Que mi asistente de voz sepa cuándo le hablo y cuándo he terminado
El dictado por voz llevaba ya un tiempo funcionando en mi asistente, pero tenía dos costuras que se notaban cada vez que lo usaba. Para empezar tenías que decir una palabra concreta, «dictado» o «te dicto», como si le dieras una orden a una máquina [sic].
Y para terminar tenías que soltar lo que estuvieras haciendo y tocar una tecla. Funcionaba, sí, pero no se sentía como hablar con alguien, se sentía como manejar un trasto.
Así que le he dado una vuelta a las dos cosas, y de paso me he encontrado un bug curioso que solo salió a la luz al ponerme a probarlo de verdad.
Bastaba con decir su nombre
Como digo, hasta ahora, si querías dictar algo estando ya despierta, tenías que soltar una de las frases fijas: «dictado», «te dicto». Nada complicado, pero tampoco era como hablar con una persona.
Con nadie dices «activo conversación» antes de contarle algo, simplemente dices su nombre y sigues hablando. Así que ahora, si ya está despierta y dices «Lucía» a secas, entra directa en modo dictado.

El problema es que no puedes dejar que cualquier «Lucía» suelta dispare algo así sin más.
Justo después de que se active con la palabra de arranque queda una cola de audio procesándose, y muchas veces esa cola arrastra el eco de tu propia frase: dices «hola Lucía» y el «Lucía» suelto se cuela en el primer ciclo de escucha, como una repetición fantasma de lo que acabas de decir.
Si ese eco hubiera bastado para lanzar el dictado, cada vez que la despertara se me habría abierto el dictado erróneamente sin querer.
La solución fue meter una ventana de gracia de 1,5 segundos justo después de despertarla. Durante ese margen, un «Lucía» suelto se ignora sin más, se da por hecho que es el eco de la propia activación.
Pasado ese margen, la misma palabra ya cuenta como orden real y lanza el dictado. Es la cautela que hacía falta para que lo natural no se convirtiera en un despertar accidental cada dos por tres.
Frases para cerrar sin soltar lo que estás haciendo
La otra costura era el final. Para cerrar el dictado tenías que pulsar Espacio o Ctrl+Espacio, así que si estabas con las manos ocupadas en otra cosa, tenías que interrumpirte para llegar al teclado.
Poco elegante para algo que se supone que va de no tocar el teclado. 😉
Le añadí un puñado de frases que también cierran la sesión: decir «fin de dictado», «ya estaría» o «corta el dictado» como frase completa termina el dictado sin pegarla como texto.
La comparación se hace sobre el trozo entero que acabas de decir, delimitado por un segundo de silencio, no sobre un trozo de una frase más larga, para que no se corte un dictado real que mencione esas palabras de pasada.

Cuando el propio motor se inventaba lo que yo decía
Aquí viene la parte que no salió bien a la primera. Al probarlo, esas frases de cierre fallaban bastante: unas veces no cortaban el dictado, otras veces sí pero tarde.
Al mirarlo con calma encontré la causa: la comprobación pasaba por Parakeet, el motor que transcribe el dictado libre, y con un audio corto y suelto como «fin de dictado» ese motor a veces se inventaba un texto distinto al que había dicho de verdad. Sin frase de contexto alrededor, no tenía mucho donde apoyarse.
Y buscando un poco más apareció algo todavía más concreto: una de las frases originales, «pégalo», ni siquiera estaba en el vocabulario del modelo de voz. No es que fallara a veces, es que no podía reconocerse nunca, por ningún camino. Estaba ahí desde esa misma mañana, documentada y todo, sin haber podido funcionar ni una sola vez.
La solución fue cambiar de motor para esa comprobación en concreto. En vez de preguntarle a Parakeet, que transcribe cualquier cosa sin restricciones, ahora se usa Vosk, el mismo motor que ya reconoce los casi 1.500 comandos de voz normales que conoce Lucía, con un vocabulario cerrado a esa lista de frases.
Con vocabulario cerrado solo puede devolver una de las frases exactas o directamente «no sé qué has dicho», nunca inventar texto. Parakeet se queda para el dictado libre y como red de seguridad de segunda línea, ya no como quien decide si has dicho la frase mágica o no.
"lucía" (sola, ya despierta) → empieza el dictado
[dictas normal, se va pegando]
"fin de dictado" / "ya estaría" / "corta el dictado"
"termina el dictado" / "cierra el dictado" / "se acabó el dictado"
→ cierra la sesión, sin pegar la frase
ESPACIO / Ctrl+Espacio → cierra al instante, sin esperar
Ninguno de los dos cambios es gran cosa por separado. Uno quita o mejora una palabra fija al empezar, dándole fluidez a la cosa, el otro quita una tecla al terminar.
Pero juntos cambian cómo se siente usarlo: ya no hay que acordarse de la fórmula exacta para arrancar ni interrumpir lo que haces con las manos para parar, y parece que realmente le estás hablando a Lucía también para dictar textos.
Estoy convencido además de que esto, que son prototipos, evolucionarán muchísimo según avancen los modelos de reconocimiento de voz, ya bastante eficientes de cualquier modo.


