Skip to content
My Drupal My GitHub My GitLab Ruby on Twitter OneByt on Youtube OneByt on Twitch OneByt on Discord

Nono, asistente de voz offline

¿Te has sentido frustrado al buscar una forma eficaz de automatizar tareas en Linux con tu voz?
Posiblemente no, pero yo si, por lo que en este post explico lo que hice para sacarme esa idea de la cabeza.

Tras investigar diversas posiciones, me encontré con varios desafíos.

He explorado algunas soluciones de automatización en línea utilizando Google Assistant, pero no cumplen con mis requisitos. No me siento cómodo con la idea de que el micrófono esté constantemente enviando datos a servidores externos. Además, no he logrado ejecutar comandos personalizados en entornos locales de manera efectiva. Como mi objetivo era integrarlo con una Raspberry Pi en casa de forma offline, un sistema en línea no me servía tampoco. Dado que no tengo tantas tareas que automatizar, adquirir un dispositivo como Alexa no parece una opción muy viable para mí.

Motivado por la falta de soluciones adecuadas, me embarqué en la aventura de desarrollar mi propia herramienta de automatización por voz. Mi objetivo era crear una herramienta que me permitiera dictar comandos de voz para ejecutar procesos de forma local, garantizando la privacidad y la flexibilidad que anhelaba. La ejecución local de procesos era fundamental para mí, ya que me permitía mantener el control total sobre mis datos y evitar la dependencia de servidores externos.

Propuesta de solución

La idea es desarrollar una aplicación de escritorio que capture audio del micrófono y ejecute una acción específica al detectar un comando de voz predefinido después de decir una palabra clave. Los usuarios podrán configurar los comandos y sus acciones asociadas a través de un fichero de configuración. El modelo de reconocimiento de voz debe estar optimizado para enfocarse únicamente en las palabras de los comandos, mejorando la precisión y la eficiencia.

Diagrama de la propuesta

Principales retos

La elección del modelo de reconocimiento de voz offline fue crucial para el éxito del proyecto. Buscaba un modelo ligero, flexible y que no requiriera conexión a internet. Afortunadamente, encontré Vosk, una biblioteca que cumplía con todos los requisitos. Si bien Vosk ofrece algunas opciones poco documentadas, después de varias pruebas logré que funcionara bastante bien.

Una característica destacable de Vosk es la posibilidad de acotar la gramática del modelo, lo que me permitió limitar las palabras que esperaba sin tener que entrenar el modelo completo. Además, el modelo pequeño consume menos de 200 MB de memoria RAM, lo que lo convierte en una opción ideal para equipos con recursos limitados.

Vosk ofrece dos modelos de lenguaje para cada idioma: uno pequeño y otro grande. El modelo pequeño es ideal para dispositivos con recursos limitados, ya que consume menos de 200 MB y tiene una velocidad de reconocimiento de voz más rápida. Sin embargo, el modelo grande ofrece una mayor precisión en el reconocimiento de voz, pero consume cerca de 4 GB de RAM.

Si bien el modelo no incluye todas las palabras necesarias, principalmente términos en inglés como PHPStorm, podemos sustituirlas por otras.

Completar este proyecto fue una batalla épica contra mi archienemigo, el síndrome de Da Vinci. Casi llega al mundo de mis proyectos inconclusos, pero al final, gracias al apoyo de mi hija (mi PM de 6 años)  , logré concluir la primera versión.

¿Dónde encontrar el código y las instrucciones de uso?

El código y las instrucciones de uso están en el repositorio de GitLab nono. Nono es el robot de Ulices 31

Las instrucciones en español están disponibles en el repositorio de GitLab.

Para una guía más visual, ver el video en Youtube o en Twitch.

Proximos pasos

Después que lo use un tiempo y verifique su utilidad, me propongo realizar los siguientes cambios:

Colaborar

Busco activamente colaboradores para este proyecto. Estoy particularmente interesado en recibir ayuda en las siguientes áreas:

Desarrollo de código: Implementación de nuevas funcionalidades, corrección de errores y mantenimiento del código existente.
Pruebas: Realización de pruebas exhaustivas para garantizar el correcto funcionamiento del programa.
Documentación: Elaboración de documentación clara y precisa para usuarios y desarrolladores.
Creo que la colaboración puede aportar grandes beneficios al proyecto, como una mayor diversidad de ideas, un mejor desarrollo y un aprendizaje mutuo. A cambio de su colaboración, puedo ofrecer mi experiencia en el desarrollo de software y mi entusiasmo por el proyecto.

Si estás interesado en colaborar, no dudes en contactarme a través de issues de proyecto en gitlab o por discord. Agradezco cualquier comentario o sugerencia que puedas tener sobre el proyecto.