00 10/09/2012 16:50
PREPARAZIONE DEI DATI
1) Primo passo: creazione della grammatica (prima parte).
------------------------------------------------------------------------- Contesto: motore di riconoscimento vocale
Tutti i software di riconoscimento vocale sono costituiti da questi 3 componenti:
- Il modello di linguaggio. Questo componente contiene una lista ordinata alfabeticamente (per Julius) di tutte le parole che il motore di riconoscimento può riconoscere e le relative probabilità di utilizzo. Un altro componente molto legato al modello di linguaggio è la grammatica (o le grammatiche). Una grammatica (o più grammatiche) viene utilizzata per le applicazioni di riconoscimento vocale continuo e veloce, cioè nel dettato. Un file di grammatica, contiene all'interno una o più regole grammaticali, ogni engine ha una serie di parole chiavi e routine stabilita di costruzione della propria grammatica. Il modello di linguaggio è costruito attraverso diverse fasi elaborative e deve essere costruito attraverso l'utilizzo di una fonologia coerente per ogni parola, questa fonologia viene utilizzata per costruire il modello di linguaggio e per Julius, viene espressa attraverso un particolare file, che deve essere perfettamente uguale (come costruzione fonetica e parole contenute) a un altro chiamato lexicon.
- Il modello acustico. Questo è il componente essenziale di qualsiasi motore di riconoscimento vocale ed essenzialmente è un contenitore "intelligente" di esempi vocali (espressi non in formato sonoro, ma in un formato più veloce e più conveniente). Il modello acustico viene creato attraverso l'associazione di ogni forma d'onda sonora al corrispondente fonema (che è in formato testo) e attraverso svariati calcoli matematici e astrazioni concettuali su queste stesse associazioni. In pratica, un modello acustico, almeno per Julius, è un modello nascosto di Markov, che descrive, in maniera più o meno giusta (dipende dalla quantità di frasi esempio), una casistica di parole e le relative forme d'onda più probabili.
- Il decodificatore. Quest'ultimo componente è quello che effettua l'operazione di confronto tra la forma d'onda ascoltata (ciò che dice l'user) e una delle forme d'onda contenute e descritte attraverso il modello acustico. Il confronto viene effettuato fonema per fonema (vedrai che non è proprio così..), a cominciare dal primo rumore catturato dal microfono e finendo con la prima pausa di silenzio. Il confronto non può -per Julius- fallire. Ciò significa che se dici una parola che non hai inserito nel modello acustico, Julius non ti dirà che quella parola non la può riconoscere, ma arrotonderà quella parola a quella più simile che è contenuta nel modello acustico che gli hai dato in pasto.
Dopo il primo rumore e fino alla prima pausa di silenzio, il decodificatore elabora il confronto e stabilisce fonema per fonema (più o meno..) quale parola in formato testo è la più adatta a quella ascoltata e la presenta a video.
------------------------------------------------------------------------- La grammatica.
Una grammatica di riconoscimento non fa altro che preparare l'engine di riconoscimento vocale a una data forma di input. Ovvero, se l'engine deve essere utilizzato per ascoltare frasi fatte da soggetto, verbo e predicato, allora la grammatica ottimale per questa esigenza è proprio quella di SOGGETTO+VERBO+PREDICATO, ovvero, utilizzando le parole chiave che dopo spiegherò, si dovrà dire a Julius:
"aspettati che io ti dica 3 parole per frase, una è un soggetto, una è un verbo e una è un predicato".
Non farti prendere dal panico, non c'è bisogno di arrivare a tanto! Non hai bisogno di seguire uno schema stabilito per parlare. Ti spiegherò un trucchetto che ho letto nel sito di sviluppo di Julius, che ti eviterà tante rogne.. [SM=g27990]
------------------------------------------------------------------------- Come scrivere una grammatica per Julius.
Sia per Julius che per Julian la musica è la stessa. Devi creare due file: in uno ci metti una o più regole grammaticali, in un altro ci metti le parole e la loro fonologia.
Il file dove scrivi la regola grammaticale deve avere l'estensione ".grammar". Julius ha delle parole chiave stabilite per creare una sua grammatica e anche una serie di regole sintattiche. Ancora una volta, sembra una cosa complicatissima, ma è tutto di una facilità estrema, con un semplice esempio capisci tutto..
ESEMPIO DI GRAMMATICA E SPIEGAZIONE (1):
Quella che segue è una grammatica che, se utilizzata, istruisce Julius ad ascoltare una singola parola per volta:

S : NS_B LOOKUP NS_E

Poche parole, ma chiare. Guarda il primo rigo.
La "S :" è la parola chiave d'inizio grammatica, ovvero, va sempre scritta ed è sempre la stessa, non c'è niente da capire, Julius ti impone di scrivere sempre come prima cosa "S :" (e puoi pure non metterci lo spazio!).
Continua a leggere. "NS_B" è un acronimo di "NoiSe Begin", quindi già capisci che rappresenta il silenzio che precede il primo rumore (rumore nel senso stretto del termine e anche nel senso di onde sonore, quindi parlato). Niente da riflettere fin ora, hai già capito che il decodificatore comincia a lavorare che c'è silenzio e che aspetta il primo rumore..
Continua a leggere.. "LOOKUP" è una variabile, ovvero è un qualcosa che richiama un valore non predicibile a priori, che, appunto, è una parola ascoltata! "NS_E" è l'acronimo di "NoiSe End".
Quindi senza sapere niente di quello che concerne il complicato linguaggio adottato da Julius per le grammatiche, tu hai già capito che il primo rigo della grammatica descritta dice a Julius:
"Aspettati SILENZIO seguito da PAROLA seguito da SILENZIO".
Praticamente a Julius viene detto che sarà utilizzato per riconoscere una singola parola alla volta..
ESEMPIO DI GRAMMATICA E SPIEGAZIONE (2):
Quella che segue è una grammatica che, se utilizzata, istruisce Julius ad ascoltare due parole per volta:

S : NS_B LOOKUP NS_E
LOOKUP: CONNECT NAME

Magia! Il rigo di sopra è identico.. No, il rigo di sotto fa cambiare quello di sopra... Infatti se nel rigo di sopra ho detto a Julius di aspettarsi qualcosa del genere:
SILENZIO seguito da PAROLA seguito da SILENZIO
dopo gli scrivo:
PAROLA: PRIMAPAROLA SECONDAPAROLA
Ovvero "LOOKUP: CONNECT NAME" equivale a dire LOOKUP è fatto da CONNECT e da NAME.
Quindi è come se avessi scritto:
S : NS_B CONNECT NAME NS_E
Difficile? Non credo!

..Continua con la spiegazione del .voca e di come si lega al .grammar.
[Modificato da calel82 15/04/2013 16:19]