Reconocimiento de voz con ATmega128

Comencemos por definir exactamente qué es lo que nos proponemos, y dónde radica su dificultad.

El “reconocimiento auditivo” que practica nuestro cerebro es muchísimo más abstracto y poderoso que cualquier sistema basado en computadora, y más aun que el que presentamos aquí.

El ser humano puede reconocer una palabra pronunciada a distinto volumen, a distintas distancias, en presencia de ruido, por distintas personas, con diferentes tonos de voz, con distinta pronunciación, con distinta intención, con distinta duración, con distinta entonación, incluso con una dicción completamente deformada; puede distinguir una expresión de otra aunque las dos “suenen” igual, basándose en el contexto; puede incluso no conocer en absoluto una palabra e igualmente “entender” un mensaje, deducir qué palabra era, deducir su significado e integrarla inmediatamente a su vocabulario. Vale decir que el sistema humano consta de muchísimas “capas”, desde las más bajas, la física, el sonido mismo, hasta las más elevadamente abstractas, como el “significado”, pero articuladas entre sí de una manera difícil de modelizar desde el punto de vista informático, sin que una capa dependa estrictamente de otra, dando la impresión de que operan todas simultáneamente.

El reconocimiento de SAMSA, en cambio, no es capaz ni de la más simple de estas habilidades. Para empezar, consta de unas pocas capas, ninguna de las cuales puede considerarse mucho más abstracta que la física misma, y al contrario de lo que ocurre en el cerebro humano, el proceso de estas capas se hace una única vez, en una sola dirección, y siempre en el mismo orden.

SAMSA sólo puede reconocer las 10 palabras que “conoce”, y éstas deben ser pronunciadas por el mismo interlocutor, en el mismo tono, de la misma manera, a la misma distancia del micrófono, con la misma duración, en un ambiente silencioso, sin errores, etc., y por supuesto, SAMSA no puede extraer las palabras de una frase, sino que éstas deben presentársele en forma aislada. Talvez pueda pensarse que un sistema tan restringido es una cosa fácil de implementar. Sí, y no.

Puede sorprender a la persona con poca experiencia en audio, el hecho de que dos versiones de una misma palabra pronunciada por el mismo interlocutor y cumpliéndose todas las condiciones enumeradas arriba, pueden constituir a pesar de todo, desde el punto de vista físico, dos fenómenos radicalmente distintos. Hace falta elevarse a un nivel bastante más “abstracto” para encontrar la similitud. El primer paso, todos sabemos, es movernos al dominio de la frecuencia, pero incluso allí, si comparamos punto a punto los espectros, nos vamos a encontrar con dos fenómenos aun sumamente distintos. En cambio, si miramos las gráficas con nuestros ojos, inmediatamente notaremos el “parecido”. Bien, aquí es donde entran en juego las redes neuronales artificiales.

Toda vez que exista realmente un patrón abstracto, pero no podamos traducirlo fácilmente a una función matemática o algoritmo computacional, la red neuronal acude en nuestra ayuda. Pero claro, no podemos implementar una red neuronal con cientos o miles de nodos (1 segundo de audio muestreado por SAMSA equivale a unos 16KB de información), su consumo de recursos sería descomunal y su entrenamiento virtualmente imposible. Esto quiere decir que debemos “abstraer” de nuestro conjunto de datos, una especie de “firma” que represente al todo y conserve sus características, pero sea lo más liviana posible para introducir en una modesta red neuronal.

Las características de esa “firma” son en realidad la parte central del problema, y son a su vez la clave que nos permite explicar cómo fue posible resolverlo con los escasos recursos disponibles. Aquí la restricción de los objetivos primarios juega un papel decisivo, como veremos en los siguientes ejemplos. Imaginemos que nos proponemos crear un sistema que sea capaz de “reconocer” únicamente dos palabras: la palabra “uno” y la palabra “ornitorrinco”. Podríamos intentar con complicados análisis espectrales, pero lo cierto es que si observamos con atención, todo lo que precisamos es medir el largo de las palabras: por debajo de cierto umbral será la palabra “uno” y si supera dicho umbral, se tratará de la palabra “ornitorrinco”. Ahora imaginemos que agregamos una tercera palabra al repertorio, la palabra “dos”. Queda claro que el método anterior ya no nos sirve, necesitamos una “firma” un poco más elaborada. En cualquier caso, podríamos resumir las características de la firma que precisamos para cada problema, en las siguientes reglas:

  • que dos palabras distintas tengan firmas distintas.
  • que dos palabras iguales tengan firmas iguales o muy parecidas.
  • dos “versiones” distintas de la misma palabra pueden tener firmas distintas, siempre y cuando ninguna de ellas se “confunda” con la de una palabra distinta.

