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