El “reconocimiento auditivo” que practica nuestro cerebro es muchísimo más sofisticado 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ísimos “niveles”, desde los más bajos, la física, el sonido mismo, hasta niveles muy elevados y abstractos, como el significado. Estos niveles (o “capas”) están articulados entre sí de una manera difícil de modelizar desde el punto de vista informático, sin que uno de ellos dependa estrictamente de otro, dando la impresión de que operan todos 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 demasiado lejos de 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.
Si alguna persona no muy familiarizada con la informática está leyendo esto, puede servirle el siguiente consejo para entender de lo que estamos hablando: póngase en el lugar de una máquina. Las cosas que a Ud. le parecen claramente “similares”, por ejemplo, dos tazas cualesquiera de café… ¿lo son en realidad? ¿Dónde radica su “similitud”? ¿Cómo puede un programa de computadora determinar ese parecido a partir de meros datos físicos?
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 hechos aun bastante diferentes. No obstante, si miramos las gráficas de estos espectros con nuestros ojos (humanos), 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 artificial acude en nuestra ayuda. Pero claro, no podemos implementar una RNA 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 nuestra implementación deberá “abstraer” del conjunto de datos primario (la digitalización del sonido, o su espectro), una especie de “firma” (signature) que represente al todo y conserve sus características, pero sea lo más liviana posible, para luego sí introducir esta firma en una modesta red neuronal.
Las características de la “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 del alcance de nuestro objetivo, 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 necesitamos 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”. En este caso nuestra firma será simplemnte el largo de la palabra. 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:
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 nuestra implementación, 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 diferentes (en particular es notorio lo del tono, ya que el análisis espectral que utilizamos funciona con 4 frecuencias fijas) y la red neuronal no puede entonces evitar “confundir” la firma de una variación de una palabra, con la de otra palabra completamente ajena.
¿Por qué utilizamos 4 frecuencias fijas? Se trata de 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 diferentes. (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.) En nuestra implementación utilizamos, por supuesto, datos fáciles de extraer, como el propio largo de la palabra, pero que no nos dicen mucho, y, en la medida de lo posible, otros datos más significativos pero costosos computacionalmente, como lo es el análisis frecuencial.
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.
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.
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.
Vayamos ahora al estudio minucioso de este algoritmo, analizando el código mismo del programa.
Siguiente sección –> Filtros por “correlation” recursivos