Para el caso concreto del reconocimiento de las 10 cifras decimales, hizo falta una firma de 8 datos, en la que está presente un cierto análisis espectral, más otros elementos que ya veremos. Las limitaciones que presenta surgen del hecho de que las “variaciones” de una misma palabra (distinto tono, distinta duración, distinta acentuación, presencia de ruido, etc.) arrojan firmas completamente distintas (en particular es notorio lo del tono, ya que el análisis espectral funciona con 4 frecuencias fijas) y que la red neuronal no puede evitar “confundir” la firma de una variación de una palabra con la de otra palabra.

Lo de las 4 frecuencias fijas, es algo tan arbitrario como puede ser basarse en el largo de la palabra, como veíamos en los ejemplos anteriores. Es simplemente un dato más del sonido, que bastaría, por ejemplo, para diferenciar sin problemas una palabra de un silbido, pero en cambio se muestra insuficiente para el reconocimiento de una misma palabra en interlocutores distintos. Sería algo parecido a intentar reconocer imágenes a partir de una pequeña muestra de 4 zonas distintas: si sabemos que esas zonas corresponden siempre a las mismas partes de la imagen, podemos intentarlo, pero si además la imagen puede estar movida con respecto a las 4 zonas, nos va a resultar muchísimo más difícil. 

 

Procesamiento de audio en un micro de 8 bits.

Ahora que tenemos una idea del fundamento en que se basa nuestro reconocimiento de palabras, y antes de entrar en la implementación concreta del sistema, detengámonos en los aspectos técnicos de la captura y procesamiento de audio en una plataforma como la tarjeta Wiring.

  1. Consideremos en primer término, que para poder capturar las frecuencias en las que está codificado el habla, necesitamos una tasa de muestreo cercana a los 8KHz.
  2. Los convertidores A/D de la Wiring tienen una resolución de 10 bits (pero al leerlos, el dato se almacena en una variable de 16 bits). Ignoro si su ancho de banda analógico se extiende hasta los 4KHz, también ignoro si el circuito preamplificador de micrófono tiene un espectro acorde. Lo ignoro todo respecto a filtros anti-aliasing; esto fue implementado de un modo muy “amateur”, pero recordemos que el objetivo no era hacer un grabador de alta fidelidad, sino un sistema de reconocimiento de voz: si funciona, sirve.
  3. De lo expresado anteriormente se desprende que el bitrate de esta captura de audio es de unos 64Kb/s. La memoria SRAM del microcontrolador es de 4KB, parte de los cuales es ocupada por las variables de todo el sistema del robot (por ejemplo, los servos, el display, etc.). Por lo tanto, no es posible capturar, almacenar y luego procesar (por otro lado, no sólo la capacidad de almacenamiento es limitada: si fuera posible almacenar y luego procesar, ni la velocidad del procesador ni la complejidad del programa que puede albergar estarían a la altura de lo que se precisa para esa cantidad de información).
  4. La conclusión inequívoca e importante de todo esto es la siguiente: el audio debe ser procesado a medida que es capturado, utilizando el tiempo entre una muestra y la otra, analizando las muestras a tiempo real, y almacenando directamente la “firma” que habrá de procesarse luego.

De esta manera, volvemos a caer en la importancia del algoritmo “extractor de firma”: se trata no sólo de la parte central de todo el sistema, sino también de un programa que debe correr en tiempo real, con poquísimos recursos. En esto radica el “arte” de nuestra implementación.

 

Implementación práctica.

Bueno, por fin llegamos al meollo del asunto. El siguiente esquema muestra el funcionamiento del reconocimiento de voz de SAMSA.

 

Diagrama en bloques del Reconocimiento de Voz en SAMSA

Diagrama en bloques del reconocimiento de voz en SAMSA

 

El audio es analizado mediante 4 filtros de frecuencias fijas. 32 muestras de cada filtro son promediadas y el resultado es analizado por el “algoritmo de comparación”. Este algoritmo devuelve para cada bloque de 32 muestras, un único código que “caracteriza” a dicho bloque. La misma rutina que muestrea, filtra, promedia y compara, va almacenando la descripción de cada bloque en una variable String, utilizando una especie de compresión RLE (run-length encoding), es decir, si hay 14 bloques consecutivos con la descripción ‘A’ , se escribe “A14″, etc.

Hasta ahí la parte que funciona “real time”. El resto del programa funciona off-line, y consiste en el análisis de la cadena RLE para extraer la firma (”signature”), y el pasaje de ésta a una red neuronal de 3 capas, cuyos pesos han sido previamente cargados en el programa mismo. Los pesos fueron obtenidos mediante el entrenamiento de la red con la PNN, utilizando unas 40 firmas de ejemplo para cada palabra.

 

YouTube Preview Image

 

Vayamos ahora al estudio minucioso de este algoritmo, analizando el código mismo del programa.

 

Siguiente sección –> Filtros por “correlation” recursivos

 

Compártelo:
  • Print this article!
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks