PROYECTO FIN DE CARRERA RECONOCIMIENTO DE VOZ USANDO HTK AUTOR: PABLO AGUILERA BONET TUTOR: SERGIO CRUCES ÁLVAREZ INGENIERO DE TELECOMUNICACIÓN DEPARTAMENTO DE TEORÍA DE LA SEÑAL Y COMUNICACIONES UNIVERSIDAD DE SEVILLA PABLO AGUILERA BONET RECONOCIMIENTO DE VOZ USANDO HTK 2 PABLO AGUILERA BONET NOTACIÓN s (n) Señal de voz, en general. a Coeficiente de predistorsión. NW Muestras que dura de una trama. MW Muestras de separación entre tramas. L Número de tramas. xɶ l ( n ) Señal de voz enventanada. xl ( n ) Señal de voz segmentada. w (n) Ventana para el análisis de voz. e (n) Excitación en el modelo clásico de generación de la voz. h (n) Sistema en el modelo clásico de generación de la voz. x (n) Señal de voz en el modelo clásico de generación de la voz. ŝ ( n ) Cepstrum complejo de la señal de voz. NF Periodo para el cálculo del cepstrum. C (n) Cepstrum real de la señal de voz. S (k ) DFT de la señal de voz. RECONOCIMIENTO DE VOZ USANDO HTK 3 PABLO AGUILERA BONET ĥ ( n ) Cepstrum del filtro que modela el tracto vocal. ê ( n ) Cepstrum de la excitación en el modelo clásico. NL Umbral de liftering. cMFCC ( m ) Coeficientes Cepstrum en Frecuencia Mel (MFCC). Hm ( k ) Filtros perceptuales que modelan la respuesta en frecuencia del oido. MM Número de bandas perceptuales. ck Vector que contiene los primeros 13 coeficientes MFCC. ∆ck Vector que contiene los primero 13 coeficientes delta-MFCC. ∆∆ck Vector que contiene los primero 13 coeficientes delta-delta-MFCC. xk Vector que contiene los primeros 39 coeficientes ck , ∆ck y ∆∆ck . MC Cantidad de características relevantes para clasificación. NC Cantidad de datos para clasificación. sk ( n ) Trama k-ésima de la voz. λ* Modelo elegido. v* Índice del modelo elegido. λ( Modelos posibles. v) θˆ Categoría elegida. θ Categorías en el proceso de clasificación. ( ) Coste de clasificación según el criterio ML. ( ) Riesgo condicional de clasificación según el criterio ML. v CML λ * | λ ( ) v JML λ * | λ ( ) dv ( x ) Funciones de discriminación. p (O | λ ) Función de verosilimilitud. E Medida del error en la decisión. rq Valores para la desigualdad de Jensen. RECONOCIMIENTO DE VOZ USANDO HTK 4 PABLO AGUILERA BONET ( m m −1 Q λ( ) |λ( ) ) Función auxiliar de Baum. qn Estado de un HMM en el instante n . eN ( n ) Ruido AWGN. on Observación en el instante n generada en los estados de un HMM. N Número de estados de un HMM. Si Estado i de un HMM. πi Probabilidad de empezar en el estado i . π Vector que contiene las N probabilidades π i . aij Probabilidad de transición del estado i al estado j . { } B = b j (k) Conjunto de distribuciones de probabilidad de los símbolos observados. b j (k) Probabilidad de observar el símbolo v k en el estado j . A Matriz cuadrada N × N de probabilidades de transición. O = o1 o2 ... oT Secuencia completa de observaciones generadas por el HMM. Q = q1 q2 ... qT Secuencia completa de estados por los que pasa el HMM. pi (d) Función densidad de probabilidad (discreta) de durar d muestras en el estado i . t = 1,..., T Instantes de tiempo para el HMM. n Instante de tiempo t = n . V = {v 1, v 2 ,..., v M } Alfabeto de símbolos observables en cada estado del HMM. M Tamaño del alfabeto de símbolos observables en cada estado del HMM. W Cantidad de HMMs en la construcción del reconocedor. λi HMMs del reconocedor. λopt El modelo óptimo al final del proceso de entrenamiento. αn ( j) Probabilidad conjunta de llegar al estado j en el instante n habiendo observado la secuencia o1 o2 ... on RECONOCIMIENTO DE VOZ USANDO HTK 5 PABLO AGUILERA BONET β n (i ) Probabilidad de obtener las observaciones on +1 on + 2 ... oT , sabiendo que en el instante n estuve en el estado i . γ t (i ) Probabilidad de estar en el estado i , en el instante t , dada secuencia de observación O y el modelo λ . δn ( j) Probabilidad máxima a lo largo de un camino determinado, tal que se dan las primeras n observaciones y se alcanza el estado j en el instante n . ψ n ( j) Estado i del que se debe partir (en el instante n − 1 ) para llegar al estado j (en el instante n ) con máxima probabilidad. δ 'n ( j ) Logaritmo de δ n ( j ) . qɵ n Estado elegido tras el algoritmo de Viterbi para el instante λ( Modelo estimado durante la iteración m -ésima del algoritmo EM. m) ξ n (i, j ) Probabilidad de estar en el estado j en el instante t , y en el estado i en el instante t + 1, dado el modelo y la secuencia completa de observación. ∆ Parámetro para la definición del modelo de Bakis. R Tamaño conjunto de secuencias de observación. { 1 2 OM = O ( ) , O ( ) , ..., O R } Conjunto de secuencias de observación. r r r r O ( ) = o1( ) , o2( ) , ..., oT( r ) Secuencia de observación r -ésima, de duración Tr . pr Verosimilitud de la secuencia de observación r -ésima. pmax La mayor de las probabilidades al llegar al último instante en el algoritmo de Viterbi. ∈ Cota inferior para algunos parámetros del HMM. RECONOCIMIENTO DE VOZ USANDO HTK 6 PABLO AGUILERA BONET ÍNDICE Notación ......................................................................................................... 3 Índice ............................................................................................................. 7 1 – Introducción ............................................................................................... 13 1.1 – El problema del reconocimiento del habla ....................................................... 13 1.2 – Motivación ............................................................................................. 14 1.3 – Aplicaciones ........................................................................................... 14 1.4 – Estructura del proyecto.............................................................................. 16 2 – Herramientas para el Tratamiento de la Señal de Voz ............................................ 17 2.1 – Preprocesado de la señal ............................................................................ 17 2.1.1 – Preénfasis ......................................................................................... 18 2.1.2 – Segmentación en tramas ........................................................................ 18 2.1.3 – Enventanado de tramas ......................................................................... 18 2.2 – Tratamiento y representación de la señal de voz ............................................... 18 2.2.1 – Enventanado ...................................................................................... 18 2.2.2 – Modelo clásico de generación de la voz ...................................................... 19 2.2.3 – Análisis cepstrum ................................................................................ 20 2.2.4 – La escala de frecuencia Mel .................................................................... 21 RECONOCIMIENTO DE VOZ USANDO HTK 7 PABLO AGUILERA BONET 2.3 – Coeficientes Cepstrum en Frecuencia Mel (MFCC) .............................................. 22 2.3.1 – Definición ......................................................................................... 22 2.3.2 – Características y aplicación al reconocimiento de voz ..................................... 24 2.3.3 – Rendimiento frente a otras representaciones ............................................... 24 2.4 – Clasificación de patrones ............................................................................ 25 2.4.1 – Concepto .......................................................................................... 25 2.4.2 – Clasificación estadística ........................................................................ 26 2.5 – El algoritmo EM (Promediado-Maximización)..................................................... 28 2.6 – Conclusiones ........................................................................................... 30 3 – Modelos Ocultos de Markov ............................................................................. 33 3.1 – Procesos de Markov ................................................................................... 33 3.1.1 – Definición ......................................................................................... 33 3.1.2 – Probabilidad de una secuencia concreta ..................................................... 34 3.2 – Cadenas de Markov ................................................................................... 34 3.2.1 – Definición y características .................................................................... 34 3.2.2 – Permanencia en un estado ..................................................................... 37 3.2.3 – Representación mediante rejilla (trellis)..................................................... 37 3.3 – Modelos Ocultos de Markov (HMM) ................................................................. 38 3.3.1 – Elementos de un Modelo Oculto de Markov .................................................. 38 3.3.2 – Representación mediante rejilla .............................................................. 39 3.3.3 – Generación de una secuencia de observación ............................................... 40 3.4 – Modelado del habla para el reconocimiento...................................................... 41 3.4.1 - Fundamentos ..................................................................................... 41 3.4.2 – Los tres problemas básicos de los HMM ....................................................... 41 3.4.3 – Procedimiento para el modelado .............................................................. 42 3.5 – Solución a los tres problemas básicos de los HMM ............................................... 43 3.5.1 – Evaluación de la verosimilitud de una secuencia observada .............................. 43 3.5.2 – Decodificación de la secuencia de estados .................................................. 51 RECONOCIMIENTO DE VOZ USANDO HTK 8 PABLO AGUILERA BONET 3.5.3 – Aprendizaje ....................................................................................... 57 3.6 – Conclusiones ........................................................................................... 63 4 – Aspectos Prácticos del Reconocimiento del Habla ................................................. 65 4.1 – Elección del modelo .................................................................................. 65 4.1.1 – Tipos de HMM ..................................................................................... 65 4.1.2 – Número de estados del modelo ................................................................ 68 4.1.3 – Probabilidad de observación asociada a cada estado ...................................... 69 4.2 – Problemas de diseño del modelo ................................................................... 69 4.2.1 – Escalado de los coeficientes ................................................................... 69 4.2.2 – Necesidad de secuencias de observación múltiples......................................... 69 4.2.3 – Estimación inicial de los parámetros .......................................................... 70 4.2.4 – Limitación del valor de los parámetros ....................................................... 71 4.2.5 – Efecto de la insuficiencia de datos de entrenamiento ..................................... 71 4.3 – Implementación de un reconocedor del habla continua usando HMM ........................ 72 4.3.1 – Análisis de características ...................................................................... 73 4.3.2 – Sistema de emparejamiento de unidades .................................................... 73 4.3.3 – Decodificación léxica ............................................................................ 73 4.3.4 – Análisis sintáctico ................................................................................ 73 4.3.5 – Análisis semántico ............................................................................... 74 4.3.6 – Detección de silencios .......................................................................... 74 4.4 – Algunas aplicaciones básicas ........................................................................ 74 4.4.1 – Reconocimiento de palabras aisladas ......................................................... 74 4.4.2 – Reconocimiento de palabras conectadas ..................................................... 76 4.4 – Conclusiones ........................................................................................... 78 5 – La Aplicación HTK......................................................................................... 79 5.1 – Fundamentos de HTK ................................................................................. 79 5.1.1 – Introducción ...................................................................................... 79 RECONOCIMIENTO DE VOZ USANDO HTK 9 PABLO AGUILERA BONET 5.1.2 – Composición ...................................................................................... 79 5.2 – Descripción de HTK ................................................................................... 80 5.2.1 – Arquitectura software ........................................................................... 80 5.2.2 – Propiedades generales de una herramienta HTK ............................................ 81 5.3 – Las herramientas de HTK ............................................................................ 82 5.3.1 – Herramientas de preparación de datos ....................................................... 83 5.3.2 – Herramientas de entrenamiento de modelos ................................................ 83 5.3.3 – Herramientas de reconocimiento del habla .................................................. 84 5.3.4 – Herramientas de análisis de resultados ....................................................... 85 5.4 – Construcción de un reconocedor con HTK ......................................................... 85 5.4.1 – Pasos para la construcción ..................................................................... 85 5.4.2 – Organización del espacio de trabajo .......................................................... 85 5.4.3 – Creación del corpus de entrenamiento y pruebas........................................... 86 5.4.4 – Análisis acústico.................................................................................. 89 5.4.5 – Definición de los HMM ........................................................................... 91 5.4.6 – Entrenamiento de los modelos ................................................................. 93 5.4.7 – Definición de la gramática ..................................................................... 96 5.4.8 – Reconocimiento .................................................................................. 99 5.4.9 – Rendimiento del reconocedor ................................................................. 101 5.5 – Conclusiones .......................................................................................... 104 6 – Simulaciones ............................................................................................. 105 6.1 – Requisitos y preparación ........................................................................... 105 6.1.1 – Requisitos previos............................................................................... 105 6.1.2 – Preparación del entorno de trabajo.......................................................... 105 6.2 – Desarrollo de la práctica ........................................................................... 106 6.2.1 – Grabación y transcripción del corpus de entrenamiento .................................. 106 6.2.2 – Análisis acústico................................................................................. 109 6.2.3 – Definición de los HMMs ......................................................................... 110 RECONOCIMIENTO DE VOZ USANDO HTK 10 PABLO AGUILERA BONET 6.2.4 – Entrenamiento de los modelos ................................................................ 112 6.2.5 – Definición de la gramática .................................................................... 114 6.2.6 – Reconocimiento de voz en vivo ............................................................... 115 6.3 – Medida del rendimiento de algoritmos de separación ......................................... 117 6.3.1 – Introducción ..................................................................................... 117 6.3.2 – Descripción del experimento .................................................................. 117 6.3.3 – Resultados ....................................................................................... 118 6.4 – Conclusiones .......................................................................................... 119 7 – Conclusiones y Líneas Futuras ....................................................................... 121 7.1 – Conclusiones .......................................................................................... 121 7.2 – Líneas futuras ........................................................................................ 122 Referencias ................................................................................................... 123 RECONOCIMIENTO DE VOZ USANDO HTK 11 PABLO AGUILERA BONET RECONOCIMIENTO DE VOZ USANDO HTK 12 PABLO AGUILERA BONET 1 – INTRODUCCIÓN 1.1 – EL PROBLEMA DEL RECONOCIMIENTO DEL HABLA Durante las últimas décadas, a medida que la industria del tratamiento de la información ha ido avanzando, se ha venido estudiando la posibilidad de desarrollar interfaces hombre-máquina distintas a las habituales. Una de las disciplinas en las que ha habido más actividad investigadora y productiva es el reconocimiento del habla. La posibilidad de comunicarse con dispositivos electrónicos mediante la voz supone una aplicación muy demandada tanto para la investigación como para la industria. El proceso consiste en transcribir a texto una señal de voz recibida. A finales de la década de los 60 se empiezan a proponer las primeras estrategias para resolver el problema, usando modelos estadísticos clásicos. Sin disponer todavía de un modelo para la señal de voz y dada la alta variabilidad de los patrones, no se conseguían alcanzar tasas de probabilidad de error aceptables. Los Modelos Ocultos de Markov (HMM) irrumpen en este campo en los años ochenta, enlazando las técnicas de programación dinámica con los métodos de optimización puramente estadísticos. Actualmente suponen la aproximación que mejores resultados ofrece, obteniendo tiempos de ejecución aceptables y tasas de error bajas. Sin embargo, aún queda mucho por avanzar hasta conseguir un reconocedor universal que funcione bien en cualquier circunstancia. Figura 1.1. La construcción de reconocedores basados en HMM es la solución con la que mejores resultados se obtienen en la práctica. RECONOCIMIENTO DE VOZ USANDO HTK 13 PABLO AGUILERA BONET En los años noventa surge la aplicación HTK (Hidden Markov Model ToolKit) ofrece una serie de herramientas muy poderosas para el tratamiento de Modelos Ocultos de Markov, por lo que es la que hemos elegido para implementar algunos reconocedores reales. Existe una gran comunidad alrededor de esta aplicación, por lo que está continuamente actualizándose y es usada en muchos grupos de investigación en universidades de todo el mundo. El enfoque adoptado en el proyecto es una mezcla entre la teoría clásica de los HMM y la aplicación práctica sobre HTK. Aunque no trata en profundidad la construcción de sistemas complejos, supone una base consistente para abordar la construcción de reconocedores sencillos basados en HMM. 1.2 – MOTIVACIÓN El presente Proyecto Fin de Carrera pretende poner de manifiesto el funcionamiento de los Modelos Ocultos de Markov y su aplicación al diseño de reconocedores de voz sencillos, así como realizar un acercamiento a los distintos problemas que rodean esta aproximación. También se persigue abordar su implementación en un ordenador mediante la aplicación HTK, y desarrollar una metodología con los pasos a seguir en la construcción de un reconocedor real. Por último, se pretende utilizar los reconocedores implementados como medida del rendimiento de diversos algoritmos de separación de la voz. 1.3 – APLICACIONES Aunque como otras interfaces hombre-máquina, el reconocimiento de voz puede aplicarse en cualquier interactuación con uno ordenador, podemos destacar las siguientes aplicaciones: • Control por comandos: son sistemas de reconocimiento de habla diseñados para dar órdenes a un computador. Reconocen un vocabulario muy reducido de comandos de actuación, lo que incrementa su rendimiento. Figura 1.2. Con las velocidades de cálculo actuales, puede implementarse un sistema sencillo de reconocimiento de voz en un microprocesador portátil. RECONOCIMIENTO DE VOZ USANDO HTK 14 PABLO AGUILERA BONET • Traducción de conferencias en vivo: pueden combinarse técnicas de reconocimiento y de síntesis de voz para traducir conferencias telefónicas entre interlocutores de distintos idiomas. Dada su complejidad, esta aplicación está comenzando a investigarse. • Transcripción automática: es el uso más común de las tecnologías de reconocimiento de voz. Al usarse frecuentemente en aplicaciones muy específicas, como en el dictado de recetas médicas y diagnósticos o el dictado de textos legales, se usan vocabularios concretos para incrementar la precisión del sistema. Figura 1.1. El dictado de diagnósticos médicos permite al profesional concentrarse en su tarea y transcribir sus percepciones de manera rápida y sencilla. • Subtitulado de películas: las técnicas de reconocimiento pueden combinarse junto a métodos de separación para subtitular películas a partir de la pista de audio de la cinta. Esto supone un aspecto complejo que aún está en fase de investigación. • Telefonía: algunos sistemas permiten a los usuarios ejecutar comandos mediante el habla, en lugar de pulsar tonos. En muchos casos, se usa una interfaz de voz para navegar por los menús. • Interactuación con terminales portátiles: los sistemas portátiles de pequeño tamaño, tienen unas restricciones muy concretas de tamaño y forma. En estos casos, el habla representa una interfaz natural para introducir datos en estos dispositivos. • Sistemas diseñados para discapacitados: los sistemas pueden ser útiles para personas con discapacidades que les impidan teclear con fluidez o que tengan problemas auditivos, ya que pueden usarlos para obtener texto escrito a partir de habla. • Pruebas para algoritmos de tratamiento digital de la voz: los reconocedores de voz pueden utilizarse para transcribir los resultados de distintos algoritmos de separación o RECONOCIMIENTO DE VOZ USANDO HTK 15 PABLO AGUILERA BONET cancelación de silencios, para evitar la subjetividad inherente a puntuar dichos algoritmos con opiniones de usuarios. 1.4 – ESTRUCTURA DEL PROYECTO El proyecto se estructura básicamente en dos bloques principales: por un lado, la teoría de los Modelos Ocultos de Markov y las herramientas necesarias para su tratamiento; y por otro lado, la implementación de reconocedores sencillos mediante la herramienta HTK. Estos bloques de contenido se dividen en los seis capítulos subsiguientes: • En el Capítulo dos exponemos las herramientas clásicas de tratamiento digital de la señal de voz que utilizaremos más adelante. Entre ellas destacan el enventanado, el cepstrum y la escala de frecuencia Mel. Además, presentamos el algoritmo EM, que será muy importante en los capítulos siguientes. • En el Capítulo tres haremos una aproximación a la teoría de los Modelos Ocultos de Markov (HMM), a partir del concepto de procesos de Markov. Se plantean y resuelven los tres problemas fundamentales que encontramos a lo hora de aplicar los modelos al diseño de reconocedores de voz: cómputo de la verosimilitud, decodificación de los estados y aprendizaje de los modelos. • En el Capítulo cuatro abordamos ciertos problemas que se nos presentan a la hora de diseñar e implementar reconocedores basados en HMM para que funcionen en un computador. Entre ellos destaca la elección del modelo. Se concluye con algunos ejemplos concretos de diseño de sistemas sencillos. Este capítulo servirá de puente entre la teoría expuesta en el capítulo tres y la aplicación en el capítulo cinco. • En el Capítulo cinco, introducimos la herramienta de tratamiento de HMMs que utilizaremos en los ejemplos prácticos: HTK. Tras una descripción breve del entorno de trabajo y las herramientas, se propone una metodología de diseño de un reconocedor del habla sencillo, desde la grabación de las secuencias de entrenamiento hasta las pruebas de rendimiento. • En el Capítulo seis se desarrolla paso a paso el proceso la construcción de un reconocedor de secuencias de dígitos. Está redactado de manera que pueda usarse para el desarrollo de una práctica de laboratorio. Al final de la misma podrá probarse su funcionamiento en vivo. Además, se comentan los resultados de utilizar el reconocedor construido como medidor de la calidad de algoritmos de separación. • En el Capítulo siete se exponen las conclusiones del proyecto y algunas líneas futuras de trabajo. RECONOCIMIENTO DE VOZ USANDO HTK 16 PABLO AGUILERA BONET 2 – HERRAMIENTAS PARA EL TRATAMIENTO DE LA SEÑAL DE VOZ En este capítulo comenzamos a presentar los fundamentos del tratamiento digital de la voz que nos serán imprescindibles para comprender el proceso de diseño y construcción de un reconocedor del habla. Se hace especial énfasis en la preparación y extracción de la información útil de la señal de voz, y en cómo se aplica la teoría de la decisión a nuestro problema concreto. Por último, se aborda la base teórica del algoritmo que usaremos para construir el núcleo del reconocedor. 2.1 – PREPROCESADO DE LA SEÑAL La voz es una señal cuasi-estacionaria, es decir, que sus características permanecen constantes durante unos instantes, cambiando cada poco tiempo. Esto implica la necesidad de analizar la señal en pequeñas tramas en las que sus propiedades no cambian. Por otro lado, como se verá posteriormente, debemos extraer un conjunto compacto y eficiente de características importantes de la señal de voz, y desechar aquellas que no nos sean útiles para el proceso de reconocimiento del habla. Antes de extraer estas características esenciales de la señal de voz, debemos prepararla para ello. Esta preparación es similar a la que se aplica en otras aplicaciones, y viene descrita por el siguiente diagrama de bloques: w (n) s (n) sɶ ( n ) xl ( n ) xɶ l ( n ) Figura 2.1. Preprocesado de la señal de voz, dividido en tres bloques: preénfasis, segmentación y enventanado. RECONOCIMIENTO DE VOZ USANDO HTK 17 PABLO AGUILERA BONET Se supone que sólo analizamos el tramo que nos interesa de la voz, es decir, que el silencio de antes y después ha sido eliminado con un algoritmo de detección de actividad vocal (a menos que también queramos detectar silencios). Además, es deseable que la señal haya sido aislada del ruido en la medida de lo posible, así como otras mejoras previas que podamos aplicarle. Tras estos bloques, se procedería a la extracción de las características importantes mediante el procedimiento que veremos posteriormente. 2.1.1 – Preénfasis La señal de voz digitalizada se hace pasar por un sistema de primer orden para aplanar su espectro, permitiendo que la codificación sea más uniforme. Este sistema tiene un solo polo en z = a , siendo a ∈ ℝ un número cercano a uno, para que no se distorsione demasiado la señal. sɶ ( n ) = s ( n ) − as ( n − 1) , a ∈ ( 0 ' 9,1) 2.1.2 – Segmentación en tramas Se seccionan NW muestras de voz consecutivas en una única trama. Las tramas consecutivas están separadas en MW muestras, por lo que hay un solapamiento entre tramas de NW − MW muestras. xl ( n ) = sɶ ( MW l − n ) , 0 ≤ n ≤ NW − 1 , 0 ≤ l ≤ L −1 2.1.3 – Enventanado de tramas Cada trama es multiplicada por una ventana de N muestras, w ( n ) . Dicha ventana será elegida de manera que se minimicen los efectos adversos de recortar una sección de la señal de voz. xɶ l ( n ) = xl ( n ) w ( n ) , 0 ≤ n ≤ NW − 1 Un esquema de preprocesado más complejo aparece detallado en [RABINER]. 2.2 – TRATAMIENTO Y REPRESENTACIÓN DE LA SEÑAL DE VOZ 2.2.1 – Enventanado La segmentación trama a trama se realiza mediante la conocida técnica de enventanado. La ventana idónea para las aplicaciones que nos interesan es la ventana de Hamming: 2π n 0 ' 54 − 0 ' 46 cos w (n) = NW − 1 0 , 0 ≤ n ≤ NW − 1 , e.o.c. La ventana de Hamming tiene dos características que nos interesan al tratar con la voz: • No distorsiona la envolvente del espectro, por lo que será idónea para análisis espectral. • Permite solapamiento entre ventanas, dando continuidad al análisis por tramas y en tiempo real. RECONOCIMIENTO DE VOZ USANDO HTK 18 PABLO AGUILERA BONET Figura 2.2. Utilidad de la ventana de Hamming. (a) Trama de voz segmentada. (b) Su espectro distorsionado debido a la segmentación. (c) La ventana de Hamming. (d) La trama enventanada. (e) Su espectro sin distorsión. Se suele utilizar una duración de 25 mseg para la ventana. Esto fija, junto a la frecuencia de muestreo, la longitud NW . Además, el desplazamiento entre ventanas ronda los 10 mseg , por lo que solapan entre sí. Para más información, pueden consultarse textos clásicos sobre tratamiento digital de señales, como [PROAKIS]. 2.2.2 – Modelo clásico de generación de la voz La señal de voz s ( n ) puede representarse como el resultado de una señal de excitación e ( n ) que atraviesa un sistema de respuesta impulsiva h ( n ) . (a) (b) Figura 2.3. Modelo clásico de generación de la voz. (a) El aire atraviesa el tracto vocal y produce la voz. (b) Representación de las señales involucradas en el modelo, extraída de [VOZ]. RECONOCIMIENTO DE VOZ USANDO HTK 19 PABLO AGUILERA BONET La excitación y el sistema tienen un fuerte significado físico: • e ( n ) representa el aire modulado por las cuerdas vocales. Es una señal periódica o ruidosa. • h ( n ) modela el tracto vocal por el que pasa el aire hasta salir al exterior. Es un filtro con función de transferencia racional. El reconocimiento de voz está basado en la forma que tiene el tracto vocal, lo cual determina los fonemas que se están diciendo en ese momento. Gracias a la distinción entre excitación y sistema, podemos basar el reconocimiento en h ( n ) , pues modela el tracto vocal. Debemos encontrar un procedimiento para encontrar el sistema h ( n ) a partir de la señal s ( n ) , pues representando aquél adecuadamente tenemos la mejor selección de características posible para el reconocimiento de voz. 2.2.3 – Análisis cepstrum – El dominio cepstrum Una transformación homomórfica es una transformación (^) que convierte una convolución en una suma: s ( n ) = e ( n ) ∗ h ( n ) → sˆ ( n ) = eˆ ( n ) + hˆ ( n ) En esta sección introducimos el cepstrum como una transformación homomórfica que nos permite separar la excitación del filtro. Mostraremos que podemos encontrar un valor NL tal que el cepstro del filtro hˆ ( n ) ≈ 0 , n ≥ NL , y tal que el cepstro de la excitación eˆ ( n ) ≈ 0 , n < NL . Bajo estas condiciones, podemos recuperar h ( n ) a partir de s ( n ) , el cual será de extrema utilidad como observación de partida para el proceso de reconocimiento. El cepstrum complejo de una señal s ( n ) se define como: 1 sˆ ( n ) = NF s (n) N −1 ∑ ln ( S ( k ) ) e j 2π kn NF , 0 ≤ n < NF k =0 S(k) log ( S(k)) ŝ ( n ) Figura 2.4. Pasos para el cálculo del Cepstrum de la voz. Aquí, S ( k ) es la DFT de la señal de voz s ( n ) : RECONOCIMIENTO DE VOZ USANDO HTK 20 PABLO AGUILERA BONET 1 S (k ) = NF N −1 ∑ s (k ) e −j 2π kn NF 0 ≤ k < NF , n=0 No obstante, si la señal s ( n ) ∈ ℝ (como es el caso de la voz), rara vez utilizaremos el cepstrum complejo. Introducimos el cepstrum real: 1 C (n) = N NF N −1 ∑ ln ( S ( k ) ) e −j 2π kn NF , 0 ≤ n < NF k =0 El cepstrum real coincide con la parte par del cepstrum. A partir de aquí, utilizaremos la notación ŝ ( n ) aunque nos refiramos al cepstrum real de la señal. – Deconvolución Puede demostrarse que el cepstrum de la voz tiene una forma como la que se muestra en la gráfica. Figura 2.5. Representación del cepstrum de la señal de voz. Las muestras cercanas al origen corresponden al cepstrum del filtro, ĥ ( n ) . Las muestras exteriores no nos interesan pues corresponden al cepstrum de la excitación. Extraído de [S. VOZ]. En estas condiciones, podemos recuperar h ( n ) simplemente aplicando liftering (recortar la parte de la señal que nos interesa, en el dominio cepstrum) sobre la parte baja de la gráfica anterior. Aplicando la transformación homomórfica inversa, puede obtenerse h ( n ) a partir de ĥ ( n ) fácilmente. Ahora que hemos introducido el concepto de cepstrum de una señal, matizaremos que no utilizaremos las muestras de ĥ ( n ) como coeficientes para el reconocimiento, sino otros coeficientes cepstrum que han dado mejores resultados en la aplicación que nos ocupa. Para más información, véase [VOZ] ó [HUANG ET AL.]. 2.2.4 – La escala de frecuencia Mel Existen escalas de frecuencia en las que el oído humano se comporta de manera más uniforme frente a los sonidos que recibe. Una de ellas es la escala Mel, que se relaciona con la frecuencia en hertzios mediante la siguiente expresión empírica: RECONOCIMIENTO DE VOZ USANDO HTK 21 PABLO AGUILERA BONET fHz fmel = 1125ln 1 + 700 Esta transformación se muestra en la siguiente gráfica: Figura 2.6. Conversión de la frecuencia en hertzios a la frecuencia en escala Mel. El uso de la escala Mel, que modela la percepción de un oído humano, mejorará el rendimiento del reconocedor. 2.3 – COEFICIENTES CEPSTRUM EN FRECUENCIA MEL (MFCC) 2.3.1 – Definición Es una representación definida como los coeficientes de la DCT del logaritmo de la energía de la señal de voz en cada banda perceptual: 2 N −1 cMFCC ( m ) = DCT log ∑ Hm1/2 ( k ) DFT {s ( n )} k =0 , m = 0,..., MM (2.1) El siguiente diagrama de bloques indica las operaciones a realizar sobre la señal s ( n ) para obtener cMFCC ( m ) : RECONOCIMIENTO DE VOZ USANDO HTK 22 PABLO AGUILERA BONET N −1 HH1 (( ff)) 1/21/2 ∑ 1 2 E1 cMFCC (1) k =0 ⋮ ⋮ HHMM( f()f ) N −1 1/2 ∑ 1/2 1 2 E MM ⋮ cMFCC ( MM ) k =0 Figura 2.7. Diagrama de flujo para el cálculo de los coeficientes MFCC. Lo primero que se hace es dividir la energía en MM bandas. En cada banda, la señal queda ponderada por el correspondiente filtro perceptual del oído Hm ( f ) . Después, se calcula la DCT del logaritmo de la energía para obtener los coeficientes. El filtro perceptual tiene la forma: Figura 2.8. Filtro perceptual del oído humano. Está elegido de manera que los anchos de banda son uniformes en unidades de frecuencia Mel. Extraído de [HUANG ET AL.] El filtro perceptual tiene la expresión analítica: 0 2 ( k − f ( m − 1) ) ( f ( m + 1) − f ( m − 1) ) ( f ( m ) − f ( m − 1) ) Hm ( k ) = 2 ( f ( m + 1) − k ) ( f ( m + 1) − f ( m − 1) ) ( f ( m + 1) − f ( m ) ) 0 , k < f ( m − 1) , f ( m − 1) ≤ k ≤ f ( m ) , f ( m ) ≤ k ≤ f ( m + 1) , k > f ( m + 1) Aunque (2.1) no constituya una transformación homomórfica, en la práctica, esta representación es aproximadamente homomórfica para filtros que tienen una función de transferencia suave. Puede verse más información en [HUANG ET AL., SECCIÓN 9.3]. RECONOCIMIENTO DE VOZ USANDO HTK 23 PABLO AGUILERA BONET 2.3.2 – Características y aplicación al reconocimiento de voz Los coeficientes cMFCC ( m ) de (2.1) se utilizan como parámetros para construir las muestras de la secuencia observada en reconocimiento de voz. En general, las características en el dominio del tiempo son mucho menos precisas que aquellas del dominio de la frecuencia. Esto es porque muchas características, como los formantes (útiles en el reconocimiento de vocales), están mejor caracterizados en el domino de la frecuencia. Como vimos anteriormente, la voz es una señal cuasi-estacionaria, por lo que sus características espectrales cambian en el tiempo, jugando estos cambios un importante papel en la percepción humana. Una forma de capturar esta información es usar los coeficientes delta cepstrum que miden el cambio de los coeficientes cepstrum a lo largo del tiempo. Esta información, además, complementa el modelado que realizan los HMM, pues éstos suponen que las tramas son independientes del pasado, y mediante los coeficientes delta se aumenta el alcance temporal de la trama, haciéndolas dependientes entre sí. Cuando usamos una frecuencia de muestreo típica de 16 kHz , un sistema de reconocimiento del habla puede construirse en base a las siguientes características: • 13 coeficientes MFCC: ck = c MFCC ( 0 ) , ... , c MFCC (12 ) , para la trama k -ésima. • 13 coeficientes delta-MFCC de primer orden, calculados como ∆ck = ck + 2 − ck − 2 • 13 coeficientes delta-MFCC de 2º orden (aceleración), calculados como: ∆∆ck = ck +1 − ck −1 En total, son 39 coeficientes que contienen las características esenciales de la señal de voz. Nótese que ck ( 0 ) se incluye en el vector de observación, y tiene un papel similar a la potencia logarítmica. El vector de observación utilizado en reconocimiento del habla es una combinación de todas estas características: ck x k = ∆ck ∆∆ck 2.3.3 – Rendimiento frente a otras representaciones En la siguiente tabla ([HUANG ET AL.]) puede verse el rendimiento que se alcanza usando distintos coeficientes como vectores de observación en reconocimiento de voz, respecto al caso de usar coeficientes LPC-cepstrum. RECONOCIMIENTO DE VOZ USANDO HTK 24 PABLO AGUILERA BONET Conjunto de coeficientes a usar Reducción relativa del error 13 LPC-Ceptrum Base 13 MFCC +10 % 16 MFCC +0% 13 MFCC + 13 ∆ MFCC + 13 ∆∆ MFCC +20% 13 MFCC + 13 ∆ MFCC + 13 ∆∆ MFCC + 13 + 13 ∆∆∆ MFCC +0% Tabla 2.1. Comparación del rendimiento de los distintos coeficientes para representar las características fundamentales de la voz. Esta tabla justifica la elección de los coeficientes que hicimos anteriormente. En efecto, se aprecia que el uso de la escala Mel en los MFCC, que modela la percepción del oído humano, de verdad ayuda al reconocimiento. Además, el uso de más coeficientes MFCC no mejora el rendimiento del reconocedor, lo cual pone de manifiesto que con 13 coeficientes tenemos representadas las características interesantes de la voz. En adelante, al hablar de MFCC nos referiremos a los 39 coeficientes MFCC, ∆ MFCC y ∆∆ MFCC. 2.4 – CLASIFICACIÓN DE PATRONES Ahora repasaremos brevemente la teoría general de clasificación de patrones, y la aplicaremos para justificar alguna de las expresiones que se verán en temas posteriores, y que confeccionan el núcleo del proceso de reconocimiento. La mayoría de esta sección se basa en [VOZ, CAP. 9]. 2.4.1 – Concepto La clasificación de patrones es el proceso mediante el cual se asigna una categoría o clase a un conjunto de datos observados, con el fin de diferenciarlo respecto de otros conjuntos. El propio proceso de reconocimiento de voz es en sí una clasificación, pues asigna una palabra o fonema a un vector de observación, formado por los coeficientes MFCC de la señal hablada. La clasificación suele dividirse en dos etapas. u1,..., uN C x = x1,..., x MC λ* Figura 2.9. Proceso completo de clasificación de patrones. El proceso se desglosa en dos etapas: extracción de características y clasificación. RECONOCIMIENTO DE VOZ USANDO HTK 25 PABLO AGUILERA BONET - Extracción de características Se trata de extraer un conjunto de MC características, que reúnan la información más relevante para la clasificación de un conjunto de NC datos en una categoría. Para eliminar la información no necesaria y que no contenga redundancias, debe cumplirse: MC ≪ NC Es decir, la dimensión del espacio de características es mucho menor que el número de datos. Se busca la menor variabilidad dentro de cada categoría junto a la máxima variabilidad entre categorías. Esto es lo que se hace al pasar de cientos o miles de muestras de voz sk ( n ) en la trama k , a un vector de observación x k de 39 coeficientes espectrales. – Clasificación Consiste en definir la correspondencia entre la característica (patrón) x y su categoría λ * : x → λ * (x) Las fronteras entre clases bastan para definir la función de clasificación. Lo difícil es que el sistema de clasificación aprenda a definir correctamente dichas fronteras. En reconocimiento de voz, esto justifica la necesidad de entrenar el reconocedor con secuencias ya clasificadas para que aprenda a desenvolverse él solo frente a secuencias desconocidas. 2.4.2 – Clasificación estadística – El criterio de Máxima Verosimilitud (ML) Usaremos la teoría de estimación bayesiana para definir unos costes de equivocación. Estos costes dependen del criterio de clasificación que utilicemos. v El coste de clasificar x como clase λ * cuando en realidad su clase es λ ( ) se expresa como: ( ) ( v v C λ * | λ ( ) ≡ C θˆ = λ *,θ = λ ( ) ) Según el criterio ML, penalizamos con un coste de “1” cuando nos equivocamos, y con “0” v cuando acertamos. Es un caso particular del criterio MAP, contando con que los λ ( ) son equiprobables a priori. Analíticamente, la función de coste es: ( ) ( v v CML λ *| λ ( ) = 1 − δ λ ( ) − λ * ) Figura 2.10. Función de coste asociada al proceso de clasificación mediante al criterio ML. RECONOCIMIENTO DE VOZ USANDO HTK 26 PABLO AGUILERA BONET Sea p ( λ ( ) | x ) es la probabilidad de acierto al elegir λ ( ) como categoría. Para minimizar la v v v λ ( ) /x probabilidad de error al clasificar, definimos la función de riesgo condicional: ( ) ( ( λ ( ) | x ) = ∑ (1 − δ ( λ ( ) − λ * ))p ( λ ( ) | x ) = ( λ ( ) | x ) − ∑ δ ( λ ( ) − λ * ) p ( λ * | x ) = 1 − p ( λ * | x ) ) v v JML λ *| λ ( ) = ∑ CML λ *| λ ( ) p j = ∑p j v v v λ ( )|x v v λ ( )|x v v λ ( )|x j v λ *|x (2.2) λ *|x j El riesgo condicional representa la media de las funciones de coste y tiene la forma de una probabilidad de error, como era lógico. Minimizando (1.2) conseguimos la clase óptima para el conjunto de características x : { ( v λ * = arg min JML λ *| λ ( ) ( ) λ v )} = arg min{1 − p ( λ ( ) | x )} = arg max {p ( λ ( ) | x )} v v λ( ) v v λ ( )|x v λ( ) v λ ( )|x (2.3) – Funciones de discriminación Otra forma de abordar el proceso de clasificación consiste en hacerlo en base a las funciones de discriminación d j ( x ) . Hay una para cada categoría y dependen del criterio de clasificación. v Gracias a ellas, la clasificación se reduce a elegir la categoría λ ( ) que maximiza dv ( x ) : , tal que v * = arg max {d v ( x )} v d1 ( x ) ⋮ v* v x v) arg max {dv ( x )} λ* = λ( dW ( x ) Figura. Funciones de discriminación 2.11. Se elegirá la categoría cuya función de discriminación sea máxima. v1 v2 La frontera entre las categorías λ ( ) y λ ( ) está formada por todos los patrones x tal que: dv 1 ( x ) = d v 2 ( x ) En el caso de la clasificación estadística mediante el criterio ML, comparando con (2.3) se deduce que la función de discriminación es la probabilidad de acierto: dv ( x ) = p ( λ ( ) | x ) v v λ ( )|x RECONOCIMIENTO DE VOZ USANDO HTK 27 PABLO AGUILERA BONET Como veremos en capítulos posteriores, el proceso de reconocimiento se basa en elegir el modelo λ que maximiza la función p ( O | λ ) , siendo O la secuencia de coeficientes MFCC a clasificar en palabras. La secuencia observada O juega el papel del patrón x en la teoría de clasificación. 2.5 – EL ALGORITMO EM (PROMEDIADO-MAXIMIZACIÓN) Dada la función de verosimilitud p ( O | λ ) , vamos a estudiar un método muy potente para calcular el valor de λ que la maximiza localmente. Este apartado está basado en [BISHOP, SECCIÓN 2.6.6]. Aquí, λ es un conjunto de parámetros que serán muy importantes en el diseño de reconocedores de voz. Diremos que λ = λ * cuando p ( O | λ ) haya alcanzado un máximo: λ * = arg max {p ( O | λ )} λ Sea E una medida del error que cometo al decidir que p ( O | λ ) ha alcanzado un máximo local para cierto λ : E = − ln ( p ( O | λ ) ) Podemos ejecutar un proceso secuencial que vaya reduciendo progresivamente ese error, lo cual aumentará p ( O | λ ) hasta que alcance un máximo local. Como el algoritmo es iterativo, usaremos el índice m para indicar la iteración. Entre dos iteraciones consecutivas se producirá una reducción del error: E( m −1) (( = − ln p O | λ ( (( m −1) m m E ( ) = − ln p O | λ ( ) )) )) E ( ) − E ( m m −1) ( ( ) ) p O | λ (m) = − ln p O | λ (m −1) (2.4) m m −1 Para que el algoritmo vaya reduciendo el error, debe darse E ( ) − E ( ) ≤ 0 . El algoritmo habrá m m −1 finalizado cuando E ( ) − E ( ) ≈ 0 , pues el error no podrá reducirse más y habremos alcanzado un máximo local de la función de verosimilitud. En cada iteración, se sustituirá λ ( m −1) m ← λ( ) . Operando con (2.4): E (m) −E ( m −1) ( p O, q | λ ( m ) ∑ q = − ln ( m −1) p O | λ ( ) ) ( ) ( p q | λ ( m ) p O | q, λ (m ) ∑ q = − ln m −1 p O |λ( ) ( ) ) (2.5) Aquí, q es cierto proceso aleatorio del que depende O y que trataremos en el tema siguiente. ( Multiplicando numerador y denominador de (2.5) por p q | O, λ ( m −1) ): RECONOCIMIENTO DE VOZ USANDO HTK 28 PABLO AGUILERA BONET E (m) −E ( m −1) ( ) ( ) p q | λ (m ) p O | q, λ ( m ) = = − ln ∑ ( m −1) q p O |λ p q | λ (m ) p O | q, λ ( m ) p q | O, λ (m −1) = − ln ∑ m −1 m −1 p O |λ( ) p q | O, λ ( ) q ( ( ) ) ( ( ) ( ( ) (2.6) ) ) Ahora usamos la desigualdad de Jensen ([BISHOP, SECCIÓN 2.6.6]): Dado un conjunto de números rq ≥ 0 , tales que ∑r q = 1 , se cumple: q ln ∑ rq x q ≥ ∑ rq ln x q q q ( ) Como ∑ p ( q | O, λ ( m −1) (2.7) ) = 1 y, por definición, p (q |O, λ ( ) ) ≥ 0 , éstas pueden jugar el papel de r m −1 q q en (2.7): ( ) ( ) ( ) ( ( m −1) m m p q | λ ( ) p O | q, λ ( ) ( m −1) ln ∑ p q | O, λ m −1 m −1 q p O | λ ( ) p q | O, λ ( ) ( ) ( ) ( ) ( ) ( ) p q | λ (m ) p O | q, λ ( m ) ( m −1) ≥ p q | O, λ ln ∑ p O | λ (m −1) p q | O, λ (m −1) q ( ) ( ) Sustituyendo en (2.6): E (m) −E ( m −1) ≤ −∑ p q | O, λ q ) ( ) ( ) ( ) p q | λ ( m ) p O | q, λ ( m ) ln p O | λ (m −1) p q | O, λ (m −1) ( ) (2.8) ( m m m m −1 Queremos minimizar E ( ) respecto a los parámetros λ ( ) . Para ello, llamamos Qɶ λ ( ) | λ ( ) ) a la parte derecha de la desigualdad (2.8) y volvemos a agrupar en probabilidades conjuntas dentro del logaritmo: ( Qɶ λ (m ) |λ ( m −1) ) = ∑ p (q |O, λ ) ( m −1) q ( ( ) = p (q,O | λ ( ) ) ln p (O,q | λ ( ) ) ∑ p O, q | λ ( ) p (O | λ ( ) ) ) ) ( p O, q | λ (m ) ln p O, q | λ ( m −1) m −1 m −1 q ( m m −1 m m −1 E ( ) − E ( ) ≤ −Qɶ λ ( ) | λ ( ) ( m m −1 ) ) m m −1 Como Qɶ λ ( ) | λ ( ) ≥ 0 siempre, el error en la iteración m es: ( m m −1 m m −1 E ( ) ≤ E ( ) − Qɶ λ ( ) | λ ( ) ( m m −1 Por lo tanto, maximizando Qɶ λ ( ) | λ ( ) ) ) m reducimos la cota superior para E ( ) lo cual minimizará dicho error a menos que ya se encuentre en un mínimo local, donde será igual a m −1 E( ) . RECONOCIMIENTO DE VOZ USANDO HTK 29 PABLO AGUILERA BONET Al maximizar, podemos desprendernos de las probabilidades que dependen de λ ( m −1) , pues son (m) constantes frente de λ . Por tanto, la función que usaremos al aplicar el algoritmo EM al reconocimiento, se llama función auxiliar de Baum y es: ( ) ) ( ( ( m m −1 m −1 m Q λ ( ) | λ ( ) = ∑ p q | O, λ ( ) ln p O, q | λ ( ) q )) (2.9) m Maximizando (2.9), hallamos los parámetros λ ( ) óptimos para esta iteración: λ( m) { ( m m −1 = arg max Qɶ λ ( ) | λ ( ) λ )} La función puede maximizarse mediante el método de los multiplicadores de Lagrange. E E( E( m −1) ( m m −1 − Q λ( ) |λ( ) ) m −1) ( m m +1 m E( ) − Q λ( ) |λ( ) ) m E( ) λ( λ (m) m −1) λ Figura 2.12. Representación esquemática de la función de error frente a los parámetros del modelo. La curva E ( m −1) ( ) m m −1 m − Q λ ( ) | λ ( ) proporciona una cota superior para E ( ) . Se calcula este nuevo error y se traza la curva correspondiente. Poco a poco se va avanzando hacia el λ que maximiza la función de verosimilitud. Pueden encontrarse muchas aplicaciones del algoritmo EM en [BISHOP]. 2.6 – CONCLUSIONES En este capítulo hemos presentado algunas herramientas esenciales para el tratamiento de la señal de voz, que nos serán útiles en capítulos posteriores. Comenzamos introduciendo las técnicas de pre-procesado de señal para adecuarla a su tratamiento por tramas. Tras repasar la técnica de enventanado, hemos introducido el cepstrum de una señal y la escala de frecuencia Mel. RECONOCIMIENTO DE VOZ USANDO HTK 30 PABLO AGUILERA BONET A partir de ellos, hemos definido los coeficientes MFCC, que servirán como patrón característico en el reconocimiento de voz, el cual puede verse como un proceso de clasificación de patrones. Hemos introducido las ideas básicas de esta teoría, y el criterio de máxima verosimilitud (ML). Por último, se ha demostrado que el algoritmo EM, que usaremos para entrenar los modelos, maximiza localmente la función de verosimilitud. Las técnicas vistas en este capítulo han demostrado su utilidad para el tratamiento de señales en multitud de disciplinas diferentes. En capítulos posteriores usaremos todas estas herramientas, junto con la teoría de los Modelos Ocultos de Markov, para resolver el problema completo del diseño de un reconocedor del habla. Para más información, pueden consultarse textos genéricos sobre tratamiento digital de la señal de voz y teoría de la estimación, como [VOZ], [HUANG ET AL.] y [BISHOP]. RECONOCIMIENTO DE VOZ USANDO HTK 31 PABLO AGUILERA BONET RECONOCIMIENTO DE VOZ USANDO HTK 32 PABLO AGUILERA BONET 3 – MODELOS OCULTOS DE MARKOV En este capítulo vamos a abordar la teoría de los Modelos Ocultos de Markov, que ha demostrado ser la que mejores resultados produce a la hora de implementar reconocedores. Los introducimos a partir de los procesos más sencillos, a los que iremos añadiendo elementos para obtener los modelos finales. Gran parte de este capítulo se dedica a resolver analíticamente los problemas fundamentales que se presentarán al intentar aplicar estas ideas al reconocimiento de voz. 3.1 – PROCESOS DE MARKOV 3.1.1 – Definición Un proceso de Markov es un proceso aleatorio {q ( n )} discreto en el tiempo, con la particularidad de que la probabilidad del valor de cada muestra sólo depende del valor de la anterior: p ( q n | qn −1, qn − 2 ,...) = p ( qn | qn −1 ) (3.1) Se usará la notación qn ≡ q ( n ) para denotar al estado del proceso en el instante n o muestra n -ésima , pues resume la información que toda la historia del proceso aporta al futuro del mismo. - Ejemplo Un modelo AR(1) (Autorregresivo de orden 1) es un proceso de Markov: q ( n ) = w1q ( n − 1) + eN ( n ) , siendo eN ( n ) ruido AWGN Gracias a la propiedad (3.1), se simplifica mucho el cálculo de la probabilidad condicionada. Una vez conocido qn −1 , la única incertidumbre la proporciona eN ( n ) . p ( q n | qn −1, qn − 2 ,...) = p ( qn | qn −1 ) = p ( eN ( n ) ) = 1 2πσ e − ( en ) 2σ 2 2 ( qn −w1qn −1 ) 2 = 1 2πσ e − 2σ 2 RECONOCIMIENTO DE VOZ USANDO HTK 33 PABLO AGUILERA BONET 3.1.2 – Probabilidad de una secuencia concreta Para calcular ahora la probabilidad de una secuencia concreta de muestras, debemos primero obtener el siguiente resultado válido para cualquier proceso aleatorio discreto. Sea {q1 = o1, q2 = o2 ,..., qT = oT } una secuencia concreta, obtenida al observar el proceso aleatorio {qn } durante T muestras. Utilizando el Teorema de Bayes, podemos descomponer la probabilidad de obtener esa secuencia en términos de un producto de las probabilidades de cada muestra, condicionadas por las muestras pasadas: p ( q1 = o1, q2 = o2 ,..., qT = oT ) = p ( q1, q2 ,..., qT ) = p ( q1 )p ( q2 ,..., qT | q1 ) (3.2) Siempre se puede descomponer (3.2) de la forma: p ( q1 ) p ( q 2 ,..., qT | q1 ) = p ( q1 ) p ( q2 | q1 ) p ( q3 ,..., qT | q1, q2 ) = = p ( q1 ) p ( q2 | q1 ) p ( q3 | q1, q 2 ) p ( q 4 ,..., qT | q1, q2 , q3 ) Si seguimos descomponiendo, se puede inducir: T p ( q1, q 2 ,..., qT ) = p ( q1 ) ∏ p ( qi | q1,..., qi −1 ) i =2 Una vez tenemos este resultado, aplicamos la propiedad (3.1) para obtener la probabilidad de una secuencia concreta de muestras: T p ( q1, q2 ,..., qT ) = p ( q1 ) ∏ p ( qi | qi −1 ) = p ( q2 | q1 ) p ( q3 | q2 ) p ( q 4 | q3 ) ...p ( qT | qT −1 ) (3.3) i =2 3.2 – CADENAS DE MARKOV 3.2.1 – Definición y características Una cadena (o modelo) de Markov es un proceso de Markov {q ( n )} con un número finito de muestras: qn = {S1,..., SN } = {1,..., N} En adelante se llamará a cada muestra por su número para simplificar la notación. Debido a que ahora el conjunto es finito, las muestras pasan a llamarse estados y aparecen las siguientes probabilidades: • Probabilidades iniciales de empezar en cada uno de los estados: π 1 π i = p ( q1 = i ) ⇒ π = ⋮ π N RECONOCIMIENTO DE VOZ USANDO HTK 34 PABLO AGUILERA BONET • Probabilidades de transición entre estados. En concreto, la probabilidad de transitar del estado i (en el instante n − 1 ) hacia el estado j (en el instante n ) es: aij = ai → j = p ( qn = j | qn −1 = i ) , ∀ n Estas probabilidades de transición cumplen: aij ≥ 0 , de la propia definición. N ∑a ij = 1 , es decir: desde el estado i tengo que llegar a alguno de los estados j = 1,..., N . j =1 N ∑a ij ≠ 1 , y esta suma no representa una probabilidad. i =1 Así, podemos definir la matriz de transición entre estados: a11 ⋯ a1N A = aij = ⋮ ⋱ ⋮ aN1 ⋯ aNN Es una matriz cuadrada N × N tal que la suma de los elementos de cada fila es la unidad (matriz estocástica). a22 a12 a21 a11 a32 a23 a13 a31 a33 Figura 3.1. Una cadena de Markov con tres estados y sus coeficientes de transición. Estos modelos también se llaman modelos observables de Markov, porque la salida del proceso O = o1 ... oT es la secuencia de estados Q = q1 ... qT por la que pasamos a lo largo del tiempo: la secuencia de estados es lo que podemos observar del proceso ( Q = O ). - Ejemplo [RABINER Y JUANG] Modelo de Markov del clima. Supongamos que, una vez al día, observamos el clima y le asignamos uno de entre estos 3 estados: RECONOCIMIENTO DE VOZ USANDO HTK 35 PABLO AGUILERA BONET Estado 1 – Lluvioso. Estado 2 – Nublado. Estado 3 – Soleado. Usaremos un modelo de Markov simple de 3 estados para predecir el clima. Debemos conocer la probabilidad de que cambie el clima entre días. Esto lo proporciona la matriz de transición de estados: 0 ' 4 0 ' 3 0 ' 3 A = 0 ' 2 0 ' 6 0 ' 2 0 '1 0 '1 0 ' 8 Figura 3.2. Modelo de Markov del clima. También podemos definir unas probabilidades iniciales, o simplemente fijar que el primer día que medimos está soleado. Con estos datos podemos calcular, por ejemplo, la probabilidad de que en los próximos 7 días, el tiempo esté “Soleado (hoy) – Soleado – Soleado – Lluvioso – Lluvioso – Soleado – Nublado Soleado”. Para ello, definimos la secuencia observada O como O = {3,3,3,1,1,3,2,3} . Simplemente computamos la probabilidad, usando (3.3): p ( O | Modelo ) = p ( 3,3,3,1,1,3,2,3| Modelo ) = = p ( 3 )p ( 3|3 )p ( 3|3 )p (1|3 )p (1|1)p ( 3|1)p ( 2|3 )p ( 3|2 ) = = π 3 a33 a33 a31a11a13 a32 a23 = = 1( 0 ' 8 )( 0 ' 8 )( 0 '1)( 0 ' 4 )( 0 ' 3 )( 0 '1)( 0 ' 2 ) = = 1' 53610 −4 RECONOCIMIENTO DE VOZ USANDO HTK 36 PABLO AGUILERA BONET 3.2.2 – Permanencia en un estado Gracias al modelo, también podemos responder a la pregunta: ¿cuál es la probabilidad de que el sistema permanezca en el mismo estado durante exactamente d muestras? { } La secuencia observada es: O = i, i, i, ... , i, j ≠ i , por lo que calculamos: 1 2 3 d d +1 p ( O | Modelo, q1 = i ) = ( aii ) (1 − aii ) = pi ( d ) d −1 (3.4) Aquí, hemos definido pi (d) como la función densidad de probabilidad de permanecer d muestras en el estado i . Gracias a (3.4), podemos calcular el número esperado de muestras que el sistema permanecerá estable en un estado concreto: ∞ ∞ d =1 d =1 di = ∑ dpi ( d ) = ∑ d( aii ) (1 − aii ) = d −1 1 1 − aii - Ejemplo [RABINER Y JUANG] Para el ejemplo anterior, el número medio de días que el clima permanecerá soleado será: d3 = 1 1 = =5 1 − a33 1 − 0 ' 8 3.2.3 – Representación mediante rejilla (trellis) Una forma muy utilizada en ingeniería de representar procesos temporales basados en estados es mediante una rejilla o trellis: a11 a12 a13 a21 a22 a23 a31 a32 a33 Figura 3.3. Rejilla utilizada para representar las transiciones entre estados a lo largo del tiempo. RECONOCIMIENTO DE VOZ USANDO HTK 37 PABLO AGUILERA BONET 3.3 – MODELOS OCULTOS DE MARKOV (HMM) Los modelos anteriormente vistos son demasiado restrictivos para aplicarlos a una gran variedad de problemas de interés, puesto que cada estado se corresponde con un evento físico observable. Podemos extender el concepto de modelo de Markov para incluir el caso en el que la observación es aleatoria, dependiente del estado en el que se encuentra el sistema. El modelo resultante se conoce como Modelo Oculto de Markov (HMM), y es un proceso doblemente estocástico con: • Un proceso estocástico subyacente que no es observable (está oculto), sino que sólo puede ser observado a través de otro proceso (que sí es observable). Conforma la secuencia de estados por la que pasa el sistema. • Un conjunto de procesos estocásticos que producen la secuencia de observación. Por lo tanto, un Modelo Oculto de Markov es una cadena de Markov en la que la observación no es la propia secuencia de estados (que permanece oculta), sino que es el resultado de ciertos procesos estocásticos que se producen en cada estado. 3.3.1 – Elementos de un Modelo Oculto de Markov Un modelo oculto de Markov está caracterizado por: • El número de estados en el modelo ( N ). Aunque los estados estén ocultos, para muchas aplicaciones prácticas hay un significado físico asociado a los estados del modelo. Normalmente los estados están interconectados tal que cada uno puede ser alcanzado desde cualquier otro estado (modelo ergódico). Sin embargo, como veremos más tarde, existen otros tipos de conexión entre estados que resultarán de interés en el caso concreto del reconocimiento de voz. Llamamos S al conjunto de estados, y a los estados individuales, luego Si S = {S1, S2 ,..., SN } = {1,2,..., N} . Al estado que se alcanza en el instante t lo llamamos qt , con t = 1,..., T . La secuencia de estados es Q = q1 q2 ... qT . • El número de símbolos distintos observables en cada estado ( M ), es decir, el tamaño del alfabeto. Aquí, los símbolos observados corresponden con la salida física del sistema. Llamamos V al conjuntos de símbolos, y v k a los símbolos individuales: V = {v 1, v 2 ,..., v M } . Al símbolo que se observa en el instante t lo llamamos ot , y a la secuencia de observación O = o1 o2 ... oT . • La distribución de probabilidades de transición entre estados ( A ). Tendremos una matriz A = aij de dimensiones N × N , donde cada elemento representa la probabilidad de saltar del estado i al estado j : ( ) aij = p qt +1 = S j | qt = Si , 1 ≤ i, j ≤ N (3.5) Suponemos que el sistema es invariable en el tiempo, por lo que esta matriz no cambia N con t . Por otro lado, la suma de los elementos de cada fila es uno: ∑a ij = 1. j =1 RECONOCIMIENTO DE VOZ USANDO HTK 38 PABLO AGUILERA BONET En el caso especial de que cualquier estado puede ser alcanzado por otro estado en un solo salto, tenemos aij > 0, ∀ i, j . Para otros tipos de HMM, puede que algún aij ≠ 0 . • La distribución de probabilidades de los símbolos observados en el estado { j } ( B = b j (k) ). Se trata de un conjunto de N vectores, uno por cada estado del sistema, en los que el elemento k -ésimo representa la probabilidad de que en ese estado se observe el símbolo v k . Suponemos siempre que el símbolo se observa justo al llegar a cada estado. ( b j ( k ) = p ot = v k | qt = S j • ) , 1≤ j ≤ N , 1≤ k ≤ M (3.6) La distribución inicial de estados ( π ). Es un vector donde el elemento i -ésimo representa la probabilidad de que el estado inicial sea el estado Si . π = π i tal que π i = p ( q1 = Si ) , 1 ≤ i ≤ N (3.7) De la discusión anterior puede inferirse que una descripción completa del modelo requiere la especificación de dos parámetros ( N y M ) y de tres medidas probabilísticas ( A , B y π ). Los parámetros N y M se encuentran implícitos en las otras tres medidas (3.5), (3.6) y (3.7), por lo que a partir de ahora usaremos la notación compacta para el modelo: λ = ( A, B,π ) 3.3.2 – Representación mediante rejilla Podemos añadir elementos a la representación del trellis para modelar HMMs: • Probabilidades iniciales de cada estado. • Probabilidades de observación de símbolos en cada estado. a11 π1 a12 a13 a21 π2 a22 a23 π3 a31 a32 a33 Figura 3.4. Rejilla utilizada para representar las transiciones en un HMM. RECONOCIMIENTO DE VOZ USANDO HTK 39 PABLO AGUILERA BONET Esta rejilla resulta muy conveniente para interpretar los cálculos posteriores. 3.3.3 – Generación de una secuencia de observación Dado un conjunto apropiado de valores a N , M , A , B y π , el HMM puede ser usado como generador para obtener una secuencia de observación O = o1 o2 ... oT , donde cada observación ot es uno de los símbolos del alfabeto V . El procedimiento es el siguiente: Procedimiento para generar una secuencia de observación: 1) Elegir un estado inicial q1 = Si , de acuerdo con la distribución inicial de estados π . 2) Inicializar t = 1 . 3) Elegir ot = v k , de acuerdo con la distribución de probabilidad de símbolo en el estado i , es decir, bi ( k ) . 4) Saltar a un nuevo estado qt +1 = j , de acuerdo con la distribución de probabilidades de transición de estados, es decir, aij . 5) Actualizar t ← t + 1 , y a. Si t < T , Saltar a 3). b. En caso contrario, terminar el proceso. Se habrá generado la secuencia O . a21 a13 π2 a33 {o1} {o2 } {o3 } {o4 } Figura 3.5. Generación de una secuencia de observación concreta. RECONOCIMIENTO DE VOZ USANDO HTK 40 PABLO AGUILERA BONET 3.4 – MODELADO DEL HABLA PARA EL RECONOCIMIENTO 3.4.1 - Fundamentos Para el reconocimiento de palabras aisladas, los modelos ocultos de Markov han demostrado en aplicaciones prácticas ser aquellos que mejores resultados producen. La idea es asignar a cada posible palabra del vocabulario (de tamaño W ) un modelo de estructura similar pero de diferentes parámetros: ( λ ( v ) = A( v ) , B ( v ) , π ( v ) ) , v = 1,...,W Cada modelo está formado por distintos estados, en los cuales se generan los símbolos que constituyen la secuencia de observación. Por otro lado, cada palabra está formada por distintos fonemas. La relación entre estados y fonemas no es directa y será abordada más adelante. La secuencia de estados es desconocida a priori: Q = q1 q2 ... qT . Por último la palabra recibida (y que queremos reconocer) se corresponderá, después de un análisis que extrae sus características más importantes (MFCC), con la secuencia observada. Ésta es conocida en las etapas de entrenamiento, validación y reconocimiento: O = o1 o2 ... oT . 3.4.2 – Los tres problemas básicos de los HMM Existen tres problemas de interés que debemos resolver antes de usar los modelos en aplicaciones reales. Ordenados de menor a mayor dificultad, son los siguientes: – Evaluación de p ( O | λ ) ¿Cómo calcular la probabilidad/verosimilitud de una secuencia observada O = o1 o2 ... oT , dado el modelo HMM de parámetros λ = ( A, B,π ) ? Se trata de calcular la probabilidad de que la secuencia observada fuese producida por el modelo. Representa una medida de qué tal encaja un modelo con una observación. Si debemos elegir de entre un conjunto de modelos (lo cual constituye el núcleo del reconocimiento de voz), la solución a este problema nos ayuda a elegir el que mejor generaría la observación. Esto reduce el problema de reconocimiento a un problema de clasificación de patrones en base a maximizar un criterio. - Decodificación de la secuencia de estados ¿Cómo calcular la secuencia óptima de estados para unas observaciones O = o1 o2 ... oT que provienen de un modelo HMM de parámetros λ = ( A, B,π ) ? Aquí, intentamos descubrir la parte oculta del modelo, es decir, la secuencia correcta de estados. Aquella que mejor explica por qué se tiene esa observación. RECONOCIMIENTO DE VOZ USANDO HTK 41 PABLO AGUILERA BONET Debe quedar claro que no existe una secuencia correcta, pues depende del criterio de optimización. A su vez, éste depende fuertemente de la aplicación concreta. En este caso, vamos a utilizar el criterio MAP (Máximo A Posteriori): max {p ( q1,..., qT | O, λ )} ( q1,..., qT )opt = arg q ,..., q ( 1 T ) – Aprendizaje Dado un modelo HMM y una secuencia de observaciones O = o1 o2 ... oT , ¿cuáles son los parámetros óptimos del modelo λ = ( A, B,π ) para que éste se ajuste a las observaciones? En este caso, intentamos optimizar los parámetros del modelo para que describa lo mejor que pueda cómo hemos obtenido la secuencia observada. Dicha secuencia, usada únicamente para entrenar el modelo, se llama secuencia de entrenamiento. Usaremos el criterio ML (Máxima Verosimilitud) para medir la bondad del modelo: λopt = arg max {p ( O | λ )} λ Este problema es el más importante en la mayoría de las aplicaciones de los HMM, pues se ocupa de crear los mejores modelos posibles que se ajusten a los fenómenos reales. 3.4.3 – Procedimiento para el modelado Consideremos el siguiente reconocedor de palabras aisladas. Para cada palabra de un vocabulario (de W palabras) queremos diseñar un HMM diferente, de N estados. Representamos la señal de voz de una palabra dada como una secuencia discreta de vectores que codifican las características esenciales de la palabra: los coeficientes MFCC. La primera tarea es construir modelos individuales para cada palabra, usando la solución al problema 3 para estimar los parámetros óptimos. Para la comprensión del significado físico de los estados del modelo, usamos la solución al problema 2. Con esto conseguimos segmentar cada modelo en estados, y entonces estudiar las propiedades de los vectores de observación. El objetivo es refinar el modelo para mejorar su capacidad de modelar la secuencia recibida. Finalmente, una vez el conjunto de W modelos han sido diseñados y optimizados, el reconocimiento de una palabra se realiza usando la solución al problema 1. Se asigna una puntuación a cada modelo basada en la secuencia observada de entrada, y se elige como palabra reconocida aquella cuya puntuación sea máxima. En la práctica, la verosimilitud puede computarse a través de la secuencia de estados más probable (problema 2), sin recurrir al cálculo minucioso de todas las combinaciones posibles (problema 1). RECONOCIMIENTO DE VOZ USANDO HTK 42 PABLO AGUILERA BONET 3.5 – SOLUCIÓN A LOS TRES PROBLEMAS BÁSICOS DE LOS HMM 3.5.1 – Evaluación de la verosimilitud de una secuencia observada ¿Cómo calcular la probabilidad/verosimilitud de una secuencia observada O = o1 o2 ... oT , dado el modelo HMM de parámetros λ = ( A, B,π ) ? Nos servirá para poder obtener por clasificación el modelo de palabra más verosímil para la secuencia de observación dada. Existen diferentes soluciones para ello, por lo que nos quedaremos con la más eficiente: - Solución directa Se trata de considerar cada posible secuencia de estados de longitud T que pueda darse en el modelo. Estas secuencias de estados formarán caminos sobre el trellis cuyos nodos son los estados en los distintos instantes de tiempo. Consideremos una secuencia de estados Q = q1 q2 ... qT , siendo q1 el estado inicial. Suponiendo que las observaciones en cada instante son estadísticamente independientes, la probabilidad de la secuencia observada O para la secuencia de estados Q es: T T t =1 t =1 p ( O | Q , λ ) = ∏ p ( ot | qt , λ ) = ∏ bqt ( ot ) = bq1 ( o1 ) bq2 ( o2 ) ... bqT ( oT ) Por otro lado, la probabilidad de que se dé dicha secuencia de estados es: T T t =2 t =2 p ( Q | λ ) = π q1 ∏ p ( qt | qt −1, λ ) = π q1 ∏ aqt −1,qt = π q1 aq1,q2 aq2 ,q3 ... aqT −1,qT Gracias al Teorema de Bayes, la probabilidad conjunta de O y Q , es decir, la probabilidad de que O y Q ocurran simultáneamente, es el producto de los términos anteriores,: p ( O, Q | λ ) = p ( O | Q , λ ) p ( Q | λ ) La probabilidad marginal de O (dado el modelo) se obtiene sumando esta probabilidad conjunta a lo largo de todas las posibles secuencias de estado Q : p (O | λ ) = ∑ p ( O, Q | λ ) = ∑ p (O | Q , λ ) p (Q | λ ) = q1,q2 , ... , qT = q1,q2 , ... , qT = T ∑ ∑ π q bq ( o1 ) aq ,q bq ( o2 ) aq ,q ... aq q1,q2 , ... , qT t =1 = (3.8) T ∏ bqt ( ot ) π q1 ∏ aqt −1,qt = q1,q2 , ... , qT 1 t =2 1 1 2 2 2 3 T −1 ,qT bqT ( oT ) Podemos interpretar (3.8) como sigue: RECONOCIMIENTO DE VOZ USANDO HTK 43 PABLO AGUILERA BONET πq aq1,q2 … 1 aqT −1,qT {o1} {o2 } {oT −1} {oT } Figura 3.6. Cómputo de la probabilidad de un camino concreto q1, q2 , ... , qT . Este cálculo se repetirá para cada camino posible a través del trellis. Inicialmente estamos en el estado q1 con probabilidad π q1 y generamos el símbolo o1 con probabilidad bq1 ( o1 ) . El reloj cambia de t = 1 a t = 2 , y transitamos al estado q2 con probabilidad aq1,q2 , generando el símbolo o2 con probabilidad bq2 ( o2 ) . De esta manera, el proceso continúa hasta que llegamos al estado qT y generamos el símbolo oT con probabilidad bqT ( oT ) . Este proceso completo se realiza para camino q1, q2 , ... , qT posible. Deteniéndonos en la expresión (3.8), puede verse que el cálculo de la manera directa involucra del orden de 2T N T operaciones. Esto se deduce de que cada instante t = 1,..., T podemos alcanzar N posibles estados (es decir, hay N T posibles secuencias). Además, para cada secuencia de estados, necesitamos aproximadamente 2T operaciones (Para ser precisos, necesitamos en total ( 2T − 1) N T multiplicaciones y NT − 1 sumas). El cálculo (3.8) es computacionalmente irrealizable, incluso para pequeños valores de N y T . Por ejemplo, para N = 5 (estados) y T = 100 (observaciones), lo cual implica del orden de 21005100 ≈ 10 72 operaciones. El problema lo introduce el término N T , es decir, el ingente número de secuencias completas que tenemos que computar. Es evidente que se requiere un RECONOCIMIENTO DE VOZ USANDO HTK 44 PABLO AGUILERA BONET procedimiento más eficiente. Afortunadamente, este procedimiento existe y se llama el método de agrupación hacia delante-atrás. a11 π1 a12 a13 a21 a22 π2 a23 π3 a31 {o1} a32 {o2 } a33 {o3 } {o4 } Figura 3.7. El cálculo directo se realiza a través de todos los caminos posibles del trellis. Es necesario encontrar un método recursivo, más eficiente. - El método de agrupación hacia delante Se basa en utilizar cálculos precedentes de las probabilidades de las secuencias, a medida que avanzamos en el tiempo. Dado el modelo λ , sea α n ( j ) la probabilidad conjunta de llegar al estado j en el instante n habiendo observado la secuencia o1 o2 ... on , es decir: α n ( j ) = p ( o1 o2 ... on , qn = j | λ ) (3.9) Podemos poner (3.9) en función de lo que ha sucedido anteriormente en el sistema, y lo que ocurre en este instante. Suponiendo las observaciones estadísticamente independientes entre sí: α n ( j ) = p ( o1 o2 ... on , qn = j | λ ) = p ( o1 o2 ... on −1, qn = j | λ ) p ( on | qn = j, λ ) N b j ( on ) λ ... , = , = | p o o o q j q i ( ) ∑ 1 2 n −1 n n −1 (3.10) i =1 RECONOCIMIENTO DE VOZ USANDO HTK 45 PABLO AGUILERA BONET a1j a2 j … … … aNj {on−1} {on } Figura 3.8. Llegadas al estado j y generación del símbolo on . Este esquema se usará para el cálculo de la recursión. Ponemos el primer factor de (3.10) como resultado de un cálculo de probabilidad marginal, e identificamos el segundo factor como la probabilidad de generar on en el estado j . Operando: N α n ( j ) = b j ( on ) ∑ p ( o1 o2 ... on −1, qn = j, qn −1 = i | λ ) = i =1 = b j ( on ) ∑ p ( o1 o2 ... on −1, qn −1 = i | λ ) p ( qn = j | qn −1 = i, λ ) i =1 aij α n −1 ( i ) N Por tanto, hemos llegado a la relación recursiva que constituye el núcleo del método de agrupación hacia delante: N α n ( j ) = b j ( on ) ∑ (α n −1 ( i ) aij ) , n = 2 , ... , T (3.11) i =1 La recursión (3.11) puede interpretarse de manera muy intuitiva como sigue: RECONOCIMIENTO DE VOZ USANDO HTK 46 PABLO AGUILERA BONET α n −1 (1) = p ( o1 o2 ... on −1, qn −1 = 1| λ ) α n −1 ( 2 ) = p ( o1 o2 ... on −1, qn −1 = 2| λ ) α ( j) = p (o o a1j a2 j … n aNj α n −1 ( N ) = p ( o1 o2 ... on −1, qn −1 = N | λ ) {o1 o2 ... on−1} 1 2 ... on , qn = j | λ ) {on } Figura 3.9. Operaciones necesarias para el cálculo recursivo de α n ( j ) . En el instante n , el estado j puede ser alcanzado desde N posibles estados i , 1 ≤ i ≤ N . El producto α n −1 (i ) aij es la probabilidad del evento conjunto “ o1 o2 ... on −1 ha sido observada” y “el estado j es alcanzado en el instante n , a través del estado i en el instante n − 1 ”. Sumando esta probabilidad a lo largo de los N posibles estados i , obtenemos la probabilidad de estar en el estado j en el instante n y haber observado o1 o2 ... on −1 . Para encontrarnos en la misma situación que (3.9) pero habiendo avanzado un instante, sólo falta generar el símbolo correspondiente. Así, (3.11) se calcula simplemente multiplicando dicha suma por la probabilidad de generar el símbolo que corresponda en este estado, es decir, b j ( on ) . Para completar el algoritmo, volvemos sobre la expresión (3.8) que obtuvimos en el método de cálculo directo. En el sumatorio en q1 sólo deben estar los parámetros que dependen de q1 , es decir: aq1,q2 , π q1 y bq1 ( o1 ) . Asimismo, el sumatorio en q2 debe contener al sumatorio en q1 (pues éste incluye al término aq1q2 ) y además a los factores que dependen de q2 : bq2 ( o2 ) y aq2 ,q3 . Esta forma de agrupar se repite hasta llegar al sumatorio en qT , que contiene a todos los demás sumatorios y términos. Agrupando de manera conveniente, obtenemos el siguiente desarrollo: RECONOCIMIENTO DE VOZ USANDO HTK 47 PABLO AGUILERA BONET N N N N p ( O | λ ) = ∑ bqT ( oT ) ∑ aqT −1,qT ... bq3 ( o3 ) ∑ aq2 ,q3 bq2 ( o2 ) ∑ aq1,q2 π q1 bq1 ( o1 ) q T =1 qT −1 =1 q2 =1 q1 =1 α1( q1 ) α 2 ( q2 ) α 3 ( q3 ) ( ) αT (qT ) Esta expresión nos enseña cómo usar los α n (qn ) para calcular p ( O | λ ) de forma recursiva. El algoritmo a implementar se muestra a continuación: Algoritmo de agrupación hacia delante: 1) Inicialización: α1 ( j ) = b j ( o1 ) π j , 1 ≤ j ≤ N 2) Inducción: αt ( j ) = b j ( ot ) ∑ αt −1 (i ) aij , 1 ≤ j ≤ N , 2 ≤ t ≤ T 3) Final: p ( O | λ ) = p ( o1 o2 ... oT | λ ) = ∑ α T (i ) N i =1 N i =1 El paso de inducción (3.10) se realiza, en cada iteración, para los N estados j distintos. Se repite este proceso T − 1 veces. El paso final es calcular la marginal de p ( o1 o2 ... oT , qT = i | λ ) , sumando en i . Si examinamos los cálculos involucrados en el algoritmo, vemos que se requieren N 2T operaciones, en lugar de las 2TN T operaciones del método directo. De nuevo, para ser precisos, necesitaríamos N(N + 1)(T − 1) + N multiplicaciones y N(N − 1)(T − 1) sumas. Para N = 5 (estados) y T = 100 (observaciones), necesitamos menos de 3000 operaciones, lo cual supone una reducción de 69 órdenes de magnitud respecto al método directo. La clave para este resultado es que, como sólo hay N estados, todas las posibles secuencias de estado serán combinación de esos N estados, sin importar cómo de larga sea la secuencia observada. En cada iteración, el cálculo de αt ( j ) sólo implica a los N valores previos de αt −1(i) , pues cada uno de los estados es alcanzado por los mismos N en el instante anterior. - El método de agrupación hacia detrás De manera similar, y conociendo el modelo λ , podemos considerar una nueva variable β n (i ) . Se define como la probabilidad de obtener las observaciones on +1 on + 2 ... oT , sabiendo que en el instante n estuve en el estado i : β n (i ) = p ( on +1 on + 2 ... oT | qn = i, λ ) (3.12) RECONOCIMIENTO DE VOZ USANDO HTK 48 PABLO AGUILERA BONET Debemos buscar, como antes, una relación recursiva que relacione β n (i ) con β n +1 ( j ) . Podemos expresar (3.12) como resultado del cálculo de una marginal: N β n (i ) = p ( on +1 on +2 ... oT | qn = i, λ ) = ∑ p ( on +1 on + 2 ... oT , qn +1 = j | qn = i, λ ) j =1 Suponiendo las observaciones independientes entre sí, podemos descomponer el contenido del sumatorio anterior de la forma: p ( on +1 on + 2 ... oT , qn +1 = j | q n = i, λ ) = = p ( on +1 on + 2 ... oT , qn +1 = j, qn = i | λ ) p ( qn = i | λ ) p ( qn +1 = j, qn = i | λ ) p ( on +1 on + 2 ... oT | qn +1 = j, λ ) p ( qn = i | λ ) = = (3.13) = p ( qn +1 = j | qn = i, λ ) p ( on +1 | qn +1 = j, λ ) p ( on + 2 ... oT | qn +1 = j, λ ) b j ( on + 1 ) aij β n +1 ( j ) a1j … … a2 j {on } … aNj {on+1} Figura 3.10. Salidas del estado i y generación del símbolo on +1 . Este diagrama se usará en el cálculo de la recursión. Se han identificado los términos con las definiciones. Sustituyendo en la expresión inicial: N β n (i ) = ∑ aij b j ( on +1 ) β n +1 ( j ) , 1 ≤ i ≤ N , n = T − 1, ... ,1 (3.14) j =1 RECONOCIMIENTO DE VOZ USANDO HTK 49 PABLO AGUILERA BONET β n +1 (1) = p ( on +1 on + 2 ... oT | qn = 1) ai 1 aiN β n +1 ( 2 ) = p ( on +1 on + 2 ... oT | qn = 2 ) … ai 2 … β n (i ) = p ( on +1 on + 2 ... oT | qn = i) β n +1 ( N ) = p ( on +1 on + 2 ... oT | qn = N ) {on+1} {on + 2 on + 3 ... oT } Figura 3.11. Operaciones necesarias para el cálculo de β n (i ) A partir de la expresión obtenida en (3.8) y de manera análoga al método hacia delante, podemos agrupar los sumatorios de forma que obtengamos un orden adecuado de cálculo: p (O | λ ) = ∑ p (O | Q , λ ) p ( Q , λ ) = q1,q2 , ... , qT = ∑∑ ...∑ π q1 bq1 ( o1 ) aq1,q2 bq2 ( o2 ) aq2 ,q3 ... aqT −1,qT bqT ( oT ) = q1 q2 qT N N N N = ∑ π q1 bq1 ( o1 ) ∑ aq1,q2 bq2 ( o2 ) ... ∑ aqT − 2 ,qT −1 bqT −1 ( oT −1 ) ∑ aqT −1,qT bqT ( oT ) 1 q =1 q =1 q1=1 q2 =1 βT ( qT ) T −1 T β q ( ) − − T 1 T 1 βT − 2 ( qT − 2 ) β1 ( q1 ) Con esto podemos determinar la estructura completa del algoritmo: RECONOCIMIENTO DE VOZ USANDO HTK 50 PABLO AGUILERA BONET Algoritmo de agrupación hacia detrás: 1) Inicialización: βT (i ) = 1 , 1 ≤ i ≤ N 2) Inducción: βt (i ) = ∑ aij b j ( ot +1 ) βt +1 ( j ) , 1 ≤ i ≤ N , t = T − 1, ... ,1 N j =1 p (O | λ ) = 3) Final: N ∑π q1 =1 q1 bq1 ( q1 ) β1 ( q1 ) El paso final corresponde a calcular la marginal de p ( o1 o2 ... oT , q1 = i | λ ) , eliminando i . El cálculo del rendimiento del algoritmo de realiza de forma análoga al método hacia delante, obteniendo un coste computacional del mismo orden. 3.5.2 – Decodificación de la secuencia de estados ¿Cómo calcular la secuencia óptima de estados para unas observaciones O = o1 o2 ... oT que provienen de un modelo HMM de parámetros λ = ( A, B,π ) ? Este problema tiene aplicación en la alineación de los estados de los fonemas y las palabras con la secuencia observada. Hay muchas soluciones posibles: la diferencia radica en qué criterio de optimización elegimos. - Criterio MAP individual Un posible criterio consiste en elegir los estados qt que, individualmente, son más verosímiles. Este criterio de optimización maximiza el número esperado de estados correctos. Al implementar esta solución para el Problema 2, definimos la siguiente variable, que representa la probabilidad de estar en el estado i (en el instante t ), dada secuencia de observación O y el modelo λ : γ n (i ) = p ( qn = i | O, λ ) (3.15) Multiplicando (3.15) por p ( O | λ ) y usando las definiciones anteriores (3.9) y (3.12): p ( O | λ ) γ n ( i ) = p ( O | λ ) p ( qn = i | O, λ ) = p ( O, qn = i | λ ) = = p ( o1 o2 ... on , qn = i | λ ) p ( on +1 on + 2 ... oT | qn = i, λ ) = α n (i ) β n ( i ) N Por lo tanto, usando p ( O | λ ) = ∑ p ( O, qn = i | λ ) : i =1 γ n (i ) = α n (i ) β n (i ) α ( i ) β n (i ) = N n p (O | λ ) ∑ α n (i ) β n ( i ) (3.16) i =1 RECONOCIMIENTO DE VOZ USANDO HTK 51 PABLO AGUILERA BONET () γn i ⋯ α n (i ) ⇒ ⇐ β n (i ) {on } {o1 o2 ... on−1} ⋯ {on+1 on+2 ... oT } ⇓ γ n (i ) Figura 3.12. Elementos involucrados en el cálculo de γ n (i ) . Puede verse cómo α n (i ) contempla la secuencia observada antes de llegar al estado i (en el instante n ), y β n (i ) lo hace en los instantes posteriores. Como γ n (i ) es una función densidad de probabilidad, se cumple: N N ∑ γ (i ) = ∑ p ( q n i =1 i =1 N n = i | O, λ ) = ∑ i =1 p ( qn = i, O | λ ) p (O | λ ) = p (O | λ ) p (O | λ ) =1 De esta forma, usando γ n (i ) podemos resolver el Problema 2 para hallar, para cada n , el estado individual qn más verosímil: qn = arg max {γ n ( i )} , 1 ≤ n ≤ T 1≤i ≤ N Aunque esta pueda parecer una buena solución, puede haber algunos problemas con la secuencia Q que resulte de resolver cada estado individualmente. Por ejemplo cuando el HMM tiene transiciones de estado con probabilidad cero ( aij = 0 para algún i y algún j ), la secuencia “óptima” de estados puede no ser ni siquiera un secuencia válida de estados. Esto se debe al hecho de que la solución qn simplemente determina el estado más verosímil en ese instante, sin tener en cuenta si existe un camino para llegar a él. RECONOCIMIENTO DE VOZ USANDO HTK 52 PABLO AGUILERA BONET - Criterio MAP conjunto Una posible solución es modificar el criterio de optimización. Podemos decidir resolver la secuencia de estados que maximiza en número de pares correctos ( qn , qn +1 ), o para la terna de estados ( qn , qn +1, qn + 2 ). Siguiendo con este razonamiento, el criterio más ampliamente usado es encontrar la secuencia de estados (camino) que maximiza p ( Q | O, λ ) , lo cual equivale a maximizar p ( Q , O | λ ) : p ( O, Q | λ ) = arg max {p ( O, Q | λ )} λ p O | ( ) T) ( q1,...,qT ) max {p ( Q | O, λ )} = arg max ( q1,..., qT )opt = arg q ,...,q q ,...,q ( 1 T ) ( 1 Afortunadamente, se conoce una técnica eficiente para encontrar este camino óptimo. Está basada en métodos de programación dinámica y se llama algoritmo de Viterbi. Para ello factorizamos p ( O, Q | λ ) en transiciones de estado y generaciones de símbolos: p ( O, Q | λ ) = π q1 bq1 ( o1 ) aq1,q2 bq2 ( o2 ) aq2 ,q3 ... aqT −1,qT bqT ( oT ) (3.17) Esto puede también hacerse sólo hasta cierto estado qn = j : p ( q1,..., qn −1, qn = j, o1,..., on | λ ) = π q1 bq1 ( o1 ) aq1,q2 bq2 ( o2 ) aq2 ,q3 ... aqn −1, j b j ( on ) Para encontrar la mejor secuencia de estados (3.18) Q = q1, q2 ,..., qT , dada la observación O = o1, o2 ,..., oT , definimos la cantidad: δ n ( j ) = max {p ( q1,..., qn −1, qn = j, o1,..., on | λ )} (3.19) q1 ,...,qn −1 Es la probabilidad máxima a lo largo de un camino determinado, tal que se dan las primeras n observaciones y se alcanza el estado j (en el instante n ). Para hallar un método de cálculo eficiente, debemos encontrar una relación recursiva entre δ n ( j ) y δ n −1 ( j ) , porque de esta forma el mejor camino hasta el instante n contendrá al mejor camino hasta el instante n − 1 . Usando (3.18) en (3.19): δ n ( j) = max {p ( q1,..., qn −1, qn = j, o1,..., on | λ )} = q1 ,...,qn −1 { } = max π q1 bq1 ( o1 ) aq1,q2 bq2 ( o2 ) aq2 ,q3 ... aqn −1, j b j ( on ) q1 ,...,qn −1 Al igual que en el instante n se alcanza el estado j , suponemos que en el instante n − 1 se alcanzó el estado i : δ n ( j) = max { max {π b i =1,...,N q1 ,...,qn − 2 q1 q1 ( o1 ) aq ,q bq ( o2 ) aq ,q ...aq 1 2 2 2 3 n − 2 ,i } b (o ) a }b (o ) = i n −1 ij j n = max max {p ( q1,..., qn − 2 , qn −1 = i, o1,..., on −1 | λ )} aij b j ( on ) = max δ n −1 (i ) aij b j ( on ) i =1,...,N q1,...,qn − 2 i =1,...,N δ n −1 ( i ) { } RECONOCIMIENTO DE VOZ USANDO HTK 53 PABLO AGUILERA BONET Por lo tanto, la recursión consiste en elegir, en el instante n , el estado qn que maximiza el criterio MAP, a partir de dicho criterio para el instante precedente. Antes de ver el algoritmo, definiremos otra variable ψ n ( j) , que es el estado i del que se debe partir (en el instante n − 1 ) para llegar al estado j (en el instante n ) con máxima probabilidad. Se interpreta como la rama por la que es más probable haber llegado al estado j . Algoritmo de Viterbi: 1) Inicialización: i = 1,..., N δ1 (i ) = π i bi ( o1 ) ψ 1(i) = 0 2) Recursión: j = 1,..., N t = 2,..., T , δt ( j) = max {δt −1 ( i ) aij } bj ( ot ) i =1,...,N ψ t ( j) = arg max {δt −1 ( i ) aij } i =1,...,N 3) Final: pmax = max {δ T (i )} i =1,...,N qɵ T = arg max {δ T (i )} i =1,...,N 4) “Backtracking”: elección del mejor camino. { } qɵ t = ψ t +1 qɵ t +1 , t = T − 1,...,1 Aquí, qɵ t es el estado que elijo como correcto para el instante t . En el paso 3 se ha usado: pmax = max ( q1,...,qT ) {p (O, Q | λ )} = max { max {p ( q ,..., q i =1,...,N q1 ,...,qT −1 1 } , qT = i, o1,..., oT | λ )} = max {δ T (i )} T −1 i =1,...,N RECONOCIMIENTO DE VOZ USANDO HTK 54 PABLO AGUILERA BONET δn −1 ( 1) a11 1 δ n− a12 ) 2 ( 1) ( δn (3 ) {on−1} ψ 2 (1) {on } ψ 3 (1) π1 (b) ψ 2 ( 2) ψ 3 ( 2) ψ 2 ( 3) ψ 3 ( 3) π2 π3 {on+1 o2 ... oT } ψ 4 (1) ψ 4 ( 2) ψ 4 ( 3) i =1,...,N δ n−1 {o1 o2 ... on −2 } a13 ¿ arg max {δ T (i )} ? (a) RECONOCIMIENTO DE VOZ USANDO HTK 55 PABLO AGUILERA BONET qˆ1 = ψ 2 ( 2 ) = 1 qˆ2 = ψ 3 ( 3 ) = 2 qˆ3 = ψ 4 ( 2 ) = 3 qˆ4 = 2 π1 (c) π2 π3 Figura 3.13. Algoritmo de Viterbi. (a) Recursión (I): en cada instante, para cada estado se calcula el camino de llegada más probable. (b) Recursión (II) y final: el proceso se repite recursivamente hasta llegar al final, donde se elige el estado que maximiza δ T (i ) . (c) “Backtracking”: se elige como mejor camino aquel que haya quedado entre q1 y q1 tras el proceso anterior. Se aprecia que el algoritmo de Viterbi es similar (excepto por el último paso) en su implementación al método de agrupación hacia delante visto anteriormente para solucionar el Problema 1. La mayor diferencia es la maximización en lugar de la suma en los pasos 2 y 3: el algoritmo de Viterbi no sólo es una forma eficiente de computar una probabilidad, sino que además decide el camino que la maximiza. Además, debe notarse que una estructura en forma de rejilla (trellis) permite implementar los cálculos del procedimiento de manera natural. Son necesarias N 2T operaciones, lo cual es un indicador de lo eficaz que es este algoritmo (crece linealmente con T ). – El algoritmo de Viterbi basado en sumas Adicionalmente, podemos usar la función logaritmo para transformar los productos en sumas, consiguiendo que el algoritmo compute sólo N 2T sumas. Como el logaritmo es monótonamente creciente y usando (3.17): RECONOCIMIENTO DE VOZ USANDO HTK 56 PABLO AGUILERA BONET max {p ( Q , O | λ )} = arg max {log ( p ( Q , O | λ ) )} = ( q1,..., qT )opt = arg q ,...,q q ,...,q ( 1 T ) ( { ( 1 T ) = arg max log π q1 bq1 ( o1 ) aq1,q2 bq2 ( o2 ) aq2 ,q3 ... aqT −1,qT bqT ( oT ) ( q1,...,qT ) )} = T = arg max π q1 bq1 ( o1 ) ∏ aqt −1,qt bqt ( ot ) = ( q1,...,qT ) t =2 T = arg max log π q1 + log bq1 ( o1 ) + ∑ log bqt ( ot ) + log aqt −1,qt ( q1,...,qT ) t =2 ( ) ( ) ( ( ) ( )) Así, el algoritmo queda con la misma estructura si definimos: { } { } δ 'n ( j ) = max log ( p ( q1,..., qn −1, qn = j, o1,..., on | λ ) ) = max δ 'n −1 (i ) + log ( aij ) + log ( b j ( on ) ) q1,...,qn −1 i =1,...,N Algoritmo de Viterbi basado en sumas: i = 1,..., N 1) Inicialización: δ '1 ( i ) = log ( π i ) + log ( bi ( o1 ) ) ψ 1(i) = 0 j = 1,..., N 2) Recursión: { , t = 2,..., T } δ 't ( j) = max δ 't −1 (i ) + log ( aij ) + log ( b j ( ot ) ) i =1,...,N { } ψ t ( j) = arg max δ 't −1 (i ) + log ( aij ) i =1,...,N 3) Final: log ( pmax ) = max {δ 'T ( i )} i =1,...,N qɵ T = arg max {δ 'T (i )} i =1,...,N 4) “Backtracking”: elección del mejor camino. { } qɵ t = ψ t +1 qɵ t +1 , t = T − 1,...,1 3.5.3 – Aprendizaje Dado un modelo HMM y una secuencia de observaciones O = o1 o2 ... oT , ¿cuáles son los parámetros óptimos del modelo λ = ( A, B,π ) para que éste se ajuste a las observaciones? RECONOCIMIENTO DE VOZ USANDO HTK 57 PABLO AGUILERA BONET Con mucho, este es el problema más complicado de resolver de los tres que se nos presentan al tratar de aplicar los HMM al reconocimiento. No existe una solución analítica conocida para hallar el modelo que maximiza la probabilidad de la secuencia de observación, p ( O | λ ) . De hecho, dada una secuencia de observación finita, no hay un forma óptima de estimar los parámetros del modelo. – El algoritmo EM Podemos, no obstante, elegir λ = ( A, B,π ) tal que p ( O | λ ) tiene un máximo local usando un procedimiento iterativo como el algoritmo EM (Promediado-Modificación), que dará lugar al método de Baum-Welch. También pueden usarse técnicas de estimación basadas en el gradiente. En esta sección estudiaremos el método iterativo de Baum-Welch. Aunque en el capítulo 2 se introdujo el método de forma general (sección 2.5), en esta sección veremos cómo aplicarlo para resolver el Problema 3 de los HMMs aplicados al reconocimiento. Aquí, se encargará de encontrar un máximo local basándose en el criterio de Máxima Verosimilitud (ML): λopt = arg max {p ( O | λ )} λ ( m m m m El núcleo del algoritmo EM consiste en iterar para obtener λ ( ) = A( ) , B ( ) ,π ( ) parámetros de la iteración anterior λ ( m −1) ( = A( m −1) , B( m −1) ,π ( m −1) ). ) a partir de los Algoritmo de Promediado-Maximización (EM): 1) Inicialización: λ( 0) i =1 , 2) Promediado: ( ) m m −1 Q λ( ) |λ( ) = E {log ( p (O,q | λ ))} = ∑ p (O,q | λ ( ) ) log ( p (O,q | λ )) m −1 ( m) q|O,λ ( m −1) ( m) q 3) Maximización: λ( m) { ( m m −1 = arg max Q λ ( ) | λ ( ) λ )} 4) ¿Convergencia? a. Sí: El algoritmo converge a un máximo local de la función de verosimilitud logarítmica p ( O | λ ) . b. No: ( m ← m + 1) y volver al paso 2. RECONOCIMIENTO DE VOZ USANDO HTK 58 PABLO AGUILERA BONET ( ) m m −1 En este método, Q λ ( ) | λ ( ) es la función auxiliar de Baum y puede demostrarse que: { ( m m −1 max Q λ( ) |λ( ) (m) λ )} ⇒ p (O | λ ( ) ) > p (O | λ ( ) ) m −1 m Ahora estudiaremos la solución dada por el algoritmo EM para la re-estimación del HMM. Como es habitual, antes debemos definir algunas variables. Sea ξt (i, j ) la probabilidad de estar en el estado j en el instante t , y en el estado i en el instante t + 1, dado el modelo y la secuencia completa de observación: ξ n (i, j ) = p ( qn = i, q n +1 = j | O, λ ) n = 1,..., T , (3.20) De nuevo, operando con la definición, podemos poner esta variable en función de α n (i ) y β n ( j ) : ξn (i, j ) = p ( qn = i, qn +1 = j | O, λ ) = = p ( qn = i, qn +1 = j, O | λ ) p (O | λ ) = p ( o1 o2 ... on , qn = i | λ ) p ( on +1 on + 2 ... oT , qn +1 = j | qn = i, λ ) p ( O, λ ) = ij n (i ) α p ( o1 o2 ... on , qn = i | λ ) p ( q n +1 = j | qn = i, λ ) p ( on +1 ... oT | qn +1 = j, λ ) a = p ( O, λ ) ( n +1 ) ij n +1 ( ) n (i ) α j p ( o1 o2 ... on , qn = i | λ ) p ( q n +1 = j | qn = i, λ ) p ( on +1 | qn +1 = j, λ ) p ( on + 2 ... oT | qn +1 = j, λ ) a = = = β b o j p ( O, λ ) = α n (i ) aij b j ( on +1 ) βn +1 ( j ) p ( O, λ ) (3.21) Se ha usado cierto desarrollo que apareció en (3.13). Podemos poner el denominador de (3.21) como resultado de calcular una marginal eliminando i y j : N N N N p ( O, λ ) = ∑∑ p ( O, qn = i, qn +1 = j | λ ) = ∑∑ α n (i ) aij b j ( on +1 ) β n +1 ( j ) i =1 j =1 i =1 j =1 Por todo ello, una forma de calcular ξt (i, j ) a partir de otras variables conocidas es: ξn (i, j ) = α n (i ) aij b j ( on +1 ) βn +1 ( j ) N N ∑∑ α (i ) a b ( o ) β ( j ) n ij j n +1 , n = 1,..., T n +1 i =1 j =1 RECONOCIMIENTO DE VOZ USANDO HTK 59 PABLO AGUILERA BONET aij α n (i ) ⇒ ⇐ β n +1 (i ) {o1 o2 ... on−1} {on+1} {on } {on +2 ... oT } ⇓ ξn (i , j ) Figura 3.14. Operaciones necesarias para el cálculo de ξ n (i, j ) a partir de α n (i) y β n +1 ( j ) . Por otro lado, hemos definido previamente γ n (i ) en (3.15). Si calculamos la marginal de ξ n (i, j ) eliminando j (independizamos del estado al que se llega), obtenemos precisamente γ n (i ) : N N ∑ ξ (i, j ) = ∑ p ( q n j =1 n = i, qn +1 = j | O, λ ) = p ( q n = i | O, λ ) = γ n (i ) j =1 Estas variables, γ t (i ) y ξt (i, j ) , pueden ser sumadas a lo largo del tiempo t para calcular el número esperado de transiciones entre estados. Concretamente: • Sumando γ t (i ) obtenemos el número esperado (a lo largo del tiempo) de veces que el estado i es visitado, o equivalentemente, el número de transiciones que se hacen desde el estado i (excluyendo en la suma el instante t = T ): T −1 ∑ γ (i ) ≡ n Número esperado de transiciones desde i . t =1 • Sumando ξt (i, j ) obtenemos el número esperado (a lo largo del tiempo) de transiciones desde el i estado al j (excluyendo en la suma el instante t = T ): RECONOCIMIENTO DE VOZ USANDO HTK 60 PABLO AGUILERA BONET T −1 ∑ ξ (i, j ) ≡ t Número esperado de transiciones desde i hacia j . t =1 Usando estas fórmulas (y el nuevo concepto de “contar eventos a lo largo del tiempo”), estamos en disposición de dar el la solución del algoritmo EM para re-estimar los parámetros de un HMM. Fórmulas de re-estimación de Baum-Welch: { ( m m m −1 Se tiene en cada iteración una nueva estimación λ ( ) = arg max Q λ ( ) | λ ( ) λ )} = ( A( ) , B( ),π ( ) ) , m m m de manera que: • Probabilidad media de empezar en el estado i en el instante t = 1 : p ( q1 = i, O | λ ) π i(m ) = p ( q1 = i | O, λ ) = • = γ 1 (i ) p (O | λ ) (3.22) Probabilidad media de las transiciones del estado i al estado j : T −1 (m ) aij = p ( qt +1 = j | qt = i, O, λ ) ≙ ∑ p (q t +1 = j, qt = i, O | λ ) = t =1 T −1 ∑ p (q = i, O | λ ) t t =1 T −1 = ∑ p (q t +1 t =1 T −1 ∑ p (q t t =1 = • T −1 = j, qt = i | O, λ ) p ( O | λ ) ∑ ξ (i, j ) t =1 T −1 = = i | O, λ ) p ( O | λ ) t = ∑ γ (i ) (3.23) t t =1 Número medio de transiciones desde el estado i al j Número medio de transiciones desde el estado i Probabilidad media de estar en el estado i y observar el símbolo v k : T −1 (m ) bi ( k ) = p ( ot = v k | qt = i,O, λ ) ≙ ∑ p (o t = v k , qt = i, O | λ ) δ ( ot , v k ) = t =1 T −1 ∑ p (q t = i, O | λ ) t =1 T −1 = ∑ p (q t =1 t T −1 ∑ p (q t =1 = T = i | O, λ ) δ ( ot , v k ) p ( O | λ ) t = i | O, λ ) p ( O | λ ) = ∑ γ (i ) δ ( o , v ) t =1 t t T ∑ γ (i ) t =1 k = (3.24) t Número medio de veces que estoy en el estado i y observo el símbolo v k Número medio de veces que estoy en el estado i A partir de este procedimiento se puede demostrar que, en cada iteración, se da uno de estos dos casos: RECONOCIMIENTO DE VOZ USANDO HTK 61 PABLO AGUILERA BONET • El modelo λ ( λ( m) = λ( m −1) m −1) define un punto crítico de la función de verosimilitud p ( O | λ ) , por lo que y el método concluye. o bien, • m m −1 El modelo λ ( ) es más verosímil que el modelo λ ( ) , en el sentido de que se cumple ( ) ( ) m m m −1 p O | λ ( ) > p O | λ ( ) , es decir, que hemos encontrado un nuevo modelo λ ( ) al que se ajusta más la secuencia de observación (es más probable que la generase). Si sustituimos el nuevo modelo en el lugar del anterior, y repetimos el cálculo varias veces, mejoraremos la probabilidad p ( O | λ ) hasta que se alcanza un punto límite. En ese momento, el algoritmo converge y se dice que ha alcanzado la máxima verosimilitud estimada del HMM. - Notas sobre el proceso de re-estimación Las fórmulas de re-estimación de Baum-Welch vistas anteriormente son equivalentes, para este problema particular, a una implementación del algoritmo EM. Un aspecto importante del proceso de re-estimación es que las restricciones estocásticas de los parámetros del HMM son satisfechas automáticamente en cada iteración: N ∑π ( m) i =1 , m = 0,1,2,... =1 , 1≤ i ≤ N , m = 0,1,2,... , 1≤ j ≤ N , m = 0,1,2,... i =1 N ∑ a( m) ij j =1 M ∑ b( ) ( k ) = 1 m j k =1 Como en otros problemas de optimización, puede usarse la técnica de los multiplicadores de Lagrange para encontrar los valores de π i , aij y b j ( k ) que maximizan la función p = p ( O | λ ) . Usando esta técnica, puede llegarse a las expresiones: π i(m ) = π i(m −1) N ∑π l =1 ∂p ∂π i ( m −1) l ∂p ∂π l( m −1) , m aij( ) = ail( ∂p m −1) ( m −1) N ∂ail ∑a ( m −1) il l =1 b (j ( m −1) ∂p m −1 ∂ail( ) , m b j( ) ( k ) = M m −1) ∑b l =1 (k ) ( m −1) j ∂p ( m −1) ∂b j (l ) (k) ∂p ∂b (j m −1) (3.25) (l ) Manipulando de manera apropiada (3.25), pueden transformarse fácilmente en las fórmulas de reestimación de Baum-Welch. Por último, también pueden utilizarse técnicas de aproximación por gradiente para hallar los parámetros óptimos del modelo. Estos procedimientos han mostrado en la práctica dar soluciones comparables a las anteriores. RECONOCIMIENTO DE VOZ USANDO HTK 62 PABLO AGUILERA BONET 3.6 – CONCLUSIONES En este capítulo hemos presentado la teoría general de los Modelos Ocultos de Markov, que forma el núcleo del sistema de reconocimiento de voz. Se ha partido de los procesos de Markov y hemos ido añadiendo progresivamente complejidad al modelo. Posteriormente, hemos presentado los tres problemas básicos que deben resolverse antes de poder aplicar esta teoría al reconocimiento de voz: la evaluación de la función de verosimilitud, la decodificación de la secuencia de estados y la re-estimación de los parámetros del modelo. En el resto del capítulo hemos resuelto en detalle cada uno de estos tres problemas, presentando tres potentes algoritmos: el método de agrupación delante-atrás, el algoritmo de Viterbi y el algoritmo EM (fórmulas de re-estimación de Baum-Welch). La mayor parte de este capítulo está basado en la teoría expuesta en [VOZ] y el artículo [RABINER]. Los Modelos Ocultos de Markov han demostrado en la práctica ser la herramienta de modelado de voz que mejor funciona en el problema concreto del reconocimiento. No obstante, aún quedan algunos detalles que debemos pulir antes de comenzar la construcción de nuestro reconocedor de voz. Esto se verá en el capítulo 4. RECONOCIMIENTO DE VOZ USANDO HTK 63 PABLO AGUILERA BONET RECONOCIMIENTO DE VOZ USANDO HTK 64 PABLO AGUILERA BONET 4 – ASPECTOS PRÁCTICOS DEL RECONOCIMIENTO DEL HABLA Una vez hemos presentado la forma de trabajar con la señal de voz y la teoría de los Modelos Ocultos de Markov, debemos abordar ciertos problemas particulares que aparecen al intentar aplicarla a nuestra aplicación concreta. A diferencia del capítulo anterior, más generalista, en éste particularizamos para el caso que nos ocupa: la transcripción del habla humana. Resolveremos problemas tanto de diseño como de implementación, finalizando con alguna aplicación particular que serán llevadas a cabo en capítulos posteriores. 4.1 – ELECCIÓN DEL MODELO 4.1.1 – Tipos de HMM – El modelo ergódico Hasta ahora, sólo hemos considerado el caso general de HMM ergódicos (todos los estados conectados entre sí). En ellos, un estado puede ser alcanzado desde cualquier otro en un solo paso. Este tipo de modelo se caracteriza porque: aij > 0 , 1 ≤ i, j ≤ N Un modelo con N = 4 estados presentaría una matriz de transición como la siguiente: a11 a A = 21 a31 a41 a12 a22 a32 a13 a23 a33 a42 a43 a14 a24 a34 a44 RECONOCIMIENTO DE VOZ USANDO HTK 65 PABLO AGUILERA BONET Figura 4.1. Modelo ergódico de 4 estados. Cada estado es accesible desde todos los demás y desde él mismo. Para algunas aplicaciones, entre las que se encuentra el reconocimiento de voz, se ha constatado que otros tipos de HMM modelan mejor las propiedades de la secuencia de observación. Uno de ellos es el modelo de Bakis. – El modelo de Bakis También se conoce como modelo izquierda-derecha, pues la secuencia de estados oculta tiene la propiedad de que, conforme el tiempo se incrementa, el estado se incrementa (o permanece constante). Se utiliza en el modelado del habla porque se ajusta a señales cuyas propiedades cambian a lo largo del tiempo, como la voz. Matemáticamente, la propiedad fundamental de todos los modelos de Bakis es que los coeficientes de transición cumplen: aij = 0 , j < i Es decir, que no puedo transitar a un estado cuyo número es anterior al actual. Es más, las probabilidades de estado iniciales cumplen: 0 , i ≠ 1 1 , i = 1 πi = Esto se debe a que la secuencia de estados debe comenzar en el estado 1 ( q1 = 1 ) y acabar en el estado N ( qT = N ). Por tanto, debe cumplirse: aNN = 1 aNj = 0 , j < N Además, en este tipo de modelos, suelen imponerse restricciones adicionales para asegurarnos de que no se den transiciones bruscas entre estados lejanos. Dichas restricciones son de la forma: aij = 0 , j > i + ∆ , ∆ = 1,..., N RECONOCIMIENTO DE VOZ USANDO HTK 66 PABLO AGUILERA BONET Aquí, ∆ es elegido según nos convenga para el modelado. Por ejemplo, para N = 4 y ∆ = 2 , el modelo tipo Bakis presenta la siguiente estructura: Figura 4.2. Modelo de Bakis de 4 estados. Cada estado sólo puede transitar a estados posteriores (o no transitar). La matriz de transición de este modelo es de la forma: a11 a12 0 a22 A= 0 0 0 0 a13 a23 a33 0 0 a24 a34 a44 – Otros modelos Aunque nos centraremos en el modelo descrito, pues es el que usaremos posteriormente, existen muchas variaciones y combinaciones posibles. Por ejemplo, el siguiente modelo muestra una variante del modelo de izquierda a derecha de Bakis, con estructura en paralelo. Nótese que existe varios caminos posibles entre los estados inicial y final: Figura 4.3. Modelo de Bakis de 6 estados, con caminos paralelos. Estrictamente hablando, se comporta como un modelo tipo Bakis pero que presenta mayor flexibilidad (no todos los estados tienen por qué ser visitados). RECONOCIMIENTO DE VOZ USANDO HTK 67 PABLO AGUILERA BONET Debe quedar claro que, aunque impongamos condiciones sobre ciertos aij para que se anulen, esto no planteará ningún problema durante el proceso de re-estimación, pues las fórmulas de Baum-Welch (3.22), (3.23) y (3.24) conservan a cero aquellos parámetros inicialmente puestos a cero. Por tanto, para reconocimiento de palabras aisladas (con un HMM para cada palabra), usaremos modelos de Bakis, pues permiten asociar estados del modelo con eventos físicos (fonemas, sílabas). 4.1.2 – Número de estados del modelo El problema de elegir el número de estados N tiene dos formas de abordarse: • La primera idea es dejar que el número de estados corresponda estrictamente con varias veces el número de fonemas de la palabra. Por ejemplo, 3 estados por fonema sería un valor adecuado, resultando N ∈ 5,20 . El primer y el último estado pueden no generar observaciones, sino simplemente modelar los silencios de comienzo y fin de la palabra. • La otra idea es que N corresponda con el número medio de observaciones en la pronunciación de la palabra. De esta forma tenemos un estado por cada intervalo de observación (unos 15 mseg ). La primera técnica es la que se utilizará en nuestro diseño. Es más, restringiremos cada modelo para que todos tengan el mismo número de estados. Esto significa que los modelos funcionan mejor cuando representan palabras con el mismo número de fonemas. Para ilustrar el efecto de variar el número de estados en un modelo de una palabra, la siguiente figura muestra el error medio al reconocer una palabra, en función del número de estados N : Figura 4.4. Error medio en el reconocimiento de palabras, frente al número de estados N . Para la elaboración de la gráfica, se ha diseñado un reconocedor de dígitos aislados (un vocabulario de 10 palabras). Puede observarse que el error es prácticamente insensible a N , consiguiendo un mínimo local en N = 6 . Es por ello que se usa N para afinar el comportamiento deseado. Extraído de [RABINER]. RECONOCIMIENTO DE VOZ USANDO HTK 68 PABLO AGUILERA BONET 4.1.3 – Probabilidad de observación asociada a cada estado En cada estado j , debemos definir la forma que tiene probabilidad de que se genere un símbolo concreto v k . Esta función densidad de probabilidad viene dada por (3.6). El símbolo v k es un vector de 39 coeficientes MFCC, que representa las características esenciales de la señal en ese instante. La probabilidad asociada a su generación vendrá dada por una f.d.p. gaussiana unidimensional, representada por un vector de 39 elementos. 4.2 – PROBLEMAS DE DISEÑO DEL MODELO 4.2.1 – Escalado de los coeficientes Consideremos la relación recursiva de α n (i ) en el método de agrupación hacia delante, dada por la expresión (3.11). Puede deducirse que αt (i ) consiste en una suma de una gran cantidad de términos, en los cuales hay productos de coeficientes aqn ,qn +1 entre sí, de bqn ( on ) entre sí, y de aqn ,qn +1 con bqn ( on ) . Como todos estos coeficientes son menores que la unidad, α n (i ) decrece exponencialmente con n . Cuando n se hace suficientemente grande, el rango dinámico de α n (i ) excede la precisión habitual de cualquier computador. La única forma de realizar el cálculo de manera correcta consiste en incorporar un procedimiento de escalado. Lo habitual es multiplicar α n (i ) por un coeficiente independiente de i pero dependiente de n , con el objetivo de mantener escalado α n (i ) dentro del rango dinámico de la máquina, para 1 ≤ n ≤ T . Un escalado similar se realiza para los β n (i ) , dados por (3.14), de manera que al final del cómputo los coeficientes de escalado se cancelan entre sí. Al implementar el reconocedor en máquinas con aritmética de coma flotante, desaparecerá este problema, pues el rango dinámico se va ajustando. Una discusión profunda de este efecto y su formalismo matemático puede verse en [RABINER], donde se especifican algunas recomendaciones para el diseño de los coeficientes de escalado. 4.2.2 – Necesidad de secuencias de observación múltiples En la sección 4.1 presentamos el modelo de Bakis, en el que la secuencia de estados recorre desde o1 = 1 hasta oT = N . El principal problema que presenta este modelo es que no puede ser entrenado con una sola secuencia de observación. Esto es porque la naturaleza transitoria de los estados del modelo sólo permite un pequeño número de observaciones, para cualquier estado. De ahí se deduce que tenemos que usar múltiples secuencias de observación para estimar todos los parámetros del modelo. La modificación que debe hacerse del algoritmo de re-estimación es sencilla. Sea OM un conjunto de R secuencias de observación, que utilizaremos para el entrenamiento: RECONOCIMIENTO DE VOZ USANDO HTK 69 PABLO AGUILERA BONET { 1 2 OM = O ( ) , O ( ) , ..., O R } , { r r r r O ( ) = o1( ) , o2( ) , ..., oT( r ) con } r = 1,..., R , Supongamos que las secuencias de observación son independientes entre sí. De esta manera, habrá que ajustar las fórmulas de Baum-Welch para encontrar λ = ( A, B,π ) que maximice la función de verosimilitud conjunta: R ( ) R r p ( OM | λ ) = ∏ p O ( ) | λ = ∏ pr r =1 r =1 Como las fórmulas de re-estimación para aij y b j ( k ) están basadas en contar la ocurrencia de eventos, básicamente se modifican en que hay que normalizar por pr y sumar para todo r . Para π i no hay que hacer re-estimación, pues al tratarse de un modelo de Bakis: 1 0 πi = , i =1 , i ≠1 r El mecanismo de escalado de los coeficientes sigue funcionando, pues cada secuencia O ( ) tendrá sus propios coeficientes de escalado. 4.2.3 – Estimación inicial de los parámetros En teoría, las fórmulas de Baum-Welch proporcionan los parámetros λ que corresponden a un máximo local de la función de verosimilitud p ( O | λ ) . Una cuestión esencial para que la estimación sea buena es: ¿Cómo elegir la estimación inicial λ ( ) de forma que el máximo local que se alcance al iterar sea el máximo global de la función de verosimilitud? 0 No existe un método concreto para responder a esta pregunta. La experiencia muestra que una inicialización aleatoria o uniforme de A y π es adecuada para re-estimación. En cambio, para B , parece que es necesario disponer de una buena estima inicial para que el algoritmo EM funcione correctamente. p (O | λ ) 0 λ( ) λ * λopt λ Figura 4.5. Importancia de la elección inicial de los parámetros. El algoritmo EM entrenará al reconocedor hasta llegar a un modelo subóptimo, correspondiente a un máximo local. RECONOCIMIENTO DE VOZ USANDO HTK 70 PABLO AGUILERA BONET En nuestros casos prácticos inicializaremos todos los parámetros manualmente de manera uniforme. 4.2.4 – Limitación del valor de los parámetros Otro hecho verificado experimentalmente es que es importante limitar el valor que toman algunas de las estimaciones de parámetros para evitar que se hagan muy pequeños. Por ejemplo, debe restringirse el valor de b j ( k ) para que no valga menos que ∈, una cota inferior que impondremos. Esto se hace para asegurar que, aunque el símbolo k nunca se generase en el estado j en una de las secuencias de entrenamiento, haya alguna probabilidad de que se genere cuando probamos con una secuencia de observación desconocida. La siguiente figura muestra el porcentaje de error en el reconocimiento frente al parámetro ∈, y pone en evidencia el acierto que supone darle un valor distinto de cero, pues el error crece si no imponemos dicho límite. Figura 4.6. Error medio en el reconocimiento de palabras, frente al parámetro ∈. Extraido de [RABINER]. Puede verse que en un amplio rango del valor que toma la cota ( 10 −10 ≤ ∈ ≤ 10 −3 ), el error permanece constante. Después, el error crece. La aplicación HTK contempla este problema y dispone de mecanismos para encontrar el valor óptimo de ∈, lo cual veremos en capítulos posteriores. 4.2.5 – Efecto de la insuficiencia de datos de entrenamiento Como el conjunto de secuencias de observación usadas en el entrenamiento es, necesariamente, finito, nos encontramos con frecuencia con que hay una cantidad insuficiente de eventos (símbolos generados por los estados) del modelo para hacer buenas estimaciones de los parámetros. Una primera solución a este problema sería aumentar el conjunto de secuencias de entrenamiento. Normalmente, esto no es práctico e incluso podría llevar a que el modelo aprendiera a reconocer sólo las secuencias de entrenamiento (sobre-aprendizaje), y funcionase mal para secuencias que desconoce. RECONOCIMIENTO DE VOZ USANDO HTK 71 PABLO AGUILERA BONET Otra solución sería disminuir el tamaño del modelo (menos estados, menos símbolos posibles por estados, …). No obstante, el modelo suele estar dimensionado para ajustarse al contexto físico que el HMM quiere aproximar, por lo que no debe cambiarse su tamaño. Existe una tercera solución. Consiste en interpolar el conjunto de parámetros estimados con otro conjunto de parámetros que provienen de un modelo previo, en el que sí se disponía de un conjunto adecuado de datos de entrenamiento. La idea es desarrollar simultáneamente ambos modelos: el deseado y otro más pequeño para el que la cantidad de datos de entrenamiento es adecuada. Esta técnica de interpolación ha sido aplicada con éxito en numerosos problemas de reconocimiento de voz. Como complemento a estos métodos, pueden imponerse restricciones adicionales a los parámetros, de manera que si estos violan esas restricciones, se reajustan manualmente. Por supuesto, tras el ajuste, el resto de parámetros deben adaptarse para que las densidades de probabilidad obedezcan las restricciones estadísticas habituales. 4.3 – IMPLEMENTACIÓN DE UN RECONOCEDOR DEL HABLA CONTINUA USANDO HMM Nuestro objetivo aquí es mostrar cómo determinados aspectos de la teoría de los HMM se aplica al problema concreto de construir un reconocedor de palabras. La siguiente figura muestra un diagrama de bloques de un sistema de reconocimiento del habla continua, desde el punto de vista de la clasificación de patrones. Vamos a analizar cada bloque por separado. H1 ( f ) 1/2 Figura 4.7. Procesos implicados en el reconocimiento de habla continua. RECONOCIMIENTO DE VOZ USANDO HTK 72 PABLO AGUILERA BONET 4.3.1 – Análisis de características Se realiza un análisis temporal o espectral (en este caso extracción de coeficientes MFCC) a la señal de voz para obtener los vectores de observación, que podrán ser usados para entrenar el modelo o para probar su funcionamiento. Para profundizar en este aspecto se remite al Capítulo 2. 4.3.2 – Sistema de emparejamiento de unidades Hay que elegir cuál será la unidad básica del reconocedor, es decir, a qué se corresponderá cada HMM. Normalmente, cuanto menos compleja sea la unidad, menos variantes hay en el lenguaje, y más complicada es su estructura en habla continua. Para vocabularios grandes (más de 1000 palabras), usar unidades menores que una palabra es obligatorio, pues sería poco práctico grabar tantas secuencias de entrenamiento si usásemos como unidad las palabras. No obstante, para aplicaciones concretas, como el reconocimiento de palabras aisladas (vocabulario pequeño, frases simples), es razonable y práctico considerar las palabras como unidades básicas del habla. Esta será la aproximación que utilizaremos en los casos prácticos. Independientemente de la unidad elegida, debemos contar con un inventario de esas unidades obtenido mediante entrenamiento. Cada unidad (palabra) estará caracterizada por un HMM. El sistema de correspondencia de unidades calculará la verosimilitud de todas las palabras con la voz desconocida entrante. 4.3.3 – Decodificación léxica Durante este proceso, se imponen restricciones al sistema anterior para que las unidades reconocidas pertenezcan a un diccionario, que debe haberse especificado previamente. Por ejemplo, si cada HMM corresponde a una sílaba, este bloque se encarga de que sólo se den transiciones de un modelo a otro cuando la unión de las sílabas que representan sea posible. Igualmente ocurre cuando cada HMM representa un fonema. Sin embargo, esta fase puede obviarse si la unidad básica elegida es la palabra, con lo que se simplifica diseño del reconocedor. 4.3.4 – Análisis sintáctico Como en el bloque anterior, este proceso impone más condiciones al sistema de correspondencia de unidades para que, en el caso de que se trate de habla continua, la estructura de las frases reconocidas tengan sentido. Para ello hay que especificar una gramática para las palabras, que determinará el orden lógico que deberían tener las palabras dentro de una frase. Esta gramática puede ser representada por una red de estados finita (en la cual se exponen todas las posibles combinaciones de palabras), o por una gramática estadística (en la que se especifica la probabilidad de que se den ciertas combinaciones de palabras). En los casos prácticos con HTK utilizaremos la primera representación. Cuando tratamos de reconocer palabras aisladas, este paso puede eliminarse simplificando el proceso. Para algunas aplicaciones simples, como el reconocimiento de secuencias de dígitos, es adecuado disponer de una gramática sencilla. Pero es en aplicaciones complejas, como el reconocimiento continuo del habla, donde este bloque es decisivo para mejorar notablemente el funcionamiento del reconocedor. RECONOCIMIENTO DE VOZ USANDO HTK 73 PABLO AGUILERA BONET 4.3.5 – Análisis semántico Este último paso del sistema impone aún más restricciones a los caminos por los que buscará la secuencia correcta el reconocedor. Previene que se den ciertos saltos en la red de estados porque no tendría sentido el resultado, e informa al sistema de entre qué palabras debe elegir durante el reconocimiento. No lo tendremos en cuenta en los casos sencillos. 4.3.6 – Detección de silencios Hay un factor adicional, que no contempla el modelo anterior. Se trata de separar el silencio de fondo del habla de entrada. Hay tres modos razonables de conseguir esta tarea: 1) Detectar explícitamente la voz mediante técnicas que separan el fondo de la voz, basándose en la energía y la duración. 2) Modelar el silencio de fondo, y representar la señal recibida como una secuencia arbitraria de voz y silencio, es decir: señal = (silencio) – voz – (silencio) Aquí, el silencio puede ser opcional. La aplicación HTK contempla esta estructura a la hora de indicarle al reconocedor qué debe esperar de la señal de entrada. 3) Extender el modelo del habla para que el silencio de fondo esté incluido (opcionalmente) dentro del primer o el último estado del HMM. Usaremos una combinación de los métodos 2 y 3 en los casos prácticos. 4.4 – ALGUNAS APLICACIONES BÁSICAS Vamos a mostrar algunas aplicaciones específicas que ilustrarán cómo la teoría de los HMMs puede ser usada para implementar reconocedores de voz. Para profundizar en ellas puede acudirse al artículo de [RABINER]. 4.4.1 – Reconocimiento de palabras aisladas Primero, presentamos un sistema que trata de reconocer una única palabra hablada, y donde no hay que tener en cuenta ni la semántica, ni el léxico, ni la sintaxis a la hora de imponer restricciones adicionales. Supongamos que tenemos un vocabulario de V palabras para ser reconocidas y que cada palabra será modelada por un HMM distinto. Además, asumamos que tenemos un conjunto de ocurrencias de cada palabra hablada de vocabulario (por una o varias personas). Cada ocurrencia de las palabras constituye una secuencia de observación, donde las observaciones son una representación apropiada de las características de la palabra. Para realizar el reconocimiento de palabras aisladas, debemos realizar lo siguiente: RECONOCIMIENTO DE VOZ USANDO HTK 74 PABLO AGUILERA BONET Reconocimiento de palabras aisladas: 1) Para cada palabra v del vocabulario, construimos un HMM: ( λ ( v ) = A( v ) , B ( v ) , π ( v ) ) , v = 1 , ... , W Esto consiste en estimar los parámetros del modelo que maximizan la verosimilitud del conjunto de vectores de observación, para la v -ésima palabra. 2) Para cada palabra desconocida que debe ser reconocida, calculamos: a. La secuencia de observación O = o1 o2 ... oT , obtenida mediante el pre-procesado de la señal de voz asociada a la palabra. b. La verosimilitud de todos los posibles modelos para esa secuencia de observación, es decir: ( v p O |λ( ) ) 1≤ v ≤ W , c. El índice v que maximiza dicha verosimilitud, e identifica a la palabra elegida: {( v v * = arg max p O | λ ( ) 1≤ v ≤W )} λ( ) 1 ( 1 ) 2 p O |λ( ) ) p O|λ( ) H1 ( f ) 1/2 λ( 2) ( ⋮ λ {( v v * = arg max p O | λ ( ) 1≤ v ≤W (W ) ( W p O |λ( ) )} ) Figura 4.8. Diagrama de bloques de un reconocedor de palabras aisladas usando HMMs. RECONOCIMIENTO DE VOZ USANDO HTK 75 PABLO AGUILERA BONET El cálculo de las verosimilitudes (paso 2.b) se realiza computando la probabilidad a través del camino más probable, obtenido mediante el algoritmo de Viterbi, y no con el método de agrupación hacia delante-atrás. Esto se debe a que, una vez tenemos la secuencia de estados, podemos calcular una estima razonable de la verosimilitud simplemente computando la probabilidad sobre ese camino. Para calcular todas las verosimilitudes, son necesarias WN 2T operaciones, lo cual es más que factible con los procesadores actuales. 4.4.2 – Reconocimiento de palabras conectadas Ahora vamos a complicar ligeramente el sistema, pues el objetivo ahora será reconocer habla continua, pero compuesta por palabras de un vocabulario pequeño. La aplicación típica es el reconocimiento de cadenas de dígitos. Como hemos dicho, la premisa básica es que el reconocimiento está basado en modelos individuales de palabras. De nuevo, no habrá sintaxis ni léxico que imponga restricciones adicionales: cualquier dígito puede seguir a cualquier otro dígito. Una vez se han entrenado los modelos, el problema es encontrar la secuencia óptima de modelos de palabras que encajan mejor con una cadena de palabras conectadas, en el sentido de máxima verosimilitud. En el siguiente diagrama se muestra una gráfica de los estados en los que se puede encontrar el sistema, frente al instante t . Figura 4.9. Estados por los que pueden pasar los HMMs cuando las palabras están conectadas. Se ha marcado el avance del estado del sistema, nunca hacia detrás. Adaptado de [RABINER]. RECONOCIMIENTO DE VOZ USANDO HTK 76 PABLO AGUILERA BONET Al tratarse de modelos de Bakis, cada HMM sólo puede avanzar hacia estados con número de estado j mayor. Al llegar un HMM al estado N , sólo puede avanzar si pasa al estado 1 de otro HMM, que modela a otra palabra. Cada vez que se pasa de un estado N a un estado 1, se dice que ha avanzado un nivel (ha avanzado al dígito siguiente). Existe un sistema de implementación de niveles, por encima de los HMM, que se encarga de hacer estas transiciones. Esencialmente, el reconocimiento se basa en tres pasos, que se muestran en el siguiente diagrama de bloques: H1 ( f ) 1/2 Figura 4.10. Diagrama de bloques de un reconocedor de palabras conectadas basado en niveles. 1) Análisis espectral: como en casos anteriores, la señal de voz s ( n ) se convierte en un conjunto de vectores MFCC. Esto define la secuencia de observación O de la cadena de dígitos desconocidos. En este caso O viene dado por varios vectores, cada uno representando un dígito hablado. 2) Emparejamiento de patrones: la secuencia de vectores espectrales se empareja con los HMM de las palabras aisladas, otorgando una puntuación a cada emparejamiento mediante el algoritmo de Viterbi. La salida de este proceso es un conjunto de cadenas de dígitos candidatas, generalmente de distintas longitudes. Cada una tendrá asociada una probabilidad. 3) Post-procesado: las cadenas candidatas se ven sujetas a otras pruebas de validez (como duración, número de dígitos) para eliminar aquellas que no son razonables. El postprocesador elige la cadena más verosímil de las restantes candidatas. Las transiciones entre palabras son llevadas a cabo mediante una conmutación en el sistema de implementación de niveles. El número de estados N para esta aplicación suele ser un número fijo: 10-12 estados si entrenamos el modelo con un solo hablante o 12-16 estados si entrenamos con varios hablantes. Cada dígito vendrá representado por un conjunto de estados como los que se muestran en la siguiente figura: RECONOCIMIENTO DE VOZ USANDO HTK 77 PABLO AGUILERA BONET λ( v) Figura 4.11. Un HMM modelando una palabra en un reconocedor de palabras conectadas. 4.4 – CONCLUSIONES En este capítulo hemos tratado de encontrar la solución óptima a ciertos detalles que se nos presentarán durante el desarrollo del reconocedor de voz. Hemos introducido las distintas topologías para los HMMs, razonando la elección del modelo de Bakis, pues contempla de manera implícita el avance en el tiempo del estado del sistema. También hemos dado una regla para elegir el número de estados: aproximadamente tres estados por cada fonema, modelando así el inicio, desarrollo y final de la pronunciación. A continuación, hemos resuelto algunos problemas que se nos presentan en el caso de querer implementar el sistema en un ordenador: el escalado de los coeficientes, la estimación inicial de los parámetros para que el máximo de la función de verosimilitud sea global, la necesidad de múltiples secuencias de entrenamiento y el efecto de la insuficiencia de éstas, y el requisito de imponer un límite inferior para el valor de los parámetros. El resto del capítulo se ha dedicado a esbozar los pasos para la construcción de un reconocedor de habla continua, y a presentar a modo de ejemplo las particularidades de reconocedores sencillos, como un reconocedor de palabras aisladas y otro de palabas conectadas. Para más información, puede consultarse el artículo [RABINER], donde se profundiza en todas estas ideas, así como los libros [RABINER Y JUANG] y [HUANG ET AL.] Este ha sido el último capítulo puramente teórico de esta memoria. Los siguientes capítulos se centran en aplicar las ideas desarrolladas en los capítulos 2, 3 y 4 para implementar un reconocedor de voz sencillo en un ordenador. Para ello usaremos la aplicación HTK. RECONOCIMIENTO DE VOZ USANDO HTK 78 PABLO AGUILERA BONET 5 – LA APLICACIÓN HTK Tras estudiar la teoría necesaria para diseñar reconocedores basados en Modelos Ocultos de Markov, vamos presentar la aplicación con la que implementaremos dichos reconocedores. Es una herramienta muy potente, aunque aquí sólo presentaremos sus características más importantes. La mayor parte del capítulo consiste en la descripción paso a paso del proceso de construcción de un reconocedor sencillo, cuya implementación será guiada en el capítulo siguiente. 5.1 – FUNDAMENTOS DE HTK 5.1.1 – Introducción HTK (Hidden Markov Models ToolKit) es un grupo de herramientas para construir y operar Modelos Ocultos de Markov (HMM). Aunque puede modelar cualquier tipo de serie temporal de datos, HTK está diseñado para construir herramientas de procesado del habla basadas en HMM, especialmente reconocedores de voz. No obstante, se ha utilizado con éxito en otras tareas (síntesis de voz, reconocimiento de caracteres y secuenciación de cadenas de ADN). Fue originalmente desarrollado en el Grupo de Robótica, Visión y Habla del Departamento de Ingeniería de la Universidad de Cambridge (CUED) a principios de los años 90. Existe una página web, un manual ampliamente detallado ([YOUNG ET AL.]) y listas de correo con aportes constantes de los distintos grupos de investigación que están utilizándolo. También está disponible el código fuente en C. 5.1.2 – Composición HTK se compone de multitud de ficheros ejecutables que realizan sencillas funciones necesarias para el diseño e implementación de reconocedores basados en HMM. También serán necesarios ficheros con la configuración de las variables requeridas, y otros archivos que contengan los datos de entrada que utilizaremos. La aplicación consiste en una serie de módulos y herramientas, cada uno diseñado para realizar una tarea determinada de análisis del habla, entrenamiento de HMM, pruebas o análisis de resultados. Así, la mayor parte de la infraestructura de HTK está dedicada a estas tareas. Como se muestra en la siguiente figura, el proceso de reconocimiento con HTK se divide en dos etapas: RECONOCIMIENTO DE VOZ USANDO HTK 79 PABLO AGUILERA BONET Figura 5.1. Etapas para el reconocimiento de voz con HTK. Extraído de [YOUNG ET AL]. Primero, se usan las herramientas de entrenamiento de HTK para estimar los parámetros de un conjunto de HMM usando secuencias de entrenamiento y sus correspondientes transcripciones. Después, las herramientas de reconocimiento de HTK se encargan de transcribir secuencias desconocidas de voz. Ya hemos visto en profundidad cómo se realizan estas operaciones teóricamente. 5.2 – DESCRIPCIÓN DE HTK 5.2.1 – Arquitectura software Figura 5.2. Arquitectura software de HTK. Extraído de [YOUNG ET AL]. RECONOCIMIENTO DE VOZ USANDO HTK 80 PABLO AGUILERA BONET Muchas de las funcionalidades de HTK están construidas dentro de los módulos. Estos módulos se aseguran de que cada herramienta interactúa con el entorno de la misma forma. Comentaremos brevemente cada uno de los módulos de la figura 5.2: • La entrada y salida de datos, y la interacción con el sistema operativo se controla mediante el módulo HSHELL. La gestión de memoria se controla mediante HMEM. • Del soporte matemático se encarga HMATH, y las operaciones de procesado de señal necesarias para el análisis del habla se encuentran en HSIGP. • Cada uno de los tipos de archivos requeridos por HTK tienen un módulo de interfaz dedicado: HLABEL proporciona la interfaz para archivos de etiquetas, HLM para archivos de modelos de lenguaje, HNET para redes y celosías, HDICT para diccionarios, HVQ para libros de códigos de cuantizadores vectoriales y HMODEL para definiciones de HMM. • Todas las entradas y salidas de voz a nivel de forma de onda son implementadas mediante HWAVE, y a nivel de parámetros mediante HPARM. Para tener una interfaz consistente, HWAVE y HLABEL soportan formatos de archivo múltiples permitiendo importar datos desde otros sistemas. La entrada directa de audio es soportada por HAUDIO y los gráficos interactivos por HGRAF. • HUTIL proporciona un conjunto de rutinas para manipular HMMs, mientras HTRAIN y HFB contienen soporte para las distintas herramientas de entrenamiento de HTK. • HADAPT proporciona soporte para las herramientas de adaptación de HTK. Finalmente, HREC contiene las funciones de procesado para reconocimiento. Podemos conseguir un control preciso sobre el comportamiento de estos módulos mediante ciertas variables de configuración. En la segunda parte del manual de HTK se proporcionan descripciones detalladas de todas las funciones que implementan los módulos citados. 5.2.2 – Propiedades generales de una herramienta HTK Las herramientas HTK están diseñadas para correr con una interfaz tradicional de línea de comandos. Cada herramienta tiene un número de argumentos requeridos y otro de opcionales. Estos últimos siempre vienen precedidos por un signo menos ( − ). El uso de la línea de comandos, aunque pueda parecer desfasada, tiene sus ventajas. Primero, hace fácil escribir scripts para automatizar procesos. Además, permite interactuar con lenguajes de programación de alto nivel para crear aplicaciones más complejas. Ayuda a la documentación y recolección de datos de experimentos y permite dedicar toda la potencia de la máquina a los algoritmos que subyacen en el proceso de reconocimiento. – Parámetros en la línea de comandos El siguiente comando puede invocar a una herramienta de HTK de ejemplo: HEjemplo –T 1 –f 12.6 –a –s miarchivo archivo1 archivo2 Esta herramienta tiene dos argumentos principales llamados archivo1 y archivo2, y cuatro argumentos opcionales. Éstos últimos siempre vienen precedidos por una única letra, que identifica a la opción, seguida de un espacio y el valor que toman. Algunos elementos opcionales no llevan valor, y sirven para activar o desactivar ciertas características de la herramienta. RECONOCIMIENTO DE VOZ USANDO HTK 81 PABLO AGUILERA BONET Aquellos que llevan su letra de identificación mayúscula, son parámetros globales para todas las herramientas. – El archivo de configuración Como complemento a los argumentos en la línea de comandos, la ejecución de una herramienta puede ser controlada por parámetros almacenados en un archivo de configuración config: HEjemplo –C config –f 12.6 –a –s miarchivo archivo1 archivo2 La herramienta cargará los parámetros almacenados en el archivo de configuración durante su inicialización. Se pueden especificar varios archivos de configuración repitiendo la opción –C. El uso principal del archivo de configuración es controlar el comportamiento de los módulos de los que las herramientas de HTK dependen. – Algunos argumentos comunes Los siguientes argumentos son opcionales pero suelen incluirse en la ejecución de la mayoría de las herramientas, pues proporciona información sobre dicha ejecución: • -A muestra todos los argumentos que añadamos a la ejecución. • –D muestra las opciones de configuración. • –T 1 muestra información sobre el desarrollo del algoritmo. 5.3 – LAS HERRAMIENTAS DE HTK La siguiente figura muestra un esquema del proceso completo de reconocimiento: Figura 5.3. Herramientas para el desarrollo de un reconocedor en HTK. Extraído de [YOUNG ET AL]. RECONOCIMIENTO DE VOZ USANDO HTK 82 PABLO AGUILERA BONET Las herramientas que proporciona HTK serán introducidas de manera natural recorriendo los pasos involucrados en la construcción de un reconocedor del habla. Vamos a centrarnos en las aplicaciones más simples: reconocimiento de palabras aisladas o conectadas Por ello, las herramientas más avanzadas para construcción de reconocedores complejos sólo serán comentadas, sin entrar en ellas en profundidad. 5.3.1 – Herramientas de preparación de datos Para construir un conjunto de HMMs, necesitamos otro conjunto de datos y sus transcripciones asociadas. Antes de que puedan usarse en el entrenamiento de los modelos, deben convertirse a un formato correcto (vectores de MFCC) y sus transcripciones asociadas también. Si la voz necesita grabarse, la herramienta HSLAB puede usarse para grabarla y etiquetarla con las transcripciones requeridas. Aunque todas las herramientas pueden parametrizar formas de onda en tiempo real, en la práctica normalmente es mejor parametrizar los datos una sola vez al principio. Para esto se usa la herramienta HCOPY, que se utiliza para copiar una o más ficheros fuente en ficheros de salida. Normalmente copia archivos completos, pero incorpora mecanismos para segmentar o concatenar archivos. La herramienta HLIST puede usarse para comprobar los contenidos de cualquier conversión antes de entrar en el procesado de grandes cantidades de datos. Las transcripciones, representadas por etiquetas, también necesitan prepararse. Para ello, HLED implementa un editor de etiquetas que está diseñada para transformar adecuadamente los archivos de etiquetas, si fuese necesario. Esta herramienta también puede generar archivos a un único Archivo Maestro de Etiquetas (MLF), que normalmente conviene más para el procesado posterior. Finalmente, HLSTATS puede recolectar y mostrar estadísticas de los archivos de etiquetas cuando se requiera. HQUANT puede ser usada para construir libros de códigos de cuantizadores vectoriales si fuese necesario. 5.3.2 – Herramientas de entrenamiento de modelos El segundo paso en la construcción de sistemas es definir la topología requerida para cada HMM escribiendo una definición de prototipos. HTK permite construir HMMs con cualquier topología. Las definiciones de estos prototipos pueden almacenarse externamente, como ficheros de texto, y pueden ser editadas con cualquier editor de textos convencional. A excepción de las probabilidades de transición, el resto de parámetros que definamos en el prototipo serán ignorados, pues el propósito de los prototipos es simplemente constatar las características principales y la topología (que viene dada por la en la matriz de transición) de los HMM. Debemos tener cuidado al elegir el valor inicial de los elementos de la matriz de transición aij , pues como se ha visto anteriormente, el algoritmo EM es sensible al lugar del que partamos para maximizar la función de verosimilitud. Una estrategia sencilla es hacer todos los valores equiprobables (dentro de una misma fila). Primero, debemos crear un conjunto inicial de modelos. Las herramientas HINIT y HREST proporcionan el entrenamiento de modelos a partir de los datos de entrenamiento etiquetados. Cada uno de los HMM es generado individualmente. Al principio, la secuencia de entrenamiento es segmentada uniformemente por HINIT y cada estado del modelo es comparado con los datos del segmento correspondiente. Así se estiman las medias y las varianzas. En las siguientes iteraciones, la segmentación se afina mediante RECONOCIMIENTO DE VOZ USANDO HTK 83 PABLO AGUILERA BONET alineamiento con el algoritmo de Viterbi. La re-estimación de los parámetros de realiza mediante el método de Baum-Welch, ejecutado con HREST, como se ha visto en capítulos anteriores. Cuando queremos iniciar los HMM sin utilizar datos de entrenamiento, podemos usar HCOMPV para dar a todas las medias y varianzas un valor global, realizando una inicialización plana del modelo. Esta herramienta se utilizará para obtener unos límites inferiores para las varianzas, cuya utilidad se puso de manifiesto en el apartado 2.4.2. Si nuestro modelo fuese más complejo y la unidad básica fuesen los fonemas, deberíamos usar HEREST para re-estimar los parámetros de los HMM. Esta herramienta está diseñada para entrenar muchos modelos pequeños a partir de grandes cantidades de datos, por lo que resulta idónea cuando los HMM representan unidades menores que la palabra. La herramienta HHED es un editor de prototipos de HMMs que incluye dependencia del contexto en las definiciones de los modelos. Se puede utilizar para hacer que la transcripción dependa del hablante, estados de ánimo y otras características avanzadas. Esto tiene un gran problema: casi nunca hay suficientes datos para la complejidad del modelo. La herramienta HSMOOTH puede usarse para suavizar las distribuciones de probabilidad abruptas que resultan de la insuficiencia de datos de entrenamiento. 5.3.3 – Herramientas de reconocimiento del habla HTK proporciona la herramienta HVITE, que implementa el reconocimiento usando los modelos disponibles tras el procesado anterior. Utiliza el algoritmo de Viterbi sobre cada uno de los HMMs, para encontrar el camino de estados más probable, y calcular sobre él la verosimilitud de que la observación desconocida haya sido generada por ese HMM. HVITE utiliza como entrada una red que describe las secuencias de palabras permitidas, un diccionario que define cómo cada palabra se pronuncia y un conjunto de HMMs. Opera asignando a cada palabra desconocida un HMM según se maximice su función de verosimilitud. El reconocimiento puede hacerse bien sobre una lista de archivos de voz almacenados, bien mediante entrada directa de audio con un micrófono. Las redes de palabras necesarias para ejecutar HVITE normalmente son bucles de palabras simples, en los cuales cualquier palabra puede seguir a cualquier otra. También puede ser un grafo con estados representando una gramática finita. Esta red define la estructura de las frases que el reconocedor puede esperar encontrarse ante una entrada desconocida. Pueden crearse directamente con un editor de texto, pero deben ser transformadas a un formato inteligible por HTK, para lo que existe un conjunto de herramientas específicas. HBUILD permite crear unidades más pequeñas que la palabra e introducirlas en redes de palabras. Por otro lado, HPARSE se encarga de traducir la gramática especificada por el usuario (mediante un sencillo formato) a una red de palabras que pueda manejar HTK. Como comprobación de que la red recién diseñada es capaz de dar lugar a las frases que vamos a recibir, mediante la herramienta HSGEN pueden generarse ejemplos del lenguaje que se ha definido. Por último, HDMAN proporciona funciones para el manejo de diccionarios extensos para aplicaciones más complejas. Aunque HVITE es la única herramienta de reconocimiento que utilizaremos en nuestros ejemplos sencillos, vamos a comentar otras dos utilidades que proporciona HTK. HLRESCORE es una herramienta para manipular rejillas de palabras, por ejemplo las generadas por HVITE. Es capaz de encontrar un camino óptimo a través de la rejilla, lo cual tiene utilidad en aplicaciones con lenguajes más complejos. Como complemento, HDECODE es un decodificador creado para generar rejillas en reconocedores de voz con vocabulario extenso. Está disponible como complemento a HTK, y se distribuye con una licencia más restrictiva. RECONOCIMIENTO DE VOZ USANDO HTK 84 PABLO AGUILERA BONET 5.3.4 – Herramientas de análisis de resultados Una vez hemos construido el reconocedor basado en HMMs, es necesario evaluar su rendimiento. Normalmente, esto se hace usándolo para transcribir unas secuencias de prueba (etiquetadas) y comparando la salida del reconocedor con la transcripción correcta de referencia. Esta comparación la realiza la herramienta HRESULTS, que usa métodos de programación dinámica para alinear las dos transcripciones y luego contar las sustituciones, ausencias e inserciones de palabras. 5.4 – CONSTRUCCIÓN DE UN RECONOCEDOR CON HTK Vamos a describir paso a paso la construcción de un reconocedor sencillo del habla, con el objeto de implementarlo en HTK. Estará basado en palabras y, excepto en la definición de la gramática, el proceso será el mismo para palabras aisladas o conectadas. 5.4.1 – Pasos para la construcción Las etapas principales son las siguientes: • Creación de una base de datos de entrenamiento y pruebas. Cada elemento del vocabulario se graba varias veces y se etiqueta con las correspondientes palabras, para crear un corpus (base de datos de grabaciones y etiquetas). • Análisis acústico. Las formas de onda grabadas deben ser convertidas a vectores de coeficientes MFCC. • Definición de los modelos. Debemos definir un prototipo de HMM para cada elemento del vocabulario. • Entrenamiento de los modelos. Cada HMM es inicializada y entrenada gracias a los datos de entrenamiento. • Definición de la gramática. Se define qué puede ser reconocido por la aplicación. • Evaluación. Se evalúa el reconocedor con entrada de micrófono o con un conjunto de secuencias de prueba. 5.4.2 – Organización del espacio de trabajo Aunque no es necesario, se recomienda crear en el directorio donde se encuentran los ejecutables de las herramientas HTK, una estructura de ficheros como sigue: • datos\ almacenará los datos relativos al entrenamiento. Estos datos son las formas de onda de la voz (datos\sig), las etiquetas (datos\lab) y los vectores de coeficientes MFCC (datos\mfcc). • analisis\ almacenará los archivos de configuración (.conf) que conciernen al análisis acústico. • entrenamiento\ almacenará una lista de las secuencias de coeficientes que se utilizarán para el entrenamiento. RECONOCIMIENTO DE VOZ USANDO HTK 85 PABLO AGUILERA BONET • modelo\ almacenará los HMMs del reconocedor. Contendrá una carpeta para los prototipos, una para los modelos inicializados y otra para los modelos entrenados. • definicion\ almacenará los archivos que definen la gramática y el vocabulario. • Prueba\ almacenará los archivos que conciernen a las pruebas: aquí se almacenarán las señales (prueba\sig), sus etiquetas (prueba\lab) y los vectores MFCC (prueba\mfcc) que usaremos para las pruebas. También se dispondrá de una lista de secuencias para probar y los resultados de las pruebas. Figura 5.4. Estructura del directorio de trabajo. 5.4.3 – Creación del corpus de entrenamiento y pruebas Primero, debemos grabar las señales de voz con las que entrenaremos y probaremos los modelos. Las frases de entrenamiento pueden ser cualquier combinación posible de las palabras que deberá reconocer el modelo. Las frases de prueba deben tener la estructura que luego definiremos para que el receptor sepa qué debe esperar. Las grabaciones para entrenamiento y prueba deben ser distintas, pues en caso contrario el reconocedor lo tendría más fácil al tratar de reconocer una secuencia con la que ya es familiar. Cada señal debe ser etiquetada, es decir, asociada con un texto (etiqueta) que describa su contenido. La grabación y el etiquetado pueden hacerse con HSLAB, aunque pueden usarse aplicaciones externas. Figura 5.5. Proceso de grabación y etiquetado de las secuencias de entrenamiento. Extraído de [MOREAU]. RECONOCIMIENTO DE VOZ USANDO HTK 86 PABLO AGUILERA BONET Para crear y etiquetar archivos de voz, nos situamos en el directorio de HTK y ejecutamos en la línea de comandos: HSLab grabacion.sig Con esto aparecerá la interfaz gráfica de HSLAB. Figura 5.6. Interfaz HSLAB. – Grabación de las señales Presionamos el botón de rec, grabamos la señal y pulsamos stop. Automáticamente se crea un archivo temporal llamado grabación_0.sig en el directorio actual. Si realizamos una nueva grabación, se graba en un segundo archivo temporal llamado grabación_1.sig. Los archivos de señal se almacenan en un formato específico de HTK (.sig). Es posible usar otros formatos de audio (.wav, etc.), como se describe en el Manual de HTK. Por otro lado, la frecuencia de muestreo por defecto es de 16 kHz , lo cual es apropiado para nuestra aplicación. Se recomienda que estas grabaciones sean lo más limpias posibles, minimizando el ruido de fondo y pronunciando correctamente. Es conveniente que el micrófono se encuentre cerca del hablante y que se hable con voz firme. – Etiquetado de las señales Para etiquetar las formas de onda grabadas, pulsamos Mark, elegimos la región que queremos etiquetar y pulsamos Labelas. Escribimos el nombre de la etiqueta y pulsamos enter. A parte de RECONOCIMIENTO DE VOZ USANDO HTK 87 PABLO AGUILERA BONET la palabra o secuencia de palabras que hayamos grabado, debe haber un silencio inicial y otro final. Los etiquetaremos con la etiqueta s. Repetimos el proceso asignando etiquetas a las distintas palabras que se han dicho, pulsando sobre play para oír la zona marcada cuando sea necesario. Las regiones etiquetadas no deben solapar entre sí, pero puede haber un pequeño salto entre ellas. Los silencios entre palabras no hace falta etiquetarlos. Cuando toda la señal ha sido etiquetada, pulsamos Save y enter, con lo que se creará un archivo de etiquetas llamado grabación.lab. Tras esto, podemos cerrar la herramienta, pulsando Quit. Figura 5.7. Etiquetado de la forma de onda grabada. El archivo de etiquetas creado puede abrirse con un editor de texto. Al hacerlo, muestra la siguiente estructura: Formato de un archivo de etiquetas (.lab) 0 1941250 s 2135625 6989375 etiq1 Se corresponde con los instantes inicial y final (en décimas de microsegundo, 10 −7 seg ) del intervalo cuya etiqueta les sigue en la línea. Este archivo puede ser editado o incluso creado (sin la necesidad de HSLAB). RECONOCIMIENTO DE VOZ USANDO HTK 88 PABLO AGUILERA BONET - Renombrar los archivos Tras haber grabado y etiquetado la señal de voz, renombramos los archivos .sig y .lab generados como nos convenga (por ejemplo, 1.sig y 1.lab). Para las aplicaciones que implementaremos, este proceso de grabación y etiquetado ha de repetirse de manera que al final dispongamos de al menos diez grabaciones de cada palabra, pronunciadas por tres o más interlocutores distintos. Cuanto más grabaciones y de más personas dispongamos, mejor funcionará el reconocedor ante nuevas situaciones. Al final, todos los archivos .sig que vayamos a utilizar en el entrenamiento de los modelos irán a la carpeta datos\sig y los archivos .lab a la carpeta datos\lab. De manera análoga ocurre para los datos que vayamos a utilizar para probar el reconocedor, que irán en las carpetas prueba\lab y prueba\lab. 5.4.4 – Análisis acústico Las herramientas de reconocimiento del habla no pueden procesar directamente las formas de onda de la voz. Tenemos que representarlas de una manera más eficiente y compacta. Este proceso ya se ha visto en los apartados 2.1 y 2.3, y consta de los siguientes pasos: • La señal es segmentada en tramas sucesivas (cuya longitud es elegida normalmente entre 20 y 40 mseg ), solapándose entre ellas. • Cada trama se multiplica por una ventana de Hamming. • De cada trama enventanada se extrae un vector coeficientes MFCC, que proporcionan una representación compacta de las propiedades espectrales de la trama. Todo el proceso debe realizarse tanto para las señales de entrenamiento como para las de prueba. La conversión se realiza mediante la herramienta HCOPY: HCopy -C analisis\analisis.conf -S datos\lista.txt Los archivos implicados deben estar preparados antes de ejecutarlo. Comentaremos los argumentos por separado: • analisis.conf es el archivo de configuración, que será detallado en el apartado siguiente. • lista.txt es una lista de parejas fuente-destino que indica la conversión a realizar desde las formas de onda a los vectores MFCC. Figura 5.8. Proceso de conversión de los datos de entrenamiento. Extraído de [MOREAU]. RECONOCIMIENTO DE VOZ USANDO HTK 89 PABLO AGUILERA BONET – Configuración El archivo de configuración es un documento de texto (pueden añadirse comentarios siguiendo al símbolo #). En nuestros ejemplos utilizaremos el siguiente archivo de configuración: Contenido de analisis.conf SOURCEFORMAT = HTK TARGETKIND = MFCC_0_D_A # Formato de los archivos de voz # Coeficientes a usar WINDOWSIZE = 250000.0 TARGETRATE = 100000.0 # 25 mseg como longitud de trama # 10 mseg como periodicidad entre tramas NUMCEPS = 12 USEHAMMING = T PREEMCOEF = 0.97 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 # Final • Con SOURCEFORMAT = HTK Indicamos que hemos usado el formato propio de HTK para grabar las secuencias de voz. • TARGETKIND = MFCC_0_D_A indica que vamos a extraer los coeficientes MFCC, deltaMFCC y delta-delta-MFCC. • NUMCEPS = 12 indica que se calcularán los 12 coeficientes MFCC c1 ... c12 . Además, se calculará el coeficiente c0 , que es proporcional a la energía total en la trama. También se calcularán 13 coeficientes ∆c y otros 13 ∆∆c . En total, son 39 coeficientes. • El tamaño de la ventana será de 25 mseg , indicado por WINDOWSIZE = 250000.0, y se tomará una trama cada 10 mseg , por lo que habrá solapamiento (TARGETRATE = 100000.0). • USEHAMMING = T activa el uso de la ventana de Hamming. Se usará un coeficiente de preénfasis de valor a = 0.97 (PREEMCOEF = 0.97). • El filtro perceptual Hm ( k ) que participa en el cálculo de los MFCC está dividido en 26 bandas (NUMCHANS = 26) y CEPLIFTER = 22 indica el número de muestras del cepstrum de la voz que se recortan. – Especificación de los archivos a convertir Aunque pueden ponerse directamente en la línea de comandos de HCOPY, es más práctico crear un archivo de texto que liste las parejas origen-destino que debe transformar la herramienta. El archivo se especifica con el argumento -S. El origen serán los archivos de voz grabados con anterioridad (.sig) y el destino los archivos de coeficientes espectrales que se crearán (.mfcc). RECONOCIMIENTO DE VOZ USANDO HTK 90 PABLO AGUILERA BONET Contenido de lista.txt datos/sig/1.sig datos/sig/2.sig datos/sig/3.sig datos/sig/4.sig datos/sig/5.sig datos/sig/6.sig datos/sig/7.sig datos/sig/8.sig datos/sig/9.sig datos/sig/10.sig (...) datos/mfcc/1.mfcc datos/mfcc/2.mfcc datos/mfcc/3.mfcc datos/mfcc/4.mfcc datos/mfcc/5.mfcc datos/mfcc/6.mfcc datos/mfcc/7.mfcc datos/mfcc/8.mfcc datos/mfcc/9.mfcc datos/mfcc/10.mfcc (...) Al ejecutar el comando, se generarán en el directorio datos\mfcc\ los archivos listados arriba, que contienen los 39 coeficientes MFCC que usaremos en el reconocimiento. En este momento, los archivos de las formas de onda (.sig) pueden eliminarse, pues ya las hemos etiquetado y además hemos extraído las características útiles para el reconocimiento. 5.4.5 – Definición de los HMM Debemos modelar usando HMMs tantos eventos como palabras distintas tengamos en el vocabulario, sin olvidar el silencio. El primer paso para diseñar el HMM es elegir una topología para los modelos. Esta discusión se detalló en el apartado 4.1, por lo que simplemente diremos que elegimos la misma topología para todos los modelos: Figura 5.9. Topología elegida para los HMM. Extraído de [MOREAU]. • Número de estados: entre 4 y 8 estados activos, pues trataremos con palabras cortas. Además, se añaden un primer y último estado que no generan observación por motivos de implementación en HTK. • Forma de la función de observación asociada a cada estado: b j ( k ) son funciones densidades de probabilidad gaussianas unidimensionales (con matrices diagonales de 39 elementos no nulos), inicializadas con media cero y varianza uno. Cada elemento de la diagonal representa a un coeficiente MFCC. • Transiciones entre estados: una matriz cuadrada, de dimensión igual al número de estados los aij deben implementar la topología tipo Bakis de la figura anterior. De cada estado se puede volver a él mismo, o transitar a los dos estados siguientes (excepto el primer y último estado, que son transitorios). RECONOCIMIENTO DE VOZ USANDO HTK 91 PABLO AGUILERA BONET En HTK, un HMM se define en un fichero de texto. El prototipo que usaremos se almacena en modelo\proto\ y se llama hmm_x, donde x es la palabra a la que modela. Se recomienda usar el mismo nombre que para las etiquetas de las palabras que representan, aunque no es obligatorio. Habrá un prototipo por cada palabra (o silencio). Su contenido es el siguiente: Contenido de hmm_x ~o <VecSize> 39 <MFCC_0_D_A> ~h "x" <BeginHMM> <NumStates> 6 <State> 2 <Mean> 39 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 <Variance> 39 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 <State> 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 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 (…) <State> 5 <Mean> 39 0.0 0.0 (...) 0.0 <Variance> 39 1.0 1.0 (...) 1.0 <TransP> 6 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.4 0.3 0.3 0.0 0.0 0.0 0.0 0.4 0.3 0.3 0.0 0.0 0.0 0.0 0.4 0.3 0.3 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 <EndHMM> Comentaremos el significado de cada línea: • ~o <VecSize> 39 <MFCC_0_D_A> indica la longitud del vector de coeficientes y el tipo de coeficientes. • ~h "x" <BeginHMM> (...) <EndHMM> encierra la definición del HMM llamado "x". • <NumStates> 6 especifica el número total de estados, los cuatro activos y los dos transitorios. • <State> i introduce a la especificación de las características del estado i -ésimo. La matriz diagonal que representa la probabilidad de generación en ese estado puede especificarse poniendo simplemente los elementos de la diagonal: un vector de medias y otro de varianzas para las 39 gaussianas. Los estados 1 y 6 no se describen, pues no tienen función de observación. RECONOCIMIENTO DE VOZ USANDO HTK 92 PABLO AGUILERA BONET • <Mean> 39 especifica el vector de medias de 39 elementos de la función de observación del estado al que acompaña. Estos coeficientes serán entrenados posteriormente y su valor cambiará, pero ahora, que estamos definiendo la estructura, son inicializados a cero. • <Variance> 39 especifica el vector de varianzas de 39 elementos de la función de observación del estado al que acompaña. Son inicializados a uno, aunque serán entrenados posteriormente. • <TransP> N especifica la matriz de transición de estados, de dimensiones N × N : • a11 … a1N A= ⋮ ⋱ ⋮ aN 1 ⋯ aNN • Los valores nulos indican transiciones no permitidas entre estados. El resto de valores pueden ser inicializados arbitrariamente, pero los elementos de cada línea deben sumar 1. Se recomienda, en la medida de lo posible, que todos los elementos no nulos de cada línea tengan el mismo valor, para que ninguna transición parta con ventaja en el proceso de entrenamiento. • Este prototipo debe copiarse para cada palabra que vayamos a usar, simplemente cambiando el nombre del archivo (hmm_x) y la cabecera (~h "x"). Todos estos modelos se almacenarán en modelo\proto\ que será el punto de partida para entrenar los modelos. 5.4.6 – Entrenamiento de los modelos El siguiente paso es probablemente el más importante en el proceso de diseño de un reconocedor. Las operaciones a realizar se muestran en la siguiente figura: Figura 5.10. Proceso completo de entrenamiento. Tras la inicialización, se ejecuta un proceso iterativo de refinamiento del modelo. Extraído de [MOREAU]. – Inicialización Antes de comenzar a entrenar los modelos, los parámetros de los HMM deben ser inicializados correctamente con los datos de entrenamiento con el objetivo de permitir que el algoritmo de entrenamiento converja rápidamente. HTK ofrece dos herramientas para la inicialización: HINIT y HCOMPV: La herramienta HCOMPV realiza una inicialización plana del modelo. Cada estado del HMM tendrá la misma media y varianza que el resto. Son computadas globalmente sobre el corpus completo de entrenamiento. Se utiliza con el comando: RECONOCIMIENTO DE VOZ USANDO HTK 93 PABLO AGUILERA BONET HCompv –S entrenamiento\entrenamiento.txt –M modelo\proto\hmm_x –f 0.01 x modelo\hmm0 –H Esta línea debe repetirse para cada uno de los HMMs que queramos inicializar. • x es el nombre del HMM que usaremos. • modelo\proto\hmm_x es el nombre del fichero que describe, creado en el paso anterior. • entrenamiento\entrenamiento.txt es una lista completa de los vectores de MFCC que vamos a usar en el entrenamiento. Su contenido es el siguiente: Contenido de entrenamiento.txt datos/mfcc/1.mfcc datos/mfcc/2.mfcc datos/mfcc/3.mfcc datos/mfcc/4.mfcc datos/mfcc/5.mfcc datos/mfcc/6.mfcc datos/mfcc/7.mfcc datos/mfcc/8.mfcc datos/mfcc/9.mfcc datos/mfcc/10.mfcc (...) (...) • En este fichero no deben incluirse los vectores MFCC que vayamos a usar para probar el reconocedor, sino sólo aquellos que usemos para entrenamiento. • modelo\hmm0 es el nombre del directorio (hay que crearlo antes) donde se almacenará el HMM inicializado. Dicho modelo tendrá el mismo nombre que el original. • -f 0.01 es un factor que especificamos y que se detallará próximamente. No usaremos HCOMPV para inicializar nuestros modelos, porque HINIT es más potente para este propósito. No obstante, HCOMPV devuelve (junto al modelo inicializado) un archivo interesante llamado vFloors (en la misma carpeta modelo\hmm0), que contiene el vector de varianzas global, multiplicado por un factor. Este factor puede especificarse mediante la opción –f comentada anteriormente. Contenido de vFloors ~v varFloor1 <Variance> 39 5.196781e-001 2.138549e-001 (...) 3.203219e-003 Los valores almacenados en este archivo pueden usarse después, durante el proceso de entrenamiento, como límites inferiores de los vectores de varianza estimados. Esta idea ya se abordó en el apartado 4.2.4, donde sugeríamos limitar estos valores para mejorar el rendimiento del reconocedor. RECONOCIMIENTO DE VOZ USANDO HTK 94 PABLO AGUILERA BONET Durante las iteraciones de entrenamiento, puede ocurrir que el número de tramas de entrenamiento asociadas con cierto estado de un HMM sean muy bajas. La varianza estimada para ese estado puede tomar un valor muy bajo. Los límites inferiores pueden usarse en este caso, para evitar que la varianza se haga muy pequeña, causando errores de cálculo. En este caso, basta con ojear el archivo para elegir el menor valor de todos, que usaremos en pasos posteriores. Por todo ello, sólo usaremos HCOMPV una vez, con cualquiera de los prototipos que tenemos, con el objetivo de obtener la varianza global. La herramienta HINIT es más sofisticada. Inicializa los HMM alineando en el tiempo los estados con los datos de entrenamiento, usando el algoritmo de Viterbi. Se ejecuta con el comando: HInit -S entrenamiento\entrenamiento.txt -M modelo\hmm0 -H modelo\proto\hmm_x -l xlab -L datos\lab\ x • Los argumentos x, -S entrenamiento\entrenamiento.txt, -M modelo\hmm0 y -H modelo\proto\hmm_x tienen el mismo significado que en HCOMPV. • -L datos\lab\ indica el directorio donde almacenamos las etiquetas cuando transcribimos las secuencias de entrenamiento al principio. • -l xlab indica qué etiqueta debe ser utilizada dentro del corpus de entrenamiento. Figura 5.11. Inicialización de los modelos con HINIT. Extraído de [MOREAU]. Este procedimiento alinea los estados del HMM hmm_x para que sea probable que produzca las observaciones de MFCC asociada a la etiqueta xlab. Debe ser repetido para cada HMM. – Entrenamiento El siguiente paso consiste en realizar una iteración del proceso de re-estimación de los modelos. La herramienta HREST estima los valores óptimos de los parámetros de los HMM (probabilidades de transición y vectores de medias y varianzas de cada función de observación). Cada vez que la ejecutemos, se produciran varias iteraciones del método de Baum-Welch hasta que converja. RECONOCIMIENTO DE VOZ USANDO HTK 95 PABLO AGUILERA BONET Figura 5.12. Proceso de re-estimación. Extraído de [MOREAU]. Antes de ejecutar el comando, en el directorio modelo\ debe crearse la carpeta hmm1, que almacenará los archivos de descripción resultantes. El comando es el siguiente: HREST –T 1 -S entrenamiento/entrenamiento.txt -M modelo/hmm1 -v min_varianza -H modelo/hmm0/hmm_x -l xlab -L datos/lab/ x • Los argumentos x, -S entrenamiento\entrenamiento.txt, datos\lab\ tienen el mismo significado que en HInit. • -T 1 pide a la herramienta que devuelva datos sobre la ejecución del algoritmo. • -M modelo/hmm1 es la carpeta en la que se almacenará el modelo entrenado. • -H modelo/hmm0/hmm_x es el fichero que describe el HMM llamado x a entrenar. Estará en el directorio resultante de la inicialización. • -v min_varianza es el límite inferior para la varianza, obtenido manualmente por inspección del archivo vFloors que devuelve HCOMPV, y que asegurará que el algoritmo no tenga problemas de cálculo. -l xlab y -L Como en la inicialización, este procedimiento debe realizarse para cada HMM. Tras la ejecución, las iteraciones de HREST se muestran en la pantalla, indicando la convergencia a través de la medida change. Tan pronto como esta medida no decrezca apreciablemente (en valor absoluto) entre dos iteraciones consecutivas, el proceso se detiene automáticamente. Normalmente 3-5 iteraciones por cada modelo serían suficientes, aunque la herramienta afina varias más. Los modelos definitivos entrenados (uno por cada palabra o silencio) se encontrarán en la carpeta hacia la que hayamos apuntado la salida de HREST: modelo\hmm1. 5.4.7 – Definición de la gramática Ahora, especificaremos a HTK para qué tipo de problema hemos diseñado el reconocedor. Cada archivo relativo a esta tarea debe almacenarse en el directorio definicion\. – Gramática RECONOCIMIENTO DE VOZ USANDO HTK 96 PABLO AGUILERA BONET Antes de usar los modelos de las palabras, tenemos que definir la arquitectura básica de nuestro reconocedor. Asumiremos que nuestro reconocedor sólo trabajará con palabras aisladas o series de palabras. Esto implica que la entrada será del tipo: silencio inicial, palabra (o palabras) y silencio final. En HTK la gramática se escribe en un fichero de texto, acorde con ciertas reglas sintácticas. En nuestro caso será bastante simple, y se almacena en el archivo definicion\gramatica.txt: Contenido de gramatica.txt $palabra = palabra1 | palabra2 | palabra 3 | (…); ( { silencio } [ $palabra ] { silencio } ) Esto dice a HTK que la variable palabra puede remplazarse por palabra1, palabra2, palabra3, …. Las llaves ({}) denotan cero o varias repeticiones (sin silencio, un silencio corto o largo). Los corchetes ([]) alrededor de $palabra denotan cero o una ocurrencia (si no se pronuncia ninguna palabra, es posible reconocer sólo silencio). La gramática anterior sólo detecta una palabra pronunciada. Para que reconociese varias palabras, deberíamos rodear la variable con llaves. Este sencillo lenguaje está detallado en el manual de HTK y permite construir estructuras más complejas. – Diccionario El sistema debe saber a qué HMM corresponde cada una de las variables del archivo de gramática. Estas variables se almacenan en un archivo de texto llamado definicion\diccionario.txt. Cuando la estructura es simple, esta correspondencia es obvia, y el diccionario simplemente contiene: Contenido de diccionario.txt palabra1 palabra2 palabra3 (…) silencio [palabra3] [palabra3] [palabra3] (…) [silencio] HMM_palabra3 HMM_palabra3 HMM_palabra3 (…) HMM_silencio No debe olvidarse incluir un retorno de carro al final de la última línea, para que esta sea considerada. Los elementos de cada columna son: • Los elementos de la columna izquierda se refieren a los nombres de las variables en el fichero de gramática. • Los elementos de la columna derecha se refieren a los nombres de los HMM (introducido por los ~h en los archivos de definición de los HMM). • Los elementos entre corchetes de la columna central son opcionales, e indican los símbolos que serán transcritos por el reconocedor (por defecto, los nombres de las RECONOCIMIENTO DE VOZ USANDO HTK 97 PABLO AGUILERA BONET variables del archivo de gramática serán usados). Lo normal es poner los nombres de las etiquetas asociadas. - Red gramática La gramática descrita en definicion\gramatica.txt no es inteligible por HTK y antes de usarla para ejecutar el reconocedor, debe ser compilada con la herramienta HPARSE, para obtener la red definicion\red.slf. El comando a ejecutar es el siguiente: HPARSE definicion\gramatica.txt definicion\red.slf En este momento, nuestro reconocedor de voz está completamente definido por su red (definicion\red.slf), el diccionario (definicion\diccionario.txt) y su conjunto de HMMs (almacenados en modelo\hmmF\). Figura 5.13. Reconocedor = Red + Diccionario + HMMs. – Generación Para asegurarnos de que no hemos cometido errores cuando hemos definido la gramática, podemos usar la herramienta HSGEN para probar qué frases pueden generarse con esa estructura: HSGEN -n 20 -s definicion\red.slf definicion\diccionario.txt • -n 20 especifica el número de frases aleatorias que queremos que se generen. • definicion\diccionario.txt es el diccionario definido previamente. Esto generará y mostrará 20 frases aleatorias conformadas con la estructura definida por la red. En nuestro ejemplo, con una gramática simple, esto no es muy útil. No obstante, cuando ésta se complica, puede resultar de mucha ayuda. – Lista de HMMs Para el proceso de reconocimiento, vamos a necesitar un archivo de texto que liste los HMMs disponibles. Es simplemente un archivo de texto almacenado como definicion\listahmm.txt y que contiene: RECONOCIMIENTO DE VOZ USANDO HTK 98 PABLO AGUILERA BONET Contenido de listahmm.txt silencio palabra1 palabra2 palabra3 (…) Como en el diccionario, debe introducirse una línea al final para que cuente el último elemento. 5.4.8 – Reconocimiento – Reconocimiento usando una entrada grabada Ahora comienza el proceso de reconocimiento propiamente dicho. Cuando vamos a pasarle al programa una secuencia previamente grabada, dividimos el proceso en dos pasos: Figura 5.14. Proceso de reconocimiento de una señal desconocida de entrada. Extraído de [MOREAU]. • El archivo grabado, prueba\sig\entrada.sig, es transformado en una serie de vectores acústicos (MFCC) al igual que hicimos para las secuencias de entrenamiento (con HCopy). No etiquetamos la señal, pues vamos a usarla para que el reconocedor la transcriba. El resultado se almacena en prueba\mfcc\entrada.mfcc. • La observación de entrada se procesa mediante el algoritmo de Viterbi, calculando la probabilidad de que cada HMM produzca dicha observación. El cálculo se realiza mediante la herramienta HVite: HVITE -T 1 -H modelo\hmm1\hmm_x -i prueba\reco.mlf -w definicion\red.slf definicion\diccionario.txt definicion\listahmm.txt prueba\mfcc\entrada.mfcc • -H modelo\hmm1\hmm_x es la definición del HMM x tras el entrenamiento. Debe añadirse este argumento para cada HMM que tengamos en esa carpeta. • -w definicion\red.slf es la red definida. RECONOCIMIENTO DE VOZ USANDO HTK 99 PABLO AGUILERA BONET • definicion\diccionario.txt es el diccionario definido. • definicion\listahmm.txt es la lista de HMMs. • prueba\mfcc\entrada.mfcc transcrita. • -i prueba\reco.mlf es el archivo de salida transcrita por el reconocedor. Su contenido puede consultarse. Una transcripción de ejemplo seria: es el archivo de entrada que queremos que sea Contenido de reco.mlf #!MLF!# "prueba\mfcc\entrada.rec" 0 4900000 silencio -2394.001465 4900000 12000000 palabra2 -5159.434570 12000000 18300000 silencio -3289.197021 . Se han reconocido los eventos silencio-palabra2-silencio, sucedidos en los tiempos (en unidades de 10 −7 seg ) que aparecen a la izquierda, y con las probabilidades logarítmicas que figuran en la derecha. – Reconocimiento en tiempo real Una forma más interactiva de probar el reconocedor es usar las opciones de “entrada en vivo” de HVite: HVITE –T 1 -C analisis\directin.conf -g -H modelo\hmm1\hmm_x -w definicion\red.slf definicion\diccionario.txt definicion\listahmm.txt 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 decidida por el reconocedor, tras lo que se mostrará un nuevo READY[2]> esperando una nueva entrada. Los argumentos que se han añadido son: • La opción –g indica al programa que reproduzca por los altavoces la señal de entrada. • -C analisis\directin.conf es un archivo de configuración creado específicamente para este paso, aunque similar al usado en el resto del proceso. Debe crearse antes de ejecutar el comando. Su contenido es el siguiente: RECONOCIMIENTO DE VOZ USANDO HTK 100 PABLO AGUILERA BONET Contenido de directin.conf SOURCERATE = 625.0 SOURCEKIND = HAUDIO SOURCEFORMAT = HTK # 16 kHz de freciencia de muestreo # Entrada directa de audio # Formato de los archivos de voz TARGETKIND = MFCC_0_D_A WINDOWSIZE = 250000.0 TARGETRATE = 100000.0 # Coeficientes a usar # 25 mseg como longitud de trama # 10 mseg como periodicidad entre tramas NUMCEPS = 12 USEHAMMING = T PREEMCOEF = 0.97 NUMCHANS = 26 CEPLIFTER = 22 AUDIOSIG = -1 # # # # # # 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 cepstral Reconocimiento controlado por teclado # Final Su contenido es como el archivo original, analisis/analisis.conf, excepto en los siguientes detalles: • AUDIOSIG = -1 define la señal que usaremos para controlar el funcionamiento. Un valor negativo indica controlado por la pulsación de teclas. • SORUCERATE = 625.0 indica el periodo de muestreo en 10 −7 seg . Equivale a 16 kHz de frecuencia de muestreo. • SOURCEKIND = HAUDIO indica que la entrada de audio será la entrada de línea (micrófono). El resto del archivo debe ser igual al que se usó para extraer las características de las secuencias de entrenamiento. 5.4.9 – Rendimiento del reconocedor – Especificar las etiquetas reales Para obtener la tasa de error del reconocedor que hemos diseñado, debemos comparar la transcripción obtenida de un conjunto de secuencias de prueba, frente al etiquetado real de esas secuencias. Por lo tanto, necesitamos dos conjuntos de etiquetas: las transcritas y las reales. Debemos grabar varias secuencias de entrenamiento, mediante el procedimiento descrito en la Sección 5.4.3, pero almacenando las señales .sig en prueba\sig\, y las transcripciones .lab en prueba\lab\. Además, deben extraerse los vectores MFCC tal como se hizo en la Sección 5.4.4, pero almacenándolos en prueba\mfcc\. - Extraer las transcripciones estimadas Por otro lado, debemos ejecutar el reconocedor sobre el conjunto de prueba para que, sin conocer las etiquetas reales, transcriba las secuencias que le pasamos. Además, debe suministrarse una lista de los archivos a probar, análogamente a como se hizo en la Sección 5.4.6.1 con la lista de entrenamiento. El archivo prueba\prueba.txt debe contener: RECONOCIMIENTO DE VOZ USANDO HTK 101 PABLO AGUILERA BONET Contenido de prueba.txt prueba\mfcc\prueba1.mfcc prueba\mfcc\prueba2.mfcc prueba\mfcc\prueba3.mfcc prueba\mfcc\prueba4.mfcc prueba\mfcc\prueba5.mfcc prueba\mfcc\prueba5.mfcc (…) En este momento, podemos ejecutar el reconocedor para que transcriba las señales de prueba. Se hace de una manera similar a la propuesta en la Sección 5.4.8.1, pero con las nuevas secuencias: HVITE -T 1 -S prueba\prueba.txt -H modelo\hmm1\hmm_x -i prueba\reco.mlf -w definicion\red.slf definicion\diccionarioprueba.txt definicion\listahmm.txt • La gramática definicion\red.slf debe cambiarse si las secuencias no tienen la misma estructura que las secuencias de reconocimiento. • -S prueba\prueba.txt especifica la lista de archivos a transcribir. • definicion\diccionarioprueba.txt es análogo a definido en la Sección 5.4.7.2, pero ahora la segunda columna debe contener, entre corchetes, los nombres de las etiquetas asociadas a cada HMM (y es recomendable que coincida con el nombre de los propios HMM). Esto se hace para que las transcripciones del reconocedor y las etiquetas reales pertenezcan al mismo diccionario. Contenido de diccionarioprueba.txt palabra1 palabra2 palabra3 (…) Silencio [ETIQUETA_palabra1] [ETIQUETA_palabra2] [ETIQUETA_palabra3] (…) [ETIQUETA_silencio] HMM_palabra1 HMM_palabra2 HMM_palabra3 (…) HMM_silencio • El resto de argumentos ya se comentaron en la Sección 5.4.8.1. • La transcripción se almacena en prueba\reco.mlf, y es el archivo que usaremos para realizar las comparaciones. – Tasa de error Por último, usaremos HRESULTS para comparar y extraer la tasa de error de nuestro reconocedor frente a las secuencias de prueba. Hay que ejecutar el comando: HRESULTS -T 1 -e ??? etiqueta_silencio -L prueba\lab definicion\listaetiquetas.txt prueba\reco.mlf RECONOCIMIENTO DE VOZ USANDO HTK 102 PABLO AGUILERA BONET • -e ??? etiqueta_silencio indica que no se deben tener en cuenta los silencios a la hora de computar las transcripciones correctas. Puede ser recomendable o no dependiendo de la situación. • -L prueba\lab es el directorio donde se almacenan las etiquetas reales que usaremos para comparar. • definicion\listaetiquetas.txt es simplemente la lista de etiquetas. Si los nombre de éstas coinciden con las de los HMMs, se puede usar definicion\listahmm.txt. • prueba\reco.mlf es el archivo de transcripción devuelto en el paso anterior. La ejecución devuelve una tabla de resultados. Ésta (y cualquier otra salida por pantalla) puede volcarse a un archivo de texto añadiendo al final de la línea de ejecución: > prueba\resultados.txt Contenido de resultados.txt: ====================== HTK Results Analysis ======================= Date: Sat Nov 17 15:02:26 2007 Ref : prueba\lab Rec : prueba\reco.mlf ------------------------ Overall Results -------------------------SENT: %Correct=98.00 [H=49, S=1, N=50] WORD: %Corr=98.00, Acc=100.00 [H=49, D=0, S=1, I=0, N=50] =================================================================== Comentaremos algunos de los resultados: • Ref : prueba\lab es el directorio donde se encuentran las etiquetas de referencia. • Rec : prueba\reco.mlf es el archivo con las transcripciones del reconocedor. • N es el número total de transcripciones que tenemos. • H es el número de transcripciones correctas. • S es el número de transcripciones en las que se ha sustituido la etiqueta correcta, y por lo tanto el reconocimiento ha sido incorrecto. • SENT: %Correct=100.00 muestra el porcentaje de acierto, computado como: % Correcto = H × 100 % N • D es el número total de transcripciones eliminadas, que se considerarán errores. • I es el número total de transcripciones insertadas, que se considerarán errores. • WORD: %Corr=98.00, Acc=98.00 muestra el porcentaje de acierto contado en palabras, donde la precisión es computada como: RECONOCIMIENTO DE VOZ USANDO HTK 103 PABLO AGUILERA BONET % Precisión = H −I × 100 % N Cuando los HMM son palabras, ambas medidas SENT y WORD coinciden. 5.5 – CONCLUSIONES En este capítulo hemos analizado el conjunto de herramientas HTK, con el que podemos implementar reconocedores de voz. Comenzamos describiendo la arquitectura y propiedades generales de la aplicación, siguiendo con un análisis de cada una de las herramientas que HTK pone a disposición del usuario para el tratamiento de HMMs. Durante todo el capítulo hemos visto cómo se aplican los conceptos teóricos vistos en capítulos anteriores al diseño real de un reconocedor. La última parte del tema explica en detalle el proceso de construcción de un reconocedor sencillo con HTK. Éste comienza con la grabación de las secuencias de entrenamiento y extracción de características. A continuación, se procede a la definición, inicialización y entrenamiento de los modelos, tras lo que se pasa a definir la gramática y el diccionario que usaremos. Finalmente, pueden ejecutarse las pruebas de reconocimiento en vivo y de rendimiento. Estos pasos serán la guía que se seguirá para implementar el reconocedor en el capítulo 6. La estructura general de este capítulo está basada en una generalización de los métodos propuestos por [MOREAU] o [POMPEU]. Para profundizar en HTK y sus herramientas se recomienda acudir al manual ([YOUNG ET AL.]). RECONOCIMIENTO DE VOZ USANDO HTK 104 PABLO AGUILERA BONET 6 – SIMULACIONES Este capítulo detalla paso a paso el proceso de construcción de un reconocedor de palabras conectadas, como aplicación a toda la teoría que hemos estudiado anteriormente. En este caso, se ha diseñado un reconocedor de números de teléfono (cadenas de 9 dígitos). Está estructurado con el objetivo de que pueda ser utilizado como guía para el desarrollo de una práctica. La mayor parte de los datos necesarios se encuentran disponibles, para que el usuario pueda centrarse en el tratamiento y manipulación de los mismos. Como complemento, se exponen los resultados de aplicar el reconocedor para medir el rendimiento de algoritmos de separación de la voz. 6.1 – REQUISITOS Y PREPARACIÓN 6.1.1 – 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. 6.1.2 – Preparación del entorno de trabajo 1 – Copia la carpeta HTK con todo su contenido al directorio donde desees trabajar, por ejemplo, C:\HTK\. RECONOCIMIENTO DE VOZ USANDO HTK 105 PABLO AGUILERA BONET 2 – Crea la siguiente estructura de directorios: Figura 6.1. Estructura de directorios. 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. 6.2 – DESARROLLO DE LA PRÁCTICA 6.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. RECONOCIMIENTO DE VOZ USANDO HTK 106 PABLO AGUILERA BONET Figura 6.2. Proceso de grabación y etiquetado de las secuencias de entrenamiento. Extraído de [MOREAU]. 11 – Ejecuta el siguiente comando: HSLab a.sig Aparecerá la interfaz gráfica de HSLAB. Figura 6.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 6.4 y pulsa Enter. Esto etiquetará la porción de voz para que el reconocedor sepa qué se ha dicho. RECONOCIMIENTO DE VOZ USANDO HTK 107 PABLO AGUILERA BONET Figura 6.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 6.5. 16 – Pulsa Save y Enter. Luego puedes salir pulsando Quit. Figura 6.5. Secuencia de entrenamiento completamente etiquetada. RECONOCIMIENTO DE VOZ USANDO HTK 108 PABLO AGUILERA BONET 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). 6.2.2 – Análisis acústico Figura 6.6. Proceso de conversión de los datos de entrenamiento. Extraído de [MOREAU]. 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 20 – Edita el archivo de configuración analisis\analisis.conf con un editor de texto. RECONOCIMIENTO DE VOZ USANDO HTK 109 PABLO AGUILERA BONET 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. 6.2.3 – Definición de los HMMs ... Figura 6.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: RECONOCIMIENTO DE VOZ USANDO HTK 110 PABLO AGUILERA BONET 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.0 0.0 0.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.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.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.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.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.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.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.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.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.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.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.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.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.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.3 0.5 0.0 0.0 0.0 0.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.5 0.0 <EndHMM> RECONOCIMIENTO DE VOZ USANDO HTK 111 PABLO AGUILERA BONET 23 - Como puede verse en la figura 6.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. 6.2.4 – Entrenamiento de los modelos Figura 6.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 – 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. RECONOCIMIENTO DE VOZ USANDO HTK 112 PABLO AGUILERA BONET Nota: antes de la s final, debe haber un espacio. Figura 6.9. Inicialización de los modelos con HINIT. Extraído de [MOREAU]. 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\hmm0 -H modelo\proto\hmm_cero -l cero -L datos\lab\ cero 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_uno -l uno -L datos/lab/ uno (…) 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 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: RECONOCIMIENTO DE VOZ USANDO HTK 113 PABLO AGUILERA BONET 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 6.10. Proceso de re-estimación. Extraído de [MOREAU]. 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_uno -l uno -L datos/lab/ uno (…) 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 6.2.5 – Definición de la gramática 28 – Crea el archivo gramatica.txt en la carpeta definicion\. Su contenido deberá ser el siguiente: RECONOCIMIENTO DE VOZ USANDO HTK 114 PABLO AGUILERA BONET 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 6.2.6 – Reconocimiento de voz en vivo 31 – Crea el archivo listahmm.txt en la carpeta definicion\. Su contenido deberá ser el siguiente: Contenido de listahmm.txt s cero uno dos tres cuatro cinco seis siete ocho nueve RECONOCIMIENTO DE VOZ USANDO HTK 115 PABLO AGUILERA BONET 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. Figura 6.11. Reconocimiento en vivo. RECONOCIMIENTO DE VOZ USANDO HTK 116 PABLO AGUILERA BONET 6.3 – MEDIDA DEL RENDIMIENTO DE ALGORITMOS DE SEPARACIÓN 6.3.1 – Introducción Los algoritmos de separación tienen como objetivo el separar una señal mezclada de audio en dos señales independientes. Uno de las técnicas más utilizadas es la conocida como ICA (Análisis de Componentes Independientes), que se basa en ciertas propiedades que se derivan de la independencia estadística de los procesos aleatorios que modelan las señales mezcladas. No obstante, su estudio queda fuera del alcance de este proyecto. Para medir la eficacia del algoritmo frente a distintas interferencias, el propio usuario puede escuchar directamente el resultado de la separación y puntuar (de manera inherentemente subjetiva) la calidad obtenida. No obstante, sería conveniente disponer de un medidor universal de la eficacia del algoritmo, que diese una puntuación basada sólo en la calidad de la señal y no en factores subjetivos. Esto es lo que nos proponemos hacer. 6.3.2 – Descripción del experimento Se tiene una señal de voz de una persona contando de cero a nueve, y repitiendo la cuenta cinco veces (50 cifras en total). Se dice una cifra cada dos segundos aproximadamente. El experimento consiste en mezclar la voz con distintas interferencias. Al principio, ambas señales (voz e interferencia) se emiten por dos altavoces, siendo recogidas por sendos micrófonos poco distantes. Los micrófonos recogerán inevitablemente la mezcla de ambas señales, añadiendo efectos como eco, ruido, atenuación y distorsión. Esto se hace así para que exista un canal real (el aire de la habitación) que degrade la voz para ajustarla a una situación realista. Las señales mezcladas deben tener niveles de energía parecidos para que el algoritmo funcione bien. Tras aplicarle el algoritmo de separación a la mezcla, obtenemos la señal de voz original separada de la interferencia. Tanto la nueva voz como la original mezclada se segmentan manualmente o mediante MatLab en 50 archivos wav de dos segundos cada uno (es decir, una cifra por archivo). Así se dispone de un conjunto de pruebas significativo. Figura 6.12. Experimento completo de las pruebas de rendimiento del algoritmo mediante el reconocimiento de voz. RECONOCIMIENTO DE VOZ USANDO HTK 117 PABLO AGUILERA BONET Mediante HRESULTS y el procedimiento descrito en la Sección 5.4.9, podemos obtener la proporción de cifras que se han reconocido correctamente antes y después de la mezcla. No obstante, hay que modificar el archivo de configuración para que puedan tratarse los archivos wav. Para ello, se edita dicho archivo y se añaden los campos: • SOURCEFORMAT = WAV (sustituye a SOURCEFORMAT = SIG). • SOURCEKIND = WAVEFORM (hay que añadirlo). Debemos tener en cuenta que la señal, tras ser pasar por el canal y mezclarse, quedará muy degradada (las interferencias tienen una energía similar a la voz). Esto se añade al hecho de que el reconocedor ha sido diseñado y entrenado para funcionar correctamente frente a señales relativamente limpias, operando de manera excelente en esas condiciones. 6.3.3 – Resultados Hemos aplicado el proceso descrito anteriormente con dos interferencias distintas: música de fondo y ruido blanco generado artificialmente. Los resultados se recogen en la tabla 6.1 en forma de “probabilidad de acertar una palabra” en el reconocedor: Señal Sin pasar por el canal Pasada por el canal (mezclada) Pasada por el canal y separada mediante ICA Pasada por el canal y aplicando sustracción espectral Voz 100% - - - Voz con música - 72% 96% - Voz con ruido - 10% 80% 82% Tabla 6.1. Medidas de rendimiento del algoritmo de separación, obtenido mediante el reconocedor de cifras implementado. Se han utilizado 50 cifras en total. De la tabla anterior se pueden inferir los siguientes resultados: • El reconocedor reconoce las 50 cifras dictadas si se le pasan recién llegadas al sistema. Se ha probado con micrófonos de distinta calidad y diferentes personas, obteniendo que todos los resultados rondan el 100% de aciertos. • El reconocedor presenta unas tasas de acierto dispares frente a la señal mezclada por el canal. En el caso de música de fondo, el resultado es bastante mejor (76%) que frente al ruido blanco (10%). Se observa una mejoría en ambas pruebas tras aplicar el algoritmo de separación, obteniendo una transcripción casi perfecta frente a música (96%) y una enorme mejora frente al ruido blanco (80%). • Centrándonos en la voz mezclada con ruido, se observa que la separación mediante ICA produce prácticamente los mismos resultados que el método de sustracción espectral. Dicho método elimina totalmente el ruido a costa de distorsionar la señal de voz, mientras RECONOCIMIENTO DE VOZ USANDO HTK 118 PABLO AGUILERA BONET que la separación apenas distorsiona pero no elimina el ruido completamente. El reconocedor falla en distintas cifras en cada caso: en separación, como sigue habiendo ruido, fallan a veces las cifras “uno” y “nueve” (poco energéticas); mientras que usando sustracción, suelen fallar “uno”, “cuatro” y “ocho” (degradadas por la distorsión). 6.4 – CONCLUSIONES En este capítulo se han desarrollado de manera guiada los pasos necesarios para la construcción de un reconocedor de secuencias de número. Tras una breve introducción exponiendo los pasos previos a realizar, se han desglosado una tras otra las distintas etapas necesarias para la implementación con HTK del sistema. La práctica finaliza con una prueba en tiempo real del funcionamiento del programa. Una práctica más sencilla puede encontrarse en [MOREAU] o [POMPEU]. Para profundizar en HTK y sus herramientas se recomienda acudir al manual ([YOUNG ET AL.]). Por otro lado, se incluye un análisis del rendimiento de la técnica ICA frente a dos interferencias distintas, usando un reconocedor. Los resultados muestran que la separación mejora notablemente la tasa de reconocimiento, siendo esencial en el caso de voz con ruido de fondo. RECONOCIMIENTO DE VOZ USANDO HTK 119 PABLO AGUILERA BONET RECONOCIMIENTO DE VOZ USANDO HTK 120 PABLO AGUILERA BONET 7 – CONCLUSIONES Y LÍNEAS FUTURAS 7.1 – CONCLUSIONES A lo largo de este proyecto, hemos expuesto la forma de trabajar con Modelos Ocultos de Markov (HMM) y cómo utilizarlos para diseñar e implementar reconocedores del habla. Se presentaron los tres problemas fundamentales a resolver antes de poder aplicar esta teoría: el cálculo eficiente de la función de verosimilitud (resuelto mediante el algoritmo delante-atrás), la decodificación de la secuencia de estado (que se calcula con el algoritmo de Viterbi) y la re-estimación de los parámetros del modelo (usando el algoritmo EM). Son algoritmos computacionalmente eficientes y que permiten obtener excelentes resultados sin más que aplicar la teoría. Aunque los HMM constituyen el núcleo del reconocedor, para implementarlo con éxito es necesario aplicar conceptos de distintas disciplinas como tratamiento de señal, lingüística y teoría de la estimación. De esta manera, el uso de los Coeficientes Cepstrum en Frecuencia Mel (MFCC) está basado en el aspecto fisiológico del habla, modelando el tracto vocal y la percepción del oído humano. Por otro lado, y la estructura general del reconocedor debe tener en cuenta el léxico, la gramática, y otros conceptos de la teoría del lenguaje. Por otro lado, los veinte años que esta teoría lleva siendo la punta de lanza en la investigación sobre reconocimiento de voz, nos permite aprovechar el conocimiento acumulado para dar con seguridad algunos pasos críticos en el proceso de diseño. Nos referimos al acierto que supone elegir el modelo de Bakis (en el cual nunca se puede retroceder en los estados), a ajustar el número de estados para que sea proporcional al de fonemas y a inicializar los procesos aleatorios subyacentes al modelo de manera adecuada. Finalmente, hemos aprendido a implementar reconocedores sencillos mediante la herramienta HTK (Hidden Markov Model ToolKit), utilizada en todo el mundo para estas aplicaciones. Se ha desarrollado un proceso metódico de construcción para que ésta pueda ser llevada a cabo en una clase práctica de la asignatura Tratamiento Digital de la Voz. Además, la implementación de un reconocedor de secuencias de cifras nos ha permitido realizar diversas pruebas sobre algoritmos de separación. En este aspecto, el reconocedor deja patente la mejora que supone el uso de dichos algoritmos, logrando altas tasas de reconocimiento en todos los casos. RECONOCIMIENTO DE VOZ USANDO HTK 121 PABLO AGUILERA BONET 7.2 – LÍNEAS FUTURAS De continuarse la línea del proyecto, o utilizarse la aplicación desarrollada para otros fines, existen algunos tópicos que pueden resultar de interés para avanzar en la investigación sobre reconocimiento del habla: • Una vez se domina el proceso de construcción de un reconocedor de palabras aisladas y conectadas, la ampliación hacia sistemas más complejos debe realizarse añadiendo capas que modelen particularidades del lenguaje o de la aplicación. Por ejemplo, pueden definirse redes gramaticales más complicadas para ampliar la complejidad de las frases con las que se trabaja. • Se debe experimentar con el efecto de asignar cada HMM a unidades menores que la palabra, como sílabas o fonemas. De hecho, éste es el primer paso que debe darse para complicar el vocabulario sin que crezca enormemente el número de secuencias de entrenamiento (para vocabularios grandes, es prohibitivo asociar una palabra a cada HMM). • Deben explotarse a fondo las enormes posibilidades que ofrece la aplicación HTK para la construcción de reconocedores complejos. En este aspecto, es una suerte que se disponga de una enorme comunidad de usuarios en grupos de investigación o universidades trabajando con ella. • Por último, si desea usarse el reconocedor para probar la eficacia de algoritmos de tratamiento digital de la señal de voz, se recomienda entrenar al sistema con secuencias grabadas en las mismas condiciones (misma habitación, canal, micrófono,…) en las que se va a recibir la señal de prueba. En cualquier caso, se propone utilizar el reconocedor para la prueba objetiva de nuevos algoritmos de tratamiento de la señal de voz. RECONOCIMIENTO DE VOZ USANDO HTK 122 PABLO AGUILERA BONET REFERENCIAS [BISHOP] Cristopher M. Bishop (2005). Neural Networks for Pattern Recognition. Oxford University Press. [VOZ] Sergio Cruces Álvarez (2006). Apuntes de la asignatura “Tratamiento Digital de la Voz”. Departamento de Teoría de la Señal y Comunicaciones (Universidad de Sevilla). [HUANG ET AL.] Xuedong Huang, Alex Acero y Hsiao-Wuen Hon (2001). Spoken Language Processing. Prentice Hall. [MOREAU] Nicolas Moreau (2002). HTK v.3.1 Basic Tutorial. Technische Universität Berlin. [POMPEU] Varios (2006). Speech Recognition with HTK. Universitat Pompeu Fabra. [PROAKIS] John G. Proakis y Dimitris G. Manolakis (1998). Tratamiento Digital de Señales, 3ª edición. Prentice Hall. [RABINER] Lawrence R. Rabiner (1989). A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition. Proceedings of the IEEE, vol 77, nº 2, Febrero de 1989. [RABINER Y JUANG] Lawrence R. Rabiner, Biing-Hwang Juang (1993). Fundamentals of Speech Recognition. Prentice Hall. [YOUNG ET AL.] Steve Young, Gunnar Evermann, Mark Gales, Thomas Hain, Dan Kershaw, Xunying Liu, Gareth Moore, Julian Odell, Dave Ollason, Dan Povey, Valtcho Valthev, Phil Woodland (2006). The HTK Book. Cambridge University Engineering Departament. RECONOCIMIENTO DE VOZ USANDO HTK 123