00 27/05/2013 15:05
Inserimento del modello silenzio all'interno dei nostri HMMs.

Subito al lavoro!
Apriamo risorse del computer, poi C:, poi cygwin, poi home, poi nomeUtente, poi voxforge, poi manual, poi hmm3.
Dentro hmm3 troverete 2 file, copiateli.
Tornate indietro nella cartella manual e aprite la cartella hmm4.
Incollate dentro la cartella hmm4 (che troverete vuota), i file che precedentemente avete copiato.
Dopo aver incollato hmmdefs e macro, aprite il file hmmdefs.
Quello che vedete è la definizione dei modelli nascosti per ogni fonema che avete creato.
Ogni definizione di modello nascosto ha questa struttura (vi ricordo che i trattini non ci sono in quel che leggete, ma li devo scrivere, altrimenti non viene visualizzato correttamente il contenuto testuale che vi espongo..):
~h "a" (che è il nome del fonema)
<-BEGINHMM-> (indica che seguono i dati che interessano all'HTK)
<-NUMSTATES-> 5
<-STATE-> 2
<-MEAN-> 25
-5.906928e+00 1.628486e-01 -3.625001e+00 -2.614522e-01 -5.282461e-01 2.667645e+00 5.102982e+00 1.545549e+00 3.636499e+00 3.845983e+00 1.652724e+00 3.094676e+00 -1.280174e-02 4.684002e-03 -6.184035e-03 2.562511e-03 -1.723273e-02 -1.433755e-02 -1.419702e-03 6.881847e-03 8.888377e-03 1.908680e-02 -1.435490e-03 -1.790903e-03 -1.929774e-02
<-VARIANCE-> 25
2.578038e+00 4.442047e+00 4.140977e+00 7.220293e+00 5.614420e+00 6.987432e+00 6.700070e+00 7.252159e+00 7.256308e+00 7.189629e+00 6.118056e+00 6.151144e+00 8.845596e-02 1.685021e-01 2.721096e-01 3.408231e-01 4.153289e-01 6.151640e-01 6.025191e-01 5.456595e-01 6.351454e-01 6.605052e-01 6.318872e-01 5.852073e-01 4.117725e-02
<-GCONST-> 5.280386e+01
<-STATE-> 3
<-MEAN-> 25
-7.046570e+00 -3.262981e-01 -1.706483e+00 -1.080971e+00 -1.134529e+00 3.588506e+00 3.917166e+00 1.443405e+00 4.899211e+00 3.409961e+00 8.219168e-01 3.644213e+00 -7.641904e-02 -6.077167e-02 2.118241e-01 -8.631640e-02 3.686112e-02 8.506200e-02 -8.106526e-02 1.066912e-02 1.281262e-01 -1.437282e-01 -3.412217e-02 1.333326e-01 1.202221e-01
<-VARIANCE-> 25
7.911258e+00 8.348815e+00 1.148870e+01 1.213321e+01 8.655976e+00 1.509970e+01 9.904381e+00 1.166922e+01 1.025182e+01 8.845907e+00 8.135198e+00 9.622693e+00 9.084668e-01 7.631339e-01 1.614822e+00 9.755048e-01 7.167343e-01 1.691362e+00 1.297928e+00 9.801642e-01 1.225108e+00 1.051384e+00 9.349809e-01 1.529028e+00 5.576642e-01
<-GCONST-> 7.411308e+01
<-STATE-> 4
<-MEAN-> 25
1.987629e+00 8.999189e-01 3.864730e-01 -4.687709e-01 5.336301e-01 2.345200e-01 -8.621325e-01 1.230609e-01 -9.877484e-01 -1.324250e+00 1.351032e-01 -5.023057e-01 -1.919302e-02 -2.812544e-02 8.604265e-02 -5.349477e-02 5.288856e-03 2.348321e-02 -4.238142e-02 -1.502599e-02 1.916558e-02 -7.591232e-02 -1.932539e-02 5.544404e-02 7.039443e-02
<-VARIANCE-> 25
7.070191e+01 2.758622e+01 4.226409e+01 5.562771e+01 4.209383e+01 4.503211e+01 5.569194e+01 2.290340e+01 4.379171e+01 3.098044e+01 2.271026e+01 3.398006e+01 1.596598e+00 1.241183e+00 1.819241e+00 1.869536e+00 1.712559e+00 2.155400e+00 2.495838e+00 1.685049e+00 2.046765e+00 1.598639e+00 1.526519e+00 1.757828e+00 1.175106e+00
<-GCONST-> 9.682940e+01
<-TRANSP-> 5
0.000000e+00 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
0.000000e+00 9.641963e-01 3.580364e-02 0.000000e+00 0.000000e+00
0.000000e+00 0.000000e+00 8.946286e-01 1.053714e-01 0.000000e+00
0.000000e+00 0.000000e+00 0.000000e+00 9.613560e-01 3.864404e-02
0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
<-ENDHMM-> (indica la fine del modello nascosto)

Cercate all'interno del file la parola sil, dovreste trovarla quasi alla fine del file. In pratica dovete cercare il modello nascosto che esprime il fonema "sil", ovvero qualcosa del genere:

~h "sil" (che è il nome del fonema che dovete trovare)
<-BEGINHMM-> (indica che seguono i dati che interessano all'HTK)
<-NUMSTATES-> 5
<-STATE-> 2
<-MEAN-> 25
-5.906928e+00 1.628486e-01 -3.625001e+00 -2.614522e-01 -5.282461e-01 2.667645e+00 5.102982e+00 1.545549e+00 3.636499e+00 3.845983e+00 1.652724e+00 3.094676e+00 -1.280174e-02 4.684002e-03 -6.184035e-03 2.562511e-03 -1.723273e-02 -1.433755e-02 -1.419702e-03 6.881847e-03 8.888377e-03 1.908680e-02 -1.435490e-03 -1.790903e-03 -1.929774e-02
<-VARIANCE-> 25
2.578038e+00 4.442047e+00 4.140977e+00 7.220293e+00 5.614420e+00 6.987432e+00 6.700070e+00 7.252159e+00 7.256308e+00 7.189629e+00 6.118056e+00 6.151144e+00 8.845596e-02 1.685021e-01 2.721096e-01 3.408231e-01 4.153289e-01 6.151640e-01 6.025191e-01 5.456595e-01 6.351454e-01 6.605052e-01 6.318872e-01 5.852073e-01 4.117725e-02
<-GCONST-> 5.280386e+01
<-STATE-> 3
<-MEAN-> 25
-7.046570e+00 -3.262981e-01 -1.706483e+00 -1.080971e+00 -1.134529e+00 3.588506e+00 3.917166e+00 1.443405e+00 4.899211e+00 3.409961e+00 8.219168e-01 3.644213e+00 -7.641904e-02 -6.077167e-02 2.118241e-01 -8.631640e-02 3.686112e-02 8.506200e-02 -8.106526e-02 1.066912e-02 1.281262e-01 -1.437282e-01 -3.412217e-02 1.333326e-01 1.202221e-01
<-VARIANCE-> 25
7.911258e+00 8.348815e+00 1.148870e+01 1.213321e+01 8.655976e+00 1.509970e+01 9.904381e+00 1.166922e+01 1.025182e+01 8.845907e+00 8.135198e+00 9.622693e+00 9.084668e-01 7.631339e-01 1.614822e+00 9.755048e-01 7.167343e-01 1.691362e+00 1.297928e+00 9.801642e-01 1.225108e+00 1.051384e+00 9.349809e-01 1.529028e+00 5.576642e-01
<-GCONST-> 7.411308e+01
<-STATE-> 4
<-MEAN-> 25
1.987629e+00 8.999189e-01 3.864730e-01 -4.687709e-01 5.336301e-01 2.345200e-01 -8.621325e-01 1.230609e-01 -9.877484e-01 -1.324250e+00 1.351032e-01 -5.023057e-01 -1.919302e-02 -2.812544e-02 8.604265e-02 -5.349477e-02 5.288856e-03 2.348321e-02 -4.238142e-02 -1.502599e-02 1.916558e-02 -7.591232e-02 -1.932539e-02 5.544404e-02 7.039443e-02
<-VARIANCE-> 25
7.070191e+01 2.758622e+01 4.226409e+01 5.562771e+01 4.209383e+01 4.503211e+01 5.569194e+01 2.290340e+01 4.379171e+01 3.098044e+01 2.271026e+01 3.398006e+01 1.596598e+00 1.241183e+00 1.819241e+00 1.869536e+00 1.712559e+00 2.155400e+00 2.495838e+00 1.685049e+00 2.046765e+00 1.598639e+00 1.526519e+00 1.757828e+00 1.175106e+00
<-GCONST-> 9.682940e+01
<-TRANSP-> 5
0.000000e+00 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
0.000000e+00 9.641963e-01 3.580364e-02 0.000000e+00 0.000000e+00
0.000000e+00 0.000000e+00 8.946286e-01 1.053714e-01 0.000000e+00
0.000000e+00 0.000000e+00 0.000000e+00 9.613560e-01 3.864404e-02
0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
<-ENDHMM-> (indica la fine del modello nascosto)

Dopo averlo trovato, copiate l'intero contenuto del modello nascosto, da ~h "sil", fino a <-ENDHMM-> (copiate, non tagliate, mi raccomando!)
Posizionatevi alla fine del file, quindi dopo <-ENDHMM-> (posizionado il cursore alla destra del simbolo maggiore ">") e premete invio.
Quindi incollate sul nuovo rigo che avete appena scritto il modello sil che avete copiato prima.
Nella copia del modello sil dovete fare le seguenti modifiche:
1- posizionatevi dove sta scritto ~h "sil" e modificatelo scrivendo ~h "sp";
2- cancellate da "<-STATE-> 2" (<-STATE-> 2 compreso) fino a "<-GCONST->" (dopo <-GCONST-> vedrete un numero, va cancellato anche quello!);
3- Cambiate il numero che sta dopo "<-NUMSTATES->" in 2;
4- Cambiate il numero che sta dopo "<-STATE->" in 2;
5- Cambiate il numero che sta dopo "<-TRANSP->" in 3;
6- Cancellate i numeri che stanno tra <-TRANSP-> e <-ENDHMM->, in modo da vedere scritto qualcosa del genere:

~h "sp"
<-BEGINHMM->
<-NUMSTATES-> 3
<-STATE-> 2
<-MEAN-> 25
-7.046570e+00 -3.262981e-01 -1.706483e+00 -1.080971e+00 -1.134529e+00 3.588506e+00 3.917166e+00 1.443405e+00 4.899211e+00 3.409961e+00 8.219168e-01 3.644213e+00 -7.641904e-02 -6.077167e-02 2.118241e-01 -8.631640e-02 3.686112e-02 8.506200e-02 -8.106526e-02 1.066912e-02 1.281262e-01 -1.437282e-01 -3.412217e-02 1.333326e-01 1.202221e-01
<-VARIANCE-> 25
7.911258e+00 8.348815e+00 1.148870e+01 1.213321e+01 8.655976e+00 1.509970e+01 9.904381e+00 1.166922e+01 1.025182e+01 8.845907e+00 8.135198e+00 9.622693e+00 9.084668e-01 7.631339e-01 1.614822e+00 9.755048e-01 7.167343e-01 1.691362e+00 1.297928e+00 9.801642e-01 1.225108e+00 1.051384e+00 9.349809e-01 1.529028e+00 5.576642e-01
<-GCONST-> 7.411308e+01
<-TRANSP-> 3
<-ENDHMM->

Non vi resta che posizionare il cursore del mouse dopo il <-TRANSP-> 3 (dopo il 3) e premere invio, in modo da vedere questo:
<-TRANSP-> 3

<-ENDHMM->

Copiate quello che segue tra doppi apici (senza copiare i doppi apici)
" 0.0 1.0 0.0
0.0 0.9 0.1
0.0 0.0 0.0"
Tornate sul file hmmdefs e incollate i numeri nel rigo bianco tra <-TRANSP-> e <-ENDHMM->, in modo da ottenere questo che segue:

<-TRANSP-> 3
0.0 1.0 0.0
0.0 0.9 0.1
0.0 0.0 0.0
<-ENDHMM->

Alla fine, il vostro modello sp, dovrebbe essere tipo questo (differendo ovviamente dai numeri decimali, che di sicuro saranno diversi):

~h "sp"
<-BEGINHMM->
<-NUMSTATES-> 3
<-STATE-> 2
<-MEAN-> 25
-7.046570e+00 -3.262981e-01 -1.706483e+00 -1.080971e+00 -1.134529e+00 3.588506e+00 3.917166e+00 1.443405e+00 4.899211e+00 3.409961e+00 8.219168e-01 3.644213e+00 -7.641904e-02 -6.077167e-02 2.118241e-01 -8.631640e-02 3.686112e-02 8.506200e-02 -8.106526e-02 1.066912e-02 1.281262e-01 -1.437282e-01 -3.412217e-02 1.333326e-01 1.202221e-01
<-VARIANCE-> 25
7.911258e+00 8.348815e+00 1.148870e+01 1.213321e+01 8.655976e+00 1.509970e+01 9.904381e+00 1.166922e+01 1.025182e+01 8.845907e+00 8.135198e+00 9.622693e+00 9.084668e-01 7.631339e-01 1.614822e+00 9.755048e-01 7.167343e-01 1.691362e+00 1.297928e+00 9.801642e-01 1.225108e+00 1.051384e+00 9.349809e-01 1.529028e+00 5.576642e-01
<-GCONST-> 7.411308e+01
<-TRANSP-> 3
0.0 1.0 0.0
0.0 0.9 0.1
0.0 0.0 0.0
<-ENDHMM->

Salvate il file e chiudetelo.
Tornate nella cartella manual e create un nuovo file, dal nome sil.hed.
Dentro a sil.hed, incollateci il seguente testo contenuto tra doppi apici (senza copiare i doppi apici):
"AT 2 4 0.2 {sil.transP}
AT 4 2 0.2 {sil.transP}
AT 1 3 0.3 {sp.transP}
TI silst {sil.state[3],sp.state[2]}"

Aprite la cygwin e scrivete:
cd voxforge (invio)
cd manual (invio)
cd hmm4 (invio)
dos2unix hmmdefs (invio)
cd .. (invio)
dos2unix sil.hed (invio)
HHEd -A -D -T 1 -H hmm4/macros -H hmm4/hmmdefs -M hmm5 sil.hed monophones1 (invio)

Non chiudete la cygwin!
L'elaborazione potrebbe richiedere alcuni minuti, aspettate che finisca e controllate bene che non ci sia scritto FATAL ERROR nell'ultima riga che vi viene stampata a video.
Se leggete FATAL ERROR, bhè avete 3 cose possibili da fare:
1- Mettete a repentaglio la vostra sanità mentale studiandovi l'HTK;
2- Rifate tutto il procedimento d'accapo;
3- Vi segnate il messaggio di errore (vedrete anche un numerino) e chiedete su questo forum cosa fare..

Finita l'elaborazione di HHEd, scrivete sulla cygwin:
HERest -A -D -T 1 -C config -I phones1.mlf -t 250.0 150.0 3000.0 -S train.scp -H hmm5/macros -H hmm5/hmmdefs -M hmm6 monophones1 (invio)

Anche qui c'è da aspettare e pregate che non vi dia errori!
Dopo che HERest ha finito scrivete (sempre nella cygwin):
HERest -A -D -T 1 -C config -I phones1.mlf -t 250.0 150.0 3000.0 -S train.scp -H hmm6/macros -H hmm6/hmmdefs -M hmm7 monophones1 (invio)

Stessa storia, un pò di pazienza, c'è da aspettare l'elaborazione.

Avete appena concluso lo Step 7 del tutorial voxforge che trovate qui:
www.voxforge.org/home/dev/acousticmodels/windows/create/htkjulius/tutorial/monophone...

Ora avete fissato il modello "piccola pausa di silenzio" e potete costruire modelli nascosti idonei per il riconoscimento vocale!
Fin ora abbiamo giocato, ora comincia il vero divertimento!

Nel prossimo post effettueremo una particolare elaborazione dei nostri dati di training, atta a uniformare la pronuncia aperta e/o chiusa di alcuni suoni (come le vocali)..