4. descripción de las herramientas empleadas

Anuncio
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
4. DESCRIPCIÓN DE LAS HERRAMIENTAS
EMPLEADAS
En este capítulo se describen las principales herramientas que se van a
emplear a lo largo del proyecto, fundamentalmente HTK y los lenguajes
de comandos y PERL.
4.1 HTK
Como se ha comentado en la introducción, nuestro sistema de
segmentación se basará en los Modelos Ocultos de Markov y se
implementará mediante el uso de las herramientas HTK (Hidden
Markov Model Toolkit).
HTK es un conjunto de herramientas de software para diseñar y
manipular modelos ocultos de Markov (HMM, Hidden Markov Models), y
se emplea en múltiples áreas del conocimiento cuando el problema a
resolver puede ser enfocado como un proceso de modelación Estocástico
Markoviano (Reconocimiento y síntesis de voz, reconocimiento de
caracteres y formas gráficas, análisis de vibraciones mecánicas,
determinación de secuencias válidas del ADN humano…), aunque su
uso principal y para el que fue diseñado es el desarrollo de sistemas de
4. Descripción de las herramientas empleadas
40
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
reconocimiento automático del habla. La mayoría de estos sistemas se
basan en la utilización de la técnica de análisis estocástico de los
Modelos Ocultos de Markov, lo que implica problemas de alto grado de
complejidad y el manejo de grandes bases de datos (archivos,
parámetros, modelos, diccionarios), por lo que se hace necesaria una
herramienta computacional efectiva, como HTK, para abordar dichos
problemas.
El desarrollo de HTK lo lleva a cabo el grupo del habla, visión y robótica
del Departamento de Ingeniería de la Universidad de Cambridge
(CUED). Actualmente HTK es de libre distribución y su código y librería,
programados en lenguaje C, pueden ser modificados en común acuerdo
con el CUED. Además la herramienta se encuentra disponible para
utilizarlo en diversas plataformas o sistemas operativos (Unix, Linux,
Windows y DOS).
4.1.1 Funcionamiento general de HTK
HTK dispone de una arquitectura flexible y autosuficiente.
Es
controlado por módulos de librerías, que alimentan la interfaz de
funciones
correspondiente:
Manejo
de
archivos,
operaciones
matemáticas, interacción con el sistema operativo... La utilización de
cualquier herramienta disponible depende de dos aspectos:
–
Línea de comandos como interfaz con el sistema operativo.
Dispone
de
parámetros
opcionales
para
controlar
detalles
particulares en su ejecución.
4. Descripción de las herramientas empleadas
41
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
–
Juan Carmona Mariscal
Módulos de librerías: Gran parte de la funcionalidad de HTK se
encuentra en las librerías. Estos módulos presentan interfaces
que aseguran que cada herramienta se comporte de cara al
usuario de manera homogénea, y ofrecen el conjunto de
funciones más utilizadas.
La llamada a las herramientas
El volumen de archivos que HTK debe manejar y controlar es siempre
elevado, por lo que la utilización de comandos es fundamental; sólo así
será práctico de utilizar. La línea de llamada a comandos es como sigue:
herramienta [opciones] archivos
donde herramienta es cualquiera de las definidas en el paquete HTK
(HCopy, HLed, Hrest, etc.), archivos son los que se emplean en las
acciones llevadas a cabo por dicha herramienta, y [opciones] agrupa las
variables, parámetros del sistema y librerías.
Las opciones particulares son indicadas mediante un guión, seguido de
una letra, y acompañada del valor alfanumérico correspondiente, en su
caso. Las letras minúsculas indican opciones propias de la herramienta,
y el parámetro utilizado podrá tener diferentes significados, según la
herramienta a ejecutar. Las letras mayúsculas son utilizadas para
indicar opciones comunes a todas las herramientas del sistema, por
ejemplo: [Young 2006]
4. Descripción de las herramientas empleadas
42
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov

Juan Carmona Mariscal
Opción –C: Esta opción introduce ficheros de configuración. El
archivo indicado posee una lista de parámetros que serán
cargados durante la inicialización de la herramienta invocada.

Opción –S: Sirve para potenciar y flexibilizar el manejo de base de
datos (archivos). Por ejemplo: Indicará a la herramienta que el
archivo mencionado hace referencia a una lista de archivos (Muy
útil en etapas de entrenamiento).

Opción –A: Imprime la línea de comandos con sus argumentos.

Opción –D: Muestra por pantalla las variables de configuración
que se están utilizando.

Opción –T: Permite que durante la ejecución de la herramienta
aparezca información relativa a la ejecución de la misma (uso de
trazas).

Opción –L: Busca las etiquetas en el directorio especificado.

Opción –H: Carga el HMM como un archivo macro de extensión
mmf (Master Macro File).
Los valores para los parámetros pueden ser:

Números enteros o flotantes.

Strings.

Booleanos.
Las librerías en HTK
Como acabamos de decir, cada librería es un conjunto de instrucciones
para lograr una función específica en las herramientas disponibles. Hay
librerías comunes a todos los comandos y otras son particulares. Para
controlar de manera más precisa el comportamiento de las librerías
haremos uso de variables de configuración.
4. Descripción de las herramientas empleadas
43
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
La siguiente figura muestra la estructura de software de una
herramienta típica de HTK:
Figura 4.1: Arquitectura de software en HTK [Young 2006]
Los principales módulos de librerías disponibles en HTK son los
siguientes:

HShell: Es la interfaz entre HTK y el sistema operativo.

HMem: Controla la gestión de memoria.

HMath: Ofrece funciones matemáticas, y maneja estructuras de
alto nivel como matrices y vectores.

HSigP:
Ofrece
operaciones
de
procesamiento
de
la
señal
necesarias para el análisis de alocuciones.

HLabel: Módulo para el manejo de archivos de etiquetas.

HLM: Módulo para el manejo de archivos de modelos de
lenguajes.
4. Descripción de las herramientas empleadas
44
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov

Juan Carmona Mariscal
HNet: Módulo para el manejo de redes; soporta archivos con
formato
Lattice
y
Networks,
necesarios
para
la
fase
de
reconocimiento.

HDict: Módulo para el control del diccionario del sistema.

HVQ:
Módulo
para
el
manejo
de
codebook
de
vectores
cuantificados.

HModel: Módulo para la interpretación las definiciones de HMM.

HWave: Manejo de archivos de entrada y salida a nivel de señal
de audio.

HParm: Control de parametrización en señales de audio.

