⏱️ 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
  1. TL;DR
  2. Qué es el modelo Whistle de Cactus
  3. Qué pasó
  4. Contexto e historia
  5. Detalles técnicos
  6. Impacto y análisis
  7. Qué sigue
  8. Preguntas frecuentes
    1. ¿Qué idiomas reconoce Whistle, el modelo de voz de Cactus?
    2. ¿Cómo se compara el tamaño de Whistle con el de Whisper base?
    3. ¿Qué hace el flag –audio-depth en el motor de voz de Cactus?
    4. ¿Funciona Whistle sin conexión a internet?
    5. ¿Qué tan rápido decodifica el reconocedor de voz de 16,9 MB que lanzó Cactus?
  9. Referencias
    1. 📚 Artículos relacionados

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"]
Whistle pesa 16,9 MB, menos de un octavo que Whisper base, de 145,3 MB. Foto de SBYGLY en Unsplash

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-depth elige 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.

El decoder de Whistle reutiliza el motor en C++ del modelo de texto Needle, también de Cactus. Foto de Gadiel Lazcano en Unsplash

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.

📬 Recibí lo nuevo en tu email

Te avisamos de artículos grandes (1-2 por mes).

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

📱 ¿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

Andrés Morales

Desarrollador e investigador en inteligencia artificial. Escribe sobre modelos de lenguaje, frameworks, herramientas para devs y lanzamientos open source. Cubre papers de ML, ecosistema de startups tech y tendencias de programación.

0 Comentarios

Deja un comentario

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Podés incluir código entre <code>…</code> o, para varias líneas, <pre><code>…</code></pre>.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.