Tratamiento Digital de la Voz PRÁCTICA: RECONOCIMIENTO DE VOZ USANDO HTK 1 – REQUISITOS Y PREPARACIÓN 1.1 – Introducción Vamos a realizar un reconocedor de voz que transcriba las secuencias de números que le digamos. Estará basado en Modelos Ocultos de Markov, que se implementarán mediante la aplicación HTK. 1.2 – Requisitos previos Para la realización de esta práctica necesitarás un ordenador con Windows y MS-DOS, micrófono configurado y altavoces o auriculares. También deberás disponer de los ejecutables de HTK 3.3 o superior, que puede obtenerse de http://htk.eng.cam.ac.uk/ previo registro, y el archivo preparado para la práctica que se puede descargar de la página de la asignatura. 1.3 – Preparación del entorno de trabajo 1 – Copia la carpeta HTK con todo su contenido al directorio donde desees trabajar, por ejemplo, C:\HTK\. 2 – Crea la siguiente estructura de directorios: Figura 1. Estructura de directorios. 1 3 – Baja el archivo de la página de la asignatura, que contiene algunos archivos ya preparados que ahorrarán al usuario mucho tiempo grabando y transcribiendo. 4 – Almacena los archivos .sig (de la carpeta sig) en HTK\datos\sig y los archivos .lab (de la carpeta lab) en HTK\datos\lab. Estos son archivos de voz ya grabados y sus transcripciones. 5 – Almacena el archivo analisis.conf en HTK\analisis\. Este archivo contiene la configuración necesaria para el analisis de los datos de entrada. 6 – Almacena los archivos hmm_x (de la carpeta proto) en la carpeta HTK\modelo\proto, donde x es una palabra. Estos archivos contienen la definición y estructura de los HMMs que representan las palabras que reconoceremos. Puedes abrirlos con un editor de texto y observar que sólo difieren en la cabecera, ~h “x”. 7 – Almacena el archivo lista.txt en la carpeta HTK\datos\. Simplemente es una lista con la correspondencia entre las señales de voz grabadas y sus archivos de coeficientes MFCC (que son los que realmente se usan en reconocimiento). 8 – Almacena el archivo entrenamiento.txt en la carpeta HTK\entrenamiento\. Es una lista con los archivos que usaremos para entrenar los modelos. 2 – DESARROLLO DE LA PRÁCTICA 2.1 – Grabación y transcripción del corpus de entrenamiento 9 – Abre la línea de comandos de MS-DOS. Para ello, usa Inicio -> Ejecutar -> Escribe cmd y pulsa Enter. 10 – Accede al directorio de trabajo, por ejemplo C:\HTK\. Todos los comandos de la práctica se ejecutarán en ese directorio. Puedes retroceder usando cd .. en la estructura de directorios. Figura 2. Proceso de grabación y etiquetado de las secuencias de entrenamiento. 11 – Ejecuta el siguiente comando: HSLab a.sig Aparecerá la interfaz gráfica de HSLAB: 2 Figura 3. Interfaz HSLAB. 12 – Pulsa rec para comenzar y stop para parar la grabación. Graba tu voz contando de cero a nueve (una cifra por segundo), pronunciando bien los números y dejando algo de silencio entre ellos. También deja un segundo de silencio al principio y otro al final. 13 – Aparecerá la forma de onda grabada. Pulsa sobre un punto de la grabación, arrastra el ratón hasta otro punto y suéltalo. Se mostrará la zona intermedia marcada. Si lo necesitas, pulsa play para oír la forma de onda en esa zona por los altavoces. 14 - Pulsa Labelas, escribe un nombre como muestra la figura 4 y pulsa Enter. Esto etiquetará la porción de voz para que el reconocedor sepa qué se ha dicho. 3 Figura 4. Etiquetando la forma de onda 15 – Repite el proceso para las cifras de cero a nueve, y para los silencios inicial y final (etiquetados con s). No puedes usar números para las etiquetas. Debe quedar algo parecido a lo que muestra la figura 5. 16 – Pulsa Save y Enter. Luego puedes salir pulsando Quit. Figura 5. Secuencia de entrenamiento completamente etiquetada. 4 17 – En el directorio de trabajo, C:\HTK\, aparecerán dos archivos: el que contiene la forma de onda (a_0.sig) y el que contiene las etiquetas (a_0.lab). Renómbralos para que se llamen 7a.sig y 7a.lab y almacénalos en HTK\datos\sig\ y HTK\datos\lab, respectivamente. Acabas de añadir una secuencia más al corpus de entrenamiento del reconocedor, con lo que funcionará mejor. Nota: si ya había archivos llamados a_0.sig y a_0.lab en el directorio de trabajo, los archivos de salida se llamarán a_1.sig y a_1.lab. Si estos también existían, los archivos se volverán a llamar a_0.sig y a_0.lab, sobrescribiendo los originales. Por esto hay que hacer el cambio de nombre tras cada grabación y etiquetado. 18 – Repite los pasos 11-17 tres veces más, hasta disponer de las cuatro grabaciones 7a, 7aa, 7b, 7bb y sus correspondientes etiquetas. En los archivos 7a y 7aa debes haberte grabado contando de cero a nueve (en orden creciente), y en los archivos 7a y 7bb contando de nueve a cero (en orden decreciente). 2.2 – Análisis acústico Figura 6. Proceso de conversión de los datos de entrenamiento. 19 – Añade cuatro líneas al archivo datos\lista.txt en las cuales especifiques la conversión entre el archivo de voz y el vector de coeficientes. Contenido de lista.txt datos/sig/1a.sig datos/sig/1aa.sig datos/sig/1b.sig datos/sig/1bb.sig datos/sig/2a.sig datos/mfcc/1a.mfcc datos/mfcc/1aa.mfcc datos/mfcc/1b.mfcc datos/mfcc/1bb.mfcc datos/mfcc/2a.mfcc (…) (…) datos/sig/6aa.sig datos/sig/6b.sig datos/sig/6bb.sig datos/sig/7a.sig datos/sig/7aa.sig datos/sig/7b.sig datos/sig/7bb.sig datos/mfcc/6aa.mfcc datos/mfcc/6b.mfcc datos/mfcc/6bb.mfcc datos/mfcc/7a.mfcc datos/mfcc/7aa.mfcc datos/mfcc/7b.mfcc datos/mfcc/7bb.mfcc 5 20 – Edita el archivo de configuración analisis\analisis.conf con un editor de texto. Contenido de analisis.conf SOURCEFORMAT = HTK TARGETKIND = MFCC_0_D_A # Formato de los archivos de voz # Coeficientes a usar WINDOWSIZE = 200000.0 TARGETRATE = 100000.0 # 20 mseg como longitud de trama # 10 mseg como periodicidad entre tramas NUMCEPS = 12 USEHAMMING = T PREEMCOEF = 0.90 NUMCHANS = 26 CEPLIFTER = 22 # # # # # Número de coeficientes MFCC Uso de la ventana de Hamming Coeficiente de pre-énfasis Número de canales del banco de filtros Longitud del liftering en cepstrum Ajusta la duración de la ventana a 25 mseg y el coeficiente de pre-énfasis a 0 ' 97 . 21 – Para convertir las señales de voz en vectores de coeficientes MFCC, que son los que se usan en reconocimiento, ejecuta el comando: HCopy -C analisis\analisis.conf -S datos\lista.txt La carpeta datos\mfcc se ha llenado con vectores de coeficientes MFCC, que usaremos en el reconocimiento. 2.3 – Definición de los HMMs ... Figura 7. Topología elegida para los HMM. 22 – Abre el archivo de modelo\proto\hmm_s con un editor de texto. Su contenido describe el HMM asociado al silencio, y es el siguiente: 6 Contenido de hmm_s ~o <VecSize> 39 <MFCC_0_D_A> ~h "s" <BeginHMM> <NumStates> 17 <State> 2 <Mean> 39 0.0 0.0 0.0 <Variance> 1.0 1.0 1.0 <State> 3 <Mean> 39 0.0 0.0 0.0 <Variance> 1.0 1.0 1.0 <State> 4 0.0 0.0 0.0 39 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 <State> 15 <Mean> 39 0.0 0.0 0.0 <Variance> 1.0 1.0 1.0 0.0 0.0 0.0 39 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 <State> 16 <Mean> 39 0.0 0.0 0.0 <Variance> 1.0 1.0 1.0 0.0 0.0 0.0 39 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 (…) <TransP> 17 0.4 0.3 0.0 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.3 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.3 0.4 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.3 0.3 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.3 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.3 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.3 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.3 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.3 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7 23 - Como puede verse en la figura 7, el estado 1 es transitorio y de él sólo se puede ir a los dos siguientes. Modifica la matriz de probabilidades de transición para que se cumpla esto, es decir: que desde el estado 1 sea imposible volver a sí mismo, pero las transiciones a los dos estados posteriores sigan siendo equiprobables. Toda la fila de la matriz debe sumar 1. El resto de archivos de definición tienen sus matrices bien implementadas. 2.4 – Entrenamiento de los modelos Figura 8. Proceso completo de entrenamiento. Tras la inicialización, se pasa a un proceso iterativo de refinamiento del modelo. Extraído de [MOREAU]. 24 – Abre el archivo entrenamiento\entrenamiento.txt con un editor de texto. Añade a la lista los vectores de coeficientes MFCC que creaste tras la grabación. Contenido de entrenamiento.txt datos/mfcc/1a.mfcc datos/mfcc/1aa.mfcc datos/mfcc/1b.mfcc datos/mfcc/1bb.mfcc datos/mfcc/2a.mfcc (…) datos/mfcc/5bb.mfcc datos/mfcc/6a.mfcc datos/mfcc/6aa.mfcc datos/mfcc/6b.mfcc datos/mfcc/6bb.mfcc datos/mfcc/7a.mfcc datos/mfcc/7aa.mfcc datos/mfcc/7b.mfcc datos/mfcc/7bb.mfcc 8 – Inicialización 25 – Ejecuta el comando: HInit -S entrenamiento\entrenamiento.txt -M modelo\hmm0 -H modelo\proto\hmm_s -l s -L datos\lab\ s Esto inicializa (mediante alineamiento de Viterbi) el HMM que modela el silencio. Nota: antes de la s final, debe haber un espacio. Figura 9. Inicialización de los modelos con HINIT. 26 – Repite el comando para las diez cifras (de cero a nueve). Por ejemplo, para la cifra cero, sería: HInit -S entrenamiento\entrenamiento.txt -M modelo\proto\hmm_cero -l cero -L datos\lab\ cero modelo\hmm0 -H Puedes crear un archivo .bat que contenga todos los comandos: Contenido de INICIALIZA.bat HINIT -S entrenamiento/entrenamiento.txt -M modelo/hmm0 -H modelo/proto/hmm_s -l s -L datos/lab/ s HINIT -S entrenamiento/entrenamiento.txt -M modelo/hmm0 -H modelo/proto/hmm_cero -l cero -L datos/lab/ cero (…) HINIT -S entrenamiento/entrenamiento.txt -M modelo/hmm0 -H modelo/proto/hmm_ocho -l ocho -L datos/lab/ ocho HINIT -S entrenamiento/entrenamiento.txt -M modelo/hmm0 -H modelo/proto/hmm_nueve -l nueve -L datos/lab/ nueve 9 Los archivos de definición inicializados puedes encontrarlos en modelo\hmm0 (carpeta que antes estaba vacía). – Entrenamiento 27 – Para re-estimar los modelos, ejecuta: HREST –T 1 -S entrenamiento/entrenamiento.txt -M modelo/hmm1 -v 2e-3 -H modelo/hmm0/s -l s -L datos/lab/ s El algoritmo se detiene automáticamente. Aquí, -v 2e-003 es un límite inferior para la varianza, que el algoritmo necesita para converger. Figura 10. Proceso de re-estimación. Puedes crear un archivo .bat, al igual que al inicializar los modelos, que contenga todos los comandos de entrenamiento: Contenido de REESTIMA.bat HREST -S entrenamiento/entrenamiento.txt -M modelo/hmm1 -v 2e-003 -H modelo/hmm0/hmm_s -l s -L datos/lab/ s HREST -S entrenamiento/entrenamiento.txt -M modelo/hmm1 -v 2e-003 -H modelo/hmm0/hmm_cero -l cero -L datos/lab/ cero (…) HREST -S entrenamiento/entrenamiento.txt -M modelo/hmm1 -v 2e-003 -H modelo/hmm0/hmm_ocho -l ocho -L datos/lab/ ocho HREST -S entrenamiento/entrenamiento.txt -M modelo/hmm1 -v 2e-003 -H modelo/hmm0/hmm_nueve -l nueve -L datos/lab/ nueve 10 2.5 – Definición de la gramática 28 – Crea el archivo gramatica.txt en la carpeta definicion\. Su contenido deberá ser el siguiente: Contenido de gramatica.txt $numero = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; ( [.] $numero $numero $numero $numero $numero $numero $numero $numero $numero [.] ) Esto le indicará al reconocedor que debe esperar un silencio inicial, nueve cifras y un silencio final. 29 – Crea el archivo diccionario.txt en la carpeta definicion\. Su contenido deberá ser el siguiente: Contenido de diccionario.txt 0 1 2 3 4 5 6 7 8 9 . [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [] cero uno dos tres cuatro cinco seis siete ocho nueve s Este archivo le indica al reconocedor la relación entre las variables de gramática, lo que queremos que muestre y los HMM definidos anteriormente. Nota: No olvides incluir una nueva línea tras la última, para que ésta cuente. 30 – Ejecuta el siguiente comando para crear una red a partir del archivo de gramática: HPARSE definicion\gramatica.txt definicion\red.slf 2.6 – Reconocimiento de voz en vivo 31 – Crea el archivo listahmm.txt en la carpeta definicion\. Su contenido deberá ser el siguiente: 11 Contenido de listahmm.txt s cero uno dos tres cuatro cinco seis siete ocho nueve Este archivo simplemente lista los nombres de los HMMs que representan las palabras que usaremos. Nota: No olvides incluir una nueva línea tras la última, para que ésta cuente. 32 – En la carpeta configuracion\ haz una copia de analisis.conf y llámala directin.conf. Ábrela con un editor de texto y añade los siguientes parámetros: Añadido en directin.conf SOURCERATE = 625.0 SOURCEKIND = HAUDIO AUDIOSIG = -1 # 16 kHz de freciencia de muestreo # Entrada directa de audio # Reconocimiento controlado por teclado 33 – Ejecuta el siguiente comando. Puedes crear un archivo .bat: HVITE -C analisis\directin.conf -g -H modelo\hmm1\hmm_s -H modelo\hmm1\hmm_cero -H modelo\hmm1\hmm_uno -H modelo\hmm1\hmm_dos -H modelo\hmm1\hmm_tres -H modelo\hmm1\hmm_cuatro -H modelo\hmm1\hmm_cinco -H modelo\hmm1\hmm_seis -H modelo\hmm1\hmm_siete -H modelo\hmm1\hmm_ocho -H modelo\hmm1\hmm_nueve -w definicion\red.slf definicion\diccionario.txt definicion\listahmm.txt Nota: No olvides poner ninguno de los once HMMs que vamos a usar (silencio y cifras de cero a nueve). 34 - Al ejecutarlo, aparecerá un indicador READY[1]> en la pantalla, indicando que comienza la grabación en tiempo real. La grabación finalizará cuando pulsemos alguna tecla. En ese momento, se muestra la transcripción reconocida por el sistema, tras lo que se mostrará un nuevo READY[2]> esperando una nueva entrada. Prueba el reconocedor que has implementado. 12 Figura 6.11. Reconocimiento en vivo. 13