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:
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.
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