Investigación · audio · dispositivos
Voz a texto
sin nube
Modelos de speech-to-text que caben en un teléfono normal y van
más rápido que el tiempo real. Qué hay en octubre de 2026, cuánto pesan y qué se pierde
al dejar de subir el audio a un servidor.
Álvaro Menéndez · 6 oct 2026 · panorama comparado + fuentes
La premisa es sencilla: si el audio se transcribe en el propio teléfono, no hay
subida, no hay cuenta atrás dependiente de la red y no hay una API que pagar. El precio
es que los modelos pequeños reconocen peor que el cloud. La pregunta útil no es
«¿se puede?» —se puede, y ya hay apps que lo hacen— sino cuántos megas y cuánta
calidad estás dispuesto a cambiar.
16,9 MBWhistle · 7 idiomas
31 MBwhisper tiny quantizado · 99 idiomas
42 MBMoonshine v2 tiny · streaming, MIT
11 msal primer token (Whistle, clip de 10 s)
01La camada nueva: modelos nacidos para el borde
Hasta hace poco, «modelo pequeño» significaba Whisper tiny recortado. Desde
2025-2026 hay modelos entrenados desde cero para CPU de móvil, con arquitecturas que
Whisper no usa (atención de ventana deslizante, pesos comprimidos de fábrica).
Whistle (Cactus Compute, 2 de octubre de 2026) es el caso extremo:
un único fichero de 16,9 MB, sin dependencias, que transcribe hasta 30 s
en inglés, alemán, francés, español, italiano, neerlandés y polaco. Detecta el idioma,
devuelve timestamps por palabra y —lo más interesante para un producto de dictado—
acepta sesgo de palabras clave (un autómata Aho-Corasick que sube la
probabilidad de nombres propios o tecnicismos durante la búsqueda). Primer token en 11 ms,
1.319 tokens/s de decodificación. Su gráfico lo enfrenta a Whisper base
(145,3 MB) y Moonshine tiny v2 (41,9 MB): Whistle gana en LibriSpeech, SPGISpeech,
Earnings-22 y la media de FLEURS; pierde en TED-LIUM, AMI y la media de MLS. En una prueba
propia con 240 clips de MINDS14 (acentos de varios países): WER 33,3 % frente al 32,2 % de
Whisper base —empate técnico— con un RTF de 0,03 en un móvil de gama media.
Traducido: 10 s de audio se transcriben en ~0,3 s de CPU.
Moonshine v2 Streaming (Useful Sensors) ataca otro frente: el
streaming real. Encoder con atención de ventana deslizante y 80 ms de
lookahead, de modo que el texto sale mientras hablas. Tiny = 34 M de parámetros
(~42 MB), small = 123 M, medium = 245 M. Lo notable son sus números por idioma: español
tiny 6,2 % WER y small 4,9 %; inglés tiny 12,0 % / small
7,84 % (media de 8 datasets del Open ASR Leaderboard); alemán 12,0 / 7,5. Licencia MIT.
La letra pequeña: son modelos separados por idioma (inglés, español,
alemán, árabe, japonés, mandarín, tagalo y vietnamita) y no hay francés, italiano,
portugués ni neerlandés. Sin mezcla de idiomas dentro de una frase.
El modelo de 16,9 MB y el de 42 MB ya existen. La discusión real es
cuántos idiomas necesitas y si tus usuarios mezclan lenguas en la misma frase.
02El clásico: Whisper cuantizado
Whisper sigue siendo el único modelo multilingüe de verdad en este
rango de peso: 99 idiomas en un solo fichero, con detección de idioma y cierta tolerancia
a cambiar de idioma a mitad de frase. Con whisper.cpp (C/C++, ejemplo oficial
de Android, bindings Java/React Native, VAD incluido) y cuantización q5, los tamaños son:
| Modelo ggml | Disco | Notas |
| tiny / tiny.en | 75 MiB | 99 idiomas / solo inglés, algo mejor en EN |
| tiny q5_1 | 31 MB | el multilingüe más pequeño que vale la pena |
| base / base.en | 142 MiB | ~58 MB cuantizado; salto de calidad notable |
| small | 466 MiB | fuera de presupuesto móvil razonable |
| large-v3-turbo | 1,5 GiB | lo que corre hoy en la nube (q5: 547 MiB) |
Los tamaños de tiny/base/small en fp16 son los del repositorio
ggml; las variantes q5 cuantizan pesos y activaciones a 5 bits. Como referencia
de velocidad en móvil: la versión int8 de Whisper tiny exportada por Arm a ExecuTorch
(XNNPACK + KleidiAI) corre a 6× tiempo real en un vivo X300, con 116 MB de
peso y WER 7,57 % en LibriSpeech test-clean — misma calidad del tiny original.
03Lo demás del panorama
- Audio8-ASR-0.1B (AutoArk) — «el modelo ASR utilizable más pequeño
de la era LLM»: 0,32 B de parámetros, 7 idiomas (ZH/EN/FR/DE/JA/KO/YUE), WER medio 7,03
en el Open ASR Leaderboard, con hotwords por logit. Pero pesa cientos de MB
(1,1 GB de pico en ONNX Runtime) → material para el futuro, no para 50 MB.
- LiteASR / lite-whisper — comprime el decoder de Whisper con
aproximación de bajo rango: lite-whisper-small es más exacto que
whisper-small (WER 14,96 vs 15,89) con el encoder un 20 % más pequeño. Útil si el
presupuesto sube de 50 a ~200 MB.
- Vosk — el veterano: modelos de 36–49 MB por idioma, streaming y
vocabulario dinámico, Apache-2.0, pero con WER del 23–38 % fuera del inglés y tecnología
Kaldi clásica. Solo como fallback de emergencia.
- SenseVoice-Small (448 MB, ZH/YUE/EN/JA/KO) y MMS
(Meta, 1.000+ idiomas pero >1 GB): multilingües pero muy por encima del peso admitido.
- El propio Android — Android 16 introduce
OnDeviceAsrEngine:
un modelo de ~50 MB en la partición del sistema, 8 idiomas, cero descarga, llamable con
createOnDeviceSpeechRecognizer. En Android 15 y anteriores esa llamada
devuelve ERROR_NETWORK sin conexión. Es gratis y no ocupa, pero la calidad
depende del fabricante y no controlas nada más.
- Comercial — Picovoice Cheetah/Leopard (streaming on-device, licencia
enterprise por dispositivo) y similares: sólidos, pero imponen un coste por usuario que
anula el argumento de «sin API que pagar».
04Cómo elegirlo
- Idiomas y mezcla de idiomas. Si tu producto soporta 12 idiomas y
los usuarios cambian de lengua a mitad de frase, solo Whisper cubre eso con un fichero.
Whistle cubre 7 idiomas con autodetección; Moonshine exige un modelo por idioma y no
mezcla.
- Tamaño vs calidad. 16,9 MB (Whistle) ≈ calidad «Whisper base»;
31 MB (whisper tiny q5) ≈ Whisper tiny; 42 MB (Moonshine tiny streaming) es el mejor
por mega en ES/EN/DE según sus propias evaluaciones. Los WER de papers distintos
no son comparables entre sí: cada uno usa su dataset.
- UX. El streaming (Moonshine) hace que el texto aparezca mientras
hablas; los modelos por clip (Whistle, whisper) responden igual de rápido al soltar el
botón. Para un dictado corto de 5–15 s la diferencia es mínima.
- Palabras del usuario. El sesgo de palabras clave (Whistle, Audio8,
Vosk) es la forma barata de acertar nombres propios, marcas y tecnicismos sin reentrenar.
Es, además, exactamente lo que un diccionario de «palabras tuyas» necesita.
- Licencias. MIT (Moonshine v2 streaming, todos los tamaños e idiomas),
Apache-2.0 (whisper.cpp, Vosk). La licencia de Whistle no está declarada en su model
card: hay que confirmarla antes de meterlo en un producto comercial.
- Mide sobre tus propios dictados. El WER promedio no predice cuántas
frases quedan «listas para enviar»: lo que importa son las correcciones («no, olvida eso»),
los cortes a mitad de palabra y el código cambiante. El criterio de decisión debería ser
el porcentaje de transcripciones usables sin tocar, medido con un juez LLM sobre un set
de dictados reales duros.
Recomendación
Para una app de dictado multiidioma con usuarios que mezclan español e inglés:
whisper tiny cuantizado (31 MB) como base — es el único que cubre todos los
idiomas y la mezcla en un fichero, con un runtime probado en Android —, y
Whistle (16,9 MB) como primera opción si el presupuesto de descarga manda
y 7 idiomas bastan. Dos híbridos que ganan siempre: (1) insertar el texto local al instante
y refinarlo en el servidor cuando llegue, así la espera desaparece; (2) mantener la ruta de
nube como fallback para idiomas no cubiertos o audio ruidoso. El modelo debe descargarse
bajo demanda, no viajar dentro del APK.