00 25/04/2013 16:25
PREPARAZIONE DEI DATI:
Spiegazione del .voca e di come si lega al .grammar.

Per questo tutorial useremo una grammatica diversa da quella che utilizza il tutorial di voxforge. Questo perchè non vogliamo utilizzare un riconoscimento di frasi note e che hanno sempre la stessa struttura, ma vogliamo che Julius (non Julian) riconosca qualsiasi tipo di frase.
Nel sito dove è possibile scaricare Julius, troviamo anche tutta la documentazione relativa all'engine, tra le varie cose, troviamo anche un tutorial che spiega come utilizzare le grammatiche.
Qui trovate il tutorial sulle grammatiche di Julius:
http://julius.sourceforge.jp/en_index.php?q=en_grammar.html
Tra le varie grammatiche troviamo questa:

S: NS_B WORD_LOOP NS_E
WORD_LOOP: WORD_LOOP WORD
WORD_LOOP: WORD

La grammatica (o le grammatiche) che vengono utilizzate per il riconoscimento vocale hanno un grosso impatto sulla prestazione di Julius e sono importantissime per ottenere un buon riconoscimento.
Diamo un occhio veloce a questa grammatica:
(primo rigo) S: NS_B WORD_LOOP NS_E
Con questo rigo diciamo a Julius di aspettarsi che lo speaker dica nell'ordine:
1° parola: una qualsiasi parola contenuta nell'insieme "NS_B";
2° parola: una qualsiasi parola contenuta nell'insieme "WORD_LOOP";
3° parola: una qualsiasi parola contenuta nell'insieme "NS_E".
(secondo rigo) WORD_LOOP: WORD_LOOP WORD
Ora diciamo a Julius che nell'insieme di parole chiamato "WORD_LOOP", ci troverà nuovamente l'insieme "WORD_LOOP" e dopo l'insieme di parole chiamato "WORD".
(terzo rigo) WORD_LOOP: WORD
In ultimo diciamo che l'insieme di parole chiamato "WORD_LOOP" è esattamente identico all'insieme di parole chiamato "WORD".
TRADOTTO:
Abbiamo semplicemente detto a Julius aspettati un minimo di due parole anche uguali e un massimo di innumerabili parole (da due a quante ne dice lo speaker).. Niente di più!

Ora basta chiacchiere e cominciamo a costruire il modello acustico!
Aprire Risorse del computer, poi C:, poi cygwin, poi home e aprire la cartella che si chiama come il proprietario del computer, oppure con il nome del computer (se non avete giocato con la cygwin, dovreste trovare sempre e solo 1 cartella, è quella non potete sbagliare!).
Dentro questa cartella createne un'altra e chiamatela "voxforge", dentro la cartella voxforge, createne un'altra e chiamatela "manual".

Ora possiamo creare il file .grammar.

Cliccare all'interno della cartella manual con il pulsante destro e selezionate "Nuovo" e poi "nuovo documento di testo".
Si creerà un nuovo documento dal nome "nuovo documento.txt".
Rinominatelo sample.grammar.
(Subito dopo aver creato il nuovo file di testo, l'icona del nuovo file dovrebbe essere già pronta per essere rinominata e vi basta scrivere il nuovo nome. Nel caso non succeda o abbiate difficoltà, basta cliccare con il pulsante destro del mouse sopra al file appena creato e scegliere "Rinomina")
Dopo aver rinominato il file, potreste visualizzare un messaggio tipo "voi cambiare l'estensione?", la vostra risposta deve essere SI ;-)
All'interno del file sample.grammar, incollate le righe seguenti, contenute tra doppi apici (senza copiare i doppi apici):

"S: NS_B WORD_LOOP NS_E
WORD_LOOP: WORD_LOOP WORD
WORD_LOOP: WORD"

Salvate il file e chiudetelo.
Il file così creato è in codifica Windows, ma a noi serve in codifica Unix, quindi dobbiamo convertirlo con uno strumento che si chiama dos2unix.
Apriamo "risorse del computer", poi C: e cygwin.
Tra le icone cliccate sulla terz'ultima che dovrebbe chiamarsi "cygwin.bat", oppure un qualsiasi nome ma sempre .bat.
Questa procedura attiva la cygwin.
Di default vi trovate in C:/cygwin/home/nomeUtente/ e dovete raggiungere C:/cygwin/home/nomeUtente/voxforge/manual/.
Quindi scrivete dentro la cygwin:
cd voxforge (poi premere invio)
cd manual (poi premere invio)
dos2unix sample.grammar (poi premere invio)
Così abbiamo convertito il file sample.grammar in formato Unix e possiamo utilizzarlo senza problemi in ambiente Unix.

