Reconocimiento de voz por medio de PocketSphinx

Abstracto: En este documento se encuentra un ejemplo práctico de la aplicación de un reconocimiento de voz offline, que

Views 129 Downloads 3 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Abstracto: En este documento se encuentra un ejemplo práctico de la aplicación de un reconocimiento de voz offline, que requiere bajos recursos del procesador y que aparte es independiente del hablante. Para esta aplicación se pretendía implementar un control por voz de vocabulario limitado para controlar un brazo mecánico tipo Jaco, el cual sirve como apoyo de actividades diarias a personas con impedimentos motrices. Se presentan algunas alternativas de sistemas que cumplen dichas características, y se logra implementar un sistema con 90% de detección en idioma inglés y un 75% para el idioma francés, su implementación en el brazo robótico aún queda pendiente. Introducción: El reconocimiento de voz es una herramienta muy utilizada para múltiples propósitos. Para la mayoría de nosotros no es anormal utilizarlo en el día a día al manejar o para acceder rápidamente a un contacto o aplicación desde el celular. A pesar de que el reconocimiento de voz ha existido desde mitad del siglo XX, no había sido utilizado debido a su falta precisión y su limitado vocabulario había hecho impráctico su uso.

El primer sistema de

reconocimiento de voz se creó en 1952 bajo el nombre de Audrey; era un sistema de reconocimiento dependiente del hablante que podía reconocer 10 dígitos. No se hicieron avances significativos hasta los años 70s el Departamento de Defensa de Estados Unidos (DARPA) desarrollo un sistema con capacidades mejoradas con posibilidad de implementar un vocabulario de hasta 1,000 palabras (SONIX). Este tipo de procesamiento se basaba en detectar los patrones del sonido para hacer una comparación exhaustiva a una base datos, lo que requería un gran poder de procesamiento y almacenamiento para todas las combinaciones del vocabulario. Debido a eso todos los esfuerzos se centraban en crear una síntesis de sonido digital más parecido e intuitivo como el del ser humano. No fue hasta la introducción del modelo estadístico de “Hidden Markov” que el procesamiento de las señales analógicas pudo crear sistemas más flexibles, con mayor robustez. A la par del mejoramiento de los modelos estadísticos, los sistemas de adquisición de señales y sistemas de procesamiento se perfeccionaron de igual forma. Para este proyecto se pretendió crear un sistema de reconcomiendo de voz capaz de reconocer un vocabulario que comprende comandos de posición. Este sistema se pretendía implementar en un sistema robótico de apoyo para personas con problemas motrices parciales, enfocado

para dar soporte dinámico en tareas diarias. Debido a que este sistema robótico estaría funcionando esporádicamente todo el día y se requiere la mayor portabilidad posible, esto quiere decir que el sistema no debe depender de estar conectado a internet, debe ser un sistema que demande bajos recursos energéticos y de procesamiento. A pesar que, actualmente existen muchos de sistemas reconocimiento de voz, la gran mayoría de estos hacen procesamiento en la nube y algunos de los sistemas offline requieren de hardware especifico o no tienen la precisión adecuada para esta aplicación. Es importante recalcar que debido al corto tiempo para desarrollar el proyecto, se evitó implementar un sistema desde cero. Y finalmente, debido a que se pretendía probar en la Ciudad de Quebec, se pretendió crear modelos personalizados en inglés y francés. Se seleccionaron dos distintos sistemas de detección: TIesr Speech Recognition System y CMUSphinx. Cada uno de estos representa una opción viable con sus respectivas ventajas y desventajas que se analizaran a lo largo de este documento. Además, es muy importante resaltar que gran parte del material audiovisual utilizado en este reporte proviene de una serie de tutoriales realizados por el propio investigador y estudiante Erick Martínez Blas como apoyo al departamento de Ingeniería Mecánica. En estos tutoriales se explica más a detalle todos los pasos para lograr instalar y programar las aplicaciones, debido a que cada tutorial requirió de la aplicación de más 30 pasos por sistema de reconocimiento, se decidió dejar algunos pasos como apoyo para el reporte, pero la demás información se deja fuera de la extensión de este documento. Marco Teórico El reconocimiento de voz sigue siendo todo un reto para los investigadores. El problema recae en la naturaleza de la señal y que en muchas ocasiones se requiere de un cierto grado de comprensión para que ciertas palabras puedan tener significado. Como ya se ha mencionado anteriormente, el modelo más utilizado para estas aplicaciones es el llamado Hidden Markov, el cual utiliza ciertos algoritmos estocásticos de redes neuronales, en donde una vez que se obtiene una señal se compara con un árbol de decisiones que el cual toma la secuencia de palabras que tengan más sentido en un cierto contexto. Como otras redes neuronales este modelo tiene que ser entrenado por una serie datos de referencia. Que, para esta aplicación comúnmente se utilizan tres diferentes niveles: se utiliza un modelo de lenguaje acústico, diccionario fonético, y diccionario escrito o se puede modificar directamente un árbol de decisiones.

