Probamos Vosk: un ASR gratuito, libre y que no necesita Internet
Hace unos días recibo por parte de el canal de anuncios de Issabel, la compatibilidad con Vosk, un ASR gratuito, libre y offline (no necesita internet para funcionar). Issabel vuelve a adelantarse a todas las distribuciones de comunicaciones esta vez con algo que mucha gente quiere y lo han incluido ya en sus sistemas.
Leo el comunicado y pienso… ¿Cómo??? debe tener truco…
Conozco varios sistemas que, aprovechando el boom de la inteligencia artificial y las redes neuronales, se han lanzado a crear modelos de reconocimiento de audio muy interesantes. Hace un par de años estuvimos en el Stand de Mozilla leyendo unos textos para ayudar a enseñar al motor. No obstante, este proyecto nos había pasado desapercibido y eso que posteriormente parecía haber pasado por delante en varias ocasiones sin haberme percatado de la joya que era.
Efectivamente, no tiene truco, la gente de Issabel no solo ha estado muy atenta si no que ha incorporado, además de muchas herramientas con las que ya cuenta, un reconocedor de audio (ASR) completamente libre y gratuito y que, a diferencia de muchos otros, no depende de terceros como Google, Amazon, Microsoft, etc.
Vosk es el motor, una aplicación escrita en Python y basada en redes neuronales que reconoce palabras en varios idiomas (según el diccionario que le cargues) y que funciona de forma independiente (no requiere conexiones a otros sistemas) por lo que instalas el servidor, cargas el diccionario del idioma que deseas, lo ejecutas y ya está el puerto listo para enviarle audio y que el motor lo convierta a texto.
Investigando, me di cuenta que lo presentaron en la ClueCon 2020 (el año pasado) donde explicaron cómo funciona y qué ventajas tiene. Podéis ver la presentación aquí:
He probado varios sistemas similares y por lo general, los ASR libres, en comparación con los sistemas comerciales, no eran muy competitivos, entiendo que un ASR es un sistema super-complejo y crear uno que funcione bien requiere de un gran esfuerzo económico que muchas veces sólo es posible si hay una empresa detrás, pero en esta ocasión la sorpresa ha sido mayúscula.
Echándole un vistazo a su web, el proyecto es completamente transparente… publican todas las presentaciones, todas las fórmulas, ecuaciones y sistemas que utilizan para el entrenamiento y análisis de la voz y posterior conversión en palabras.
También publican ejemplos y demos para que cualquiera pueda probarlo con varios comandos. Esto también lo conocía en otros sistemas, funciona muy bien en sus ejemplos pero luego uno prueba una conversación normal y no da con una traducción medianamente aceptable.
Así que sin más… me he puesto manos a la obra y por probar una grabación mía:
Ejecuto el comando que se conecta al servidor y devuelve lo siguiente:
{ "result" : [{ "conf" : 0.572926, "end" : 0.900000, "start" : 0.660000, "word" : "hola" }, { "conf" : 0.976447, "end" : 1.427432, "start" : 1.151597, "word" : "hola" }, { "conf" : 0.841578, "end" : 1.830000, "start" : 1.530000, "word" : "esto" }, { "conf" : 0.998902, "end" : 1.890000, "start" : 1.830000, "word" : "es" }, { "conf" : 1.000000, "end" : 2.070000, "start" : 1.890000, "word" : "una" }, { "conf" : 1.000000, "end" : 2.460000, "start" : 2.070000, "word" : "prueba" }], "text" : "hola hola esto es una prueba" }
Como podéis ver, aunque falta el primer «hola» (en la grabación eran 3 ‘hola’) el reconocimiento es perfecto y tampoco es que sea una conversación muy difícil.
Probando algo más complejo:
El resultado ha sido este:
"text" : "una aplicación escrita en país y basada en redes neuronales que reconoce palabras en varios idiomas",
"text" : "y que funciona de forma independiente por lo que instala servidor cargas en diccionario idioma que deseas lo ejecutas y ya hasta el puerto listo para enviarle el audio"
}
Como podéis ver… el reconocimiento es prácticamente perfecto. (si, fallan algunas palabras… pero ¿qué esperabas?)
Instalación
La instalación del servidor no puede ser más sencilla:
docker run -d -p 2700:2700 alphacep/kaldi-es:latest
Ejecutamos este docker que corre en background y nos abre el puerto 2700 para que nos conectemos vía websocket y enviarle el audio.
Conectándonos al servidor Vosk
Luego tan solo hay que descargar un cliente websocket para enviarle el archivo wav (formateado a 8Khz y mono)
git clone https://github.com/alphacep/vosk-server
cd vosk-server/websocket
./test.py test.wav
Y si le pasáis el archivo wav que tengáis… veréis cómo lo reconoce.
Usando Asterisk para conectar el ASR de Vosk
La gente de AlphaCep ha publicado un módulo para Asterisk, FreeSwitch y Jigasi (el módulo que utiliza Jitsi)
https://github.com/alphacep/vosk-asterisk
De esta manera, podéis utilizar el reconocedor de audio directamente desde el Dialplan de Asterisk:
[internal]
exten = 1,1,Answer
same = n,Wait(1)
same = n,SpeechCreate
same = n,SpeechBackground(hello)
same = n,Verbose(0,Result was ${SPEECH_TEXT(0)})
Eso sí, nos avisan en varios sitios que el sistema de reconocimiento requiere de un sistema potente, ya que consume bastante memoria y procesador cada vez que tiene que hacer un reconocimiento, pero eso es algo común en cualquier ASR hospedado por nosotros, así que a tenerlo en cuenta si queremos instalarlo en nuestro sistema de comunicaciones.
Toda la información en la página de Vosk: https://alphacephei.com/vosk/
Su página para estar al día: https://alphacephei.com/en/news.html
Y la guía para configurarlo en Issabel: https://t.me/Issabel_channel/4