Whistle: el modelo ASR abierto de 16,9 MB que cabe en cualquier dispositivo, entiende español y bate a Whisper base

Whistle, el nuevo ASR abierto de Cactus Compute: 16,9 MB, 11,1 ms al primer token, 1.319 tokens/s, 7 idiomas (incluido español), corre en CPU y supera a Whisper base en 5 de 8 benchmarks clave.

Cactus Compute ha publicado esta semana Whistle, un modelo de reconocimiento automático del habla (ASR) que cabe en un solo archivo de 16,9 megabytes, corre en CPU sin dependencias externas, soporta siete idiomas (entre ellos español) y, según los benchmarks de la compañía, supera a Whisper base en cinco de los ocho conjuntos de prueba más usados. La noticia explotó en Hacker News el 8 de octubre de 2026 con 384 puntos y más de 90 comentarios, y reaviva un debate clave para 2026: si la IA útil cabe o no en el dispositivo.

La cifra que mejor resume el lanzamiento no es la del tamaño, sino la combinación de las tres. Whistle mide 16,9 MB, tarda 11,1 milisegundos en emitir su primer token sobre un Apple M4 Pro y decodifica a 1.319 tokens por segundo. Para ponerlo en contexto, Whisper base — el modelo open source de OpenAI que se ha convertido en el estándar de facto desde 2022 — ocupa 145,3 MB, tarda 73,2 ms en el primer token y decodifica a 266 tokens por segundo. Moonshine tiny v2, otra alternativa reciente centrada en eficiencia, se queda en 41,9 MB, 22,8 ms y 262 tokens por segundo.

Whistle es, en la práctica, 8,6 veces más pequeño que Whisper base, 6,6 veces más rápido en el primer token y casi cinco veces más rápido decodificando. Y todo sobre CPU, sin GPU, sin servidor, sin internet.

Qué hace Whistle

Whistle hace tres cosas, todas en local, sobre el mismo motor C++ que Cactus ya usa para su modelo de texto Needle:

• Transcripción. Audio mono a 16 kHz, hasta 30 segundos por clip, en inglés, alemán, francés, español, italiano, holandés y polaco. El idioma se detecta automáticamente si no se especifica.

• Timestamps por palabra. Cada palabra sale con su tiempo de inicio, su tiempo de fin y la probabilidad estimada por el decodificador, alineada desde la atención del propio modelo.

• Embeddings de voz. La salida del codificador, una fila por cada 80 ms de audio, sin necesidad de producir transcripción.

El lanzamiento es relevante por una razón práctica que los benchmarks no captan: Whistle se carga en el mismo binario que Needle. Un desarrollador puede ejecutar en la misma memoria un modelo de texto y un modelo de voz y encadenarlos con una sola llamada para, por ejemplo, transcribir el audio de un micrófono, pasarlo al LLM como prompt y devolver una llamada a función en JSON. Cactus lo demuestra con un ejemplo real: la frase «turn off the kitchen lights» pronunciada en inglés se transcribe, se enruta a una herramienta y devuelve {"name":"set_lights","arguments":{"room":"kitchen","on":false}} sin que el código de llamada manipule nunca la transcripción.

Cómo está construido

El artículo técnico de Cactus entra en un nivel de detalle inusual para un lanzamiento open source, y deja claras varias decisiones de diseño:

• Front-end. El audio se ventanea en fragmentos de 25 ms con saltos de 10 ms y se convierte en 80 bancos log-mel limitados a 250-3.500 Hz. Treinta segundos equivalen a 3.000 frames, que un stem convolucional de 128 canales y kernel 9 reduce a la mitad tres veces, dejando 375 frames a razón de uno cada 80 ms. Todo el modelo opera después a esa tasa.

• Codificador. Ocho bloques de Simple Attention: cuatro carriles residuales mHC y un Monarch Hadamard MLP en lugar del feed-forward clásico. La atención no es causal: un frame a 3 segundos puede atender a un frame a 12 segundos, lo que mejora la calidad pero obliga a procesar el clip entero antes de transcribir.

• Decodificador. Ocho bloques de Laddered Simple Attention con 8 cabezas de consulta sobre 2 cabezas KV, consultas y claves de 48 dimensiones, valores de 64, una convolución causal de 3 taps sobre Q/K/V y búsquedas en engramas en las capas 3 y 7 sobre 18.432 slots. Es, en esencia, la misma pila de Needle con un número de capas distinto.

• Cross-attention con puerta. Cada capa del decodificador lee el codificador a través de una atención cruzada con una puerta aprendida por capa, lo que permite que el modelo «ignore» tramos del audio que no aportan información al token que se está generando.

• Beam search con cinco haces y keyword biasing mediante un autómata de Aho-Corasick, que eleva la probabilidad logarítmica de ciertas frases (nombres propios, comandos, jerga) según van apareciendo en los haces.

• Vocabulario de 8.192 piezas de texto más siete tokens de idioma (uno por idioma soportado), de modo que el idioma detectado se emite como un token, no como un campo aparte.

