PRÁCTICA: RECONOCIMIENTO DE VOZ USANDO HTK

Anuncio
Tratamiento Digital de la Voz
PRÁCTICA:
RECONOCIMIENTO DE VOZ USANDO HTK
1 – REQUISITOS Y PREPARACIÓN
1.1 – Introducción
Vamos a realizar un reconocedor de voz que transcriba las secuencias de números que le
digamos. Estará basado en Modelos Ocultos de Markov, que se implementarán mediante la
aplicación HTK.
1.2 – Requisitos previos
Para la realización de esta práctica necesitarás un ordenador con Windows y MS-DOS, micrófono
configurado y altavoces o auriculares. También deberás disponer de los ejecutables de HTK 3.3 o
superior, que puede obtenerse de http://htk.eng.cam.ac.uk/ previo registro, y el archivo
preparado para la práctica que se puede descargar de la página de la asignatura.
1.3 – Preparación del entorno de trabajo
1 – Copia la carpeta HTK con todo su contenido al directorio donde desees trabajar, por ejemplo,
C:\HTK\.
2 – Crea la siguiente estructura de directorios:
Figura 1. Estructura de directorios.
1
3 – Baja el archivo de la página de la asignatura, que contiene algunos archivos ya preparados que
ahorrarán al usuario mucho tiempo grabando y transcribiendo.
4 – Almacena los archivos .sig (de la carpeta sig) en HTK\datos\sig y los archivos .lab
(de la carpeta lab) en HTK\datos\lab. Estos son archivos de voz ya grabados y sus
transcripciones.
5 – Almacena el archivo analisis.conf en HTK\analisis\. Este archivo contiene la
configuración necesaria para el analisis de los datos de entrada.
6 – Almacena los archivos hmm_x (de la carpeta proto) en la carpeta HTK\modelo\proto,
donde x es una palabra. Estos archivos contienen la definición y estructura de los HMMs que
representan las palabras que reconoceremos. Puedes abrirlos con un editor de texto y observar
que sólo difieren en la cabecera, ~h “x”.
7 – Almacena el archivo lista.txt en la carpeta HTK\datos\. Simplemente es una lista con
la correspondencia entre las señales de voz grabadas y sus archivos de coeficientes MFCC (que
son los que realmente se usan en reconocimiento).
8 – Almacena el archivo entrenamiento.txt en la carpeta HTK\entrenamiento\. Es
una lista con los archivos que usaremos para entrenar los modelos.
2 – DESARROLLO DE LA PRÁCTICA
2.1 – Grabación y transcripción del corpus de entrenamiento
9 – Abre la línea de comandos de MS-DOS. Para ello, usa Inicio -> Ejecutar -> Escribe cmd y pulsa
Enter.
10 – Accede al directorio de trabajo, por ejemplo C:\HTK\. Todos los comandos de la práctica se
ejecutarán en ese directorio. Puedes retroceder usando cd .. en la estructura de directorios.
Figura 2. Proceso de grabación y etiquetado de las secuencias de entrenamiento.
11 – Ejecuta el siguiente comando:
HSLab a.sig
Aparecerá la interfaz gráfica de HSLAB:
2
Figura 3. Interfaz HSLAB.
12 – Pulsa rec para comenzar y stop para parar la grabación. Graba tu voz contando de cero a
nueve (una cifra por segundo), pronunciando bien los números y dejando algo de silencio entre
ellos. También deja un segundo de silencio al principio y otro al final.
13 – Aparecerá la forma de onda grabada. Pulsa sobre un punto de la grabación, arrastra el ratón
hasta otro punto y suéltalo. Se mostrará la zona intermedia marcada. Si lo necesitas, pulsa play
para oír la forma de onda en esa zona por los altavoces.
14 - Pulsa Labelas, escribe un nombre como muestra la figura 4 y pulsa Enter. Esto etiquetará la
porción de voz para que el reconocedor sepa qué se ha dicho.
3
Figura 4. Etiquetando la forma de onda
15 – Repite el proceso para las cifras de cero a nueve, y para los silencios inicial y final
(etiquetados con s). No puedes usar números para las etiquetas. Debe quedar algo parecido a lo
que muestra la figura 5.
16 – Pulsa Save y Enter. Luego puedes salir pulsando Quit.
Figura 5. Secuencia de entrenamiento completamente etiquetada.
4
17 – En el directorio de trabajo, C:\HTK\, aparecerán dos archivos: el que contiene la forma de
onda (a_0.sig) y el que contiene las etiquetas (a_0.lab). Renómbralos para que se llamen
7a.sig y 7a.lab y almacénalos en HTK\datos\sig\ y HTK\datos\lab,
respectivamente. Acabas de añadir una secuencia más al corpus de entrenamiento del
reconocedor, con lo que funcionará mejor.
Nota: si ya había archivos llamados a_0.sig y a_0.lab en el directorio de trabajo, los archivos
de salida se llamarán a_1.sig y a_1.lab. Si estos también existían, los archivos se volverán a
llamar a_0.sig y a_0.lab, sobrescribiendo los originales. Por esto hay que hacer el cambio de
nombre tras cada grabación y etiquetado.
18 – Repite los pasos 11-17 tres veces más, hasta disponer de las cuatro grabaciones 7a, 7aa, 7b,
7bb y sus correspondientes etiquetas. En los archivos 7a y 7aa debes haberte grabado contando
de cero a nueve (en orden creciente), y en los archivos 7a y 7bb contando de nueve a cero (en
orden decreciente).
2.2 – Análisis acústico
Figura 6. Proceso de conversión de los datos de entrenamiento.
19 – Añade cuatro líneas al archivo datos\lista.txt en las cuales especifiques la conversión
entre el archivo de voz y el vector de coeficientes.
Contenido de lista.txt
datos/sig/1a.sig
datos/sig/1aa.sig
datos/sig/1b.sig
datos/sig/1bb.sig
datos/sig/2a.sig
datos/mfcc/1a.mfcc
datos/mfcc/1aa.mfcc
datos/mfcc/1b.mfcc
datos/mfcc/1bb.mfcc
datos/mfcc/2a.mfcc
(…)
(…)
datos/sig/6aa.sig
datos/sig/6b.sig
datos/sig/6bb.sig
datos/sig/7a.sig
datos/sig/7aa.sig
datos/sig/7b.sig
datos/sig/7bb.sig
datos/mfcc/6aa.mfcc
datos/mfcc/6b.mfcc
datos/mfcc/6bb.mfcc
datos/mfcc/7a.mfcc
datos/mfcc/7aa.mfcc
datos/mfcc/7b.mfcc
datos/mfcc/7bb.mfcc
5
20 – Edita el archivo de configuración analisis\analisis.conf con un editor de texto.
Contenido de analisis.conf
SOURCEFORMAT = HTK
TARGETKIND = MFCC_0_D_A
# Formato de los archivos de voz
# Coeficientes a usar
WINDOWSIZE = 200000.0
TARGETRATE = 100000.0
# 20 mseg como longitud de trama
# 10 mseg como periodicidad entre tramas
NUMCEPS = 12
USEHAMMING = T
PREEMCOEF = 0.90
NUMCHANS = 26
CEPLIFTER = 22
#
#
#
#
#
Número de coeficientes MFCC
Uso de la ventana de Hamming
Coeficiente de pre-énfasis
Número de canales del banco de filtros
Longitud del liftering en cepstrum
Ajusta la duración de la ventana a 25 mseg y el coeficiente de pre-énfasis a 0 ' 97 .
21 – Para convertir las señales de voz en vectores de coeficientes MFCC, que son los que se usan
en reconocimiento, ejecuta el comando:
HCopy -C analisis\analisis.conf -S datos\lista.txt
La carpeta datos\mfcc se ha llenado con vectores de coeficientes MFCC, que usaremos en el
reconocimiento.
2.3 – Definición de los HMMs
...
Figura 7. Topología elegida para los HMM.
22 – Abre el archivo de modelo\proto\hmm_s con un editor de texto. Su contenido describe
el HMM asociado al silencio, y es el siguiente:
6
Contenido de hmm_s
~o <VecSize> 39 <MFCC_0_D_A>
~h "s"
<BeginHMM>
<NumStates> 17
<State> 2
<Mean> 39
0.0
0.0
0.0
<Variance>
1.0
1.0
1.0
<State> 3
<Mean> 39
0.0
0.0
0.0
<Variance>
1.0
1.0
1.0
<State> 4
0.0
0.0
0.0
39
1.0
1.0
1.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0
0.0
0.0
39
1.0
1.0
1.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
<State> 15
<Mean> 39
0.0
0.0
0.0
<Variance>
1.0
1.0
1.0
0.0
0.0
0.0
39
1.0
1.0
1.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
<State> 16
<Mean> 39
0.0
0.0
0.0
<Variance>
1.0
1.0
1.0
0.0
0.0
0.0
39
1.0
1.0
1.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0
(…)
<TransP> 17
0.4 0.3
0.0 0.4
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.3
0.3
0.4
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.3
0.3
0.4
0.0
0.0
0.0
0.0
0.0
0.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0
0.0
0.0
0.3
0.3
0.4
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.3
0.3
0.4
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.3
0.3
0.4
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.3
0.3
0.4
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.3
0.3
0.4
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.3
0.3
0.4
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.3
0.3
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.3
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
7
23 - Como puede verse en la figura 7, el estado 1 es transitorio y de él sólo se puede ir a los dos
siguientes. Modifica la matriz de probabilidades de transición para que se cumpla esto, es decir:
que desde el estado 1 sea imposible volver a sí mismo, pero las transiciones a los dos estados
posteriores sigan siendo equiprobables. Toda la fila de la matriz debe sumar 1.
El resto de archivos de definición tienen sus matrices bien implementadas.
2.4 – Entrenamiento de los modelos
Figura 8. Proceso completo de entrenamiento. Tras la inicialización, se pasa a un proceso iterativo
de refinamiento del modelo. Extraído de [MOREAU].
24 – Abre el archivo entrenamiento\entrenamiento.txt con un editor de texto. Añade
a la lista los vectores de coeficientes MFCC que creaste tras la grabación.
Contenido de entrenamiento.txt
datos/mfcc/1a.mfcc
datos/mfcc/1aa.mfcc
datos/mfcc/1b.mfcc
datos/mfcc/1bb.mfcc
datos/mfcc/2a.mfcc
(…)
datos/mfcc/5bb.mfcc
datos/mfcc/6a.mfcc
datos/mfcc/6aa.mfcc
datos/mfcc/6b.mfcc
datos/mfcc/6bb.mfcc
datos/mfcc/7a.mfcc
datos/mfcc/7aa.mfcc
datos/mfcc/7b.mfcc
datos/mfcc/7bb.mfcc
8
– Inicialización
25 – Ejecuta el comando:
HInit -S entrenamiento\entrenamiento.txt -M modelo\hmm0 -H
modelo\proto\hmm_s -l s -L datos\lab\ s
Esto inicializa (mediante alineamiento de Viterbi) el HMM que modela el silencio.
Nota: antes de la s final, debe haber un espacio.
Figura 9. Inicialización de los modelos con HINIT.
26 – Repite el comando para las diez cifras (de cero a nueve). Por ejemplo, para la cifra cero, sería:
HInit
-S
entrenamiento\entrenamiento.txt
-M
modelo\proto\hmm_cero -l cero -L datos\lab\ cero
modelo\hmm0
-H
Puedes crear un archivo .bat que contenga todos los comandos:
Contenido de INICIALIZA.bat
HINIT -S entrenamiento/entrenamiento.txt -M modelo/hmm0 -H
modelo/proto/hmm_s -l s -L datos/lab/ s
HINIT -S entrenamiento/entrenamiento.txt -M modelo/hmm0 -H
modelo/proto/hmm_cero -l cero -L datos/lab/ cero
(…)
HINIT -S entrenamiento/entrenamiento.txt -M modelo/hmm0 -H
modelo/proto/hmm_ocho -l ocho -L datos/lab/ ocho
HINIT -S entrenamiento/entrenamiento.txt -M modelo/hmm0 -H
modelo/proto/hmm_nueve -l nueve -L datos/lab/ nueve
9
Los archivos de definición inicializados puedes encontrarlos en modelo\hmm0 (carpeta que
antes estaba vacía).
– Entrenamiento
27 – Para re-estimar los modelos, ejecuta:
HREST –T 1 -S entrenamiento/entrenamiento.txt -M modelo/hmm1
-v 2e-3 -H modelo/hmm0/s -l s -L datos/lab/ s
El algoritmo se detiene automáticamente. Aquí, -v 2e-003 es un límite inferior para la
varianza, que el algoritmo necesita para converger.
Figura 10. Proceso de re-estimación.
Puedes crear un archivo .bat, al igual que al inicializar los modelos, que contenga todos los
comandos de entrenamiento:
Contenido de REESTIMA.bat
HREST -S entrenamiento/entrenamiento.txt -M modelo/hmm1 -v 2e-003 -H
modelo/hmm0/hmm_s -l s -L datos/lab/ s
HREST -S entrenamiento/entrenamiento.txt -M modelo/hmm1 -v 2e-003 -H
modelo/hmm0/hmm_cero -l cero -L datos/lab/ cero
(…)
HREST -S entrenamiento/entrenamiento.txt -M modelo/hmm1 -v 2e-003 -H
modelo/hmm0/hmm_ocho -l ocho -L datos/lab/ ocho
HREST -S entrenamiento/entrenamiento.txt -M modelo/hmm1 -v 2e-003 -H
modelo/hmm0/hmm_nueve -l nueve -L datos/lab/ nueve
10
2.5 – Definición de la gramática
28 – Crea el archivo gramatica.txt en la carpeta definicion\. Su contenido deberá ser el
siguiente:
Contenido de gramatica.txt
$numero = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
( [.] $numero $numero $numero $numero $numero $numero
$numero $numero $numero [.] )
Esto le indicará al reconocedor que debe esperar un silencio inicial, nueve cifras y un silencio final.
29 – Crea el archivo diccionario.txt en la carpeta definicion\. Su contenido deberá ser
el siguiente:
Contenido de diccionario.txt
0
1
2
3
4
5
6
7
8
9
.
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[]
cero
uno
dos
tres
cuatro
cinco
seis
siete
ocho
nueve
s
Este archivo le indica al reconocedor la relación entre las variables de gramática, lo que queremos
que muestre y los HMM definidos anteriormente.
Nota: No olvides incluir una nueva línea tras la última, para que ésta cuente.
30 – Ejecuta el siguiente comando para crear una red a partir del archivo de gramática:
HPARSE definicion\gramatica.txt definicion\red.slf
2.6 – Reconocimiento de voz en vivo
31 – Crea el archivo listahmm.txt en la carpeta definicion\. Su contenido deberá ser el
siguiente:
11
Contenido de listahmm.txt
s
cero
uno
dos
tres
cuatro
cinco
seis
siete
ocho
nueve
Este archivo simplemente lista los nombres de los HMMs que representan las palabras que
usaremos.
Nota: No olvides incluir una nueva línea tras la última, para que ésta cuente.
32 – En la carpeta configuracion\ haz una copia de analisis.conf y llámala
directin.conf. Ábrela con un editor de texto y añade los siguientes parámetros:
Añadido en directin.conf
SOURCERATE = 625.0
SOURCEKIND = HAUDIO
AUDIOSIG = -1
# 16 kHz de freciencia de muestreo
# Entrada directa de audio
# Reconocimiento controlado por teclado
33 – Ejecuta el siguiente comando. Puedes crear un archivo .bat:
HVITE -C analisis\directin.conf -g -H modelo\hmm1\hmm_s -H
modelo\hmm1\hmm_cero -H modelo\hmm1\hmm_uno -H
modelo\hmm1\hmm_dos -H modelo\hmm1\hmm_tres -H
modelo\hmm1\hmm_cuatro -H modelo\hmm1\hmm_cinco -H
modelo\hmm1\hmm_seis -H modelo\hmm1\hmm_siete -H
modelo\hmm1\hmm_ocho -H modelo\hmm1\hmm_nueve -w
definicion\red.slf definicion\diccionario.txt
definicion\listahmm.txt
Nota: No olvides poner ninguno de los once HMMs que vamos a usar (silencio y cifras de cero a
nueve).
34 - Al ejecutarlo, aparecerá un indicador READY[1]> en la pantalla, indicando que comienza la
grabación en tiempo real. La grabación finalizará cuando pulsemos alguna tecla. En ese momento,
se muestra la transcripción reconocida por el sistema, tras lo que se mostrará un nuevo
READY[2]> esperando una nueva entrada. Prueba el reconocedor que has implementado.
12
Figura 6.11. Reconocimiento en vivo.
13
Descargar