HAudio: Controla adquisición en vivo de señales de audio.

HGraf: Manejo gráfico de señales de audio.

HUtil: Provee rutinas de manipulación de HMM.

HTrain: Soporte para entrenamiento de modelos.

HAdapt: Provee soporte para las herramientas de adaptación del
reconocedor a uno o más locutores.

HRec: Conjunto de funciones para el procesado en etapa de
reconocimiento.
4.1.2 Parametrización con HTK
Dada una señal, debemos extraer su información, es decir, debemos
extraer los parámetros que caracterizan a la señal, los cuales nos
servirán para entrenar los HMM y efectuar el reconocimiento.
HTK acepta dos formatos de parametrización:
–
Formato de parámetros HTK: Opción por defecto.
4. Descripción de las herramientas empleadas
45
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
–
Juan Carmona Mariscal
Formato de parámetros Esignal: Similar al formato HTK, sólo
presenta diferencias en las cabeceras de los archivos.
Existen tres posibilidades para la obtención de las muestras:
1. Archivos Parametrizados: Al experimentar con señales, lo primero
que debemos lograr es disponer de una base de datos parametrizada,
sólo así, posteriormente, podremos realizar múltiples experimentos.
Para construirla, HTK dispone de la herramienta HCopy. Las entradas
de HCopy son la señal en banda base (en formato wav) y un archivo de
configuración de la parametrización, el cual le indica a HTK la manera
de analizar los datos. HCopy entrega como salida un archivo de voz
parametrizada convertida en una matriz o vector de vectores.
2. Archivo de Señal: Para cualquier señal deberán tomarse las
muestras y parametrizarlas. Sólo así, HTK podrá interpretarlas.
3. Entrada Directa por Micrófono: Es especial para experiencias con
voz en vivo. Habrá que tener en cuenta el efecto del ruido ambiental y
obligatoriamente se debe filtrar.
En cuanto a la parametrización de la señal, como hemos comentado,
HTK soporta todo el proceso de parametrización por medio del comando
HCopy. Hcopy es una herramienta de propósito general que se emplea
para copiar, filtrar y extraer features de los ficheros de audio.
Por defecto HCopy realiza una simple copia del fichero de origen en el
fichero destino. Dicho comportamiento puede modificarse con las
opciones especificadas en el fichero de configuración. En este fichero
4. Descripción de las herramientas empleadas
46
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
pueden detallarse un conjunto de transformaciones que se aplican
sobre el fichero origen y se guardan en el fichero destino. La idea es que
exista un tipo de parámetros origen y un tipo de parámetros destino de
forma que, especificando dichos tipos en el fichero de configuración,
HCopy realice la conversión entre ambos formatos.
Este archivo de configuración al que hacemos referencia puede ser un
archivo de texto codificado en ANSI. En él se debe indicar el tipo de
algoritmo a aplicar: Banco de Filtros, Cepstrum y MEL Cepstrum. Los
parámetros para especificar el archivo de configuración son:

Formato de datos: SOURCEFORMAT=HTK

Tipo de algoritmo y análisis: TARGETKIND. tenemos las
siguientes posibilidades [Carrillo 2007]:
ALGORITMO
LPC
LPREFC
LPCEPSTRA
LPDELCEP
IREFC
MFCC
FBANK
MELSPEC
TIPO DE ANÁLISIS
Predicción Lineal
Coeficientes de Reflexión para LPC
LPC con Cepstrum
LPC Cepstrum - Plus de Coeficientes
LPC - Coeficientes de Reflexión
Coeficientes MEL Cepstrum
Banco de filtros de MEL con salida LOG
Banco de filtros de MEL con salida Lineal

Tamaño de la ventana de análisis: WINDOWSIZE

Desplazamiento de tramas: TARGETRATE.

Número de coeficientes cepstrales: NUMCEPS.

Filtro de Preénfasis: PREEMCOEF.

Número de bancos de filtros: NUMCHANS.
4. Descripción de las herramientas empleadas
47
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov

Juan Carmona Mariscal
Ganancia Cepstral: CEPLIFTER. Se emplea para reescalar los
coeficientes cepstrales de modo que todos estén en el mismo
orden de magnitud.
Para afinar en el análisis se emplea un grupo finito de coeficientes
extras:

Cantidad de Energía: _E

Energía total Suprimida: _N

Coeficientes Delta: _D

Coeficientes de Aceleración: _A

Uso de compresión: _C

Valor medio nulo: _Z

Coeficiente Cepstral nulo: _0
Por poner un ejemplo que utilizaremos en nuestro segmentador, por
medio de la variable TARGETKIND=MFCC_E_D_A HTK sabrá del tipo de
análisis; significa que el algoritmo es un banco de filtros con
coeficientes cepstrales MFCC, al que se le añade la energía _E, los
coeficientes Delta _D y los de aceleración _A. Un ejemplo de archivo de
configuración de la parametrización usado en nuestro segmentador se
muestra
a
continuación
(es
un
extracto
del
fichero
config_hcopy_ses_mfcc_). El tamaño de la ventana para el análisis es de
25 ms y el tiempo para cada muestra alcanza los 10 ms.
SOURCEFORMAT = NOHEAD
SOURCERATE = 625.0
SOURCEKIND = WAVEFORM
TARGETFORMAT = HTK
TARGETRATE = 100000.0
TARGETKIND = MFCC_E_D_A
HPARM: WINDOWSIZE = 250000.0
4. Descripción de las herramientas empleadas
48
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
HPARM:
HPARM:
HPARM:
HPARM:
HPARM:
Juan Carmona Mariscal
NUMCEPS = 12
USEHAMMING = T
PREEMCOEF = 0.97
NUMCHANS = 40
CEPLIFTER = 22
La llamada para ejecutar HCopy es:
HCopy
[opción]
archivo_parametrización
[opción]
archivo
_salidaParametrizada.
Como las llamadas a las herramientas de HTK a veces pueden ser muy
complejas emplearemos de ahora en adelante diagramas en bloque que
ayuden a comprender el uso de la herramienta. Así, la llamada de
Hcopy respondería al siguiente diagrama de bloques:
Figura 4.2: Diagrama de bloques de la llamada a HCopy [Carrillo 2007]
El archivo_salidaParametrizada debe poseer extensión mfcc, indicando
con ello que los datos corresponden a vectores codificados según
coeficientes cepstrales de frecuencia MEL.
Para visualizar los resultados del proceso de parametrización, HTK
dispone del comando HList. Si el usuario desea conocer el vector de
4. Descripción de las herramientas empleadas
49
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
parametrización para alguna forma de onda en particular, la llamada
debe ser:
HList [opción] archivo_de_audio
Figura 4.3: Diagrama de bloques de la llamada a HList [Carrillo 2007]
La entrada es un archivo de audio, la señal de audio en formato wav.
HList entrega un archivo con el informe de la parametrización de las
muestras.
Análogamente, HTK dispone de recursos para realizar la cuantización
de los vectores (o etiquetado). Se puede optar por los modelos de
densidad discreta o continua; en estos últimos los vectores cuantizados
se agrupan como un codebook, lo cual permite acelerar el proceso de
reconocimiento reduciendo el tiempo de los cálculos, pero reduce la
precisión debido a que la tasa de error aumentará con facilidad, dando
lugar a reconocedores débiles. La herramienta HSlab es la encargada
de realizar el etiquetado en HTK. Se dispone para ello de una interfaz
gráfica que simplifica el proceso:
4. Descripción de las herramientas empleadas
50
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
Figura 4.4: Diagrama de bloques de la llamada a HSlab [Carrillo 2007]
Figura 4.5: Etiquetado de una señal de audio con HSlab [Carrillo 2007]
A pesar de su utilidad práctica, ni HList ni HSlab son necesarias para el
desarrollo de nuestro segmentador, por lo que se han descrito aquí
brevemente. En cambio HCopy sí es fundamental en nuestro proceso de
parametrización, por lo que volveremos a esta herramienta cuando
detallemos este proceso en el capítulo dedicado a los scripts del
segmentador.
4. Descripción de las herramientas empleadas
51
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
4.1.3 Creación de Modelos de Markov
El concepto de Modelo Oculto de Markov está ampliamente difundido;
su esquema se muestra en la siguiente figura:
Figura 4.6: Esquema de un HMM [Carrillo 2007]
Los elementos característicos de todo HMM, son:

Número de estados: N

Número de símbolos observables por estado: M

Probabilidad de transición entre estados: A={aij}

Distribución de Probabilidad de símbolos de observación: B=bj(k)

Distribución inicial de estados: Π={ πi}
Para que un HMM sea útil, deben responderse las tres preguntas
siguientes: [Carrillo 2007]
1.- ¿Para el modelo, cómo se evalúa la probabilidad de la secuencia
observada?
El algoritmo Fordward – Backward permite resolver este problema.
Consiste básicamente en un proceso que permite optimizar el cálculo de
la probabilidad, de lo contrario, el procesamiento (multiplicaciones y
adiciones) sería tan grande que no podría implementarse de manera
práctica. Con su aplicación, bastan 2TN2 operaciones de cómputo, en
4. Descripción de las herramientas empleadas
52
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
vez de 2TNT operaciones al no utilizar el algoritmo, siendo T el número
de observaciones realizadas.
2.- ¿Cómo elegir la secuencia óptima de estados?
Este problema se puede resolver abordando la técnica de programación
dinámica, específicamente utilizando el algoritmo de Viterbi.
3.- ¿Cómo ajustar los parámetros del modelo?
Basándonos en algún criterio de optimización podríamos responder a
esta pregunta, y para ello es necesario utilizar el algoritmo de Baum –
Welch.
Implementación de un HMM
Como paso previo al entrenamiento de modelos, es necesario definir la
topología requerida para cada HMM. Las definiciones de cada modelo se
almacenan en archivos de texto donde se recogen todos los parámetros
de cada uno de ellos. El objetivo es diseñar un único prototipo de HMM
para especificar las características generales de todos los modelos que
más adelante formen parte del sistema.
Deben indicarse los siguientes parámetros:

Tipo de vector de observación.

Número de estados.

Número de flujos de datos (data streams) y su ancho.

Cada estado emisor (de cada flujo) se indica con el número de
componentes mixtas (mixtures component) de la gaussiana y su
correspondiente peso. Los parámetros de cada componente son:

Media y covarianza.

Parámetros opcionales (duración del vector y peso del flujo).
4. Descripción de las herramientas empleadas
53
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov

Juan Carmona Mariscal
Matriz de transición.
El modelo más sencillo será aquel que no tiene ningún parámetro
global, es decir, que no comparte ninguna característica de las
anteriormente nombradas con ningún otro modelo. La complejidad de
los modelos puede ir aumentando según se vayan compartiendo más
características (requiere uso de macros). Una macro es cualquiera de
los grupos de parámetros del modelo almacenado externamente al
mismo. Así, para hacer uso en un modelo de un parámetro definido
mediante una macro, sólo habrá que incluir una línea en la que se
llame a esa macro.
El lenguaje de definición de modelos utiliza el mismo carácter clave
para indicar las macro de los distintos parámetros (~tipo de macro). Sin
embargo, se pueden distinguir dos tipos de macros (según su uso):
–
Macro para un modelo: Los parámetros internos de un modelo
concreto se escriben como unidades separadas (como archivos
diferentes). Se pueden hacer macros de todos los parámetros
indicados en un modelo. Las macros más empleadas son las de
los parámetros correspondientes a cada uno de los estados. De
este modo se puede tener, por ejemplo, la misma varianza en
todos los estados de un modelo.
–
Macros comunes para varios modelos: Idéntico al anterior, pero
habrá varios modelos compartiendo la misma macro. Se lograría,
por ejemplo, que todos los modelos tengan algún estado con un
mismo vector de varianza.
4. Descripción de las herramientas empleadas
54
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
Se ha discutido ampliamente sobre cómo generar un prototipo de HMM,
llegándose a la siguiente conclusión: es más sencillo realizar un modelo
con parámetros aislados, pero querer lograr una elevada tasa de
aciertos en el reconocedor requerirá enlazar estados o modelos. La
opción más útil parece ser partir de un modelo sencillo, donde se
encuentren todos los parámetros que se van a manejar de modo
aislado.
Lenguaje para definición de modelos
HTK usa un lenguaje propio para definir los modelos, así todas las
herramientas funcionarán correctamente con el mismo HMM. Conviene
conocer este lenguaje para poder editar un prototipo acorde con
nuestras necesidades.
El ejemplo siguiente está extraído de uno de nuestros ficheros (models
de hmm1m1) y corresponde a un modelo de cinco estados, tres son de
emisión (los estados de entrada y salida no emiten. Ver figura 3.5). La
primera línea indica el nombre del HMM, ~h “nombre”. Aquí se está
definiendo el modelo (o alófono) llamado “J”. En la siguiente línea hay
que poner la palabra clave <BeginHMM>, que indica el punto a partir
del cual se encuentran los parámetros del modelo. Al final de la
definición habrá otra palabra clave complementaria <EndHMM>.
~o
<STREAMINFO> 1 13
<VECSIZE> 13<NULLD><MFCC_0><DIAGC>
~h "J"
<BEGINHMM>
<NUMSTATES> 5
<STATE> 2
<MEAN> 13
-2.206162e+002 -5.421960e+001 [...]
4. Descripción de las herramientas empleadas
55
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
<VARIANCE> 13
3.833246e+004 3.632157e+004 [...]
<GCONST> 1.631388e+002
<STATE> 3
<MEAN> 13
-2.181095e+002 -5.599409e+001 [...]
<VARIANCE> 13
3.833246e+004 3.685270e+004 [...]
<GCONST> 1.632600e+002
<STATE> 4
<MEAN> 13
-2.145374e+002 -6.134979e+001 [...]
<VARIANCE> 13
3.833246e+004 3.796980e+004 [...]
<GCONST> 1.634138e+002
<TRANSP> 5
0.000000e+000 1.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000
0.000000e+000 6.734391e-001 3.265609e-001 0.000000e+000 0.000000e+000
0.000000e+000 0.000000e+000 6.734399e-001 3.265601e-001 0.000000e+000
0.000000e+000 0.000000e+000 0.000000e+000 6.734408e-001 3.265592e-001
0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000 0.000000e+000
<ENDHMM>
El orden dentro de la jerarquía es de mayor a menor importancia:
–
<BeginHMM>, <EndHMM>
–
Parámetros globales, número de estados, definición de cada
estado y matriz de transición entre estados.
–
Número de flujos de dato y sus pesos.
–
Número de componentes mixtas y sus pesos.
–
Media y varianza de cada uno de las componentes mixtas.
Al principio se especifican los aspectos globales de todos los modelos
que conformen la base, los que suelen indicarse son: Tamaño de los
vectores de parámetros <VecSize> número entero y el algoritmo con el
que se han extraído la información de la forma de onda. El algoritmo se
pone entre llaves, como el resto de palabras clave. En este caso
4. Descripción de las herramientas empleadas
56
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
<MFCC_0>. Para no dar lugar a errores, el nombre del algoritmo será el
indicado durante el proceso de parametrización. En la siguiente línea se
deben indicar el número de estados que componen el modelo, 5 en
nuestro caso. A partir de este punto se encuentra la definición de cada
estado. La información recogida para cada estado depende de cuántos
flujos de datos se utilizan y del número de componentes de mezcla
gaussiana en cada flujo. Existen también casos que mezclan varios
flujos de datos y cada uno de ellos cuenta con diversas componentes de
mezcla. Una vez alcanzada la componente de mezcla gaussiana como
unidad fundamental, los parámetros serán:
–
Vector de valores medios.
–
Vector de varianza, en alguno de los siguientes formatos:

Varianza. El vector es la diagonal de la matriz.

Covarianza. La distribución gaussiana se indica como una
matriz completa. Estas son simétricas, por lo que sólo se
almacena la diagonal superior.
Una vez que se han definido todas las componentes de mezcla de todos
los flujos y para todos los estados, el prototipo de HMM se completa con
la matriz de transición de estados <TransP> tamaño. Esta debe ser una
matriz cuadrada, cuyo tamaño hay que indicar siempre de modo
explícito, y debe corresponder con el número de estados definidos
anteriormente. La suma de todas las componentes de cada fila debe
resultar la unidad, excepto para el último estado, cuya suma debe ser
siempre cero (no se permite ninguna transición que parta del estado
final hacia alguno de los estados anteriores). Finalmente el modelo se
termina con <EndHMM>.
4. Descripción de las herramientas empleadas
57
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
4.1.4 Entrenamiento de los HMM
El entrenamiento de los HMM consiste básicamente en actualizar los
valores de los parámetros mediante diferentes algoritmos y, con ello,
conseguir modelos más ajustados a la realidad o aplicación. Por lo
tanto, debe ser un proceso optimizado. Consta de dos fases:
i)
Inicialización, que se consigue por medio de la herramienta
HInit.
ii)
Aplicación del algoritmo de Baum-Welch.
También está disponible la posibilidad de realizar un entrenamiento
global, lo cual siempre se debería realizar. HTK dispone de la
herramienta HERest para dicha tarea. Veamos pues las herramientas
para el entrenamiento:
HInit aprovecha las facilidades del segmentado de etiquetas para
detectar los diferentes alófonos. Los busca en cada modelo y
posteriormente utiliza el algoritmo de Viterbi para la estimación de las
medias y varianzas. El proceso se repite hasta que el algoritmo ya no
pueda mejorar la semejanza, que es calculada en paralelo. La llamada
para inicializar cada modelo de cada alófono se hace de modo iterativo,
como se muestra en la siguiente figura:
4. Descripción de las herramientas empleadas
58
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
Figura 4.7: Diagrama de bloques de la llamada a HInit [Carrillo 2007]
HInit [opción] datos_parametrizados [opción] directorio_destino [opción] \
archivo_fuente [opción] etiqueta [opción] directorio_fuente_etiquetas
HRest utiliza el algoritmo de Baum - Welch (reestimación de los
parámetros de los modelos aislados). Este modo de entrenamiento debe
realizarse de modo iterativo, para cada alófono del conjunto. Las
opciones de esta herramienta son muy poderosas y su diagrama de
llamada se muestra en la figura:
4. Descripción de las herramientas empleadas
59
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
Figura 4.8: Diagrama de bloques de la llamada a HRest [Carrillo 2007]
HERest realiza un entrenamiento global actualizando simultáneamente
todos los modelos del sistema. Se ignora la información de segmentado
en las etiquetas, pues sólo interesa conocer el mensaje que contiene la
frase. Cada etiqueta usada en este entrenamiento acumula estadísticas
provenientes del algoritmo Forward - Backward. Su diagrama de
llamada es mostrado en la figura:
4. Descripción de las herramientas empleadas
60
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
Figura 4.9: Diagrama de bloques de la llamada a HERest [Carrillo 2007]
El significado de cada archivo en fase de entrenamiento que se anota en
los diagramas anteriores es el siguiente:
Datos_parametrizados: Son los archivos que conforman la base de datos
parametrizada (archivos con extensión mfcc), a entrenar. Generalmente
se indica la manera de cómo acceder a esos datos bajo opción S (script).
Archivos_salida_Estadística: Es el archivo que genera el proceso
HERest, como resultado estadístico del análisis del entrenamiento.
Directorio_fuente_etiquetas: Es la ruta para alcanzar el archivo que
contienen la lista con todas las etiquetas del proceso.
Lista_archivos_modelos_ocultos_de_markov: Es la ruta para ubicar al
archivo con todos los modelos de Markov actualizados.
Lista_nombre_sonidos_a_reconocer: Es la indicación que caracteriza al
archivo de entrada que contiene la lista de todos los HMM del proceso.
En nuestro proyecto emplearemos la tercera de las herramientas,
HERest, para llevar a cabo el entrenamiento. Adicionalmente a ésta,
emplearemos la herramienta HCompV para los casos de experimentos
de normalización cepstral.
HCompV calcula la media y la covarianza de un conjunto de datos de
entrenamiento. Lo emplearemos en la fase de normalización Cepstral ya
que trabajaremos con dos tipos de normalizaciones: normalización
cepstral
de
la
normalización
media
cepstral
(CMN,
de
la
Cepstral
varianza
Mean
(CVN,
Normalisation)
Cepstral
y
Variance
Normalisation).
4. Descripción de las herramientas empleadas
61
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
 CMN, Normalización cepstral de la media
