Engineering

Dictado por voz omni-modal: comprensión multimodal, MoE y salida de texto en streaming

Un recorrido técnico de cómo Loqua combina escucha, comprensión multimodal de la tarea y renderizado de texto sin que la voz se sienta lenta.

TL;DR

El dictado por voz omni-modal no es un único modelo gigante de audio. Loqua es una herramienta de dictado por voz nativa para Mac que separa el reconocimiento de voz, la planificación de instrucciones multimodal y el renderizado de texto en un pipeline de salida de texto en streaming. Esa separación nos deja espacio para un MoE en el audio encoder, contexto local de pantalla e interacción del orden de 200 ms, sin sugerir que el producto es un wrapper sobre un modelo de terceros.

Soy Shuran, fundador de Loqua.ai. Esta es la nota de ingeniería más profunda detrás de nuestro stack de dictado por voz omni-modal: por qué separamos el reconocimiento acústico de la comprensión multimodal de la tarea y del renderizado de texto, dónde ayudaron los expertos condicionales, dónde no, y por qué el streaming dictó casi cada decisión de arquitectura.

Por qué los LMs de audio monolíticos chocan con un muro en Mac

Un modelo monolítico de lenguaje sobre audio es atractivo en papel: alimentar audio, frames de pantalla y texto a un único modelo grande y pedirle que emita el dictado final. En el uso diario en Mac, ese diseño choca contra tres muros a la vez. Primero, el presupuesto de latencia es brutal. Si el primer token útil llega después de que el hablante pause, el dictado por voz se siente como transcripción batch en lugar de teclear.

Este es el presupuesto al que nos sujetamos. Desde el micrófono hasta el primer carácter visible, tenemos unos 200 milisegundos. De eso, aproximadamente 40 ms son overhead de plataforma (buffering de Core Audio, entrega inter-proceso y render final), 60 ms son extracción de características acústicas e inferencia del front-end, 70 ms son decodificación del planificador de instrucciones para la primera salida parcial, y quedan 30 ms para que el renderizador de texto emita un commit temprano seguro. Un único modelo de lenguaje sobre audio de 1B+ parámetros corriendo cada paso dentro de esa ventana es plausible en una máquina de benchmark pero poco fiable en un portátil real con un navegador, un IDE y Zoom ya corriendo.

Segundo, el trabajo visible para el usuario no es solo reconocimiento automático de voz. La misma frase debe convertirse en un párrafo de Slack, un asunto de commit de Git, un prompt de Cursor o un comentario de Python. Un modelo monolítico puede entrenarse para hacer todo eso, pero tiene que reaprender las convenciones de formato de cada app y volver a derivarlas cada vez que el cursor se mueve. Tercero, el modelo tiene que mantenerse dentro de la envolvente térmica y de memoria del portátil. Un modelo audio-visión-texto de 7B cargado en VRAM al lado del index de un IDE es una receta para thermal throttling y ventilador ruidoso. Trabajos públicos como Whisper y reportes recientes de modelos omni ayudaron al campo a entender el modelado robusto de audio y multimodal, pero enviar un producto local fuerza decisiones más estrechas y opinionadas.

Nuestra conclusión fue simple: el dictado por voz omni-modal debería ser un pipeline, no un único bloque para todo. El pipeline deja que cada capa mantenga un objetivo pequeño, un modo de fallo medible y un coste de runtime acotado.

El pipeline de instrucciones multimodal

Loqua no tiene una capa de respuesta hablada ni de TTS en este camino del producto. El planificador de instrucciones consume características de audio en streaming, contexto de pantalla seleccionado, metadatos de la app activa, el texto reciente alrededor del cursor y el prompt de instrucción activo. Produce un plan compacto de salida de texto: intención, entidades, modo de edición, formato objetivo e incertidumbre.

El renderizador de texto convierte ese plan en texto. No genera audio, respuestas habladas ni salida TTS. Decide si el plan se vuelve un checklist en Markdown, una frase, un comentario de código o una instrucción estructurada. Esta separación mantiene el razonamiento cross-modal caro fuera del camino caliente cuando el usuario simplemente está dictando prosa.

Lo que cada capa no debe hacer

La disciplina está en lo que quitamos. El front-end acústico no intenta ser listo sobre el formato de destino; expone tokens de audio con tiempos y confianza. El planificador de instrucciones no escribe prosa final; hace un plan estructurado lo bastante pequeño para revisarlo barato. El renderizador de texto no vuelve a leer el audio ni sintetiza voz; confía en el plan, el contexto de destino y el prompt de instrucción. Dejar que cualquier capa cruzara esas fronteras fue la causa más común de regresiones de latencia en nuestros primeros prototipos, porque los loops de feedback entre capas convierten el streaming en procesamiento batch sin que nadie se dé cuenta hasta que se lee el trace.

CapaEntrada principalSalidaFallo que vigilamos
Front-end acústicoFrames de micrófono en streamingTokens de audio con tiemposErrores con voz baja y en sala ruidosa
Planificador de instruccionesTokens de audio + contexto de pantalla + prompt de instrucciónIntención y plan de salida de textoSuposición errónea sobre el destino
Renderizador de textoPlan + restricciones de la appSolo texto finalSobre-formato o corrección tardía

