Capítulo 7: La segmentación automática de unidades.
Transcripción
Capítulo 7: La segmentación automática de unidades.
Capítulo 7 La segmentación automática de unidades Capítulo 7: La segmentación automática de unidades. 7.1. Introducción. En este capítulo se describen una serie de experimentos, que fueron llevados a cabo de cara a realizar la segmentación de las frases componentes de la base de datos de una manera automática. Estos experimentos se realizaron en colaboración con D. Juan Manuel Montero y con D. Luis García Pérez (profesor y proyectando del Grupo de Tecnología del Habla, respectivamente). El objetivo de dichos experimentos, era el de evaluar la posibilidad de realizar la segmentación de las frases componentes de la base de datos de una manera automática (como ya se citó en el Capítulo 3, la segmentación consiste en delimitar mediante etiquetas la posición de los fonemas dentro de las frases), restándose de este modo una gran cantidad de trabajo para la elaboración de bases de datos compuestas por un gran número de unidades. En efecto, debemos recordar que dicho proceso de segmentación es realizado manualmente por el usuario (empleando la herramiente de edición PCV, elaborada por el GTH), para lo cual éste debe escuchar una a una las frases, y colocar las etiquetas que aislan cada uno de los fonemas dentro de las mismas. Claramente, este procesado manual requiere una gran cantidad de tiempo y además, en algunos casos, lleva asociado también errores. Estos errores pueden venir derivados del cansancio que este trabajo implica, o en otros casos, de que al ser realizada la segmentación por varias personas con el objetivo de reducir el volúmen de trabajo, se producen errores de criterio en la segmentación (distinto criterio a la hora de segmentar algunos fonemas) que llevan a una falta de uniformidad en la base de datos. Algunos de dichos "errores" podrían ser corregidos mediante el etiquetado automático, ya que por un lado no sería necesaria la edición manual para generar el etiquetado (los desarrolladores se podrían centrar en otros aspectos), y por otro lado, al ser realizado todo el marcado por un mismo programa, el criterio de segmentación de unidades siempre será el mismo. Lógicamente, hay que pensar que se producirán 108 Capítulo 7 La segmentación automática de unidades también errores de marcado, que seguramente serán mayores que en el caso de la segmentación manual, hecho que puede quedar compensado por la considerable reducción en el tiempo de procesado. 7.2. Descripción de los experimentos. Para la realización de estos experimentos se empleó el sistema de reconocimiento de voz de habla aislada desarrollado en el Grupo de Tecnología del Habla, pudiéndose encontrar una descripción teórica del mismo en el Apéndice A de este mismo trabajo. Hay que destacar el hecho de que se trata de un reconocedor de palabras aisladas, aspecto que se ajusta bastante bien a nuestros objetivos (ya que pretendemos "reconocer" una palabra dentro de una determinada frase-patrón). Los parámetros fundamentales que emplea este reconocedor son los siguientes: - frecuencia de muestreo: 8 Khz . - desplazamiento de trama: 80 muestras (10 ms). - tamaño de trama: 200 muestras (25 ms). - coeficiente de pre-énfasis: 1.00. - parámetros empleados: 11 parámetros estáticos y 11 diferenciales. - tipos de parámetros: 10 MFCC + energía (extraídos de 17 bandas de energía). El alfabeto empleado por el reconocedor estaba compuesto por 28 alófonos y 1 silencio (no aparecen representados los silencios de las oclusivas): 0 ch 1a 2 'a 3e 4 'e 5i 6 'i 7o 8 'o 9u 10 'u 11 b 12 z 13 d 14 f 15 g 16 x 17 k 18 l 19 m 20 n 21 ny 22 p 23 rr 24 r 25 s 26 t 27 y 28 & 109 Capítulo 7 La segmentación automática de unidades Se emplearon modelos semi-contínuos independientes del contexto, con modelos de fonema de 3 estados. Para el modelado de los silencios inicial y final también se emplearon 3 estados. Para el entrenamiento del reconocedor se emplearon las frases utilizadas en la base de datos de Natvox siguientes (voz femenina aplicada a dominio restringido): - frases 1, 2, 3, 4, 5, 6, 7, 17 y 19 En total se dispuso de un conjunto de 16.062 alófonos de cara al entrenamiento del sistema. Hay que tener en cuenta, que por trabajar el reconocedor con una frecuencia de muestreo de 8 Khz fue necesario convertir la frecuencia de muestreo de nuestras frases de 32Khz a 8 Khz, para lo que se empleó el programa comercial de edición de sonido Cool Edit. Previamente a la realización del entrenamiento, fue necesario generar el diccionario y la lista que iban a ser empleados, tanto en el entrenamiento del sistema, como en la fase de segmentación. Para ello se emplearon una serie de programas que se encargaban de crear dichos ficheros. La creación comenzaba haciendo una llamada al fichero PROCESA.BAT: for %frase in (@frases.dir) gosub :PROCESA for %i in (*.dic) type %i >>lista.unf edit lista.unf quit :PROCESA for %i in (%DIR_PAR\%frase\originales\*.par) gosub :PROCESA1 return :PROCESA1 for %j in (@DIR_TXT\%frase\originales\%@NAME[%i].txt gosub :PROCESA2 return :PROCESA2 echo %j | perl sinespac.per > sinespac.dep for %k in (@sinespac.dep) gosub :PROCESA3 :PROCESA3 perl gendic.per @%NAME[%i].lbl %k <%i >%@NAME[%i].dic return 110 Capítulo 7 La segmentación automática de unidades El programa iba recorriendo la lista contenida en frases.dir, en la cual se encontraban las frases a ser procesadas (p.e. frase1, frase 2 ...) y para cada una de ellas se iban tomando todos los ficheros de parámetros asociado a cada fichero concreto de la frase (p.e. bv01001.par) y los ficheros de texto asociados a los mismos (p.e. bv01001.txt), eliminándose los espacios de dicho fichero. Estos datos se le pasaban al programa gendic.per que era el encargado de generar los diccionarios. En el programa gendic.per en primer lugar se hacía una conversión de los datos contenidos en el fichero *.PAR (relativos a la etiqueta LBO, dado que la posición de las marcas que aparecía en dichos ficheros era relativa a las frases muestreadas a 32 Khz: while ($_=<stdin>) { if (/LBO/) { s/\,//g; @campos=split(/ /,$_,9999); $etiquetas[$cont]=$campos[4]; if ($cont==0) { $etiqueta_inicial=$campos[1]/4; } $cont ++; $etiqueta_final=$campos[3]/4; } } Como se puede ver, el proceso que se llevaba a cabo era el de ir buscando las líneas del fichero *.par que comenzasen por el patrón "LBO" cuyo formato genérico era el siguiente: LBO: pos_inic, pos_int, pos_fin, fonema Se separaban los distintos campos de la línea (mediante la función split) y se dividía la información contenida en las etiquetas correspondientes a la posición inicial y final (en número de muestras) por 4 (para pasar de 32 Khz a 8 Khz).. 111 Capítulo 7 La segmentación automática de unidades A continuación se tomaban las etiquetas y se hacía la conversión de algunos fonemas (para adaptarse a nuestro alfabeto) y por último se hacía la codificación de los fonemas componentes (pasar del fonema a su número correspondiente según la tabla expuesta anteriormente). El resultado de todo este proceso era un diccionario (fichero con extensión *.DIC), presentando estos ficheros un aspecto de la forma: BV201.lbl 456 357 AkSesta 7 a k s 'e s t a 1 17 25 4 25 26 1 BV202.lbl 357 419 Acebo 5 a z 'e b o 1 12 4 11 7 BV203.lbl 357 443 Alentisque 9 a l e n t 'i s k e 1 18 3 20 26 6 25 17 3 BV204.lbl 374 464 AltoCampó 9 'a l t 'o k a m p 'o 2 18 26 7 17 1 19 22 8 ....... Por último, se generaba una lista (lista.unf) que contenía el nombre de los diccionarios que habían sido generados).Una vez que se dispuso del diccionario, ya se pudo proceder al entrenamiento del sistema. Hay que destacar que se generaron dos codebooks (1 para los parámetros MFCC y otro para su derivada, DMFCC) utilizándose un total de 256 centroides. Durante la fase de test, el sistema de reconocimiento recibía como entrada, además del fichero de muestras de la frase a segmentar (con la extensión *.PCM), un fichero con la extensión *.LBL asociado a la misma frase. En este fichero, se daba información al reconocedor sobre la posición dentro de la frase en la cual se encontraba el fragmento que debía "reconocer" (hay que recordar que se trataba de frases portadoras que contenían un determinado campo variable, que era lo que nos interesaba segmentar). El formato típico de estos ficheros era el siguiente (es el mismo que el de las líneas del fichero *.PAR): LBO: 51832, 54796, 57761, ablanedo 112 Capítulo 7 La segmentación automática de unidades Como se puede apreciar, en el fichero aparecen tres números. El primero de ellos informa sobre la posición (en número de muestras) del comienzo de la cadena a segmentar (reconocer), el segundo sobre la posición central (este dato no se emplea) y el último de ellos proporciona la posición del final de la cadena (también en número de muestras). Por último, también se pasa como argumento de entrada el valor de la cadena a reconocer. La salida que daba el reconocedor era un fichero de parámetros (con extensión *.PAR) con el formato adecuado para el programa PCV (en realidad sólo generaba la información sobre la posición de las etiquetas asociadas a los fonemas reconocidos). Un ejemplo de fichero *.PAR generado automáticamente sería el siguiente: LBO: 52080, 52080, 52720, a LBO: 52720, 52720, 53200, b LBO: 53200, 53200, 54000, l LBO: 54000, 54000, 54720, a LBO: 54720, 54720, 55360, n LBO: 55360, 55360, 56240, 'e LBO: 56240, 56240, 56800, d LBO: 56800, 56800, 57760, o 7.3. Resultados del experimento. Hay que destacar que para la realización del test se emplearon todos los datos de que disponíamos, esto es, el mismo conjunto de 16062 alófonos que fue utilizado en el entrenamiento del sistema. En primer lugar citamos la tasa de reconocimiento obtenida por el sistema, cifra que solamente tiene sentido con el objeto de evaluar si el funcionamiento del mismo es correcto (ya que se han empleado los mismos datos en el reconocimiento que en el entrenamiento). Los resultados obtenidos del reconocimiento fueron los siguientes: 113 Capítulo 7 La segmentación automática de unidades Número de ficheros a reconocer: 1364. Aciertos primer candidato: 1321 sobre 1364 (0.9685 %) Aciertos segundo candidato: 1361 sobre 1364 (0.9978 %) Aciertos tercer candidato: 1363 sobre 1364 (0.9993 %) Aciertos cuarto candidato: 1364 sobre 1364 (100 %) Investigando los fallos que había tenido el reconocedor, se pudo observar que una gran parte de los mismos era debida a la existencia de distintas pronunciaciones para un mismo fonema (p.e. d/z) no constituyendo por lo tanto errores en el reconocimiento. Al final de este análisis se llegó a las siguientes cifras: Aciertos primer candidato: 1358 sobre 1364 (99.5601 %) Aciertos segundo candidato: 1361 sobre 1364 (99.7801 %) Aciertos tercer candidato: 1361 sobre 1364 (99.7801 %) Aciertos cuarto candidato: 1364 sobre 1364 (100.00 %) En cuanto a los resultados de la segmentación automática, que era lo que realmente queríamos evaluar, se consideraron como erróneas aquellas etiquetas en las cuales la posición de la marca difería en más de 20 milisegundos con respecto de la existente en el *.par que había sido marcado manualmente (hay que tener en cuenta, que la resolución de nuestro sistema va a venir marcada por el desplazamiento de trama que empleemos, no pudiendo nunca ser mayor que dicho desplazamiento, que en nuestro caso es de 10 milisegundos). Con este umbral de 20 milisegundos se obtuvieron los siguientes resultados: Tasa de aciertos: 28.631 sobre 32126 marcas (89.1210 %) Error medio cometido por marca: 8.9953 % 114