Nel grammar file abbiamo dichiarato di voler utilizzare 3 insiemi (categorie) di parole: NS_B, WORD_LOOP e NS_E.
Ora dobbiamo comunicare a Julius quali parole fanno parte di ciascun insieme (categoria). Per farlo utilizziamo un file che deve avere estensione .voca.
Il grammar file e il voca file esprimono concetti legati tra loro, quindi è buona norma che abbiano lo stesso nome!
Se il grammar file lo abbiamo chiamato sample.grammar, allora il voca file lo chiameremo sample.voca.
Ma come va costruito il voca file?
C'è una sintassi specifica da seguire, questa sintassi è obbligatoria per poter far funzionare Julius e tutti gli strumenti HTK che utilizzeremo..
Consideriamo nuovamente la riga S: NS_B WORD_LOOP NS_E
-"S:" è una parola chiave che ha il significato: quello che segue è la mia frase;
-"NS_B" è la prima parola della mia frase. Questa parola è contenuta nell'insieme (categoria) che si chiama "NS_B";
-"WORD_LOOP" è la seconda parola (oppure tante parole) della mia frase. Questa parola (oppure queste parole), sono contenute nell'insieme chiamato "WORD_LOOP";
-"NS_E" è la terza e ultima parola della mia frase. Questa parola è contenuta nella categoria chiamata "NS_E".
Le liste di parole, oppure insiemi, oppure come volete chiamarle voi, non sono altro che un gruppo di parole, il cui gruppo è identificato dall'etichetta "NS_B", "WORD_LOOP" oppure "NS_E".
A sua volta "WORD_LOOP" viene completamente descritta da "WORD", nel rigo: WORD_LOOP: WORD
Ora queste categorie, queste liste, vanno specificate per bene!
Un esempio di come specificare una lista può essere:
data la grammatica: "S: NS_B NOME COGNOME TELEFONO NS_E"
NOME: (in stampatello il nome della lista e in piccolo i componenti)
Carlo
Michele
Francesco

COGNOME:
Rossi
Bianchi
Gialli

TELEFONO:
tretretrecinquequattrotre
tredueottoquattrotresette
treottonoveunounotrecinque

Questo non basta, a Julius servono anche i fonemi che costruiscono i suoni delle parole:
NOME:
Carlo k a r l o
Michele m i k e l e
Francesco f r a n ci e s k o
ecc ecc
Questo è il primo passaggio su cui bisogna fare attenzione!
Perchè si può scegliere qualsiasi simbolo per rappresentare un dato suono, ma poi quel simbolo deve essere utilizzato per tutte le occorrenze del suono considerato. Un errore di distrazione non verrà rilevato nei passi successivi e renderà il riconoscimento vocale PESSIMO!
Indipendentemente dalle parole che voi sceglierete, in questo tutorial si utilizzerà il seguente modello fonetico:
///////CORRISPONDENZA SIMBOLI SCELTI-FONEMI
/////// "GHL+consonante" --> ʎ di glicine
/////// "GL+vocale" --> ʎ di maglia
/////// "SCH+consonante" --> sk di scala
/////// "SC+e oppure +i" --> ʃ di ascia
/////// "B" --> b di buco
/////// "CI+e oppure +i" --> tʃ di cena
/////// "K+consonate oppure +a oppure +o oppure +u" --> k di cane
/////// "D" --> d di dado
/////// "F" --> f di farfalla
/////// "GO" --> g di gola
/////// "GG" --> dʒ di gelo e giglio
/////// "G" --> NOsimbolo di aggiungere
/////// "GH" --> g di ghiaccio
/////// "GN" --> ɲ di vigna
/////// "H" --> NOsimbolo di ha
/////// "I" --> j di ieri
/////// "L" --> l di lana
/////// "M" --> m di mela
/////// "NF" --> ɱ di anfora
/////// "NC" --> ŋ di anche
/////// "N" --> n m rispettivamente di nano e di un pò
/////// "P" --> p di pera
/////// "Q" --> k di quattro
/////// "R" --> r di raro
/////// "S" --> S di sale
/////// "T" --> t di topo
/////// "U" --> w di uomo
/////// "V" --> v di vero
/////// "Z" --> dz di zero
/////// "ZI" --> ts di azione
/////// "W" --> NOsimbolo di wresling
/////// "Y" --> NOsimbolo di yogurt
/////// "J" --> NOsimbolo di job
/////// "X" --> Nosimbolo di xilofono
/////// "EE" --> EE Verbo essere terza persona singolare presente indicativo.
Vi consiglio di utilizzare la mia tabella, perchè ho creato uno strumento che crea in automatico il voca file utilizzando questa struttura fonetica.. Ad ogni modo potete creare la vostra corrispondenza fonetica e utilizzare quella che preferite.
Dovete stare attenti solo al fatto che Julius e l'HTK non lavorano con lettere accentate. Le lettere accentate sono vietate!
Non è un problema se non per la "è", che ha una pronuncia decisamente diversa dalla "e". Per distinguerla, io uso la "EE".
Usando la mia tabella, quando effettuerete il riconoscimento vocale non leggerete da Julius "UNIVERSITA'" ma "UNIVERSITA" e la "E'" la leggerete "EE". In pratica, non si possono utilizzare lettere accentate nè in minuscolo, nè in maiuscolo.
Quindi utilizziamo una corrispondenza tra pronuncia e fonemi per descrivere ogni parola che vogliamo utilizzare e che dobbiamo scrivere nel file sample.voca.
Oltre a questo, dobbiamo rispettare la sintassi HTK.
Semplicemente, la sintassi HTK, ci dice che:
-Il nome delle categorie deve essere stampatello e preceduto dal simbolo "%";
-Le parole contenute nelle liste possono essere sia stampatello che minuscolo (ma in questo tutorial si userà lo stampatello);
-I fonemi devono essere divisi dallo spazio e possono essere sia minuscoli che maiuscoli (qui li scriviamo minuscoli).
ESEMPIO:
%NOME
CARLO k a r l o
MICHELE m i k e l e
MARIO m a r i o