A pesar de que estos programas utilizan el modelo Hidden Markov de diferentes maneras y en diferentes niveles, se puede observar cierta similitud. El modelo de Markov viene de las Cadenas de Markov, que en un principio es fácil de comprender y que en bajos niveles es muy sencillo de aplicar, pero mientras vaya aumentando la cantidad de elementos a considerar en la cadena de decisiones su complejidad aumentara en la misma medida. Este modelo como su nombre lo indica y explicada de una manera simplificada se basa en la demostración y comparación de una serie de eventos estadísticos para los cuales se tiene que definir una serie de probabilidades y esas probabilidades se plasman en el árbol de decisiones entonces existen distintas probabilidades para todas las posibles combinaciones en el árbol de decisiones. Entonces, en el Hidden Markov Model reconoce los patrones probabilísticos en para ser reconocidos en el proceso estocástico comprendida por una o más cadenas de Markov. Las características de estos modelos es que las cadenas deben de ser finitas y también así el conjunto de distribución de probabilidad de resultados. Entonces cuando se aplica al reconocimiento de voz, la mayoría de las veces se obtiene mediante un algoritmo de retroactivo que asigna una probabilidad para un vector futuro de un estado de Cadena de Markov. Cuando se entrena un modelo por medio del algoritmo Viterbi, se construye un árbol de decisiones con la información del diccionario fonético con la cual se construirían los nuevos vectores. Así se encuentra la combinación más probable al comparar el modelo con la señal de entrada y se fuerza a esa posibilidad. En cuanto al modelo acústico, se pueden grabar muestras de las palabras o de los fonemas a replicar, el número de muestras puede variar dependiendo si se requiere que sea dependiendo o independiente del hablante. Para algunos sistemas de reconocimiento de voz se necesitan alrededor de 500 muestras para una sola palabra para poder crear un modelo independiente del hablante. Y existen algunos proyectos de código abierto en donde se pretende crear una colección de palabras para lenguajes completos. Cuando se procede a crear el diccionario fonético, se pretende reducir un conjunto de palabras a sus mínimas silabas fonéticas que finalmente construyen la pronunciación de una palabra; existen algunos modelos que permiten introducir diferentes pronunciaciones para estas palabras. Cuando se crea el modelo de lenguaje o árbol de decisiones, se basa en las entradas para el diccionario fonético, en esta se establecen diferentes niveles de interacciones entre cada una de las palabras. Esto puede ser a nivel monófona, bífona, o trífona, generalmente se establece solo hasta trífona puesto que si se considera un nivel más de interacción el modelo se vuelve demasiado grande como para