En el dominio de la frecuencia, el efecto de insertar un canal de
transmisión es multiplicar el espectro de la voz por la función
de transferencia del canal. En el dominio logarítmico de los
coeficientes cepstrales esta multiplicación se convierte en una
sencilla suma, que puede ser aproximadamente compensada
restando la media cepstral a todos los vectores de parámetros.
En la práctica, la media se estima a partir de una cantidad
limitada de datos, de forma que la cancelación del efecto del
canal de transmisión no es perfecta. La media se estima
calculando el promedio de cada parámetro cepstral a lo largo
del fichero o agrupación de ficheros en cuestión. Es importante
destacar que CMN se aplica a los coeficientes estáticos, luego
se calculan los coeficientes delta y aceleración, y por último se
realiza CVN sobre los tres tipos de coeficientes.
Respecto a la aplicación de CMN, el resultado de la estimación
de las medias cepstrales de los coeficientes estáticos se guarda
en un fichero. De modo que las herramientas de HTK que
necesiten trabajar con CMN tendrán que restar a cada fichero
de parámetros su correspondiente fichero de medias durante la
ejecución.
 CVN, Normalización cepstral de la varianza
4. Descripción de las herramientas empleadas
62
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
De un modo paralelo, también podemos normalizar la varianza
de los parámetros cepstrales. Con esto logramos que los
márgenes de variación de los parámetros en todos los ficheros
de la base de datos sean similares, hecho que favorecerá el
entrenamiento de los HMM. CVN se realiza normalizando a 1 la
varianza del fichero en cuestión dividiendo todos sus vectores
de parámetros por su varianza cepstral, y multiplicando
posteriormente por la varianza global.
Onorm  Oorig
2
 global
 2fich
