00 12/05/2013 16:27
Premessa:
Virtualmente è possibile astrarre, attraverso regole matematiche (quindi numeri ed equazioni), comportamenti naturali (processi naturali), come la combustione, gli urti e anche il suono.
Naturalmente il suono viene percepito dal nostro orecchio, attraverso la capacità che ha il timpano, di piegarsi quando varia la pressione dell'aria.
Il timpano del computer, nel nostro caso, è il microfono.
Il microfono "sente" un suono, grazie alla variazione di pressione dell'aria che genera lo stesso suono.
Il nostro scopo è quello di "virtualizzare" quello che naturalmente succede nel nostro cervello quando il timpano sente una variazione di pressione dell'aria e quindi un suono.
Il nostro cervello, è infatti in grado, non solo di utilizzare i suoni che sente il timpano, ma anche di effettuare previsioni, nel caso in cui il timpano senta male.
Non potremmo mai dare a Julius la stessa intelligenza predittiva che ha il nostro cervello, ma qualcosina di lontanamente simile la possiamo ricreare grazie all'utilizzo della matematica statistica predittiva.
Il suono percepito dal microfono, come quello che percepisce l'orecchio umano, non è mai costituito da una sola componente..
ES:
Se io dico ad alta voce "ciao", il mio timpano non sentirà solo il suono che hanno generato le mie corde vocali, ma anche altri suoni, che non sono stati generati dalle mie corde vocali e che quindi per i nostri scopi, possono essere definiti rumori.
I rumori sono suoni non prevedibili a priori, perchè "aleatori".
Il Sig. Markov, si è inventato una procedura matematica che fa al caso nostro.
In maniera drasticamente semplificata, un modello nascosto di Markov, deve essere caricato con degli esempi (esempi di training) e dopo può essere utilizzato per ascoltare un suono (mischiato con rumore) e prevedere (azzardare, stimare), statisticamente, questo suono privo di rumore a quale lettera o parola corrisponde.

TUTORIAL:
Aprire risorse del computer, quindi C:, quindi cygwin, poi home, poi nomeUtente, poi voxforge, poi manual.
Dentro la cartella manual creare un nuovo file e chiamarlo proto.
Prima di creare modelli nascosti di Markov (HMM) descriventi parole, dobbiamo creare quelli che descrivo i fonemi.. E prima ancora di creare i HMM che descrivono fonemi, dobbiamo creare un "prototipo" di HMM. Creiamo il prototipo:
apriamo il file proto e copiamoci dentro quel che segue tra doppie virgolette (senza virgolette!E senza i trattini che trovate dopo il segno minore e prima del segno maggiore):
"~o <-VecSize-> 25 <-MFCC_0_D_N_Z->
~h "proto"
<-BeginHMM->
<-NumStates-> 5
<-State-> 2
<-Mean-> 25
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<-Variance-> 25
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
<-State-> 3
<-Mean-> 25
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<-Variance-> 25
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
<-State-> 4
<-Mean-> 25
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<-Variance-> 25
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-> 5
0.0 1.0 0.0 0.0 0.0
0.0 0.6 0.4 0.0 0.0
0.0 0.0 0.6 0.4 0.0
0.0 0.0 0.0 0.7 0.3
0.0 0.0 0.0 0.0 0.0
<-EndHMM->"
Prima di salvare, posizionarsi, con il cursore del mouse, dopo <-EndHMM-> e lasciare un rigo.
Quindi salvare e chiudere il file.
Quello che noi abbiamo scritto non è altro che un HMM con 5 stati.
Creare un nuovo file dentro la cartella manual e chiamarlo config.
Copiare dentro al file appena creato il seguente testo tra doppie virgolette (senza le doppie virgolette):
"TARGETKIND = MFCC_0_D_N_Z
TARGETRATE = 100000.0
SAVECOMPRESSED = T
SAVEWITHCRC = T
WINDOWSIZE = 250000.0
USEHAMMING = T
PREEMCOEF = 0.97
NUMCHANS = 26
CEPLIFTER = 22
NUMCEPS = 12"

