reconocimiento de voz usando htk

Anuncio
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
fHz  

fmel  = 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 —a31—a11—a13 —a32 —a23 =
= 1—( 0 ' 8 )—( 0 ' 8 )—( 0 '1)—( 0 ' 4 )—( 0 ' 3 )—( 0 '1)—( 0 ' 2 ) =
= 1' 536—10 −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 = ∑ d—pi ( 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
2—100—5100 ≈ 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
Descargar