ser practico. Cuando se habla del nivel de monófonos se establecen las probabilidades que aparezca una sola palabra en cualquier contexto, por ejemplo si se trabajara con un amplio modelo del español, existiría una mayor probabilidad generalmente que si se dice la palabra “Él” (ya que es un pronombre muy usado en el idioma) a una palabra como “elefante” que se utiliza en menos contextos. Se podría decir que solo se considera, para este nivel, la sola probabilidad de aparición de una palabra más que una interacción. En el nivel de bífonos se establece la probabilidad de interacción entre dos palabras del diccionario, también se consideran el silencio antes o después de una palabra. Y en el último nivel se pueden establecer las interacciones entre dos o tres palabras (contemplando un silaba de silencio). La voz es una señal análoga que se propaga por medio de ondas causada por vibraciones a diferentes frecuencias, el límite de audición se encuentre aproximadamente desde los 20 Hz hasta 20KHz. Esta señal se encuentra formada elementalmente por senos y cosenos aunque su construcción llega a ser muy compleja. Dentro de las características de la señal de voz se pueden observar algunos comportamientos estadísticos, estos son: la función de densidad de probabilidad, estacionariedad y ergocidad. La función de densidad se puede estimar mediante un histograma de las amplitudes sobre un numero suficientemente grande representativo de la señal, que pueden ser por distribuciones laplaciana o distribución gama. Aunque para la señal de voz depende mucho los intervalos de tiempo en los que se analice la señal. Si los intervalos ese encuentran entre los 20 y 60 ms se procede más típicamente al uso del modelo ergodico. Para simplificar la obtención de señales de voz, se supone entonces que la señal es casi estacionaria y con ergodicidad solo en intervalos largo puede cambiar esta condición. Desarrollo: El primer sistema de desarrollo se trata del producido por Texas Instruments, este sistema requiere de un hardware especializado para poder implementarse, se trata del DSP (Procesador de Señal Digital) de la familia C5000, que justamente son procesadores diseñados para aplicaciones de baja energía, y que debido a sus especificaciones permite un paralelismo para ejecutar los algoritmos de redes neuronales para generar las coincidencia. Este mismo procesador está presente en diversos productos electrónicos como grabadoras y micrófonos. Por lo que la primera aproximación se logró por medio del kit de desarrollo C5535 eZdsp el cual incluye el DSP C5000. Este procesador ocupa una librería específica para la implementación del reconocimiento de voz desarrollado por la propia empresa Texas

Instruments bajo el nombre de TIesr Speech Recognition. El sistema de biblioteca TIesr es el kit de herramientas que permite a los dispositivos DSP C5535 y C5545 ejecutar comandos de activación por voz que imprime una palabra clave pre programada en la pantalla OLED de la placa, basada en la palabra clave. Además, este diseño también permite la creación de frases de activación personalizadas y varias otras aplicaciones, como modulación de voz, detección de tonos, etc.

Ilustración 1:C5535

Ilustración 2: C5545

Para lograr este cometido hay que entender que para desarrollar una aplicación utilizando un dispositivo de la familia Texas Instrumentas se deben instalar todos los toolkits para funcionar a la par de Code Composer Studio (plataforma de desarrollo para programación de la familia TI). En este desarrollo se utilizó la versión 7.4 ya que la versión más reciente 8.1 mostró varias veces problemas de compatibilidad con algunas herramientas de la librería, además que continuamente se presentaba error de conexión de tipo puerto serial. Una vez cargado CCS, se deben actualizar e instalar algunas librerías que se muestran a continuación:

Ilustración 3: Actualización importantes

Para comprobar una buena instalación, se procede a cargar el Demo que contiene una sola frase de activación y que puede estar corriendo de forma continua. Existen algunos otros proyectos de demostración, pero todos estos proyectos deben estar optimizados para el chipset adecuado (en este caso C5535) y compatible con las versiones de 2013-2015 ya que el desarrollo de esta librería empezó en esos años y algunas funciones no están habilitados para versiones más recientes tanto de BIOS como de CCS. Algunas imágenes de los proyectos y de configuraciones de compatibilidad se muestran a continuación:

Ilustración 5: Demo de proyectos Ilustración 4: Navegación de Proyectos

Ilustración 6: Compatibilidad Bios Ilustración 7: Compatibilidad en programa

Una vez compilado y cargados estos proyectos en la placa, se puede proceder a conectar un micrófono al eZdsp C5535 y se puede comprobar su funcionamiento diciendo la palabra de activación “t i voice trigger” la palabra se presenta en la pantalla OLED como se muestra en la siguiente figura:

Ilustración 8: Ejemplo de activación