La estimación de la varianza cepstral se obtiene calculando la
varianza de cada parámetro cepstral a lo largo de ese fichero o
agrupación de ficheros. Y por varianza global nos referimos a
la varianza de los parámetros cepstrales calculada a lo largo de
toda la base de datos. Al igual que CMN, CVN también se
realiza en tiempo de ejecución.
4.1.5 Red gramatical y Diccionario
Red gramatical es la secuencia de palabras que pueden reconocerse,
mientras que el término Diccionario describe los diferentes alófonos
que componen cada una de las palabras (red).
Pueden crearse distintos tipos de redes, dependiendo del modelo de
lenguaje utilizado. Si el problema consiste en reconocer señales de voz
4. Descripción de las herramientas empleadas
63
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
con nombre y apellido, entonces un ejemplo de red gramatical será la
mostrada en la figura 3.9. La sintaxis divide la red en tres partes:
cabecera, nodos
y enlaces. Los enlaces pueden ser: unigrama
(probabilidad de una palabra) o bigrama (transiciones posibles entre
unas palabras hacia otras).
Figura 4.10: Estructura de una red gramatical [Carrillo 2007]
Los valores de probabilidad de los enlaces dependen del modelo de
lenguaje usado. Se definen tres tipos:
i)
Wordloop: Todos los enlaces son equiprobables.
ii)
Bigrama: Cada enlace tendrá una probabilidad que se ajusta
al número de ocurrencias de esa transición en el texto de
entrada.
iii)
Modelo propio: No asignan probabilidades, indica cuáles son
los enlaces permitidos. Esta estructura resulta ideal cuando se
usan diccionarios con muy pocas palabras.
4. Descripción de las herramientas empleadas
64
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
4.1.6 Reconocimiento y evaluación de resultados
Una vez configurada la red gramatical debemos ingresar a la etapa de
reconocimiento y evaluación de resultados. Esta opción sólo requiere de
archivos parametrizados y de un repertorio de alocuciones (base de
datos para el reconocimiento). Los resultados los da a conocer un
archivo de salida, siendo fundamental el porcentaje de reconocimiento.
Archivos MLF: En el proceso de reconocimiento se generan etiquetas de
los distintos archivos que se han utilizado. Cuantos más archivos se
reconozcan, más fiable podrá ser la estadística de aciertos que se
calcule. La manera natural de almacenar las etiquetas es utilizando un
archivo de etiquetas maestro (Master Label File: MLF). Éste cumple una
función idéntica a las macros de los HMM, va almacenando dentro de
un único archivo todas las etiquetas (de ahí su nombre).
HVite: Es la herramienta que maneja el algoritmo de Viterbi. Debe
proporcionar el camino de mayor probabilidad para la secuencia óptima
de estados. Cuanto más grande sea la red, más procesamiento requerirá
el algoritmo y, por lo tanto, más lento resultará el reconocimiento. Su
llamada la indica el siguiente diagrama de bloques:
4. Descripción de las herramientas empleadas
65
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
Figura 4.11: Diagrama de bloques de la llamada a HVite [Carrillo 2007]
HResults: Es la herramienta de HTK que entrega los resultados del
proceso de evaluación. Compara las etiquetas de entrada y las de
salida, dando lugar a una matriz de confusión de los distintos HMM
(calidad del proceso). La salida de este comando se realiza por pantalla
y para guardar los resultados habrá que usar un redireccionamiento
adecuado hacia un archivo de texto.
Figura 4.12: Diagrama de bloques de la llamada a HResults [Carrillo
2007]
4. Descripción de las herramientas empleadas
66
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
4.2 EL LENGUAJE DE SCRIPTS
Gran parte del desarrollo de nuestro segmentador automático lo
realizaremos mediante el uso de archivos de procesos por lotes o
scripts, cuya extensión es .bat, y que nos permiten codificar grandes
cadenas de instrucciones y agruparlas según el uso que se le da en el
programa global, la etapa del proceso de segmentación de que se trate,
etc. Por ello es interesante hacer una breve introducción al lenguaje de
scripts y a alguna de las instrucciones del mismo que empleamos en
nuestro proyecto.
La shell que emplearemos es la de Windows, que se basa en la del
antiguo sistema operativo MS-DOS. Un proceso por lotes es un archivo
de texto formado por varios comandos de la shell de Windows. Esta
secuencia de comandos se ejecuta de uno en uno, línea a línea, en el
mismo orden en que aparecen en el programa, como si se tecleara cada
uno delante del símbolo del sistema.
En algunas ocasiones, como en las ejecuciones de experimentos con el
segmentador que nos ocupa, el usuario escribe repetidamente la misma
secuencia de comandos para realizar algunas tareas comunes. Para
evitar eso podemos colocar esta secuencia de comandos en un archivo
de procesamiento por lotes y ejecutar automáticamente toda esa
secuencia de comandos. Para que puedan ser reconocidos por el
sistema
Windows
como
archivos
especiales,
los
archivos
de
procesamiento por lotes, también conocidos como ficheros BAT o
scripts, deben llevar la extensión .BAT.
4. Descripción de las herramientas empleadas
67
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
4.2.1 Gestión de argumentos en los procesos por lotes
Los argumentos son informaciones adicionales colocadas detrás del
nombre de una orden. Si la mayoría de las órdenes del sistema admiten
argumentos
o
modificadores,
también
será
posible
gestionar
argumentos en los ficheros por lotes.
Un ejemplo del uso de argumentos en los scripts del segmentador se
observa en las dos primeras líneas de nuestro fichero experim.bat:
echo on
set FICH_LOG=log_%1_%5_%6_states%2_iter%3_gauss%4.log
Si ejecutamos este proceso por lotes o script, de la siguiente manera:
C:\> experim.bat mfcc 4 6 30 _cmn D_A_Z_0 39
tendríamos que esa línea se transformaría en:
set FICH_LOG =log_mfcc_cmn_D_A_Z_0_iter6_states4_gauss30.log
En la línea de comandos, cada parámetro debe estar separado con un
espacio en blanco. De la forma anteriormente explicada podemos
gestionar hasta nueve parámetros (del %1 al %9).
4.2.2 Comandos específicos para procesos por lotes
Aparte de los comandos usuales de la shell de Windows, en los procesos
por lotes podemos usar algunos comandos especiales, que nos permiten
programar estructuras complejas usando procesos. La referencia
completa de todos los comandos puede encontrarse en [Microsoft 2012].
4. Descripción de las herramientas empleadas
68
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
Nosotros nos fijaremos especialmente en los comandos que empleamos
en nuestros scripts, describiendo la función que realizan, el formato con
el que se les debe llamar, y veremos un ejemplo de cada comando
sacado de nuestros scripts. De este modo, los comandos que
emplearemos son:
COMANDO CALL (llamar)

Función: Llama a un archivo de procesamiento por lotes desde
otro igual, sin salir del archivo que hizo la llamada. Es decir,
invoca la ejecución de otros archivos como una subrutina o una
función.

Formato: CALL nombre_del_script

Una vez terminada la ejecución del proceso por lotes llamado con
CALL, se reanuda la ejecución del archivo que hizo la llamada. Un
archivo de proceso por lotes, puede hacer una llamada repetitiva
a sí mismo (recursividad), siempre y cuando exista una condición
de finalización.

Ejemplo: Al estar nuestro segmentador programado de manera
modular, la gran mayoría de nuestros scripts llaman a otros, de
manera que la concatenación de los mismos da lugar al proceso
completo. Por ejemplo, en nuestro script full.bat encontramos
call limpia.bat
call experim.bat plp 5 5 5 _ 0_D_A 39
4. Descripción de las herramientas empleadas
69
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
que llama a los scripts limpia.bat y experim.bat, para que se
ejecuten, acompañados en su caso de sus correspondientes
argumentos.
COMANDO ECHO (eco)

Función: Este comando activa y desactiva la salida de comandos
por pantalla, o escribe un mensaje por pantalla.

Formato: ECHO [ON] [OFF] [MENSAJE]
Echo ON: Nos permite ver en pantalla los comandos de DOS que
están siendo ejecutados desde un archivo de proceso por lotes.
Echo OFF: Desactiva la visualización en pantalla de los comandos.
El valor por defecto es ECHO ON.
Echo mensaje: Este comando nos permite imprimir mensajes en
la pantalla.
Si escribimos simplemente ECHO, se nos presentará en pantalla
el estado actual de ECHO.
Podemos insertar el símbolo @ (arroba), antes de una línea de
comandos en un archivo de proceso por lotes, para que no se
haga ECO de dicha línea.
Si queremos dejar en pantalla una línea en blanco, se usa ECHO.
(ECHO y un punto sin dejar espacios en blanco entre la O y el
punto).

Ejemplo:
en
nuestro
script
segm_monophones.bat
la
línea
siguiente escribe un mensaje por pantalla, que nos ayuda a saber
por qué parte del proceso se encuentra en este momento la
ejecución del segmentador:
4. Descripción de las herramientas empleadas
70
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
echo "Segmentation with one mixture HMM"
COMANDO GOTO (transferencia de control)

Función: Transfiere el control del proceso a una línea con
etiqueta, dentro del script.

Formato: GOTO [:] etiqueta
Etiqueta puede ser cualquier palabra que deseemos y se
reconocen porque empiezan por “:”.

Ejemplo: en varias partes de nuestro programa se presenta la
instrucción:
goto :FINAL
Al encontrarse nuestro programa un comando GOTO, se buscará
la etiqueta :FINAL en el script; si se encuentra, nuestro programa
saltará a dicha etiqueta y continuará en la línea que sigue a la
misma.
COMANDO PAUSE (pausa)

Función: Suspende la ejecución de un archivo de procesamiento
por lotes.

Formato: PAUSE (comentario)