El beneficio es la depurabilidad. Cuando la salida está mal, podemos saber si el reconocedor oyó mal la palabra, el planificador de instrucciones eligió la intención equivocada o el renderizador de texto escribió en el registro equivocado. Eso es mucho más fácil que interpretar una trayectoria oculta larga. En nuestro triage interno, aproximadamente dos tercios de los arreglos de calidad post-lanzamiento se aislaron limpiamente a una sola capa; el resto requirió cambios entre capas, pero solo tras un diagnóstico claro.

MoE en el audio encoder

El audio encoder es donde rindió el cómputo condicional. No todas las frases necesitan el mismo tratamiento acústico. Habla silenciosa, inglés con acento, inglés y chino mezclados, identificadores de código y ruido de fondo de sala de reunión estresan partes distintas del modelo. Un router pequeño de mixture-of-experts deja que el encoder gaste más capacidad en regiones difíciles sin hacer caro cada frame.

Mantuvimos el routing conservador. El router se condiciona en estadísticas acústicas y pistas léxicas superficiales, no en perfiles personales de usuario. Los expertos se especializan en patrones como habla de baja amplitud, dictado técnico rápido y code-switching. Rechazamos un pool de expertos más grande porque la inestabilidad del routing empeoraba el comportamiento de streaming: un modelo que es preciso pero cambia de estilo a mitad de frase no sirve para teclear.

Lo que probamos y descartamos

Dos ideas se veían atractivas en investigación y fallaron en producto. Primero, adaptación de expertos por usuario: entrenar un pequeño adapter por usuario intensivo. Mejoró la precisión de cold-start unos pocos puntos en nuestro set de test interno, pero duplicó la huella de memoria al lanzar y enturbió las fronteras de privacidad. Segundo, un router que tomara el identificador de la app activa como señal fuerte. Sobreajustó a un puñado de apps comunes y se degradó silenciosamente en las nuevas. Lo reemplazamos con el router acústico-y-léxico actual y movimos el comportamiento consciente de la app hacia arriba, al planificador de instrucciones y al renderizador de texto, donde corresponde.

En términos prácticos, el MoE del audio encoder ayuda a Loqua a mantener rápido el camino común mientras hace la cola menos frágil. Ese es el valor de producto: no un truco de benchmark, sino menos momentos en los que el nombre de una biblioteca, una frase silenciosa o un fragmento bilingüe rompen el flujo.

Streaming: token a token vs frase a frase

El streaming fue el tradeoff más difícil. La salida token a token se siente responsiva, pero puede exponer suposiciones prematuras. La salida frase a frase es más limpia, pero se siente tarde. Usamos un híbrido: parciales tempranos para tramos de bajo riesgo, commits retrasados para entidades y ediciones que necesitan contexto de pantalla.

Por ejemplo, cuando dices "change the fetch profile function to return early if the auth client is missing", el sistema puede transmitir las palabras ordinarias rápido. Pero los tokens alrededor de fetchProfile y authClient esperan a que la capa de contexto confirme los identificadores visibles. Por eso el renderizado de texto está separado del reconocimiento: puede revisar un pequeño tramo antes de confirmar el texto, sin reiniciar la frase entera.

La entrada bilingüe a mitad de frase es un caso relacionado. Cuando dices "把这个 retry 函数改成指数退避", el planificador de instrucciones produce un plan de salida de texto que intercala tramos en chino con un token de código en inglés. El renderizador de texto emite los caracteres chinos en cuanto pasan un umbral interno de confianza y espera unos milisegundos extra en el identificador en inglés para confirmarlo contra el buffer visible del IDE. El usuario ve primero el flujo en chino, luego el identificador, luego el resto. Reordenar la salida habría sido más rápido pero se sentía mal; el ojo espera escritura de izquierda a derecha.

Las commit boundaries son la otra perilla. Una commit boundary es el momento en que el renderizador de texto promete no revisar. Las anclamos a pausas naturales, terminadores de oración y transiciones estructurales como párrafo, item de lista o bloque de código. Dentro de una commit boundary el renderizador de texto es libre de revisar; una vez confirmado, el texto es final desde el punto de vista del usuario. Ese contrato es lo que hace que el streaming se sienta honesto en lugar de tembloroso.

El resultado es un voice stack en streaming que se siente inmediato pero no trata cada suposición acústica temprana como final. Para el dictado por voz, ese compromiso importa más que la pura velocidad de transcripción.

Contexto de investigación abierta

Seguimos la investigación abierta de cerca porque afina nuestro vocabulario para los problemas que vemos en producto. Papers y reportes sobre modelado audio-lenguaje, encoders multimodales y optimización por preferencias muestran al campo convergiendo en responsabilidades separadas, restricciones de streaming y alineación cross-modal. Como base, empieza con Whisper, el reporte técnico de Qwen2, y la visión general pública de Qwen2.5-Omni.

La frontera importante de producto: estas referencias son contexto de literatura. El stack de producción de Loqua es investigación original entrenada y optimizada internamente para dictado en Mac. Citamos trabajos abiertos para explicar el campo, no para sugerir procedencia.