Sempre nella cartella manual, create una nuova cartella e chiamatela hmm0.
Ancora in manual, create un nuovo file e chiamatelo train.scp.
Il file train.scp, è simile al file codetrain.scp, ma deve contenere un solo indirizzo. Dobbiamo infatti dare all'HTK, gli indirizzi dei file .mfc che abbiamo creato nello step precedente!
Dentro al file train.scp, va scritto qualcosa del tipo:
"../train/mfcc/sample1.mfc
../train/mfcc/sample2.mfc
../train/mfcc/sample3.mfc
...
...
../train/mfcc/sampleULTIMONUMERO.mfc"
Per ogni file sonoro, abbiamo il corrispondente mfc dentro la cartella mfcc. Per ciascun file contenuto nella cartella C:/cygwin/home/nomeUtente/voxforge/train/mfcc/ dobbiamo avere un rigo dentro al file train.scp.
Se avessimo voluto registrare 10 sample, avendo chiamato il primo "sample1", allora dentro il nostro train.scp, avremmo dovuto scrivere:
"../train/mfcc/sample1.mfc
../train/mfcc/sample2.mfc
../train/mfcc/sample3.mfc
../train/mfcc/sample4.mfc
../train/mfcc/sample5.mfc
../train/mfcc/sample6.mfc
../train/mfcc/sample7.mfc
../train/mfcc/sample8.mfc
../train/mfcc/sample9.mfc
../train/mfcc/sample10.mfc"
Aprire la cygwin e scrivere:
cd voxforge (invio)
cd manual (invio)
dos2unix proto (invio)
dos2unix config (invio)
dos2unix train.scp (invio)
HCompV -A -D -T 1 -C config -f 0.01 -m -S train.scp -M hmm0 proto (invio)

L'esecuzione dei comandi di sopra creerà il nostro primo HMM dentro la cartella hmm0. Aprite la cartella hmm0 e controllate che all'interno ci siano i file:
- proto
- vFloors
Ci sono??
Si, ottimo!
Si, ma sono file vuoti, oppure non ci sono... Riscrivete sulla cygwin:
HCompV -A -D -T 1 -C config -f 0.01 -m -S train.scp -M hmm0 proto (invio)
Segnatevi il messaggio che vi scrive HCompV e chiedete qui in forum, avete fatto qualche errore! O ricominciate d'accapo, oppure mi fate vedere l'errore che vi dà HCompV e magari potete risparmiarvi qualche sbattimento..