Cuando se está ejecutando un archivo de procesamiento por
lotes, puede ser necesario cambiar el disco o realizar alguna otra
operación, por lo cual debemos pausar el proceso hasta que el
4. Descripción de las herramientas empleadas
71
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
usuario pulse una tecla. El comando PAUSE suspende este
proceso temporalmente, hasta que se presione cualquier tecla; al
ejecutarse emite el siguiente mensaje: Pulse cualquier tecla
cuando esté listo(a)...
Pause comentario: Es útil cuando desea poner en pantalla un
mensaje especial. A menos que el ECHO esté desactivado, PAUSE
muestra ese comentario antes de pulsar tecla.

Ejemplo: en la implementación de nuestros scripts hemos
empleado en múltiples ocasiones el comando pause como forma
de establecer un punto de corte en el proceso, de modo que se
pueda revisar éste antes de pasar a la siguiente etapa.
COMANDO REM (recordatorio, comentario)

Función: Nos permite poner comentarios en el programa.

Formato: REM comentario

Ejemplo:
en
nuestro
script
segm_monophones.bat
la
línea
siguiente muestra un comentario, que nos servirá de control:
rem 1. SEGMENTATION with one mixture HMM
COMANDO IF (si)

Función: Desvía condicionalmente el proceso de ejecución de un
fichero por lotes.

Formato:
4. Descripción de las herramientas empleadas
72
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
IF [NOT] ERRORLEVEL número comando
IF [NOT] cadena1==cadena2 comando
IF [NOT] EXIST archivo comando
NOT especifica que Windows debe ejecutar el comando sólo si la
condición es falsa.
ERRORLEVEL número especifica una condición verdadera si el
último programa que se ejecutó devolvió un código de salida igual
o mayor que el número especificado.
cadena1==cadena2 especifica una condición verdadera si las
cadenas de texto especificadas coinciden.
EXIST archivo especifica una condición verdadera si el archivo
especificado existe.
comando especifica el comando que se ejecutará si se cumple la
condición. Comando puede ir seguido de la palabra clave ELSE y,
a continuación, un comando que se ejecutará si la condición
especificada es FALSA. La cláusula ELSE debe aparecer en la
misma línea que la del comando que sigue al IF.
También podemos realizar distintos tipos de comparaciones
usando el siguiente formato:
IF [/I] cadena1 comparación cadena2 comando
donde comparación puede ser:
EQU – igual (equal)
NEQ - no igual
LSS - menor que
LEQ - menor que o igual
GTR - mayor que
GEQ - mayor que o igual
4. Descripción de las herramientas empleadas
73
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
Y el modificador /I, si se especifica, realiza comparaciones de
cadena que no distinguen entre mayúsculas y minúsculas. El
modificador
/I
también
puede
usarse
en
la
forma
cadena1==cadena2 de IF.

Ejemplo:
en
nuestro
script
train_monophones.bat
la
línea
siguiente introduce una condición con if, de modo que las líneas
que se encuentran entre paréntesis sólo se ejecutarán si se
cumple dicha condición (en este caso, que se haya especificado
que se realice la normalización cepstral):
if %TIPO%==%TIPO_BASE%_cmn_cvn (
"%HTK_DIR%\HCompV.exe" -A -D -C %CONFIG_FILE_CMN% -c ..\cmn -q
m -k "*%%%%%%%%%%%%%%%%%%%%%%%%."%TIPO_BASE% -S
%LIST_FILE_TRAIN% > ..\cmn\HCompv.cmn.log
)
Comando FOR

Formato: FOR %%variable IN (conjunto) DO orden

Función: Este comando repite la orden especificada para cada
valor del conjunto. Conjunto es una lista de datos. En ella, se
pueden establecer varios nombres separados por espacios y
también
utilizar
comodines
para
representar
ficheros
o
directorios.

Ejemplo:
en
nuestro
script
segm_monophones.bat
la
línea
siguiente introduce una iteración con for:
for /L %%i in (1,1,%NUM_GAUSSIANS%) do call segm_gauss.bat %%i
4. Descripción de las herramientas empleadas
74
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
Como se ve en el ejemplo, las variables del FOR no tienen un solo
% como los argumentos, ni están encerradas entre % como las
variables del sistema, sino que comienzan por %%.
4.3 EL LENGUAJE PERL
A lo largo de los distintos scripts fundamentales del segmentador
recurrimos en varias ocasiones al lenguaje de programación perl, para
realizar tareas de simplificación o automatización. Por ello, dedicaremos
ahora un apartado a realizar una breve descripción del mismo.
Perl (Practical Extraction and Report Language) es un lenguaje de
propósito general originalmente desarrollado para la manipulación de
texto y que ahora es utilizado para un amplio rango de tareas
incluyendo administración de sistemas, desarrollo web, programación
en red, desarrollo de GUI y más.
Se previó que fuera práctico (facilidad de uso, eficiente, completo) en
lugar
de
“bonito”
(pequeño,
elegante,
mínimo).
Sus
principales
características son que es fácil de usar, soporta tanto la programación
estructurada
como
la
programación
orientada
a
objetos
y
la
programación funcional, tiene incorporado un poderoso sistema de
procesamiento de texto y una enorme colección de módulos disponibles
[Pérez 2008].
4. Descripción de las herramientas empleadas
75
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
4.3.1 Estructura del lenguaje
Perl se considera un lenguaje interpretado, es decir, no es necesaria
una previa compilación para poder ejecutarse, lo único que se necesita
es pasarle al intérprete, perl, el código que queremos que ejecute.
Puede encontrarse amplia información sobre el lenguaje Perl en
[Perldoc 2012] y [Lizama 2012]. Nosotros nos detendremos en realizar
una breve explicación tan sólo de los elementos que componen las
instrucciones que se han empleado en la implementación de los
programas en perl que se utilizan en este proyecto:
Tipos de datos
Perl tiene tres tipos de datos: escalares, listas y hashes.

Un escalar es un sólo valor; puede ser un número, un string
(cadena de caracteres) o una referencia

Una lista es una colección ordenada de escalares (una variable
que almacena una lista se llama array)