Lo que construimos y lo que viene

Lo que salió de esta dirección es un sistema estrecho: dictado por voz en Mac que escucha, lee el contexto local de pantalla y escribe texto consciente de la app. El siguiente trabajo es una evaluación más rigurosa. Necesitamos metodología pública para latencia, NER técnico, WER multilingüe y desambiguación por contexto de pantalla, para que las afirmaciones sean revisables fuera de nuestro loop de dogfooding.

La segunda dirección es mejor calibración. Cuando el modelo está incierto sobre un identificador visible, debería pedir menos al usuario eligiendo una forma de salida segura o preservando la frase cruda. También estamos explorando marcadores ligeros de incertidumbre en el renderizador de texto para que la UI downstream pueda resaltar tramos de baja confianza para una corrección rápida con teclado sin romper el ritmo del dictado.

La tercera dirección es el audio no-palabra. Ese trabajo sigue en fase de prototipo y lo cubrimos por separado en Sonidos con significado. Junto con nuestro trabajo en aprendizaje por refuerzo y el oyente multimodal, conforma la agenda del próximo año para nuestro stack de dictado por voz omni-modal.

Preguntas frecuentes

¿Qué es el dictado por voz omni-modal?
Dictado por voz omni-modal significa que el sistema de dictado considera más que el audio. Puede combinar voz con contexto local de pantalla, metadatos de la app activa, texto seleccionado y entorno del cursor. En Loqua, ese contexto ayuda al sistema a decidir si la misma frase hablada debería convertirse en prosa, un comentario de código, una lista o una edición.
¿Por qué Loqua separa la comprensión del renderizado de texto?
La separación hace el pipeline más rápido y más fácil de depurar. El planificador de instrucciones resuelve intención, entidades, contexto de destino y el prompt de instrucción activo. El renderizador de texto escribe el texto final con la forma correcta. No genera voz ni salida TTS. Si la salida falla, podemos inspeccionar si fue responsable el oír, la comprensión de la tarea o el renderizado de texto, en lugar de adivinar dentro de un único modelo monolítico.
¿MoE hace que el dictado por voz local sea demasiado pesado?
Puede serlo si el pool de expertos es grande o el routing es inestable. Loqua mantiene el MoE del audio encoder conservador: expertos pequeños, señales de routing simples y un camino por defecto rápido. El objetivo no es capacidad máxima. El objetivo es gastar cómputo extra solo en regiones acústicas difíciles.
¿Por qué no transmitir cada token inmediatamente?
El streaming inmediato puede exponer suposiciones costosas de corregir, sobre todo alrededor de identificadores y formato específico de app. Loqua transmite rápidamente los tramos de bajo riesgo y retrasa los tramos arriesgados hasta que el contexto los confirma. Eso se siente responsivo evitando al mismo tiempo las correcciones más frustrantes a mitad de frase.
¿Esta arquitectura solo es útil para Mac?
La separación general puede funcionar en otros lugares, pero Mac es donde podemos hacer suposiciones fuertes de producto: Apple Silicon, contexto de apps de escritorio, APIs de Accessibility y flujos de trabajo guiados por teclado. Acotar la plataforma deja que el modelo y el runtime se optimicen para un único entorno diario en lugar de un compromiso genérico cross-platform.
¿Cómo deberían los ingenieros evaluar un voice stack así?
No midas solo word error rate. Mide también tiempo hasta el primer texto útil, preservación de entidades, precisión del formato consciente de la app, tasa de corrección y comportamiento en la frontera de privacidad. Un voice stack puede tener buen ASR y aun así ser pobre escribiendo texto útil en la app de destino.
¿Qué significa una commit boundary en un voice stack en streaming?
Una commit boundary es el punto en el que el renderizador de texto promete no revisar el texto ya emitido. Loqua coloca las boundaries en pausas naturales, terminadores de oración y transiciones estructurales. Dentro de una boundary el renderizador de texto puede revisar libremente; una vez confirmado, el texto es final desde el punto de vista del usuario, que es lo que hace que el streaming se sienta honesto.
¿Por qué no personalizar el audio encoder por usuario?
Lo intentamos y lo descartamos. Los adapters por usuario mejoraron la precisión de cold-start unos pocos puntos en sets internos pero duplicaron la huella de memoria al lanzar y debilitaron nuestra historia de privacidad. Loqua mantiene el encoder genérico y empuja el comportamiento específico de usuario hacia arriba del stack: al planificador de instrucciones, al renderizador de texto y a diccionarios locales que nunca dejan el dispositivo.

Prueba Loqua hoy

Gratis para empezar. Nativo para Mac. Construido por investigadores en algoritmos que lo usan todos los días.

Descargar para Mac

Más del Loqua Blog

how-to
Cómo dictar código en Mac: una guía completa para Cursor, VS Code y Claude Code
compare
Loqua vs Wispr Flow: una alternativa Mac-first a Wispr Flow para contexto, código y privacidad
engineering
Dictado por voz privado para Mac: cómo el voice stack híbrido de Loqua mantiene tus datos de tu lado