Paso 10 - Fabricación de Trifonemas de estado atado
Fondo
Una limitación de la creación de un modelo acústico basado en trifonía en el paso 9 es que no se ocupa de los trifonemas para los que no hay ejemplos en los datos de entrenamiento. Este problema se puede evitar mediante el diseño cuidadoso de la base de datos de entrenamiento, pero cuando se construye un gran vocabulario, los sistemas trifónicos de palabra cruzada son inevitables.
El agrupamiento de árboles de decisión utilizado aquí permite sintetizar trifonemas previamente no vistos. ¿Cómo? Utilizando un árbol de decisiones fonéticas donde los modelos están organizados en un árbol y los parámetros que pasa son llamados preguntas. El decodificador hace una pregunta en el contexto del fonema y decide qué modelo utilizar.
Un árbol de decisiones fonéticas es un árbol binario en el que una pregunta fonética sí/no está conectada a cada nodo. La pregunta en cada nodo se elige para maximizar la probabilidad de los datos de entrenamiento, dado el conjunto final de tings de estado. Los árboles se definen por el comando TB. Todas las preguntas fonéticas posibles deben ser cargadas en HHED usando comandos QS. Cada pregunta toma la forma "¿Es el contexto izquierdo o derecho en el conjunto con nombre?" Donde el contexto es el contexto del modelo definido por su nombre lógico.
TUTORIAL
Crear un nuevo archivo de script HTK llamado maketriphones.ded que contenga lo siguiente:
AS sp
MP sil sil sp
TC
El comando de edición TC dirige HDMan a los trifonemas de salida.
A continuación, ejecute el comando HDMan contra todo el archivo de léxico, no sólo el diccionario de entrenamiento que hemos utilizado hasta el momento:
../soft/htk/HTKTools/HDMan -A -D -T 1 -b sp -n fulllist0 -g maketriphones.ded -l flog dict-tri ../lexicon/voxforge_lexicon
Esto crea 2 archivos:
- dict-tri
- fulllist0
A continuación, descargue el script de julia fixfulllist.jl (https://raw.githubusercontent.com/VoxForge/develop/master/bin/fixfulllist.jl) A su carpeta 'voxforge/bin'
wget https://raw.githubusercontent.com/VoxForge/develop/master/bin/fixfulllist.jl
y ejecutela para añadir el contenido de monofones0 al principio del archivo fulllist0 y, a continuación, para eliminar cualquier entrada duplicada y poner el resultado en fullist:
julia ../bin/fixfulllist.jl fulllist0 monophones0 fulllist
tree.hed
A continuación, hay que crear una nueva secuencia de comandos HTK llamada tree.hed (que contiene las preguntas del contexto del fonema que HTK usará para seleccionar los trifonemas relevantes).
Cree un archivo en su carpeta 'voxforge/tutorial' llamado tree1.hed que contenga lo siguiente:
RO 100 stats
TR 0
QS "R_NonBoundary" { *+* }
QS "R_Silence" { *+sil }
QS "R_V-Front" { *+i,*+e }
QS "R_V-Central" { *+a }
QS "R_V-Back" { *+o,*+u }
QS "R_V-cerrada" { *+i,*+u }
QS "R_V-media" { *+e,*+o }
QS "R_V-abierta" { *+a }
QS "R_oclusive"{ *+p,*+b,*+t,*+d,*+k,*+g }
QS "R_Fricative"{ *+th,*+f,*+s,*+x,*+j,*+y,*+z }
QS "R_Africada"{ *+ch }
QS "R_nasal"{ *+m,*+n,*+gn }
QS "R_lateral"{ *+l,*+ll }
QS "R_vibrante"{ *+r,*+rr }
QS "R_bilabial"{ *+p,*+b,*+m }
QS "R_dental"{ *+t,*+d,*+z }
QS "R_palatal"{ *+ch,*+gn,*+x,*+y }
QS "R_velar"{ *+k,*+g,*+j }
QS "R_interdental"{ *+th }
QS "R_labiodental"{ *+f }
QS "R_alveolar"{ *+s,*+n,*+l,*+r,*+rr}
QS "R_sorda"{ *+p,*+t,*+k,*+th,*+f,*+s,*+x,*+ch,*+j,*+z }
QS "R_sonora"{ *+b,*+d,*+g,*+y }
QS "R_nisordanisonora" { *+m,*+n,*+gn,*+l,*+ll }
QS "R_simple"{ *+r }
QS "R_multiple"{ *+rr }
QS "R_a" { *+a }
QS "R_e" { *+e }
QS "R_i" { *+i }
QS "R_o" { *+o }
QS "R_u" { *+u }
QS "R_p"{ *+p }
QS "R_t"{ *+t }
QS "R_k"{ *+k }
QS "R_th"{ *+th }
QS "R_f"{ *+f }
QS "R_s"{ *+s }
QS "R_x"{ *+x }
QS "R_ch"{ *+ch }
QS "R_b"{ *+b }
QS "R_d"{ *+d }
QS "R_g"{ *+g }
QS "R_m"{ *+m }
QS "R_n"{ *+n }
QS "R_gn"{ *+gn }
QS "R_l"{ *+l }
QS "R_ll"{ *+ll }
QS "R_r"{ *+r }
QS "R_rr"{ *+rr }
QS "R_j"{ *+j }
QS "R_y"{ *+y }
QS "R_z"{ *+z }
QS "L_NonBoundary" { *-* }
QS "L_Silence" { sil-* }
QS "L_V-Front" { i-*,e-* }
QS "L_V-Central"{ a-*,a1-* }
QS "L_V-Back" { o-*,u-* }
QS "L_V-cerrada" { i-*,u-* }
QS "L_V-media" { e-*,o-* }
QS "L_V-abierta" { a-* }
QS "L_oclusive"{ p-*,b-*,t-*,d-*,k-*,g-* }
QS "L_Fricative"{ th-*,f-*,s-*,x-*,j-*,y-*,z-* }
QS "L_Africada"{ ch-* }
QS "L_nasal"{ m-*,n-*,gn-* }
QS "L_lateral"{ l-*,ll-* }
QS "L_vibrante"{ r-*,rr-* }
QS "L_bilabial"{ p-*,b-*,m-* }
QS "L_dental"{ t-*,d-*,z-* }
QS "L_palatal"{ ch-*,gn-*,x-*,y-* }
QS "L_velar"{ k-*,g-*,j-* }
QS "L_interdental"{ th-* }
QS "L_labiodental"{ f-* }
QS "L_alveolar"{ s-*,n-*,l-*,r-*,rr-*}
QS "L_sorda"{ p-*,t-*,k-*,th-*,f-*,s-*,x-*,ch-*,j-*,z-* }
QS "L_sonora"{ b-*,d-*,g-*,y-* }
QS "L_nisordanisonora" { m-*,n-*,gn-*,l-*,ll-* }
QS "L_simple"{ r-* }
QS "L_multiple"{ rr-* }
QS "L_a" { a-* }
QS "L_e" { e-* }
QS "L_i" { i-* }
QS "L_o" { o-* }
QS "L_u" { u-* }
QS "L_p"{ p-* }
QS "L_t"{ t-* }
QS "L_k"{ k-* }
QS "L_th"{ th-* }
QS "L_f"{ f-* }
QS "L_s"{ s-* }
QS "L_x"{ x-* }
QS "L_ch"{ ch-* }
QS "L_b"{ b-* }
QS "L_d"{ d-* }
QS "L_g"{ g-* }
QS "L_m"{ m-* }
QS "L_n"{ n-* }
QS "L_gn"{ gn-* }
QS "L_l"{ l-* }
QS "L_ll"{ ll-* }
QS "L_r"{ r-* }
QS "L_rr"{ rr-* }
QS "L_j"{ j-* }
QS "L_y"{ y-* }
QS "L_z"{ z-* }
TR 2
(Nota: asegúrese de que tiene una línea en blanco al final de este archivo).
Copiar el contenido de tree1.hed a tree.hed:
cat tree1.hed > tree.hed
He aquí una breve descripción de los comandos contenidos en tree.hed:
RO - Umbral de salida
1er "TR" - Nivel de traza
QS - Pregunta - definida por el usuario (ver archivo quests.hed en la distribución HTK - carpeta demo RM)
(Cada comando QS carga una sola pregunta y esa pregunta está definida por un conjunto de contextos)
2ndo "TR" - permite el informe de progreso de nivel intermedio
TB - agrupa un conjunto específico de estados - creado con el comando mkclscript.prl
AU - sintetiza los trifonemas previamente no vistos, es decir, usa el conjunto de árboles de decisión recién creados para hacer todos los trifonemas incluidos en la lista
CO - compactar el conjunto de modelos: algunas definiciones de estado serán exactamente las mismas (mismas medias y variaciones, etc.). Para ahorrar espacio, sólo uno de estos estados se mantiene en la definición, otros se añaden a la lista de vinculados.
ST: guarda los árboles de decisión en un archivo
Consulte el libro HTK para obtener detalles sobre estos comandos.
A continuación, descargue el script mkclscript.jl (https://raw.githubusercontent.com/VoxForge/develop/master/bin/mkclscript.jl a su carpeta 'voxforge/bin'
wget https://raw.githubusercontent.com/VoxForge/develop/master/bin/mkclscript.jl
y ejecútelo de la siguiente manera para anexar los clústeres de estado al archivo tree.hed que creó anteriormente:
julia ../bin/mkclscript.jl monophones0 tree.hed
Nota: el script mkclscript.jl añade automáticamente lo siguiente al final de su archivo tree.hed:
TR 1
AU "fulllist"
CO "tiedlist"
ST "trees"
Su archivo debe tener este aspecto:
RO 100 stats
TR 0
QS "R_NonBoundary" { *+* }
QS "R_Silence" { *+sil }
QS "R_V-Front" { *+i,*+e }
QS "R_V-Central" { *+a }
QS "R_V-Back" { *+o,*+u }
QS "R_V-cerrada" { *+i,*+u }
QS "R_V-media" { *+e,*+o }
QS "R_V-abierta" { *+a }
QS "R_oclusive"{ *+p,*+b,*+t,*+d,*+k,*+g }
QS "R_Fricative"{ *+th,*+f,*+s,*+x,*+j,*+y,*+z }
QS "R_Africada"{ *+ch }
QS "R_nasal"{ *+m,*+n,*+gn }
QS "R_lateral"{ *+l,*+ll }
QS "R_vibrante"{ *+r,*+rr }
QS "R_bilabial"{ *+p,*+b,*+m }
QS "R_dental"{ *+t,*+d,*+z }
QS "R_palatal"{ *+ch,*+gn,*+x,*+y }
QS "R_velar"{ *+k,*+g,*+j }
QS "R_interdental"{ *+th }
QS "R_labiodental"{ *+f }
QS "R_alveolar"{ *+s,*+n,*+l,*+r,*+rr}
QS "R_sorda"{ *+p,*+t,*+k,*+th,*+f,*+s,*+x,*+ch,*+j,*+z }
QS "R_sonora"{ *+b,*+d,*+g,*+y }
QS "R_nisordanisonora" { *+m,*+n,*+gn,*+l,*+ll }
QS "R_simple"{ *+r }
QS "R_multiple"{ *+rr }
QS "R_a" { *+a }
QS "R_e" { *+e }
QS "R_i" { *+i }
QS "R_o" { *+o }
QS "R_u" { *+u }
QS "R_p"{ *+p }
QS "R_t"{ *+t }
QS "R_k"{ *+k }
QS "R_th"{ *+th }
QS "R_f"{ *+f }
QS "R_s"{ *+s }
QS "R_x"{ *+x }
QS "R_ch"{ *+ch }
QS "R_b"{ *+b }
QS "R_d"{ *+d }
QS "R_g"{ *+g }
QS "R_m"{ *+m }
QS "R_n"{ *+n }
QS "R_gn"{ *+gn }
QS "R_l"{ *+l }
QS "R_ll"{ *+ll }
QS "R_r"{ *+r }
QS "R_rr"{ *+rr }
QS "R_j"{ *+j }
QS "R_y"{ *+y }
QS "R_z"{ *+z }
QS "L_NonBoundary" { *-* }
QS "L_Silence" { sil-* }
QS "L_V-Front" { i-*,e-* }
QS "L_V-Central"{ a-*,a1-* }
QS "L_V-Back" { o-*,u-* }
QS "L_V-cerrada" { i-*,u-* }
QS "L_V-media" { e-*,o-* }
QS "L_V-abierta" { a-* }
QS "L_oclusive"{ p-*,b-*,t-*,d-*,k-*,g-* }
QS "L_Fricative"{ th-*,f-*,s-*,x-*,j-*,y-*,z-* }
QS "L_Africada"{ ch-* }
QS "L_nasal"{ m-*,n-*,gn-* }
QS "L_lateral"{ l-*,ll-* }
QS "L_vibrante"{ r-*,rr-* }
QS "L_bilabial"{ p-*,b-*,m-* }
QS "L_dental"{ t-*,d-*,z-* }
QS "L_palatal"{ ch-*,gn-*,x-*,y-* }
QS "L_velar"{ k-*,g-*,j-* }
QS "L_interdental"{ th-* }
QS "L_labiodental"{ f-* }
QS "L_alveolar"{ s-*,n-*,l-*,r-*,rr-*}
QS "L_sorda"{ p-*,t-*,k-*,th-*,f-*,s-*,x-*,ch-*,j-*,z-* }
QS "L_sonora"{ b-*,d-*,g-*,y-* }
QS "L_nisordanisonora" { m-*,n-*,gn-*,l-*,ll-* }
QS "L_simple"{ r-* }
QS "L_multiple"{ rr-* }
QS "L_a" { a-* }
QS "L_e" { e-* }
QS "L_i" { i-* }
QS "L_o" { o-* }
QS "L_u" { u-* }
QS "L_p"{ p-* }
QS "L_t"{ t-* }
QS "L_k"{ k-* }
QS "L_th"{ th-* }
QS "L_f"{ f-* }
QS "L_s"{ s-* }
QS "L_x"{ x-* }
QS "L_ch"{ ch-* }
QS "L_b"{ b-* }
QS "L_d"{ d-* }
QS "L_g"{ g-* }
QS "L_m"{ m-* }
QS "L_n"{ n-* }
QS "L_gn"{ gn-* }
QS "L_l"{ l-* }
QS "L_ll"{ ll-* }
QS "L_r"{ r-* }
QS "L_rr"{ rr-* }
QS "L_j"{ j-* }
QS "L_y"{ y-* }
QS "L_z"{ z-* }
TR 2
TB 350 "ST_a_2_" {("a","*-a+*","a+*","*-a").state[2]}
TB 350 "ST_b_2_" {("b","*-b+*","b+*","*-b").state[2]}
TB 350 "ST_ch_2_" {("ch","*-ch+*","ch+*","*-ch").state[2]}
TB 350 "ST_d_2_" {("d","*-d+*","d+*","*-d").state[2]}
TB 350 "ST_e_2_" {("e","*-e+*","e+*","*-e").state[2]}
TB 350 "ST_f_2_" {("f","*-f+*","f+*","*-f").state[2]}
TB 350 "ST_g_2_" {("g","*-g+*","g+*","*-g").state[2]}
TB 350 "ST_i_2_" {("i","*-i+*","i+*","*-i").state[2]}
TB 350 "ST_j_2_" {("j","*-j+*","j+*","*-j").state[2]}
TB 350 "ST_k_2_" {("k","*-k+*","k+*","*-k").state[2]}
TB 350 "ST_l_2_" {("l","*-l+*","l+*","*-l").state[2]}
TB 350 "ST_ll_2_" {("ll","*-ll+*","ll+*","*-ll").state[2]}
TB 350 "ST_m_2_" {("m","*-m+*","m+*","*-m").state[2]}
TB 350 "ST_n_2_" {("n","*-n+*","n+*","*-n").state[2]}
TB 350 "ST_gn_2_" {("gn","*-gn+*","gn+*","*-gn").state[2]}
TB 350 "ST_o_2_" {("o","*-o+*","o+*","*-o").state[2]}
TB 350 "ST_p_2_" {("p","*-p+*","p+*","*-p").state[2]}
TB 350 "ST_r_2_" {("r","*-r+*","r+*","*-r").state[2]}
TB 350 "ST_rr_2_" {("rr","*-rr+*","rr+*","*-rr").state[2]}
TB 350 "ST_s_2_" {("s","*-s+*","s+*","*-s").state[2]}
TB 350 "ST_t_2_" {("t","*-t+*","t+*","*-t").state[2]}
TB 350 "ST_th_2_" {("th","*-th+*","th+*","*-th").state[2]}
TB 350 "ST_u_2_" {("u","*-u+*","u+*","*-u").state[2]}
TB 350 "ST_x_2_" {("x","*-x+*","x+*","*-x").state[2]}
TB 350 "ST_y_2_" {("y","*-y+*","y+*","*-y").state[2]}
TB 350 "ST_z_2_" {("z","*-z+*","z+*","*-z").state[2]}
TB 350 "ST_sil_2_" {("sil","*-sil+*","sil+*","*-sil").state[2]}
TB 350 "ST_a_3_" {("a","*-a+*","a+*","*-a").state[3]}
TB 350 "ST_b_3_" {("b","*-b+*","b+*","*-b").state[3]}
TB 350 "ST_ch_3_" {("ch","*-ch+*","ch+*","*-ch").state[3]}
TB 350 "ST_d_3_" {("d","*-d+*","d+*","*-d").state[3]}
TB 350 "ST_e_3_" {("e","*-e+*","e+*","*-e").state[3]}
TB 350 "ST_f_3_" {("f","*-f+*","f+*","*-f").state[3]}
TB 350 "ST_g_3_" {("g","*-g+*","g+*","*-g").state[3]}
TB 350 "ST_i_3_" {("i","*-i+*","i+*","*-i").state[3]}
TB 350 "ST_j_3_" {("j","*-j+*","j+*","*-j").state[3]}
TB 350 "ST_k_3_" {("k","*-k+*","k+*","*-k").state[3]}
TB 350 "ST_l_3_" {("l","*-l+*","l+*","*-l").state[3]}
TB 350 "ST_ll_3_" {("ll","*-ll+*","ll+*","*-ll").state[3]}
TB 350 "ST_m_3_" {("m","*-m+*","m+*","*-m").state[3]}
TB 350 "ST_n_3_" {("n","*-n+*","n+*","*-n").state[3]}
TB 350 "ST_gn_3_" {("gn","*-gn+*","gn+*","*-gn").state[3]}
TB 350 "ST_o_3_" {("o","*-o+*","o+*","*-o").state[3]}
TB 350 "ST_p_3_" {("p","*-p+*","p+*","*-p").state[3]}
TB 350 "ST_r_3_" {("r","*-r+*","r+*","*-r").state[3]}
TB 350 "ST_rr_3_" {("rr","*-rr+*","rr+*","*-rr").state[3]}
TB 350 "ST_s_3_" {("s","*-s+*","s+*","*-s").state[3]}
TB 350 "ST_t_3_" {("t","*-t+*","t+*","*-t").state[3]}
TB 350 "ST_th_3_" {("th","*-th+*","th+*","*-th").state[3]}
TB 350 "ST_u_3_" {("u","*-u+*","u+*","*-u").state[3]}
TB 350 "ST_x_3_" {("x","*-x+*","x+*","*-x").state[3]}
TB 350 "ST_y_3_" {("y","*-y+*","y+*","*-y").state[3]}
TB 350 "ST_z_3_" {("z","*-z+*","z+*","*-z").state[3]}
TB 350 "ST_sil_3_" {("sil","*-sil+*","sil+*","*-sil").state[3]}
TB 350 "ST_a_4_" {("a","*-a+*","a+*","*-a").state[4]}
TB 350 "ST_b_4_" {("b","*-b+*","b+*","*-b").state[4]}
TB 350 "ST_ch_4_" {("ch","*-ch+*","ch+*","*-ch").state[4]}
TB 350 "ST_d_4_" {("d","*-d+*","d+*","*-d").state[4]}
TB 350 "ST_e_4_" {("e","*-e+*","e+*","*-e").state[4]}
TB 350 "ST_f_4_" {("f","*-f+*","f+*","*-f").state[4]}
TB 350 "ST_g_4_" {("g","*-g+*","g+*","*-g").state[4]}
TB 350 "ST_i_4_" {("i","*-i+*","i+*","*-i").state[4]}
TB 350 "ST_j_4_" {("j","*-j+*","j+*","*-j").state[4]}
TB 350 "ST_k_4_" {("k","*-k+*","k+*","*-k").state[4]}
TB 350 "ST_l_4_" {("l","*-l+*","l+*","*-l").state[4]}
TB 350 "ST_ll_4_" {("ll","*-ll+*","ll+*","*-ll").state[4]}
TB 350 "ST_m_4_" {("m","*-m+*","m+*","*-m").state[4]}
TB 350 "ST_n_4_" {("n","*-n+*","n+*","*-n").state[4]}
TB 350 "ST_gn_4_" {("gn","*-gn+*","gn+*","*-gn").state[4]}
TB 350 "ST_o_4_" {("o","*-o+*","o+*","*-o").state[4]}
TB 350 "ST_p_4_" {("p","*-p+*","p+*","*-p").state[4]}
TB 350 "ST_r_4_" {("r","*-r+*","r+*","*-r").state[4]}
TB 350 "ST_rr_4_" {("rr","*-rr+*","rr+*","*-rr").state[4]}
TB 350 "ST_s_4_" {("s","*-s+*","s+*","*-s").state[4]}
TB 350 "ST_t_4_" {("t","*-t+*","t+*","*-t").state[4]}
TB 350 "ST_th_4_" {("th","*-th+*","th+*","*-th").state[4]}
TB 350 "ST_u_4_" {("u","*-u+*","u+*","*-u").state[4]}
TB 350 "ST_x_4_" {("x","*-x+*","x+*","*-x").state[4]}
TB 350 "ST_y_4_" {("y","*-y+*","y+*","*-y").state[4]}
TB 350 "ST_z_4_" {("z","*-z+*","z+*","*-z").state[4]}
TB 350 "ST_sil_4_" {("sil","*-sil+*","sil+*","*-sil").state[4]}
TR 1
AU "fulllist"
CO "tiedlist"
ST "trees"
Lo siguiente es crear 3 carpetas más: hmm13-15
mkdir hmm13 hmm14 hmm15
A continuación, ejecute el comando HHEd (hmm definition editor):
../soft/htk/HTKTools/HHEd -A -D -T 1 -H hmm12/macros -H hmm12/hmmdefs -M hmm13 tree.hed triphones1
Este comando crea 3 archivos:
- hmmdefs
- macros
- tiedlist
Seguidamente ejecute HERest dos veces más:
../soft/htk/HTKTools/HERest -A -D -T 1 -T 1 -C config -I wintri.mlf -t 250.0 150.0 3000.0 -S train.scp -H hmm13/macros -H hmm13/hmmdefs -M hmm14 tiedlist
Este comando crea dos archivos:
- hmmdefs
- macros
Y ejecutamos un última vez
../soft/htk/HTKTools/HERest -A -D -T 1 -T 1 -C config -I wintri.mlf -t 250.0 150.0 3000.0 -S train.scp -H hmm14/macros -H hmm14/hmmdefs -M hmm15 tiedlist
Y tambien este comando crea dos archivos:
- hmmdefs
- macros
El archivo hmmdefs en la carpeta hmm15, junto con el archivo de lista de vinculación, ahora se puede utilizar con Julius para reconocer su discurso!
Fondo
Una limitación de la creación de un modelo acústico basado en trifonía en el paso 9 es que no se ocupa de los trifonemas para los que no hay ejemplos en los datos de entrenamiento. Este problema se puede evitar mediante el diseño cuidadoso de la base de datos de entrenamiento, pero cuando se construye un gran vocabulario, los sistemas trifónicos de palabra cruzada son inevitables.
El agrupamiento de árboles de decisión utilizado aquí permite sintetizar trifonemas previamente no vistos. ¿Cómo? Utilizando un árbol de decisiones fonéticas donde los modelos están organizados en un árbol y los parámetros que pasa son llamados preguntas. El decodificador hace una pregunta en el contexto del fonema y decide qué modelo utilizar.
Un árbol de decisiones fonéticas es un árbol binario en el que una pregunta fonética sí/no está conectada a cada nodo. La pregunta en cada nodo se elige para maximizar la probabilidad de los datos de entrenamiento, dado el conjunto final de tings de estado. Los árboles se definen por el comando TB. Todas las preguntas fonéticas posibles deben ser cargadas en HHED usando comandos QS. Cada pregunta toma la forma "¿Es el contexto izquierdo o derecho en el conjunto con nombre?" Donde el contexto es el contexto del modelo definido por su nombre lógico.
TUTORIAL
Crear un nuevo archivo de script HTK llamado maketriphones.ded que contenga lo siguiente:
AS sp
MP sil sil sp
TC
El comando de edición TC dirige HDMan a los trifonemas de salida.
A continuación, ejecute el comando HDMan contra todo el archivo de léxico, no sólo el diccionario de entrenamiento que hemos utilizado hasta el momento:
../soft/htk/HTKTools/HDMan -A -D -T 1 -b sp -n fulllist0 -g maketriphones.ded -l flog dict-tri ../lexicon/voxforge_lexicon
Esto crea 2 archivos:
- dict-tri
- fulllist0
A continuación, descargue el script de julia fixfulllist.jl (https://raw.githubusercontent.com/VoxForge/develop/master/bin/fixfulllist.jl) A su carpeta 'voxforge/bin'
wget https://raw.githubusercontent.com/VoxForge/develop/master/bin/fixfulllist.jl
y ejecutela para añadir el contenido de monofones0 al principio del archivo fulllist0 y, a continuación, para eliminar cualquier entrada duplicada y poner el resultado en fullist:
julia ../bin/fixfulllist.jl fulllist0 monophones0 fulllist
tree.hed
A continuación, hay que crear una nueva secuencia de comandos HTK llamada tree.hed (que contiene las preguntas del contexto del fonema que HTK usará para seleccionar los trifonemas relevantes).
Cree un archivo en su carpeta 'voxforge/tutorial' llamado tree1.hed que contenga lo siguiente:
RO 100 stats
TR 0
QS "R_NonBoundary" { *+* }
QS "R_Silence" { *+sil }
QS "R_V-Front" { *+i,*+e }
QS "R_V-Central" { *+a }
QS "R_V-Back" { *+o,*+u }
QS "R_V-cerrada" { *+i,*+u }
QS "R_V-media" { *+e,*+o }
QS "R_V-abierta" { *+a }
QS "R_oclusive"{ *+p,*+b,*+t,*+d,*+k,*+g }
QS "R_Fricative"{ *+th,*+f,*+s,*+x,*+j,*+y,*+z }
QS "R_Africada"{ *+ch }
QS "R_nasal"{ *+m,*+n,*+gn }
QS "R_lateral"{ *+l,*+ll }
QS "R_vibrante"{ *+r,*+rr }
QS "R_bilabial"{ *+p,*+b,*+m }
QS "R_dental"{ *+t,*+d,*+z }
QS "R_palatal"{ *+ch,*+gn,*+x,*+y }
QS "R_velar"{ *+k,*+g,*+j }
QS "R_interdental"{ *+th }
QS "R_labiodental"{ *+f }
QS "R_alveolar"{ *+s,*+n,*+l,*+r,*+rr}
QS "R_sorda"{ *+p,*+t,*+k,*+th,*+f,*+s,*+x,*+ch,*+j,*+z }
QS "R_sonora"{ *+b,*+d,*+g,*+y }
QS "R_nisordanisonora" { *+m,*+n,*+gn,*+l,*+ll }
QS "R_simple"{ *+r }
QS "R_multiple"{ *+rr }
QS "R_a" { *+a }
QS "R_e" { *+e }
QS "R_i" { *+i }
QS "R_o" { *+o }
QS "R_u" { *+u }
QS "R_p"{ *+p }
QS "R_t"{ *+t }
QS "R_k"{ *+k }
QS "R_th"{ *+th }
QS "R_f"{ *+f }
QS "R_s"{ *+s }
QS "R_x"{ *+x }
QS "R_ch"{ *+ch }
QS "R_b"{ *+b }
QS "R_d"{ *+d }
QS "R_g"{ *+g }
QS "R_m"{ *+m }
QS "R_n"{ *+n }
QS "R_gn"{ *+gn }
QS "R_l"{ *+l }
QS "R_ll"{ *+ll }
QS "R_r"{ *+r }
QS "R_rr"{ *+rr }
QS "R_j"{ *+j }
QS "R_y"{ *+y }
QS "R_z"{ *+z }
QS "L_NonBoundary" { *-* }
QS "L_Silence" { sil-* }
QS "L_V-Front" { i-*,e-* }
QS "L_V-Central"{ a-*,a1-* }
QS "L_V-Back" { o-*,u-* }
QS "L_V-cerrada" { i-*,u-* }
QS "L_V-media" { e-*,o-* }
QS "L_V-abierta" { a-* }
QS "L_oclusive"{ p-*,b-*,t-*,d-*,k-*,g-* }
QS "L_Fricative"{ th-*,f-*,s-*,x-*,j-*,y-*,z-* }
QS "L_Africada"{ ch-* }
QS "L_nasal"{ m-*,n-*,gn-* }
QS "L_lateral"{ l-*,ll-* }
QS "L_vibrante"{ r-*,rr-* }
QS "L_bilabial"{ p-*,b-*,m-* }
QS "L_dental"{ t-*,d-*,z-* }
QS "L_palatal"{ ch-*,gn-*,x-*,y-* }
QS "L_velar"{ k-*,g-*,j-* }
QS "L_interdental"{ th-* }
QS "L_labiodental"{ f-* }
QS "L_alveolar"{ s-*,n-*,l-*,r-*,rr-*}
QS "L_sorda"{ p-*,t-*,k-*,th-*,f-*,s-*,x-*,ch-*,j-*,z-* }
QS "L_sonora"{ b-*,d-*,g-*,y-* }
QS "L_nisordanisonora" { m-*,n-*,gn-*,l-*,ll-* }
QS "L_simple"{ r-* }
QS "L_multiple"{ rr-* }
QS "L_a" { a-* }
QS "L_e" { e-* }
QS "L_i" { i-* }
QS "L_o" { o-* }
QS "L_u" { u-* }
QS "L_p"{ p-* }
QS "L_t"{ t-* }
QS "L_k"{ k-* }
QS "L_th"{ th-* }
QS "L_f"{ f-* }
QS "L_s"{ s-* }
QS "L_x"{ x-* }
QS "L_ch"{ ch-* }
QS "L_b"{ b-* }
QS "L_d"{ d-* }
QS "L_g"{ g-* }
QS "L_m"{ m-* }
QS "L_n"{ n-* }
QS "L_gn"{ gn-* }
QS "L_l"{ l-* }
QS "L_ll"{ ll-* }
QS "L_r"{ r-* }
QS "L_rr"{ rr-* }
QS "L_j"{ j-* }
QS "L_y"{ y-* }
QS "L_z"{ z-* }
TR 2
(Nota: asegúrese de que tiene una línea en blanco al final de este archivo).
Copiar el contenido de tree1.hed a tree.hed:
cat tree1.hed > tree.hed
He aquí una breve descripción de los comandos contenidos en tree.hed:
RO - Umbral de salida
1er "TR" - Nivel de traza
QS - Pregunta - definida por el usuario (ver archivo quests.hed en la distribución HTK - carpeta demo RM)
(Cada comando QS carga una sola pregunta y esa pregunta está definida por un conjunto de contextos)
2ndo "TR" - permite el informe de progreso de nivel intermedio
TB - agrupa un conjunto específico de estados - creado con el comando mkclscript.prl
AU - sintetiza los trifonemas previamente no vistos, es decir, usa el conjunto de árboles de decisión recién creados para hacer todos los trifonemas incluidos en la lista
CO - compactar el conjunto de modelos: algunas definiciones de estado serán exactamente las mismas (mismas medias y variaciones, etc.). Para ahorrar espacio, sólo uno de estos estados se mantiene en la definición, otros se añaden a la lista de vinculados.
ST: guarda los árboles de decisión en un archivo
Consulte el libro HTK para obtener detalles sobre estos comandos.
A continuación, descargue el script mkclscript.jl (https://raw.githubusercontent.com/VoxForge/develop/master/bin/mkclscript.jl a su carpeta 'voxforge/bin'
wget https://raw.githubusercontent.com/VoxForge/develop/master/bin/mkclscript.jl
y ejecútelo de la siguiente manera para anexar los clústeres de estado al archivo tree.hed que creó anteriormente:
julia ../bin/mkclscript.jl monophones0 tree.hed
Nota: el script mkclscript.jl añade automáticamente lo siguiente al final de su archivo tree.hed:
TR 1
AU "fulllist"
CO "tiedlist"
ST "trees"
Su archivo debe tener este aspecto:
RO 100 stats
TR 0
QS "R_NonBoundary" { *+* }
QS "R_Silence" { *+sil }
QS "R_V-Front" { *+i,*+e }
QS "R_V-Central" { *+a }
QS "R_V-Back" { *+o,*+u }
QS "R_V-cerrada" { *+i,*+u }
QS "R_V-media" { *+e,*+o }
QS "R_V-abierta" { *+a }
QS "R_oclusive"{ *+p,*+b,*+t,*+d,*+k,*+g }
QS "R_Fricative"{ *+th,*+f,*+s,*+x,*+j,*+y,*+z }
QS "R_Africada"{ *+ch }
QS "R_nasal"{ *+m,*+n,*+gn }
QS "R_lateral"{ *+l,*+ll }
QS "R_vibrante"{ *+r,*+rr }
QS "R_bilabial"{ *+p,*+b,*+m }
QS "R_dental"{ *+t,*+d,*+z }
QS "R_palatal"{ *+ch,*+gn,*+x,*+y }
QS "R_velar"{ *+k,*+g,*+j }
QS "R_interdental"{ *+th }
QS "R_labiodental"{ *+f }
QS "R_alveolar"{ *+s,*+n,*+l,*+r,*+rr}
QS "R_sorda"{ *+p,*+t,*+k,*+th,*+f,*+s,*+x,*+ch,*+j,*+z }
QS "R_sonora"{ *+b,*+d,*+g,*+y }
QS "R_nisordanisonora" { *+m,*+n,*+gn,*+l,*+ll }
QS "R_simple"{ *+r }
QS "R_multiple"{ *+rr }
QS "R_a" { *+a }
QS "R_e" { *+e }
QS "R_i" { *+i }
QS "R_o" { *+o }
QS "R_u" { *+u }
QS "R_p"{ *+p }
QS "R_t"{ *+t }
QS "R_k"{ *+k }
QS "R_th"{ *+th }
QS "R_f"{ *+f }
QS "R_s"{ *+s }
QS "R_x"{ *+x }
QS "R_ch"{ *+ch }
QS "R_b"{ *+b }
QS "R_d"{ *+d }
QS "R_g"{ *+g }
QS "R_m"{ *+m }
QS "R_n"{ *+n }
QS "R_gn"{ *+gn }
QS "R_l"{ *+l }
QS "R_ll"{ *+ll }
QS "R_r"{ *+r }
QS "R_rr"{ *+rr }
QS "R_j"{ *+j }
QS "R_y"{ *+y }
QS "R_z"{ *+z }
QS "L_NonBoundary" { *-* }
QS "L_Silence" { sil-* }
QS "L_V-Front" { i-*,e-* }
QS "L_V-Central"{ a-*,a1-* }
QS "L_V-Back" { o-*,u-* }
QS "L_V-cerrada" { i-*,u-* }
QS "L_V-media" { e-*,o-* }
QS "L_V-abierta" { a-* }
QS "L_oclusive"{ p-*,b-*,t-*,d-*,k-*,g-* }
QS "L_Fricative"{ th-*,f-*,s-*,x-*,j-*,y-*,z-* }
QS "L_Africada"{ ch-* }
QS "L_nasal"{ m-*,n-*,gn-* }
QS "L_lateral"{ l-*,ll-* }
QS "L_vibrante"{ r-*,rr-* }
QS "L_bilabial"{ p-*,b-*,m-* }
QS "L_dental"{ t-*,d-*,z-* }
QS "L_palatal"{ ch-*,gn-*,x-*,y-* }
QS "L_velar"{ k-*,g-*,j-* }
QS "L_interdental"{ th-* }
QS "L_labiodental"{ f-* }
QS "L_alveolar"{ s-*,n-*,l-*,r-*,rr-*}
QS "L_sorda"{ p-*,t-*,k-*,th-*,f-*,s-*,x-*,ch-*,j-*,z-* }
QS "L_sonora"{ b-*,d-*,g-*,y-* }
QS "L_nisordanisonora" { m-*,n-*,gn-*,l-*,ll-* }
QS "L_simple"{ r-* }
QS "L_multiple"{ rr-* }
QS "L_a" { a-* }
QS "L_e" { e-* }
QS "L_i" { i-* }
QS "L_o" { o-* }
QS "L_u" { u-* }
QS "L_p"{ p-* }
QS "L_t"{ t-* }
QS "L_k"{ k-* }
QS "L_th"{ th-* }
QS "L_f"{ f-* }
QS "L_s"{ s-* }
QS "L_x"{ x-* }
QS "L_ch"{ ch-* }
QS "L_b"{ b-* }
QS "L_d"{ d-* }
QS "L_g"{ g-* }
QS "L_m"{ m-* }
QS "L_n"{ n-* }
QS "L_gn"{ gn-* }
QS "L_l"{ l-* }
QS "L_ll"{ ll-* }
QS "L_r"{ r-* }
QS "L_rr"{ rr-* }
QS "L_j"{ j-* }
QS "L_y"{ y-* }
QS "L_z"{ z-* }
TR 2
TB 350 "ST_a_2_" {("a","*-a+*","a+*","*-a").state[2]}
TB 350 "ST_b_2_" {("b","*-b+*","b+*","*-b").state[2]}
TB 350 "ST_ch_2_" {("ch","*-ch+*","ch+*","*-ch").state[2]}
TB 350 "ST_d_2_" {("d","*-d+*","d+*","*-d").state[2]}
TB 350 "ST_e_2_" {("e","*-e+*","e+*","*-e").state[2]}
TB 350 "ST_f_2_" {("f","*-f+*","f+*","*-f").state[2]}
TB 350 "ST_g_2_" {("g","*-g+*","g+*","*-g").state[2]}
TB 350 "ST_i_2_" {("i","*-i+*","i+*","*-i").state[2]}
TB 350 "ST_j_2_" {("j","*-j+*","j+*","*-j").state[2]}
TB 350 "ST_k_2_" {("k","*-k+*","k+*","*-k").state[2]}
TB 350 "ST_l_2_" {("l","*-l+*","l+*","*-l").state[2]}
TB 350 "ST_ll_2_" {("ll","*-ll+*","ll+*","*-ll").state[2]}
TB 350 "ST_m_2_" {("m","*-m+*","m+*","*-m").state[2]}
TB 350 "ST_n_2_" {("n","*-n+*","n+*","*-n").state[2]}
TB 350 "ST_gn_2_" {("gn","*-gn+*","gn+*","*-gn").state[2]}
TB 350 "ST_o_2_" {("o","*-o+*","o+*","*-o").state[2]}
TB 350 "ST_p_2_" {("p","*-p+*","p+*","*-p").state[2]}
TB 350 "ST_r_2_" {("r","*-r+*","r+*","*-r").state[2]}
TB 350 "ST_rr_2_" {("rr","*-rr+*","rr+*","*-rr").state[2]}
TB 350 "ST_s_2_" {("s","*-s+*","s+*","*-s").state[2]}
TB 350 "ST_t_2_" {("t","*-t+*","t+*","*-t").state[2]}
TB 350 "ST_th_2_" {("th","*-th+*","th+*","*-th").state[2]}
TB 350 "ST_u_2_" {("u","*-u+*","u+*","*-u").state[2]}
TB 350 "ST_x_2_" {("x","*-x+*","x+*","*-x").state[2]}
TB 350 "ST_y_2_" {("y","*-y+*","y+*","*-y").state[2]}
TB 350 "ST_z_2_" {("z","*-z+*","z+*","*-z").state[2]}
TB 350 "ST_sil_2_" {("sil","*-sil+*","sil+*","*-sil").state[2]}
TB 350 "ST_a_3_" {("a","*-a+*","a+*","*-a").state[3]}
TB 350 "ST_b_3_" {("b","*-b+*","b+*","*-b").state[3]}
TB 350 "ST_ch_3_" {("ch","*-ch+*","ch+*","*-ch").state[3]}
TB 350 "ST_d_3_" {("d","*-d+*","d+*","*-d").state[3]}
TB 350 "ST_e_3_" {("e","*-e+*","e+*","*-e").state[3]}
TB 350 "ST_f_3_" {("f","*-f+*","f+*","*-f").state[3]}
TB 350 "ST_g_3_" {("g","*-g+*","g+*","*-g").state[3]}
TB 350 "ST_i_3_" {("i","*-i+*","i+*","*-i").state[3]}
TB 350 "ST_j_3_" {("j","*-j+*","j+*","*-j").state[3]}
TB 350 "ST_k_3_" {("k","*-k+*","k+*","*-k").state[3]}
TB 350 "ST_l_3_" {("l","*-l+*","l+*","*-l").state[3]}
TB 350 "ST_ll_3_" {("ll","*-ll+*","ll+*","*-ll").state[3]}
TB 350 "ST_m_3_" {("m","*-m+*","m+*","*-m").state[3]}
TB 350 "ST_n_3_" {("n","*-n+*","n+*","*-n").state[3]}
TB 350 "ST_gn_3_" {("gn","*-gn+*","gn+*","*-gn").state[3]}
TB 350 "ST_o_3_" {("o","*-o+*","o+*","*-o").state[3]}
TB 350 "ST_p_3_" {("p","*-p+*","p+*","*-p").state[3]}
TB 350 "ST_r_3_" {("r","*-r+*","r+*","*-r").state[3]}
TB 350 "ST_rr_3_" {("rr","*-rr+*","rr+*","*-rr").state[3]}
TB 350 "ST_s_3_" {("s","*-s+*","s+*","*-s").state[3]}
TB 350 "ST_t_3_" {("t","*-t+*","t+*","*-t").state[3]}
TB 350 "ST_th_3_" {("th","*-th+*","th+*","*-th").state[3]}
TB 350 "ST_u_3_" {("u","*-u+*","u+*","*-u").state[3]}
TB 350 "ST_x_3_" {("x","*-x+*","x+*","*-x").state[3]}
TB 350 "ST_y_3_" {("y","*-y+*","y+*","*-y").state[3]}
TB 350 "ST_z_3_" {("z","*-z+*","z+*","*-z").state[3]}
TB 350 "ST_sil_3_" {("sil","*-sil+*","sil+*","*-sil").state[3]}
TB 350 "ST_a_4_" {("a","*-a+*","a+*","*-a").state[4]}
TB 350 "ST_b_4_" {("b","*-b+*","b+*","*-b").state[4]}
TB 350 "ST_ch_4_" {("ch","*-ch+*","ch+*","*-ch").state[4]}
TB 350 "ST_d_4_" {("d","*-d+*","d+*","*-d").state[4]}
TB 350 "ST_e_4_" {("e","*-e+*","e+*","*-e").state[4]}
TB 350 "ST_f_4_" {("f","*-f+*","f+*","*-f").state[4]}
TB 350 "ST_g_4_" {("g","*-g+*","g+*","*-g").state[4]}
TB 350 "ST_i_4_" {("i","*-i+*","i+*","*-i").state[4]}
TB 350 "ST_j_4_" {("j","*-j+*","j+*","*-j").state[4]}
TB 350 "ST_k_4_" {("k","*-k+*","k+*","*-k").state[4]}
TB 350 "ST_l_4_" {("l","*-l+*","l+*","*-l").state[4]}
TB 350 "ST_ll_4_" {("ll","*-ll+*","ll+*","*-ll").state[4]}
TB 350 "ST_m_4_" {("m","*-m+*","m+*","*-m").state[4]}
TB 350 "ST_n_4_" {("n","*-n+*","n+*","*-n").state[4]}
TB 350 "ST_gn_4_" {("gn","*-gn+*","gn+*","*-gn").state[4]}
TB 350 "ST_o_4_" {("o","*-o+*","o+*","*-o").state[4]}
TB 350 "ST_p_4_" {("p","*-p+*","p+*","*-p").state[4]}
TB 350 "ST_r_4_" {("r","*-r+*","r+*","*-r").state[4]}
TB 350 "ST_rr_4_" {("rr","*-rr+*","rr+*","*-rr").state[4]}
TB 350 "ST_s_4_" {("s","*-s+*","s+*","*-s").state[4]}
TB 350 "ST_t_4_" {("t","*-t+*","t+*","*-t").state[4]}
TB 350 "ST_th_4_" {("th","*-th+*","th+*","*-th").state[4]}
TB 350 "ST_u_4_" {("u","*-u+*","u+*","*-u").state[4]}
TB 350 "ST_x_4_" {("x","*-x+*","x+*","*-x").state[4]}
TB 350 "ST_y_4_" {("y","*-y+*","y+*","*-y").state[4]}
TB 350 "ST_z_4_" {("z","*-z+*","z+*","*-z").state[4]}
TB 350 "ST_sil_4_" {("sil","*-sil+*","sil+*","*-sil").state[4]}
TR 1
AU "fulllist"
CO "tiedlist"
ST "trees"
Lo siguiente es crear 3 carpetas más: hmm13-15
mkdir hmm13 hmm14 hmm15
A continuación, ejecute el comando HHEd (hmm definition editor):
../soft/htk/HTKTools/HHEd -A -D -T 1 -H hmm12/macros -H hmm12/hmmdefs -M hmm13 tree.hed triphones1
Este comando crea 3 archivos:
- hmmdefs
- macros
- tiedlist
Seguidamente ejecute HERest dos veces más:
../soft/htk/HTKTools/HERest -A -D -T 1 -T 1 -C config -I wintri.mlf -t 250.0 150.0 3000.0 -S train.scp -H hmm13/macros -H hmm13/hmmdefs -M hmm14 tiedlist
Este comando crea dos archivos:
- hmmdefs
- macros
Y ejecutamos un última vez
../soft/htk/HTKTools/HERest -A -D -T 1 -T 1 -C config -I wintri.mlf -t 250.0 150.0 3000.0 -S train.scp -H hmm14/macros -H hmm14/hmmdefs -M hmm15 tiedlist
Y tambien este comando crea dos archivos:
- hmmdefs
- macros
El archivo hmmdefs en la carpeta hmm15, junto con el archivo de lista de vinculación, ahora se puede utilizar con Julius para reconocer su discurso!