Con un esempio pratico tutto sarà più chiaro...

Torniamo alla cartella manual che abbiamo creato prima e con lo stesso procedimento usato per creare il nuovo file "sample.grammar", creiamo il file "sample.voca".
Dentro al file sample.voca scriviamo prima quello che segue tra virgolette (senza le virgolette!), purtroppo non posso scrivere direttamente il codice, altrimenti viene interpretato da ffz.. Quindi scrivete esattamente quel che segue, ma non scrivete il simbolo "-", al posto del trattino non scriveteci niente:
"%NS_B
<-s->- sil

%NS_E
<-/-s-> sil

%WORD"

(fate riferimento a quello che sta scritto qui www.voxforge.org/home/dev/acousticmodels/windows/create/htkjulius/tutorial/data-pre... al paragrafo ".voca" dove comincia il tutorial)

Starete pensando.. Che cos'è ora quel "sil"?
Semplicemente NS_B sta per new sentence begin, ovvero "inizio della nuova frase", mentre NS_E "new sentence end".
Prima che si parla al microfono, c'è silenzio. Per cui l'ascolto del silenzio fa capire a Julius che sta per cominciare una nuova frase.
Dopo aver finito di parlare, c'è nuovamente silenzio.
E il fonema "sil" è l'astrazione del silenzio.
Quindi la nostra grammatica viene vista da Julius:
SILENZIO (almeno due parole) SILENZIO.
In realtà il discorso è molto complesso, ma basta sapere questo!
Dopo %WORD scrivete le parole che vorreste far "imparare" a Julius.
Giusto come esempio ne scriverò qualcuna, voi seguite il mio procedimento ma scrivete tutte le parole che volete!
Ecco il contenuto completo del file sample.voca (non copiate le virgolette!):

"%NS_B
sil

%NS_E
sil

%WORD
CARLO k a r l o
ARANCIA a r a n ci a
TASTIERA t a s t i e r a"

Le parole possono essere scritte in un qualsiasi ordine, basta che ci sia una sola parola per rigo.
Se decidete di far riconoscere a Julius meno di 500 parole, tenete presente che dovrete ripetere (con il training, che verrà descritto più avanti) ogni parola almeno 20 volte. Se ne vorrete scrivere tra 500 e 2000, dovrete ripetere ogni parola almeno 45 volte!

Dopo aver scritto tutte le parole che volete, salvate il file e chiudetelo.
Aprite la cygwin come ho descritto sopra, quindi nella cygwin scrivete:
cd voxforge (invio)
cd manual (invio)
dos2unix sample.voca (invio)
mkdfa.pl sample (invio)

L'ultimo comando serve a compilare i due file costruiti e crearne altri che ci serviranno dopo... Se non avete fatto errori dovreste leggere sulla cygwin:
---
Now parsing grammar file
Now modifying grammar to minimize states[-1]
Now parsing vocabulary file
Now making nondeterministic finite automaton[6/6]
Now making deterministic finite automaton[6/6]
Now making triplet list[6/6]
---
generated: sample.dfa sample.term sample.dict

Dovreste trovarvi a meno dei numeri tra parentesi quadre (anche se sono gli stessi non è un problema)!
Il comando di sopra vi ha creato tre file in C:/cygwin/home/nomeUtente/voxforge/manual/
questi file sono:
-sample.dfa
-sample.dict
-sample.term

Avete appena concluso lo step descritto qui:
www.voxforge.org/home/dev/acousticmodels/windows/create/htkjulius/tutorial/data-pre...

...Segue con la creazione del dizionario delle pronunce...
[Modificato da calel82 25/04/2013 16:34]