Universidad politécnica de madrid escuela técnica superior de ingenieros



Descargar 3.96 Mb.
Página31/44
Fecha de conversión18.08.2020
Tamaño3.96 Mb.
1   ...   27   28   29   30   31   32   33   34   ...   44
6.3.1.2.- Adaptación de los diccionarios
El primer paso que debemos llevar a cabo es adaptar los diccionarios que tenemos en formato GTH al formato que deben tener los diccionarios en HTK. El motivo principal es que hay fonemas cuya trascripción no tiene un formato admitido por HTK y es necesario cambiarlo, como por ejemplo:
‘e  Xe

R*  R~
Este proceso de cambio se lleva a cabo con el programa “awk_dic2” que es:




#imprime cada palabra, campo 4 de las líneas impares

{printf "%s\t\t", $4}


#si la palabra es corta, imprime un tabulador

{if (length($4)<8) printf "\t"}


#lee la siguiente línea (par), la que contiene la transcripción

{getline}


# lee el número de alófonos de la palabra

{MAX = ($1)+0}

{n=2}
#busca una ' en la linea leida, y guarda la posicion en la variable i
{i= index ($1, "'")}
#si hay comilla, sustituye el campo $1 por lo que hay detrás de la comilla

{if (i!=0) $1= substr($1,i,length($1)+1)}

{if (i!=0) n=1}

{if (i!=0) MAX--}


#recorre los campos, si el primer carácter del campo es ', antepone un barra
{

#si no se pone el n=n da error de sintaxis

for (n=n; n<(MAX+1); n++)

if (substr($n,1,1)=="\'")

printf "\\%s\t", $n;
#si el primer campo es R*, sustituye por R~

else if ($n=="R*")

printf ("R~ ");
#si no, imprime tal cual, pero con tabulador

else


printf "%s\t", $n

}

{if (substr($(MAX+1),1,1)=="'") printf "\\%s \tsp\n", $(MAX+1);



else if ($(MAX+1)=="R*") printf ("R~\tsp\n");

else printf "%s\tsp\n", $(MAX+1)}



Cuadro 34: Programa awk_dic2
El diccionario que obtenemos puede ser utilizado para entrenamiento. Para pruebas debemos añadir los modelos de silencio al final del fichero:
[ ] sil

[ ] sil

proceso que automatizamos creando un nuevo fichero de la combinación del fichero de diccionario y el fichero “silencios.dic” que sólo contiene los modelos de silencio.




copy silencios_HTK_test.dic+%1_HTK.dic %1_HTK_test.dic

Cuadro 35: Instrucción para combinar el fichero de diccionario con los silencios

6.3.1.3.- Generación de los ficheros maestros de etiquetas
A partir de los ficheros .alf a nivel de frase que teníamos, crearemos los ficheros de etiquetas maestras o MLF (Master Label Files) de nivel de palabra. Cada una de las frases se descompone según el siguiente formato:

Figura 23: Formato de descomposición de una frase en el MLF

Para lograr esta descomposición utilizamos el programa awk_words2:


{

#si el numero de linea es 1, escribimos #!MLF!#

if (NR==1)

printf ("#!MLF!#\n")

}

{

#el nombre del fichero de audio debe tener mas de 5 caracteres



if (length($1)>5)

{

{



#el nombre del fichero de audio debe tener un maximo de 12 caracteres

#tal como indica el tercer parametro de la instruccion substr

printf ("\"*/%s.lab\"\n", substr($1,1,12))

}

{



#se recorren todos los campos de la linea a partir del cuarto que es la

#primera palabra de la frase

for (n=4; n<=NF; n++)

if (($n!="[sta]")&&($n!="[int]"))

if ($n=="[fil]")

printf "!FIL\n";

else if ($n=="[spk]")

printf "!SPK\n";

else

printf "%s\n", $n



}

{

printf ".\n"



}

}

}



