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.

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 ggmlDiscoNotas
tiny / tiny.en75 MiB99 idiomas / solo inglés, algo mejor en EN
tiny q5_131 MBel multilingüe más pequeño que vale la pena
base / base.en142 MiB~58 MB cuantizado; salto de calidad notable
small466 MiBfuera de presupuesto móvil razonable
large-v3-turbo1,5 GiBlo 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

04Cómo elegirlo

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.