Entrate nella cartella manual e copiate il file monophones0.
Per copiare un file, basta cliccare sul nome del file con il pulsante destro del mouse e selezionare "copia".
Aprire la cartella hmm0 e incollare il file appena copiato.
Per incollare un file che precedentemente è stato copiato, basta cliccare con il pulsante destro del mouse all'interno di una cartella e selezionare "incolla".
Dopo aver incollato il file monophones0 dentro la cartella hmm0, questo nuovo file, si chiamerà monophones0.
Quindi dentro la cartella hmm0 vi trovate 3 file:
- vFloors
- proto
- monophones0
Rinominate il file monophones0, con il nuovo nome "hmmdefs".
Aprite il file hmmdefs, dentro trovate, per ogni rigo, un fonema del vostro modello.
Prima di ogni fonema scrivere "~h" (senza le virgolette) e lasciate uno spazio, poi mettete tra doppi apici il fonema che trovate.
ES
hmmdefs prima:
a
b
ci
..
hmmdefs dopo:
~h "a"
~h "b"
~h "ci"
..
Non chiudete il file hmmdefs.
Aprite il file dal nome proto, che è contenuto nella cartella hmm0.
All'interno del file proto, copiate il testo contenuto da <-BEGINHMM-> fino a <-ENDHMM-> (ricordatevi che i trattini dopo il segno minore e maggiore, li scrivo solo perchè altrimenti ffz non mi fa visualizzare la parola, ma non ci sono, nè vanno aggiunti!), copiando anche le due parole chiave menzionate.
Chiudete il file proto e tornate sul file hmmdefs.
Posizionate il cursore del mouse dopo il primo fonema tra virgolette (a destra dell'ultima virgoletta), premete invio e incollate nel rigo di sotto quello che prima avevate copiato dal file proto.
ES:
hmmdefs prima:
~h "a"
~h "b"
~h "ci"
..
hmmdefs dopo (i trattini non vanno scritti!):
~h "a"
<-BEGINHMM->
..
<-ENDHMM->
~h "b"
<-BEGINHMM->
..
<-ENDHMM->
~h "ci"
<-BEGINHMM->
..
<-ENDHMM->
..
Non avete bisogno di copiare ogni volta la porzione di codice che vi interessa e contenuta in proto. Basta copiarla una sola volta per essere incollata tutte le volte che volete.
Dopo aver finito questa operazione, posizionate il cursore del mouse alla fine del file hmmdefs, proprio dopo la parola chiave <-ENDHMM-> e premete invio, in modo da lasciare un rigo bianco alla fine del file.
Salvate il file e chiudetelo.
Create un nuovo file dentro hmm0 e chiamatelo macros.
Aprite il file vFloors che avete dentro la vostra cartella hmm0 e copiatene l'intero contenuto.
Chiudete il file vFloors.
Aprite il file macros e incollateci dentro quello che avete copiato.
Lasciate aperto il file macros e aprite anche il file proto.
Da dentro proto copiate il frammento di testo che va da "~o" a "<-DIAGC->", copiando anche le parole chiave menzionate (sono i primi 5 righi di proto!).
Chiudete il file proto.
Tornate al file macros e incollate quel che avete copiato dal file proto all'inizio del file macros.
ES:
macros prima (i trattini non ci sono,servono solo per far visualizzare la parola chiave!):
~v varFloor1
<-Variance-> 25
....
macros dopo:
~o
<-STREAMINFO-> 1 25
<-VECSIZE-> 25<-NULLD-><-MFCC_D_N_Z_0-><-DIAGC->
~v varFloor1
<-Variance-> 25
....

Salvate il file macros e chiudetelo.
Create nella cartella manual altre 9 cartelle:
- hmm1
- hmm2
- hmm3
- hmm4
- hmm5
- hmm6
- hmm7
- hmm8
- hmm9
Aprite la cygwin e scrivete:
cd voxforge (invio)
cd manual (invio)
cd hmm0 (invio)
dos2unix macros (invio)
dos2unix hmmdefs (invio)
cd .. (invio)
HERest -A -D -T 1 -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm0/macros -H hmm0/hmmdefs -M hmm1 monophones0 (invio)
HERest -A -D -T 1 -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm1/macros -H hmm1/hmmdefs -M hmm2 monophones0 (invio)
HERest -A -D -T 1 -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H hmm2/macros -H hmm2/hmmdefs -M hmm3 monophones0 (invio)

La funzione HERest la prima volta che viene eseguita ci metterà un pò di tempo ad effettuare la sua elaborazione, dipende da quanti esempi di training avete registrato!
Se avete effettuato errori, vi bloccherete alla prima esecuzione di HERest e le altre non andranno a buon fine (leggerete FATAL ERROR).
Vi invito, anche per HERest, a segnarvi l'errore e domandare qui in forum, da cosa potrebbe derivare l'errore.

La prima volta che ho costruito un modello acustico, proprio a questo punto, sono rimasto bloccato per più di 10 gironi a causa di FATAL ERROR che mi dava la prima HERest.. Per poi capire (studiando l'HTK book), che sul sito di voxforge la I (i stampatello) sembra una l (l minuscola).

Avete appena concluso lo step 6 del tutorial voxforge per windows, che trovate qui: www.voxforge.org/home/dev/acousticmodels/windows/create/htkjulius/tutorial/monophone...

..Nel prossimo post considereremo anche il silenzio tra parole e lo andremo ad inserire nei nostri HMM, in modo da poter dare la capacità al nostro modello acustico, di distinguere le parole, semplicemente confrontando due pause di silenzio..
[Modificato da calel82 12/05/2013 16:33]