Para desarrollar un programa y aplicación propios se encontró con el inconveniente que para crear modelos de Hidden Markov, se debía bajar herramientas de terceros con el nombre de HTK Speech Recognition y para crear un árbol de decisiones (necesario para crear vocabularios específicos para nuevos lenguajes). A pesar de que se sigue utilizando la familia de los C5000 la aplicación de reconocimiento de voz casi no tiene soporte, y al final eso dificultó en gran medida la capacidad de completar un diccionario personalizado. Es por eso que se decidió utilizar CMUSphinx. CMUSphinx CMUSphinx es un ambiente de desarrollo especializado en reconocimiento de voz de código abierto. Actualmente este sistema tiene versiones especializadas para dispositivos móviles con Android, esto quiere decir que no depende de hardware específico para poder correrlo. A pesar de eso, se recomienda la plataforma de desarrollo de Rasberry Pi debido a que el código para esta aplicación, a diferencia del TIesr Speech Recognition, se encuentra escrito totalmente en Python. Y puede ser desarrollado y probado con la ayuda de una laptop, lo que facilita enormemente, sin mencionar que existe mucha más información en internet para desarrolladores sin tener que pasar por foros o chats de alguna empresa. También cabe mencionar que es recomendable desarrollar en el sistema operativo Linux Ubuntu 14.04 ya que evita problemas de compilación. Antes de empezar el desarrollo de estas aplicaciones se necesitan instalar ciertas dependencias en Ubuntu. Existe mucha documentación al respecto pero aquí se muestran los más importantes:

Ilustración 9: Instalación en Ubuntu

Ilustración 10: Lista de dependencias

La versión a instalar para la aplicación prevista se denomina sphinxbase. Sphinxbase es una versión optimizada para sistemas de bajos recursos, con alta velocidad de respuesta y que ya tiene integrados todas las herramientas para entrenar un nuevo modelo, implementar un diccionario propio y correrlo para más aplicaciones. Este sistema ya incluye una opción de reconocimiento de voz independiente del hablante, pero debido a que tiene un muy amplio vocabulario, no era práctico para una aplicación con un vocabulario limitado a 15 diferentes comandos. Este sistema resulto tener una interfaz más intuitiva para el desarrollador ya que tanto el diccionario fonético como el de lenguaje o árbol de decisiones podía ser editado mediante un script, y el modelo acústico podía ser entrenado en base a grabaciones de audio a menos de 16 MHz con la posibilidad de ser entrenado varias veces bajo el mismo modelo. Esto, aunado al hecho que se podían ocupar entradas de micrófono de la laptop para hacer las pruebas, hizo que la experimentación fuera un proceso más fluido, que se podía acceder mediante el command window bajo un sencillo argumento. Otra de las grandes ventajas de Pocketsphinx es que existe una gran comunidad de desarrolladores y documentación para diferentes aplicaciones. Por ejemplo, a pesar que el modelo acústico del idioma inglés viene predefinido, para crear un modelo acústico del francés con sus diferentes pronunciaciones propias de la región de Quebec, hubiese requerido

al menos 20 horas de grabaciones para un vocabulario muy reducido. Cuya obtención habría requerido de al menos dos semanas para catalogar e implementar en el entrenamiento de las redes neuronales. En vez de eso fue posible descargar un modelo acústico francés, que se adecuo en cierta medida a nuestra aplicación. Algunas imágenes del sistema se muestran a continuación:

Ilustración 11: Reconocimiento predefinido

Ilustración 12: Programa en funcionamiento

Resultados: A pesar que el programa de detección predefinido utilizado por Pocketsphinx reunía todas las características demandadas por el sistema, la detección de palabras dejaba mucho que desear. Se hicieron algunas pruebas utilizando el diccionario que incluye dicho sistema predeterminado y se encontró que no detectaba la palabra deseada en la mayoría de los casos mostrando una fiabilidad del 22%, misma que no podía ser aceptada bajo los términos del proyecto. La razón de esta disparidad es que al ocupar el programa determinado de detección de palabras en idioma inglés, se utiliza todo el vocabulario que se ha entrenado en esa red neuronal para intentar reconocer las palabras.

Aunque cabe mencionar que existía la

posibilidad de un error por una deficiente obtención de audio debido al micrófono o una mala pronunciación del investigador, se descartó dicho error al probar el sistema con algunos angloparlantes y diferentes sistemas de grabación. Logrando aumentar la fiabilidad del sistema hasta un 45%, lo que sigue siendo un rendimiento bajo si se pretende dar órdenes a un robot que potencialmente podría representar un peligro no solo para las personas alrededor sino para el propio usuario. A continuación se muestran algunas pruebas utilizando la palabra “backward”, que es parte de una serie de 12 diferentes comandos que se tomaron como referencia para crear un vocabulario:

Ilustración 13: Prueba "backward" 1

Ilustración 14: Prueba "backward" 2

