Whistle es un modelo open source de Cactus Compute para transcribir audio a texto en local: ocupa un solo archivo de 16.9 MB, funciona en CPU sin GPU y entiende español. Es más o menos la octava parte de Whisper base, que pesa 145.3 MB. Se publicó el 2 de octubre con licencia Apache-2.0, según su ficha en Hugging Face, y ya puedes instalarlo con pip.
¿Qué es Whistle?
Whistle es un modelo de on-device speech to text pensado para el hardware donde Whisper no cabe con comodidad: Cactus menciona teléfonos, wearables, robots, dispositivos de hogar inteligente, autos y microcontroladores. Funciona dentro del mismo motor en C++ que Needle, el pequeño modelo de tool calling de la misma empresa. Ese motor vive en el repositorio cactus-compute/needle de GitHub, que tiene 13.7k estrellas.
Hace tres cosas, todas en el dispositivo:
- Transcripción. Audio mono a 16 kHz, hasta 30 segundos por pasada, en inglés, alemán, francés, español, italiano, neerlandés y polaco. Detecta el idioma automáticamente, salvo que se lo indiques.
- Marcas de tiempo por palabra. Cada palabra llega con su inicio, su fin y su probabilidad.
- Embeddings de voz. Devuelve la salida del encoder, una fila cada 80 ms, sin generar transcripción. Sirve para comparar y buscar fragmentos de audio.
También admite keyword biasing: le pasas los nombres y términos de producto que tus usuarios dicen de verdad, y el decodificador los favorece. Si el audio es silencio, devuelve una transcripción vacía en lugar de inventar una frase.
¿Cómo transcribir audio a texto con Whistle?
Necesitas tres pasos: instalar el paquete, importarlo y llamar a transcribe.
pip install cactus-needle
import needle
print(needle.transcribe("clip.wav")["text"])
El motor y los pesos se descargan la primera vez y quedan en caché. Un WAV a 16 kHz no necesita nada más que la instalación base. Para otras frecuencias de muestreo o para capturar desde el micrófono, añade el extra [mic], que instala soxr y sounddevice:
pip install "cactus-needle[mic]"
Opciones útiles en la misma llamada:
word_timestamps=Truedevuelve cada palabra con sus tiempos y su probabilidad.keywords=[...]orienta el decodificador hacia los términos que le pases.language=fija el idioma en lugar de detectarlo.
Cada llamada informa además los milisegundos hasta el primer token y la velocidad de decodificación en tokens por segundo. Desde la terminal, needle whistle playground transcribe en vivo lo que dices al micrófono.
¿Whistle o Whisper: cuál es más preciso?
Depende del dataset, y la respuesta honesta es un empate repartido. Todas estas cifras las publica Cactus: las tasas de error de Whistle se midieron sobre 86,174 frases, y las de Whisper y Moonshine son las que publicaron los autores de esos modelos, no una ejecución nueva hecha por Cactus.
Frente a Whisper base:
| Benchmark | Gana |
|---|---|
| LibriSpeech test-clean | Whistle |
| LibriSpeech test-other | Whistle |
| FLEURS (promedio, 7 idiomas) | Whistle |
| TED-LIUM | Whisper base |
| MLS (promedio, 6 idiomas, sin inglés) | Whisper base |
| SPGISpeech, Earnings-22 | Whisper no publicó cifra |
| AMI | No comparable (Whisper reporta otro subconjunto) |
Dos matices importan:
- La precisión numérica no es la misma. Whistle corre cuantizado a 2–4 bits; Whisper corrió en fp32.
- La cobertura de idiomas tampoco. Whisper cubre muchos más idiomas que los siete de Whistle. Si necesitas uno fuera de esa lista, Whistle no es opción.
Cactus afirma que ningún audio de prueba aparece en los datos de entrenamiento ni de validación de Whistle, y que lo verificó comparando checksums de audio e IDs de hablantes.
El comando más útil para cualquier lector es needle whistle compare: pasa el mismo clip por Whistle, Whisper y Moonshine, uno al lado del otro, con sus tiempos. Tu audio, tu acento y tu micrófono te dirán más que cualquier gráfico.
¿Whistle es más rápido que Whisper?
En el benchmark de Cactus, sí, y por mucho. La prueba usó 10 segundos de audio en la CPU de un Apple M4 Pro, con cada modelo en su runtime oficial y con la configuración por defecto.
| Whistle | Whisper base | Moonshine tiny v2 | |
|---|---|---|---|
| Tamaño | 16.9 MB | 145.3 MB | 41.9 MB |
| Tiempo al primer token | 11.1 ms | 73.2 ms | 22.8 ms |
| Decodificación | 1,319 tok/s | 266 tok/s | 262 tok/s |
Whisper rellena toda entrada hasta 30 segundos, así que su tiempo al primer token es el mismo sea cual sea la duración del clip. El de Whistle crece con el clip: 5.9 ms a 5 segundos y 36.3 ms a 30 segundos.
¿Whistle funciona mejor que Whisper en español?
Whistle transcribe español y detecta el idioma solo, pero en precisión el resultado es mixto:
- Whistle gana en el promedio de FLEURS, que incluye español.
- Whisper base gana en el promedio de MLS, que no incluye inglés y también incluye español.
Los gráficos publicados muestran promedios, no el desglose por idioma. Otra razón para correr compare con tus propias grabaciones en español antes de decidir.
¿Whistle es gratis? Convertir audio a texto gratis y sin nube
Sí. Los pesos y el motor tienen licencia Apache-2.0, según la ficha de Hugging Face y el repositorio de GitHub. La inferencia corre en tu máquina, así que no hay costo por minuto de API.
Un detalle que conviene saber: el paquete cactus-needle envía telemetría de uso anónima (nombre de la función, versión del paquete y sistema operativo). Cactus asegura que nunca recoge prompts, salidas ni datos. Puedes desactivarla con NEEDLE_TELEMETRY=0 o DO_NOT_TRACK=1.
¿Whistle funciona en Windows?
Sí. El motor se distribuye con binarios precompilados en el repositorio Cactus-Compute/needle3 de Hugging Face, con carpetas para estas plataformas:
- Windows:
windows-x86_64ywindows-arm64 - Linux: x86_64, ARM, RISC-V y MIPS
- macOS: Apple Silicon (
macos-arm64) - Móvil y wearables: Android, iOS, tvOS y watchOS
- Navegador: WebAssembly
Al momento de publicar esta nota, esa lista no incluía una versión para Mac con procesador Intel.
Para usar el binario directamente, sin Python:
needle download macos-arm64
needle download whistle
./macos-arm64/needle --model whistle.cact --audio clip.wav --audio-word-timestamps
¿Qué limitaciones tiene Whistle?
- 30 segundos por pasada. Las grabaciones largas (reuniones, entrevistas, podcasts) hay que dividirlas en fragmentos antes.
- Siete idiomas. Inglés, alemán, francés, español, italiano, neerlandés y polaco.
- Benchmarks publicados por el propio fabricante. Las cifras de los rivales son las que publicaron sus autores, no una comparación directa en las mismas condiciones.
- Entrada mono a 16 kHz en la instalación base. Otros formatos necesitan el extra
[mic].
¿Whistle puede convertir la voz en llamadas a herramientas?
Sí, si lo cargas junto a Needle. El mismo binario carga los dos modelos:
needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav
El motor transcribe el clip, compara la transcripción con las herramientas que declaraste y devuelve un único objeto JSON con las llamadas a funciones, el texto transcrito y el idioma detectado. Entra audio y sale una acción estructurada, sin servidor de por medio. Entre los dos modelos suman unos 52 MB.
¿Y tú? ¿Qué usas hoy para transcribir audio a texto en tu propia máquina?
- Whisper u otro modelo en local
- Un servicio en la nube
- Todavía no transcribo audio
- Prefiero otra opción (cuéntanos cuál)
Comenta abajo o, si este artículo te llegó por correo, responde directamente al email: tu respuesta se publica aquí.
Relacionado: Voicebox: la alternativa open source a ElevenLabs que clona tu voz en local y hace hablar a Claude Code