Un hash, o memoria asociativa, es un mapeo de strings a
escalares; los strings se llaman claves y los escalares valores.
Todas las variables están precedidas por un símbolo, que identifica el
tipo de dato que es accedido (no el tipo de dato de la misma variable).
Se puede usar el mismo nombre para variables de diferentes tipos, sin
que tengan conflictos.
$var # un escalar
@var # un array
4. Descripción de las herramientas empleadas
76
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
%var # un hash
Estructuras de control
Perl tiene estructuras de control orientadas a bloque, similares a las
que tienen los lenguajes de programación C y Java. Las condiciones
están rodeadas por paréntesis y los bloques subordinados mediante
llaves:
while (condición) {...}
while (condición) {...} continue {...}
for (expresión_inicial; expresión_condicional; expresión_incremental) {...}
if (condición) {...}
if (condición) {...} else {...}
if (condición) {...} elsif (condición) {...} else {...}
Nuestros
programas
en
Perl
hacen
uso
continuamente
de
las
estructuras de control, dado que son una buena manera de realizar
labores
repetitivas
de
manera
automatizada.
Por
ejemplo,
en
GenProto.per tenemos este código:
if ($NumStates==1)
{
printf stdout "1.000e+0\n";
}
else
{
for ($i=0; $i<$NumStates; $i++)
{
que utiliza las estructuras de control if, else y for para ir creando la
matriz de transición de estados, según se explica en el apartado
dedicado a este programa (5.4.1).
4. Descripción de las herramientas empleadas
77
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
Expresiones regulares
El lenguaje Perl incluye una sintaxis especializada para escribir
expresiones regulares y el intérprete contiene un motor para emparejar
strings con expresiones regulares.
Existen tres operadores básicos en perl: el operador de cotejo (m//), el
de sustitución (s///) y el de traducción (tr///). El único empleado en el
desarrollo de este proyecto es el de sustitución.
El operador de sustitución (s///) es utilizado para sustituir alguna
cadena o expresión por otra. Su sintaxis es sencilla, basta con indicar
entre los dos primeros delimitadores (las barras) la cadena que
queremos que sea sustituida, y entre el segundo y el tercer delimitador
la cadena por la cual queremos sustituirla. Por ejemplo, el siguiente
comando convertiría la letra b en mayúscula:
$x =~ s/abc/aBc/;
En nuestro código encontramos un ejemplo del operador de sustitución
en el programa blancos2retornos.per:
s/[\s\t]+/\n/g;
que reemplaza lo que encuentra entre las dos primeras barras, [\s\t]+,
es decir, espacios y tabuladores, por lo que encuentra entre las últimas,
\n, esto es, retornos de carro. Estos indicadores con barra invertida son
llamados metasecuencias, que serán explicados a continuación. Antes
de ello sólo hay que indicar que el indicador g que se encuentra al final
de la línea es una opción, que sirve para indicarle a perl que repita la
sustitución en todas las ocurrencias de la cadena. Si no lo indicáramos
4. Descripción de las herramientas empleadas
78
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
sustituiría el primer espacio que encontrara por un retorno de carro y
dejaría de realizar sustituciones en el resto del fichero.
Metasecuencias
En Perl se emplean metasecuencias, principalmente en las expresiones
regulares, para especificar condiciones de las cadenas de caracteres que
queremos modificar o tratar. Algunas de estas metasecuencias son:
 \d: Cualquier dígito del 0 al 9.
 \D: La mayúscula indica lo contrario de la minúscula; en este
caso, simboliza cualquier no-dígito.
 \s: Cualquier espacio en blanco.
 \S: Cualquier no-espacio.
 \t: Cualquier tabulador.
 \n: Cualquier retorno de carro.
 \w: Cualquier secuencia de caracteres de palabra, es decir, todos
los caracteres alfanuméricos y el guión.
 \W: Todos los caracteres no alfanuméricos.
 +: Indica que el elemento o patrón que lo precede puede aparecer
una o más veces.
Un ejemplo de expresión regular que utilice estas metasecuencias
puede ser el siguiente:
if (m/\*(\s+)(\d+)(\s+)(\d+)(\s+)([a-zA-Záéíóú])/)
En este caso, la condición se cumplirá si se encuentra un * seguido de
uno o más espacios, seguido de uno o más números, a los que siguen
4. Descripción de las herramientas empleadas
79
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
uno o más espacios seguidos de uno o más números y que termina con
uno o más espacios seguidos de un conjunto de letras.
Para finalizar veremos un ejemplo con todo lo que hemos explicado en
este
apartado
(estructuras
de
control,
expresiones
regulares
y
metasecuencias). Está sacado de nuestro segmentador, lo encontramos
en el script setBD.bat, en el que se adaptan los ficheros de
configuración para que cambien la variable TARGETKIND por el tipo de
algoritmo y los coeficientes con los que se quiere llevar a cabo la
parametrización de los ficheros de voz. La instrucción es la siguiente:
while ($_=<stdin>) {
$v=uc\"%1_%6\";
s/TARGETKIND[\s\t]+=[\s\t]+[a-zA-z_0-9]+/TARGETKIND = $v/i;
print;
}
Como se observa con la estructura de control while se van recorriendo
todas las líneas del fichero de configuración y se ejecutan las sentencias
que van entre llaves hasta que no queda ninguna línea más en el
fichero. A continuación se guarda en la variable $v el contenido de los
argumentos 1 y 6 (tipo de algoritmo de parametrización y coeficientes
extras, como se verá en el capítulo siguiente). A continuación
encontramos una expresión regular que hace uso de metasecuencias; se
trata del operador de sustitución s///, que indica que se debe cambiar
TARGETKIND[\s\t]+=[\s\t]+[a-zA-z_0-9]+
por
TARGETKIND = $v
es decir, cuando encuentre una línea que contenga TARGETKIND
seguido de uno o más espacios/tabuladores, un signo =, uno o más
4. Descripción de las herramientas empleadas
80
Desarrollo de un segmentador fonético
automático para habla expresiva
basado en modelos ocultos de Markov
Juan Carmona Mariscal
espacios/tabuladores, y una sucesión de letras, dígitos y guiones bajos,
sustituirá toda esa cadena por TARGETKIND = seguido del contenido de
la variable v que fue almacenado antes. La sentencia termina con la
opción i, que indica a perl que ignore el uso de mayúsculas y
minúsculas. Por último se imprime el contenido de la línea que se
estaba leyendo, con su correspondiente sustitución dado el caso.
Este ejemplo que contiene estructuras de control, expresiones regulares
y metasecuencias es muy representativo del tipo de labores que
realizaremos en perl para determinadas tareas de nuestro segmentador.
En el capítulo siguiente se explicarán los scripts del sistema, y se
dedicará un apartado especial a los programas desarrollados en perl.
4. Descripción de las herramientas empleadas
81
Descargar