• Escalera de profundidades. Cada profundidad del decodificador, desde 2 capas hasta 8, se entrenó como un modelo independiente y se selecciona en tiempo de carga con el parámetro --audio-depth. El codificador, en cambio, siempre corre las 8 capas completas.

La elección de hacer el codificador no causal y procesar el clip entero es lo que permite esos 11,1 ms de latencia a primer token cuando el audio ya está en memoria: no es un streaming incremental, es una sola pasada muy rápida sobre un clip pequeño.

Qué tal funciona frente a Whisper y Moonshine

Cactus publica un cuadro comparativo en WER (Word Error Rate, menor es mejor) sobre los benchmarks clásicos de ASR:

• LibriSpeech test-clean y test-other: Whistle gana.

• SPGISpeech (finanzas): Whistle gana.

• Earnings-22 (call earnings, ruidoso): Whistle gana.

• FLEURS (promedio multilingüe): Whistle gana.

• TED-LIUM, AMI y MLS: Whisper base gana, pero a 145,3 MB contra 16,9.

Whisper no publica cifras en SPGISpeech, Earnings-22 ni AMI cleaned, y Moonshine tiny v2 es solo inglés, así que la comparación no es simétrica. Los autores aclaran que las cifras de Whisper y Moonshine son las publicadas por sus respectivos autores sobre los checkpoints multilingües (no los monolingües), y que ningún audio de los conjuntos de prueba aparece en el entrenamiento o la validación de Whistle — algo que verifican comparando checksums de audio e IDs de hablante entre los conjuntos.

En latencia y rendimiento, los tres modelos se midieron sobre un Apple M4 Pro usando sus runtimes oficiales y sus valores por defecto. Whistle usa el motor C++ a 5 beams, openai-whisper para Whisper y moonshine-voice no streaming para Moonshine. La latencia de Whisper es plana porque paddea cada entrada a 30 segundos; la de Whistle escala con la duración del clip: 5,9 ms a 5 segundos, 11,1 ms a 10, 36,3 ms a 30.

Por qué importa para el resto de 2026

Whistle no es solo un benchmark más pequeño. Encaja en una tendencia que el blog ha cubierto varias veces este año — la IA on-device como respuesta a los problemas de privacidad, coste y latencia de los modelos en la nube. La comparativa es útil:

• Privacidad por defecto. El audio nunca sale del dispositivo. La sandbox de Cactus en la web lo demuestra: la primera pulsación descarga el modelo y todo el procesamiento posterior ocurre en el navegador.

• Coste por uso prácticamente cero. No hay tokens de API, no hay GPUs alquiladas, no hay transferencia. En un móvil o un microcontrolador, el coste energético es el de un ciclo de CPU.

• Latencia útil para agentes en tiempo real. 11,1 ms al primer token es del orden de magnitud de la latencia que un usuario percibe como «instantáneo» en una interfaz conversacional, incluso antes de empezar a generar la respuesta del LLM.

• Embarcable en hardware barato. Cactus distribuye binarios precompilados para 17 destinos: macOS, Linux, Android, iOS, watchOS, Windows on ARM, RISC-V, MIPS, navegador (WebAssembly) y un componente WASI. El modelo no necesita aceleración de hardware.

Para un blog dedicado a la seguridad informática, la implicación es directa: cada vez más piezas de IA que antes requerían confiar en un proveedor externo (transcripción de reuniones, dictado de notas, comandos de voz en agentes) pueden ejecutarse en un dispositivo bajo control del usuario. Eso reduce superficie de ataque, elimina fugas por canal lateral de audio y abre la puerta a despliegues en entornos air-gapped.

Cómo probarlo

Cactus publica los pesos en Hugging Face (Cactus-Compute/whistle), el motor y los binarios por plataforma en Cactus-Compute/needle3 y el código fuente en GitHub. Hay tres formas de empezar:

• Sandbox web en cactuscompute.com/blog/whistle — se descarga el modelo al pulsar el micrófono y todo el audio se queda en el navegador.

• Python con pip install cactus-needle y luego needle.transcribe("clip.wav")["text"]. Admite word_timestamps=True, keywords=[...] y language="es" para forzar idioma.

• CLI con needle --model whistle.cact --audio clip.wav y opciones para timestamps, idioma y profundidad del decodificador.

La compañía también incluye dos comandos pensados para evaluación: needle whistle playground transcribe desde el micrófono en la terminal, y needle whistle compare lanza el mismo clip contra Whistle, Whisper y Moonshine y muestra tiempos lado a lado. Una manera directa de comprobar si la cifra de 11,1 ms se reproduce en el hardware del lector.

El patrón que deja Whistle es el mismo que el de Needle y el de otros lanzamientos de este año: modelos abiertos, diminutos, ejecutables en CPU y combinables entre sí. Si esa trayectoria se mantiene, la frontera entre «IA en la nube» e «IA en el dispositivo» se va a seguir estrechando — y 2026 parece ser el año en el que el reconocimiento de voz deja de ser una excepción.

Read more