Cuadro 36: Programa awk_words2
Es importante resaltar que el nomrbe del fichero debe tener entre 5 y 12 caracteres.
A partir de este MLF a nivel de palabra, generamos el MLF a nivel de fonemas mediante el HLEd. Tendremos dos MLF de nivel de fonema, uno en el que se tiene en cuenta el modelo de pausa corta (tarea_train_mono.mlf) y otro en que se elimina dicho modelo (tarea_train_mono0.mlf).
El último MLF que necesitamos es el de trifonemas internos en el que se considera un fonema en el contexto de los dos que lo rodean salvo en el principio y el final de la palabra, que se emplean modelos independientes de contexto. Lo creamos a partir del MLF de nivel de fonema mediante HLEd.
Debido a problemas de formato es necesario modificar el MLF de trifonemas de manera que las vocales que comiencen por tilde estén entrecomilladas, para lo que utilizamos el programa “awk_comillas2”:



#si el primer caracter de la palabra es una comita que indica tilde, se #imprime la palabra entrecomillada en caso contrario, se imprime la palabra #tal cual

if (substr($1,1,1)=="'")

printf "\"%s\"\n", $1;

else


printf "%s\n", $1

Cuadro 37: Programa awk_comillas2
En los MLF a nivel de fonema también tenemos que hacer una modificación y poner “ \ ” delante de todas las vocales que tengan tilde. Para ello utilizamos el programa “awk_slash2”:


#si el primer caracter de la palabra es una tilde, le antepone una \

#antes de imprimirla, en caso contrario la imprime como estaba

{

if (substr($1,1,1)=="'")



printf "\\%s\n", $1;

else


printf "%s\n", $1

}


Cuadro 38: Programa awk_slash2
En los MLF a nivel de fonema, los modelos de silencio y pausa corta deben aparecer al final y según el fichero de que se trate deberán aparecer ambos o únicamente el de silencio, por lo que editamos dichos ficheros mediante “editaMono.per” y “editaMono0.per” que es igual que “editaMono.per” pero eliminando la última línea.



while ($_=)

{

#quitamos los tabuladores y retornos de carro



chop;
#comparamos la linea de entrada con el silencio y la pausa corta

$Comparacion1 = 'sil' cmp $_;

$Comparacion2 = 'sp' cmp $_;
#si coincide con alguno de los dos no la imprimimos

if ($Comparacion1==0)

{

next;


}

elsif ($Comparacion2==0)

{

next;


}

else


{

printf stdout "%s\n",$_;

}

}
printf stdout "sil\n";



printf stdout "sp\n";

Cuadro 39: Programa editaMono.per
Aunque hemos generado listas con todos los fonemas y trifonemas que aparecen en nuestras frases, es necesario disponer de una lista en la que aparezcan todos los fonemas y trifonemas posibles, así como los modelos de silencio y pausa corta, lo que conseguimos llamando al programa “fulllist_tri”. En estas nuevas listas que acabamos de obtener, hay que realizar otro cambio de formato, cambiando el símbolo “ ’ ” que aparece delante de algunas vocales por “ \’ ”. Para ello nos valemos del programa “awk_slash2” anteriormente mencionado.
6.3.1.4.- Parametrización de los ficheros de audio
Para poder llevar a cabo la parametrización de los ficheros de audio con las grabaciones de las frases, es necesario obtener una lista en la que aparezcan dichos ficheros con su path de manera que el programa que lleve a cabo dicha parametrización pueda encontrarlos. Para ello partimos del fichero .scp que contenía la lista de los ficheros y mediante el programa “awk_scp” les añadiremos el path:


#programa que añade un path y una extension a cada uno de los elementos de una #lista

{

printf "%s/%s.wav %s/%s.plp\n", DIR_AUDIO, $1, DIR_PAR, $1;



}

Cuadro 40: Programa awk_scp
Una vez tenemos la lista de los ficheros de audio y su localización, utilizamos el programa HCopy para parametrizarlos, teniendo en cuenta que son ficheros de audio con las siguientes propiedades:


  • Formato del archivo: WAV

  • Frecuencia de muestreo: 8 KHz

Por último, a partir de los ficheros .scp originales, generamos un fichero en el que aparezca una lista con todos los ficheros de parámetros (.plp) que acabamos de generar junto con su path. Para ello ejecutamos el programa “awk_list2”:




#programa que añade un path y una extencion a cada uno de los elementos de una #lista generando la lista de archivos .plp con su path

{

printf "/%s/%s.plp\n", DIR_PAR, $1;



}

Cuadro 41: Programa awk_list2




Compartir con tus amigos:
1   ...   27   28   29   30   31   32   33   34   ...   44


La base de datos está protegida por derechos de autor ©odont.info 2019
enviar mensaje

    Página principal