BookinglyTech News
Software

Huh?, la app de macOS que guarda en RAM el audio que acabas de perder

Un desarrollador publica una utilidad de barra de menú que retiene hasta dos minutos de audio en memoria y los reproduce con un atajo, sin grabar a disco ni subir nada a la nube.

3 min de lecturaDev.to0 vistas

Un desarrollador ha publicado Huh?, una utilidad de barra de menú para macOS que mantiene en memoria los últimos 30 segundos o hasta 2 minutos de lo que se esté escuchando y lo reproduce al pulsar ⌥⌘H. El audio vive en RAM, no se escribe en disco y no se sube a ningún sitio: la única salida al sistema de ficheros es exportar un clip con ⌘S, y la única petición de red posible es la descarga del modelo de Whisper, que hay que autorizar en los ajustes. El autor lo presenta como un proyecto que aún no considera cerrado.

La app se engancha a una sola aplicación (Chrome, Zoom, la que sea), a todo el audio del sistema o al micrófono, mediante un process tap de CoreAudio. El tamaño del búfer se ajusta entre los 30 segundos y los dos minutos.

Cómo está montado

El stack es Swift y SwiftUI dentro de un NSPanel, con CoreAudio para la captura, AVAudioEngine para la reproducción y WhisperKit como transcripción opcional. Todo se compila con Swift Package Manager y las Command Line Tools, sin proyecto de Xcode: un build.sh arma el bundle .app a mano.

La captura es la parte con más cuidado. El audio llega como PCM mono en Float32 y entra en un ring buffer sin locks. El método de escritura corre en el hilo de IO en tiempo real de CoreAudio, así que no hay allocaciones, ni locks, ni llamadas a os_log en ese camino; el estado compartido son atómicos y el almacenamiento es un puntero crudo reservado una sola vez. El autor lo justifica sin rodeos: una retención de ARC o un log en ese punto no es un problema de estilo, es un chasquido audible.

El coste en memoria es el dato práctico: unos 5,5 MB con 30 segundos de búfer y alrededor de 22 MB con 2 minutos sobre una fuente de 48 kHz.

La reproducción pasa por AVAudioUnitTimePitch, lo que permite bajar a 0,75x o 0,5x sin cambiar el tono. Ahí se le fue una semana: el playhead se desincronizaba cuando cambiaba el dispositivo de audio a mitad de reproducción, por ejemplo al conectar unos auriculares Bluetooth. Las builds de release son universales, arm64 y x86_64 empaquetadas con lipo.

Para transcribir hay dos motores en local. SFSpeechRecognizer de Apple, sin configuración previa, o Whisper vía WhisperKit, con descarga única del modelo y mejor resultado con nombres propios y URLs. La transcripción se sincroniza con la reproducción y se puede saltar pulsando una palabra.

Lo que falta

El autor no dice qué licencia tendrá, cuánto costará ni dónde se descarga. En X hubo gente preguntando si pagaría 5 dólares por ella, y esa cifra es lo único parecido a un precio que aparece en todo el texto. Tampoco hay repositorio ni fecha de publicación estable, así que por ahora esto es una demo con recorrido incierto.

El patrón que hay detrás sí es trasladable: transcripción y reproducción en local, sin cuenta, sin un bot colándose en la llamada y sin mandar audio de reuniones a un tercero. Y para quien trabaje con audio en macOS, el diseño del ring buffer sobre el hilo de IO recuerda lo poco que hace falta para meter glitches en un camino de tiempo real.