UNIVERSIDAD NACIONAL DEL CALLAO FACULTAD DE INGENIERÍA INDUSTRIAL Y DE SISTEMAS RECONOCIMIENTO DE VOZ PARA CONVERTIR EL DISCURSO HABLADO EN TEXTO APLICANDO REDES NEURONALES ARTIFICIALES SALLY KARINA TORRES ALVARADO (RESOLUCIÓN RECTORAL No 416-2010-R) (01 de Abril 2010 – 30 de Setiembre 2011) CALLAO 2011 1. RESUMEN Como alternativa muy fácil y rápida de comunicación entre el usuario y una maquina es el uso de lenguaje natural hablado. Una de las primeras fases para la creación de interfaces inteligentes para las maquinas con lenguaje natural hablado es la captura del los sonidos y convertirlos a texto escrito. Para esto es necesario capturar los sonidos en archivos de WAV (VER APENDICE A) y procesar para extraer los datos (VER APENDICE B), que son señales de forma particular de acuerdo a cada fonema capturado, esta diferencia de la señal se utiliza para realizar el reconocimiento. Como propuesta de solución al problema de reconocimiento de fonemas, en este proyecto se propone el uso de redes neuronales artificiales, para lo cual se necesita crear una red por cada fonema del lenguaje. De esta forma durante el trascurso de fonemas emitidos, que forman palabras en un discurso en el tiempo se activan una secuencia de redes neuronales correspondientes a los fonemas reconocidos y pueden ser escritos en archivos de texto. Para la implementación del procesamiento del sonido y las redes neuronales artificiales se usa un lenguaje Visual C++ que permite una gran velocidad de cálculo ya que requiere una gran cantidad de neuronas artificiales para cada fonema. 2 2. INTRODUCCIÓN La manera natural y más rápida de comunicación entre personas es el lenguaje natural hablado, emitido como una secuencia de sonidos que conforma las palabras y a su vez un conjunto de palabras forman un discurso que contiene información. La evolución de las interfaces hombre también se orientan a una comunicación mediante el lenguaje natural hablado, lo que hace necesario desarrollar innovadoras tecnologías que permitan convertir el discurso hablado en texto que se pueda almacenar en una computadora en forma de archivo para luego realizar las faces restantes de procesamiento de lenguaje natural. Para convertir el discurso oral es necesario realizar un proceso de reconocimiento de voz la cual es una tarea muy compleja debido a todos los requerimientos que le son implícitos. Además del alto orden de los conocimientos que en ella se conjugan, deben tenerse nociones de los factores inmersos que propician un evento de análisis individual (estados de ánimo, salud, etc.). La historia esencial de los sistemas de reconocimiento de voz se puede resumir con los siguientes eventos: • Los inicios: años 50’s Bell Labs. Reconocimiento de dígitos aislados monolocutor. RCA Labs. Reconocimiento de 10 sílabas monolocutor. University College in England. Reconocedor fonético. MIT Lincoln Lab. Reconocedor de vocales independiente del hablante. 3 • Los fundamentos: años 60’s – Comienzo en Japón (NEC labs) Dynamic Time Warping (DTW – Alineación Dinámica en Tiempo -). Vintsyuk (Soviet Union). CMU (Carnegie Mellon University). Reconocimiento del Habla Continua. HAL 9000. • Las primeras soluciones: años 70’s - El mundo probabilístico. Reconocimiento de palabras aisladas. IBM: desarrollo de proyectos de reconocimiento de grandes vocabularios. Gran inversión en los EE. UU.: proyectos DARPA. Sistema HARPY (CMU), primer sistema con éxito. • Reconocimiento del Habla Continua: años 80’s - Expansión, algoritmos para el habla continua y grandes vocabularios Explosión de los métodos estadísticos: Modelos Ocultos de Markov. Introducción de las redes neuronales en el reconocimiento de voz. Sistema SPHINX. • Empieza el negocio: años 90’s - Primeras aplicaciones: ordenadores y procesadores baratos y rápidos. Sistemas de dictado. Integración entre reconocimiento de voz y procesamiento del lenguaje natural. • Una realidad: años 00’s - Integración en el Sistema Operativo 4 Integración de aplicaciones por teléfono y sitios de Internet dedicados a la gestión de reconocimiento de voz (Voice Web Browsers). Aparece el estándar VoiceXML. Algunos de los métodos usados son Bancos de Filtros, Codificación Predictiva Lineal, Modelos Ocultos de Markov, Redes Neuronales Artificiales, Lógica Difusa, Sistema de reconocimiento híbrido, etc. Esta tecnología debe se eficiente en cuanto a uso de recursos de la computadora por lo que se requiere métodos y principios sofisticados, que en la actualidad ofrecen novedosos métodos de inteligencia artificial, específicamente las redes neuronales artificiales se caracterizan por el baja usos de recursos computacionales. En base a lo expresado, el problema de la presente investigación se plantea de la siguiente forma: ¿Es posible convertir el discurso emitido por las personas en texto realizando el reconocimiento de la voz aplicando redes neuronales artificiales? Planteándose como objetivo de Implementar el reconocimiento de voz mediante redes neuronales artificiales que permitan convertir el discurso hablado de las personas a texto, Para lo cual se: a. Realiza la captura de la voz de un discurso en un formato digital mediante la computadora. b. Estudia las características de la voz que conforma el discurso. 5 c. Realiza el reconocimiento de voz para convertir el discurso hablado en texto. Cabe destacar que la presente investigación se justifica ya que en la actualidad se requiere de aplicaciones computacionales con interfaces inteligentes que sean capaces de operar mediante órdenes habladas, capturar dictados, etc. Estas aplicaciones requieren de un modulo que permita convertir el discurso hablado en texto escrito. Uno de los métodos para lograr la conversión, es realizar reconocimiento de voz aplicando redes neuronales artificiales. En este contexto la presente investigación hace un gran aporte tecnológico ya que permitirá implementar las aplicaciones que requieran capturar en forma escrita el discurso hablado por las personas. 3. MARCO TEÓRICO Para convertir el discurso hablado a texto escrito es necesario capturar el discurso mediante un micrófono conectado a una computadora y guardarlo en el disco duro en forma de archivo utilizando un aplicación en un formato que sea fácil de manipular para lo cual se usa WAV (APÉNDICE A). Los fonemas emitidos durante un discurso hablado forman señales, (APÉNDICE A) en donde se pueden apreciar separados: por silencios los fonemas y por silencios mas grandes las palabras.Esto se puede utilizar para separar los fonemas y palabras. Para reconocer los fonemas se aplica redes neuronales artificiales (JANG 2007) de perceptrones que son muy eficientes para reconocer formas. 6 El pre – procesamiento de imágenes consiste en la obtención de los pixeles de la imagen, binarización y expansión/reducción se utilizan algoritmos implementados en un programa en Visual C++. La fase de expansión/reducción permite estandarizar el tamaño de la imagen a uno predeterminado ya que la red neuronal tiene un número predefinido de entradas. El aprendizaje de la red neuronal consiste en ajustar los pesos de las entradas de cada una de las neuronas, aplicando un método de backpropagation modificado, el cual se basa en un método heurístico computacional, que modifica los pesos que influyen en la salida correspondiente. El funcionamiento del sistema consiste en realizar el pre - procesamiento de la imagen de la voz, y realizar el algoritmo de cálculo de la red, el cual consiste en calcular la sumatoria de los productos de las entradas de cada neurona, pasar por la función de activación y propagar el resultado hacia delante hasta llegar a la capa de salida. Este algoritmo esta implementado en Visual C++. El tiempo de reconocimiento siempre es el mismo y no es afectado por el tipo de datos que se ingresen al sistema. El discurso genera un secuencia de fonemas en el tiempo (VER APENDICE B) los cuales son reconocidos por un conjunto de redes neuronales artificiales que se activan en una secuencia de acuerdo a la aparición de fonemas en el tiempo mientras una persona habla una secuencia de palabras que conforman las frases para comunicarse. Esta activación en secuencia de las diversas redes se utiliza para escribir el resultado en un archivo de texto. 7 4. MATERIALES Y METODOS 4.1. El Universo.- Son todas las organizaciones estatales y privadas donde se necesiten aplicaciones que utilicen el modulo de conversión de discurso hablado a texto escrito. 4.2. Técnicas de recopilación de datos.- La presente investigación es de tipo tecnológica – experimental, en la cual se utilizo las siguientes técnicas de recopilación de datos: Exploración conceptual y experimental para determinar la mejor herramienta para capturar la voz del discurso hablado y guardarlo en forma de archivo de sonido. Exploración conceptual y experimental para determinar los fonemas que conforman del lenguaje español hablado. Exploración conceptual y experimental determinar las características de la voz emitiendo los fonemas. Exploración conceptual y experimental para determinar las herramientas tecnológicas de programación para implementar la posible solución al problema planteado en la presente investigación. Para la contrastación de la hipótesis se utiliza resultados de la implementación experimental de un prototipo que permite verificar la conversión de los fonemas en texto. 8 4.3. Técnicas estadísticas.- La presente investigación no requiere la aplicación de técnicas estadísticas ya que el reconocimiento de voz no es un proceso estocástico. Cabe destacar que ninguna de las variables influyentes en la presente investigación, tienen un comportamiento estocástico, excluyendo de esta forma la aplicación de técnicas estadísticas. 4.4. Materiales.- Para la realización del experimento es necesario los siguientes materiales: Computadora Core 2 DUO: Disco duro de 250 GB; RAM 2 GB; monitor; teclado; o cualquier equipo superior. 4.5. Micrófono para capturar el sonido. Software de captura de sonidos. Sistema operativo Microsoft Windows. Lenguaje de programación Microsoft Visual C++. Archivos WAV con los fonemas grabados por distintas personas. Procedimiento.- Para ejecutar el experimento se debe: Copiar el código fuente en la computadora con Visual C++ 6.00 en el disco C desde la carpeta /voz del CD. Ejecutar el programa con Visual C++ 6.00. Hacer el proceso de aprendizaje de fonemas con el programa de aprendizaje (APÉNDICE D). 9 Verificar el reconocimiento de fonemas con el programa de reconocimiento (APÉNDICE E). 5. RESULTADOS Mediante un micrófono conectado a una computadora y la aplicación grabadora de sonidos de Windows, se capturo fonemas en formato WAV. Utilizando el prototipo de programa en Visual C++ 6.00 (APÉNDICE C) que lee los datos de acuerdo al formato WAV (APÉNDICE A) se construyo las imágenes de la señal de sonido captada para cada fonema (APÉNDICE B) en los archivos WAV. Estas imágenes nos permitió determinar, que cada fonema generaba una señal semejante de diferente frecuencia, que depende de el tono de emisión del fonema, es decir si es agudo la frecuencia es mayor o cuando es grave la frecuencia se reduce. En base a que la forma es la misma y solo difiere en la frecuencia entonces se opto por aplicar un red neuronal de perceptrones (JANG 1997) que nos permite reconocer formas, con facilidad para reconocer un fonema, salvo que se tiene que hacer un estiramiento o encogimiento de la imagen para lograr una forma estándar de cada fonema. Utilizando el prototipo de programa en Visual C++ 6.00 (APÉNDICE D) se realizo el proceso de aprendizaje de la red neuronal artificial para las imágenes generadas por las cinco vocales (APÉNDICE B). Y se comprobó el reconocimiento del fonema con el prototipo en Visual C++ (APÉNDICE E). De esta forma la presente investigación ha permitido comprobar que utilizando redes neuronales artificiales es posible reconocer los fonemas que conforman el 10 lenguaje español los cuales a su vez forman palabras que conforman un discurso hablado, al ser reconocidos estos fonemas se pueden escribir la secuencia de letras reconocidas. El resultado de la presente investigación genera la experiencia científica y tecnológica en la implementación de sistemas de reconocimiento de voz mediante redes neuronales artificiales en un lenguaje de programación común como es el Visual C++ y lo mas importante es que se ha obtenido los algoritmos de implementación. Los resultados obtenidos durante la presente investigación demuestran la hipótesis planteada. 6. DISCUSIÓN Si bien muchas empresas de países desarrollados ofrecen aplicaciones de reconocimiento de voz pero no existen aplicaciones de uso masivo, que integren los sistemas operativos de las computadoras o sistemas en general y por otro lado son aplicaciones cerradas donde no es posible saber cómo han sido realizadas lo que nos dificulta la aplicación generalizada en sistemas computacionales. En esta investigación se planteo resolver este problema de reconocimiento de voz utilizando redes neuronales artificiales logrando obtener y probar el método para implementar el reconocimiento de voz en cualquier lenguaje de programación. De esta forma en la presente investigación se ha logrado cumplir con el objetivo de implementar el reconocimiento de voz aplicando redes neuronales artificiales con herramientas básicas de programación como es el Visual C++ y puede ser 11 desplazado a cualquier tipo de lenguaje de programación que tenga la posibilidad de manejo de archivos y matrices, de esta forma no es necesario la adquisición de costosas librerías desarrollada para tales fines, logrando el desarrollo tecnológico en esta área. Complementándose como un gran beneficio que ha sido implementado utilizando las redes neuronales que requieren un bajo procesamiento, lo cual permite implementar el sistema en computadoras personales de bajo costo lo que hace posible la utilización de esta alta tecnología, y da acceso a organizaciones y empresas con bajos recursos. 7. REFERENCIAS 7.1. BATES, JON. TOMPKINS, TIM. microsoft Visual C++ 6, Madrid: Prentice Hall Iberia S.R.L. 1ra, 1999. 7.2. CEBALLOS, FCO. JAVIER. Microsoft Visual C++ 6 Programación Avanzada en Win32, México: Alfaomega grupo editor S.A. 2da, 1999. 7.3. Fayin, L. Wechsler, H. Open Set Face Recognition Using Transduction. IEEE Transactions on Pattern Analysis and Machine Intelligence, November 2005, v.27 n.11, p.1686-1697. 7.4. JANG, J. -S. R. SUN, C. –T. MIZUTAMI, E. Neuro – Fuzzy and Soft Computing A Computational Approach to Learning and Machine Intelligence, Upper Saddle River: Pretice Hall INC., 1ra, 1997. 7.5. NILS, J. NILSON. Inteligencia artificial Un nueva síntesis, Madrid: McGrawHill/Interamericana de España S.A.U., 1ra, 2000. 12 7.6. OROPEZA RODRÍGUEZ J. Algoritmos y Métodos para el Reconocimiento de Voz en Español Mediante Sílabas. Mexico, Computación y Sistemas Vol. 9 Núm. 3, pp. 270-286, 2006. 7.7. Rowley, H. Baluja, S. Kanade T. Neural Network-Based Face Detection. IEEE Transactions on Pattern Analysis and Machine Intelligence, January, 1998, Vol. 20, No. 1, pp. 23-38. 7.8. STUART, RUSSELL. PETER, NORVING. Inteligencia artificial Un enfoque moderno, México: Pretice Hall Hispanoamerica S.A., 1ra, 1996. 13 8. APÉNDICE APÉNDICE A. Especificación de formato wave. Descripción.- El formato wave es nativo de Windows y sirve para almacenar datos de audio y es usado por la mayoría de aplicaciones de audio. Estructura del archivo wave.- Los archivos wave usan el estándar RIFF, que consisten en almacenamiento de datos de audio en porciones separadas que contienen su propia cabecera y datos. La cabecera de la porción contiene el tipo y el tamaño de datos. Cabecera del archivo wave.- Los primeros 8 bytes contiene el identificador de porción y el tamaño de los datos que es igual al tamaño de archivo menos 8 bytes. Offset Size Description Value 0x00 4 Chunk ID "RIFF" (0x52494646) 0x04 4 Chunk Data Size (file size) - 8 0x08 4 RIFF Type 0x10 "WAVE" (0x57415645) Wave chunks Formato de la porción.- El formato contiene información sobre cómo está almacenado los datos y como deben ser reproducido incluyendo el formato de compresión, numero de canales, periodo de muestreo, bits por muestreo y otros. Offset Size Description Value 14 0x00 4 Chunk ID "fmt " (0x666D7420) 0x04 4 Chunk Data Size 16 + extra format bytes 0x08 2 Compression code 1 - 65,535 0x0a 2 Number of channels 1 - 65,535 0x0c 4 Sample rate 1 - 0xFFFFFFFF 0x10 4 Average bytes per second 1 - 0xFFFFFFFF 0x14 2 Block align 0x16 2 Significant bits per sample 2 - 65,535 0x18 2 Extra format bytes 0x1a 1 - 65,535 0 - 65,535 Extra format bytes * Códigos de compresión Code Description 0 (0x0000) Unknown 1 (0x0001) PCM/uncompressed 2 (0x0002) Microsoft ADPCM 15 6 (0x0006) ITU G.711 a-law 7 (0x0007) ITU G.711 µ-law 17 (0x0011) IMA ADPCM 20 (0x0016) ITU G.723 ADPCM (Yamaha) 49 (0x0031) GSM 6.10 64 (0x0040) ITU G.721 ADPCM 80 (0x0050) MPEG 65,536 (0xFFFF) Experimental Datos de audio.- Contiene los datos de audio de cada muestra que debe ser decodificada d acuerdo a método de compresión especificado en la cabecera. Offset Length Type Description Value 0x00 4 char[4] chunk ID "data" (0x64617461) 0x04 4 dword chunk size depends on sample length and compression 0x08 sample data 16 APÉNDICE B. IMÁGENES DE FONEMAS (Fuente: Elaboración propia) Letra “a” aguda Letra “a” grave Letra “e” 17 Palabra “Papa” Frase “Hola Papa” 18 APÉNDICE C. CÓDIGO FUENTE PARA LECTURA DE DATOS DE ARCHIVO WAV DE LOS FONEMAS (Fuente: Elaboración propia) x=fopen("o.wav","rb"); y=fopen("data.txt", "w"); if(!x){ exit(0); } else { fread(&son, sizeof(unsigned long), 1, x); fprintf(y, "ChunkID : %x\n", son); fread(&son, sizeof(unsigned long), 1, x); fprintf(y, "ChunkSize : %d\n", son); fread(&son, sizeof(unsigned long), 1, x); fprintf(y, "Format : %x\n", son); fread(&son, sizeof(unsigned long), 1, x); fprintf(y, "Subchunk1ID : %x\n", son); fread(&son, sizeof(unsigned long), 1, x); fprintf(y, "Subchunk1Size : %u\n", son); fread(&faudio, sizeof(unsigned short int), 1, x); fprintf(y, "AudioFormat : %u\n", faudio); fread(&canales, sizeof(unsigned short int), 1, x); fprintf(y, "NumChannels : %u\n", canales); fread(&son, sizeof(unsigned long), 1, x); fprintf(y, "SampleRate : %u\n", son); fread(&son, sizeof(unsigned long), 1, x); fprintf(y, "ByteRate : %u\n", son); fread(&canales, sizeof(unsigned short int), 1, x); fprintf(y, "BlockAlign : %u\n", canales); fread(&canales, sizeof(unsigned short int), 1, x); fprintf(y, "BitsPerSample : %u\n", canales); fread(&son, sizeof(unsigned long), 1, x); fprintf(y, "Subchunk2ID : %u\n", son); fread(&son, sizeof(unsigned long), 1, x); fprintf(y, "Subchunk2Size : %d\n", son); fprintf(y, "Datos : \n"); datson=0; datsona=0; muestra=0; muestraa=0; cmuestra=0; do{ cmuestra++; fread(&datson, sizeof(unsigned short int), 1, x); if ((cmuestra>=inigraf) & (cmuestra<=fingraf)){ muestra++; pDC->MoveTo(xc1+exe*muestraa,yc1-eye*datsona); pDC->LineTo(xc1+exe*muestra,yc1-eye*datson); muestraa=muestra; datsona=datson; } fprintf(y, "Datos : %d\n", datson); }while (!feof(x)); fclose(x); fclose(y); } APÉNDICE D. CÓDIGO FUENTE DE APRENDIZAJE DE LA RED NEURONAL ARTIFICIAL (Fuente: Elaboración propia) /* Definicion de la estructura de la red*/ sred[0]=4; sred[1]=20; sred[2]=40; sred[3]=20; sred[4]=1; int ir=0; for (int j=1;j<=sred[0];j++){ if (j==1){ for (int k=0;k<sred[j];k++){ rna[ir].m=(int)ancho*alto; rna[ir].capa=j; for (int p=0;p<rna[ir].m;p++){ rna[ir].peso[p]=rand()*0.000001; } rna[ir].k=1; rna[ir].u=6000; ir++; } } else{ for (int k=0;k<sred[j];k++){ rna[ir].m=sred[j-1]; rna[ir].capa=j; for (int p=0;p<rna[ir].m;p++){ rna[ir].peso[p]=rand()*0.000001; } rna[ir].k=1; rna[ir].u=6000; ir++; } } } int nred=0; for (int j=1;j<=sred[0];j++){ nred=nred+sred[j]; } fprintf(r,"\n\nEstrucutra de la Red\n\n"); fprintf(r,"Numero de neuronas de la red=%d\n",nred); for (int j=0;j<nred;j++){ fprintf(r,"rna[%d].m=%d : rna[%d].capa=%d : rna[%d].k=%f\n",j,rna[j].m,j,rna[j].capa,j,rna[j].k); } /* Aprendizaje */ /* Calcular la red */ float res=CalculoRed(nred); fprintf(r,"\nResultado=%f\n",res); fprintf(r,"\nm=%d\n",rna[0].m); fprintf(r,"\nu=%f\n",rna[0].u); int ne=0; float AP=0.005; float ka=0.000001; float na=0; 20 float error=0; float res1=0; unsigned int ni=0; unsigned int nia=0; float exe=dx/fx; float eye=dy/pmax; fprintf(r,"\nexe=%f\n",exe); fprintf(r,"\neye=%f\n",eye); pDC->MoveTo(xc1,yc1-eye*rna[nred-1].u); pDC->LineTo(xc1+exe*fx,yc1-eye*rna[nred-1].u); pOldPen=pDC->SelectObject(&myPen1); do{ for (int j=0;j<nred;j++){ res=CalculoRed(nred); if (res<rna[nred-1].u){ error=rna[nred-1].u+100-res; if (rna[j].capa==1){ for (ne=0;ne<rna[j].m;ne++){ if (e[ne]>0){ rna[j].peso[ne]=rna[j].peso[ne]+error*ka*e[ne]; } ni++; } } else{ for (ne=0;ne<rna[j].m;ne++){ rna[j].peso[ne]=rna[j].peso[ne]+error*ka; ni++; } } } pDC->MoveTo(xc1+exe*nia,yc1-eye*na); pDC->LineTo(xc1+exe*ni,yc1-eye*res); nia=ni; na=res; } }while (res<rna[nred-1].u); for (int j=0;j<nred;j++){ fprintf(r,"rna[%d].m=%d : rna[%d].capa=%d : rna[%d].k=%f\n",j,rna[j].m,j,rna[j].capa,j,rna[j].k); for (int pp=0;pp<rna[j].m;pp++){ fprintf(r,"%f - ",rna[j].peso[pp]); } fprintf(r,"\n\n"); } pDC->TextOut(600,300,"Fin de aprendizaje"); fclose(r); 21 APÉNDICE E. CÓDIGO FUENTE DE FUNCIONAMIENTO RED NEURONAL ARTIFICIAL (fuente: Elaboración propia). sred[0]=4; sred[1]=20; sred[2]=40; sred[3]=20; sred[4]=1; arna = fopen("red.dat","w"); fread(rna,sizeof(rna),1,arna); fclose(arna); int nred=0; for (int j=1;j<=sred[0];j++){ nred=nred+sred[j]; } /* Calcular la red */ float res=0; arna = fopen("red.dat","w"); fwrite(rna,sizeof(rna),1,arna); fclose(arna); res=CalculoRed(nred); if (res<rna[nred-1].u){ pDC->TextOut(600,300,"No reconoce el fonema"); } else{ pDC->TextOut(600,300,"Si reconoce el fonema") } float CalculoRed(int nred){ for (int n=0;n<nred;n++){ if (rna[n].capa==1){ rna[n].n=0; for (int ne=0; ne<rna[n].m;ne++){ rna[n].n=rna[n].n+e[ne]*rna[n].peso[ne]; } rna[n].a=rna[n].n*rna[n].k; } else{ int ni=0; for (int cc=1;cc<rna[n].capa-1;cc++){ ni=ni+sred[cc]; } rna[n].n=0; for (int ne=0;ne<rna[n].m;ne++){ rna[n].n=rna[n].n+rna[n].peso[ne]*rna[ni].a; ni++; } rna[n].a=rna[n].n*rna[n].k; } } return rna[nred-1].a; } 22