Como se observa, a pesar que se pretendió detectar backward, se detectaron palabras que carecían de sentido en este contexto. Además que el programa, realmente no cumplía con las demás necesidades de simplicidad para poder ser ocupado por un usuario. Por lo que se procedió a la creación de un programa propio con un árbol de decisiones, entrenado mediante prueba y error y un diccionario propio. El código se muestra a continuación:

Ilustración 15: Muestra programa final

Ilustración 16: Muestra vocabulario final

Al disminuir el tamaño del vocabulario se logró aumentar la fiabilidad de detección hasta un 90% teniendo solamente un confusión de palabras en la presentación final. Cabe destacar que

no se puede mostrar el árbol de decisiones no solo por lo extenso, sino porque el formato es incompatible con los programas de visualización de Windows (recordando que se desarrolló en Ubuntu). Además se logró generar el mismo vocabulario en francés, con una menor fiabilidad que se supone se debe a que el modelo acústico en francés no esta tan detalladamente desarrollado como el de inglés. Y para eliminar cualquier anomalía o activación en falso, se logró implementar una palabra de activación que servía como referencia para el programa y el usuario permitiendo mayor libertad sin restricciones a por ejemplo decir forward o backward en medio de una conversación sin miedo que se activara el brazo. A pesar que se logró un gran avance, debido al tiempo de la estadía no fue posible terminar por completa la implementación con el brazo robótico como se pretendía. Pero se lograron las bases para que se pudiera empezar a implementar los algoritmos de posición y movimiento por medio de comandos de voz. Logrando así, cumplir con el propósito de la estadía.

Conclusión: El reconocimiento de voz es un complejo sistema que requiere que muchos procesos funcionen al mismo tiempo para poder interpretar algo que para la mayoría de nosotros es muy normal. Aunque no lo parezca a simple vista, el modelo matemático y estadístico detrás de esta clase de sistemas requiere un procesamiento y algoritmos muy optimizados y que a pesar que se utilizan redes neuronales, el usuario es quien a final de cuentas tiene la capacidad de entrenar a estos sistemas con fines específicos. Este proyecto requirió de características muy específicas por las cuales se decidió utilizar dichos sistemas, pero hoy en día podemos encontrar esta clase de sistemas en todos lados, al alcance de nuestra mano muy probablemente tenemos uno. Pero eso no significa que el reconocimiento de voz este totalmente desarrollado. Siguen existiendo muchos esfuerzos para mejorar y hacer más accesible esta clase de tecnología para todos y en todos los idiomas. Justamente, el propósito de mi proyecto se centraba en encontrar otra forma de facilitar el día a día a una persona discapacitada motrizmente, lo cual aumenta el grado de responsabilidad a este sistema. Analizando más a fondo, también es importante hacer la observación que muchas veces el desarrollo de las aplicaciones no van a la par del desarrollo de sistemas operativos o de descubrimientos tecnológicos y que fácilmente un proyecto puede ser incompatible y traer

muchos problemas al intentar desarrollar en dicha aplicación. Aparte de estos resultados se obtuvieron otras comparativas que tuvieron que ser dejadas al margen para no desviar el motivo de este reporte, pero que son igualmente importantes. Como la aplicación de otros modelos más modernos que incluyen un grado de Deep learning el cual se encuentra aún en grado experimental para poder implementarlo correctamente. Y también existe mucha área de oportunidad para seguir mejorando el sistema creado y hacerlo más robusto y seguro para el usuario, aunque se requeriría al menos otros tres meses para llegar a un estado en el que pueda ser implementado de forma segura con un usuario. Fuentes: http://www.ti.com/product/TMS320C5535 https://www.happyscribe.co/blog/history-voice-recognition/ https://web.stanford.edu/~jurafsky/slp3/ed3book.pdf https://www.fceia.unr.edu.ar/prodivoz/banco_filtros_bw.pdf https://cmusphinx.github.io/ http://www.ti.com/lit/ug/tidubj5a/tidubj5a.pdf https://www.hearinglink.org/living/loops-equipment/speech-recognition-systems/ https://en.wikipedia.org/wiki/Code_Composer_Studio http://htk.eng.cam.ac.uk/ https://sonix.ai/history-of-speech-recognition https://mi.eng.cam.ac.uk/~mjfg/mjfg_NOW.pdf