⏱️ Lectura: 10 min
Cactus comprimió un reconocedor de voz completo en 16,9 MB y lo hizo arrancar en 11 milisegundos sobre una CPU común, sin GPU y sin tocar servidores externos.
📑 En este artículo
La empresa publicó el 2 de octubre de 2026 el modelo Whistle de Cactus, que transcribe siete idiomas y corre en el mismo motor en C++ que ya mueve a Needle, su modelo de texto para dispositivos con poca memoria.
TL;DR
- Cactus lanzó el 2 de octubre de 2026 un modelo de voz de 16,9 MB que corre en CPU sin dependencias.
- Transcribe siete idiomas (inglés, alemán, francés, español, italiano, neerlandés y polaco) en clips de hasta 30 segundos.
- En un Apple M4 Pro llega al primer token en 11,1 ms, frente a 73,2 ms de Whisper base.
- Decodifica a 1.319 tokens por segundo, unas cinco veces más rápido que Whisper base y Moonshine tiny v2.
- Comparte el motor en C++ y los bloques Simple Attention del modelo de texto Needle, también de Cactus.
Qué es el modelo Whistle de Cactus
Whistle es el modelo de reconocimiento de voz de código abierto que Cactus lanzó el 2 de octubre de 2026 para dispositivos con memoria limitada: móviles, wearables, robots, autos y microcontroladores. Pesa 16,9 MB, corre solo en CPU sin dependencias externas y transcribe audio de 16 kHz en siete idiomas en un solo paso.
El modelo lo desarrolló Cactus, una startup que construye motores de inferencia para hardware con memoria y batería limitadas. Whistle no es un proyecto aislado: usa la misma cuantización, el mismo contenedor binario y los mismos bloques de atención que Needle, el modelo de texto que la compañía lanzó antes. Un solo binario puede cargar los dos modelos y pasar de un clip de audio a una llamada de herramienta sin pasar por un servidor.
Qué pasó
El lanzamiento llegó el 2 de octubre de 2026, firmado por Jakub Mroz y Henry Ndubuaku, cofundadores de Cactus. El anuncio describe tres funciones que corren enteramente en el dispositivo: transcripción de audio de 16 kHz en un solo pase de hasta 30 segundos, marcas de tiempo por palabra (inicio, fin y probabilidad, calculadas desde la atención del decoder) y una tercera salida menos habitual, el embedding del encoder: una fila por cada 80 milisegundos de audio, sin pasar por el decoder ni generar transcripción.
La detección de idioma es automática salvo que se indique uno de los siete soportados: inglés, alemán, francés, español, italiano, neerlandés y polaco. El motor también mide el rango dinámico del clip antes de arrancar el decoder. Si el audio está por debajo de un umbral de silencio, devuelve una transcripción vacía sin siquiera iniciar la búsqueda por haces, lo que ahorra cómputo en el caso más común en un asistente siempre activo: el silencio.
Cactus publicó además un sandbox en el navegador donde el reconocedor de voz de 16,9 MB corre localmente. El primer uso descarga el modelo y, a partir de ahí, el audio nunca sale del dispositivo. La demo acepta una lista de palabras clave escritas a mano, y el motor las prioriza mientras decodifica.
Contexto e historia
El reconocimiento de voz en el borde (edge) viene de dos frentes distintos. Por un lado, modelos grandes como Whisper, de OpenAI, que priorizan precisión y multilingüismo a costa de tamaño: la variante base pesa 145,3 MB. Por otro, proyectos livianos como Moonshine, de Useful Sensors, pensados para microcontroladores pero limitados a inglés en su versión tiny v2 de 41,9 MB.
Whistle entra en un tercer casillero: multilingüe y más chico que ambos, apoyado en una apuesta previa de Cactus con Needle. La decisión de reutilizar el motor, la cuantización y los bloques de atención de Needle, en vez de construir un motor de audio desde cero, explica buena parte del tamaño. El sistema de transcripción de Cactus no carga un runtime propio, solo un conjunto distinto de pesos sobre la misma maquinaria en C++.
Ese parentesco también fija el techo de lo que Whistle puede hacer hoy: la lista de idiomas depende del vocabulario de 8.192 piezas de texto que ya usa el motor compartido, no de un tokenizador diseñado desde cero para audio.
Detalles técnicos
El front end convierte el audio en un espectrograma log-mel de 80 bandas, con ventanas de 25 ms y saltos de 10 ms, limitado a la banda de 250 a 3.500 Hz y normalizado por canal. Treinta segundos de audio quedan en 3.000 cuadros. Un tallo convolucional de 128 canales y kernel 9 reduce ese número a la mitad tres veces seguidas, hasta 375 cuadros, uno cada 80 ms: ese es el ritmo en el que trabaja todo lo que sigue.
flowchart TD
A["Audio 16kHz mono"] --> B["Log-mel: 80 bandas"]
B --> C["Tallo conv: 375 cuadros"]
C --> D["Encoder: 8 bloques Simple Attention"]
D --> E["Atencion cruzada con compuerta"]
E --> F["Decoder: 8 bloques Laddered Attention"]
F --> G["Beam search x5"]
G --> H["Transcript final"]
El encoder son ocho bloques Simple Attention, los mismos que usa Needle: cuatro carriles residuales mHC y un MLP Monarch Hadamard en lugar del feed-forward tradicional. La atención ahí no es causal, así que un cuadro a los 3 segundos puede mirar directamente a un cuadro a los 12 segundos del mismo clip.
El decoder son ocho bloques Laddered Simple Attention de ancho 512, con 8 cabezas de consulta contra 2 de clave y valor (GQA), dimensiones de 48 para consulta y clave y 64 para valor, una convolución causal de 3 posiciones sobre Q, K y V, y una memoria engram en las capas 3 y 7 con 18.432 posiciones. Lo distinto frente a Needle es un único agregado por capa: una atención cruzada con compuerta que lee el encoder.
x ← x + σ(g) · softmax(q̂ Kᵗ / √d) V
La compuerta g se aprende en cada capa, y K y V se toman del clip de audio. Esas proyecciones del encoder se calculan una sola vez por clip (375 cuadros en 8 capas) y quedan fijas durante todo el decodificado, así que cinco haces de búsqueda cuestan cinco cachés de texto cortos, no cinco pasadas sobre el audio.
La decodificación evalúa cinco haces con probabilidad logarítmica normalizada por longitud. Un autómata Aho-Corasick sesga la búsqueda hacia una lista de palabras clave que el usuario puede pasar junto al audio. El vocabulario tiene 8.192 piezas de texto más siete tokens de idioma, uno por idioma soportado, y el transcript queda limitado a 320 piezas.
💭 Clave: el decoder de Whistle está escalonado (laddered): cada profundidad desde 2 capas en adelante se entrenó como un modelo independiente, y el flag
--audio-depthelige cuál cargar al arrancar. El encoder, en cambio, siempre corre sus 8 bloques completos, sin excepción.
Cactus no publicó un comando ni una llamada que confirme de manera independiente qué profundidad del modelo Whistle de Cactus quedó activa en una corrida determinada. No hay forma directa de verificar esto desde afuera del proceso: la única señal documentada es la que el propio motor imprime al cargar el modelo.
Impacto y análisis
Cactus comparó los tres modelos en sus runtimes oficiales por defecto, sobre un Apple M4 Pro y diez segundos de audio: el motor en C++ de Whistle con 5 haces, openai-whisper para Whisper base y moonshine-voice en modo no continuo sobre el clip completo.
| Modelo | Tamaño | Primer token | Decodificación | Dónde gana en precisión (WER) |
|---|---|---|---|---|
| Whistle (Cactus) | 16,9 MB | 11,1 ms | 1.319 tokens/s | LibriSpeech, SPGISpeech, Earnings-22, promedio FLEURS |
| Whisper base (OpenAI) | 145,3 MB | 73,2 ms | 266 tokens/s | TED-LIUM, AMI, promedio MLS |
| Moonshine tiny v2 (Useful Sensors) | 41,9 MB | 22,8 ms | 262 tokens/s | Solo inglés; no reporta los benchmarks anteriores |
La lectura honesta de esos números es que el modelo Whistle de Cactus no gana en todo: Whisper base sigue adelante en TED-LIUM, en AMI y en el promedio de MLS, tres conjuntos con grabaciones de reuniones y conferencias, más ruidosas y con más de un hablante que los audiolibros de LibriSpeech. Cactus construyó a Whistle para el caso donde el tamaño y la latencia pesan más que esos últimos puntos de precisión: un asistente de voz en un wearable no tiene 145 MB de margen ni 73 ms para gastar antes del primer token.
La comparación de velocidad tampoco es neutral: Whisper base y Moonshine corrieron en sus runtimes de referencia en Python, mientras que Whistle corrió en el motor en C++ de Cactus. Parte de la ventaja de 1.319 tokens por segundo contra 266 viene del modelo, pero otra parte viene de comparar un binario nativo contra dos runtimes interpretados, algo que el propio anuncio no oculta pero tampoco aísla con un control aparte.
Qué sigue
Cactus no adelantó una fecha para sumar más idiomas ni para una versión de Whistle con más capas en el encoder, que hoy corre fijo en 8 bloques sin opción de recorte. Tampoco confirmó si va a liberar pesos para afinar sobre vocabularios propios, algo que sí ofrece para Needle según el mismo anuncio. Lo que sí queda planteado es el patrón: un motor en C++ y una cuantización, dos modelos que comparten memoria y arrancan del mismo binario, listos para que un agente pase de escuchar a razonar sin un viaje a un servidor.
📖 Resumen en Telegram: Ver resumen
Probalo vos: abrí el sandbox del blog de Cactus, apretá el micrófono y mirá cuánto tarda en aparecer la primera palabra en pantalla.
Preguntas frecuentes
¿Qué idiomas reconoce Whistle, el modelo de voz de Cactus?
Siete: inglés, alemán, francés, español, italiano, neerlandés y polaco, en clips de hasta 30 segundos y detección automática si no se especifica uno.
¿Cómo se compara el tamaño de Whistle con el de Whisper base?
Whistle pesa 16,9 MB frente a los 145,3 MB de Whisper base, casi un octavo del tamaño, según los benchmarks que publicó Cactus en un Apple M4 Pro.
¿Qué hace el flag –audio-depth en el motor de voz de Cactus?
Elige cuántas capas del decoder cargar: cada profundidad desde 2 capas en adelante se entrenó como un modelo independiente. El encoder siempre corre sus 8 bloques completos.
¿Funciona Whistle sin conexión a internet?
Sí. El modelo corre entero en CPU y en el dispositivo; en el sandbox del navegador, después de la primera descarga de 16,9 MB, el audio no sale del equipo.
¿Qué tan rápido decodifica el reconocedor de voz de 16,9 MB que lanzó Cactus?
1.319 tokens por segundo en un Apple M4 Pro, frente a 266 tokens/s de Whisper base y 262 tokens/s de Moonshine tiny v2, según las pruebas de Cactus.
Referencias
- Cactus: anuncio oficial de Whistle: arquitectura completa, benchmarks contra Whisper base y Moonshine tiny v2, y sandbox en el navegador.
- Cactus Compute: sitio oficial de la empresa detrás de Whistle y Needle.
- OpenAI: repositorio oficial de Whisper: código y pesos del modelo usado como referencia de comparación.
- Useful Sensors: repositorio oficial de Moonshine: código del modelo de voz ligero usado como segunda referencia.
📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.
Imagen destacada: Foto de Daniel Sandvik en Unsplash
¿Te sirvió? ¿Te dio otro error? Contalo abajo: las preguntas se responden y le sirven al siguiente que llegue.
Dejar un comentario
0 Comentarios