Italian

Flat
Re: Italian acoustic model
User: p!Zz@b0y
Date: 1/4/2013 10:58 am
Views: 381
Rating: 5

Ragazzi, leggendo la vostra discussione ho avuto i brividi.

Sto iniziando il mio progetto di tesi triennale e grazie al supporto di un Prof. ho deciso di puntare in alto.

Il suddetto Prof. lavora fra l'altro in una spin-off in Università che vende e sviluppa un sistema di domotica.

Io ho la passione per il volontariato, e dal momento che faccio tutoraggio ad un ragazzo disabile, ho pensato di fare qualcosa di concreto come progetto di tesi.

Si tratta di un'applicativo per Android che riconosca dei comandi vocali e interagisca con l'interfaccia del sistema di domotica.

L'ideale sarebbe integrarlo con un plugin per Chrome, poiché in questo caso il software sarebbe riciclabile per altri progetti.

Finora ho solo valutato l'utilizzo di PocketSphinx perché sono riuscito a farlo girare (quasi) comodamente su Android.

Ora il problema è il MA, ed è per questo che sono arrivato qui. Me ne serve uno in Italiano, ma non riesco a trovarlo. Io sarei più che disponibile per aiutarvi a crearne uno completo, ed eventualmente crearne uno piccolo per me. A me infatti serve riconoscere poche decine di parole, massimo 50, e per il momento usiamo una grammatica finita, anche perché stiamo sperimentando il sistema.

Sarei entusiasta se potessi collaborare con voi...soprattutto perché allargherei il mio lavoro ad un'utenza più alta. Infatti ho precisato con il professore, che nonostante il sistema sia commerciale, desidero che la mia parte di codice rimanga open, per poter offrire un aiuto reale ai portatori di handicap.

Vi ringrazio in anticipo!

Re: Italian acoustic model
User: calel
Date: 1/6/2013 9:40 am
Views: 401
Rating: 7

Ciao p!Zz@b0y .... Mazza e che nick!!!!

Piacere di conoscerti ;-)

Bella tesi XD

Pocket Sphinx cosa vuole per funzionare? O meglio, come vuole i modelli acustici?

Julius vuole 4 file, un .dict, un .dfa, uno di definizione di mod acustici (hmmdefs, del tutorial) e un file "lsta di navigazione" (tiedlist, del tutorial) se si utilizzano i trifoni (tritelefoni o come vuoi chiamarli)... A sphinx che serve?

Ma poi i brividi ti sono venuti perchè ti sei reso conto che esistono persone MATTE come te, o perchè avevi la finestra aperta? hahhaha :-D

Fammi sapere come posso aiutarti, mandandomi, anche solo qualche link.. Purtroppo il tempo è tiranno!

Buon Anno C. 

Re: Italian acoustic model
User: p!Zz@b0y
Date: 2/26/2013 3:37 am
Views: 172
Rating: 1

Allora, scusa per il ritardo, ma sono nella cacca più estrema per lo stage!

Vabbè, PocketSphinx vuole un file lm (eventualmente compilato in lm.DMP, che contiene mono-di-trigrammi), un file .dic(contenente il dizionario e, per ogni parola, la lista dei fonemi di cui essa è composta), un file .phone(solo elenco dei fonemi) un file .vocab(lista vocaboli) ed un file .idngram( che non ricordo a cosa serva).

Sono riuscito ad addestrare un mini modello acustico registrando la mia voce e quella di amici mentre leggevano le frasi di prova. È un miniset di 28 frasi, lette per il momento da 5 persone.

Il mio problema più che altro è sapere come posso fare per assicurarmi che il trainer di PocketSphinx esegua un allineamento corretto fra i file audio e le trascrizioni... in Julius quale tecnica usi?

Grazie 18500 per la risposta(i brividi mi sono venuti per la prima ragione :-) )

Re: Italian acoustic model
User: calel
Date: 2/26/2013 7:39 am
Views: 465
Rating: 1

hahahah stai tranquillo, in ingegneria difficilmente cadi di faccia, in genere cadi in piedi...

Se può esserti utile di seguito ci sono alcune info che potrebbero servirti per cambiare engine, ovvero per passare da poket-Sphinx a Julius in poco più di due ore di programmazione.. Sarò abbastanza dettagliato e se non ti interessa cambiare engine, vai direttamente al prossimo paragrafo (dove ti passo qualche link su poket-Sphinx).. Allora, hai 28 frasi lette da 5 persone, ovvero hai 149 file wave. Facendo finta che in ogni frase c'è una sola occorrenza di ogni parola, vuol dire che hai un training di 5 ripetizioni per parola. Utilizzando Julius e costruendo un accurato modello acustico e utilizzando un microfono di 5 euro, dovresti avere un buon riconoscimento del 70% per 3 parole alla volta, se già dici 4 parole, l'engine non ti riconosce una cicca (2 parole su 4 + 5 oppure 8 parole tipo che, chi, a, ad, evince, ecc). Se utilizzi Julius, ti posso mandare un .jar che è un piccolo client, dove puoi inviare un .txt contenente le parole che vuoi far riconoscere, una cartella di wave e un file prompts.txt (se lo scenario ti interessa ti spiegherò come devono essere nominati i wave e come deve essere fatto il prompts.txt). Se le tue 28 frasi devono essere riconosciute con una precisione di circa 90%, allora servono 8 ripetizioni per parola, un microfono direzionale e (soprattutto) ambiente silenzioso. Bada bene, una cosa è la teoria e un'altra è la pratica!

In teoria Julius e gli altri engine hanno un buon rate di riconoscimento vocale, in pratica per l'italiano e per i reali casi d'uso questa percentuale è solo fumo negli occhi. Attualmente posso affermare -dati alla mano- che parlare di precisione di riconoscimento, non ha senso se non si fissano degli standard.

Se le tue frasi sono del tipo:

"DAL LAVORO EFFETTUATO SI EVINCE LA CONCRETA POSSIBILITA", con 8 e dico 8 ripetizioni per parola (vocabolario di 111 parole), con un microfono economico e in una stanza insonorizzata, puoi ottenere qualcosa del tipo:

"la al lavoro chi effettuato dal chi evince ee e la chi che concreta o chi possibilita e ee ee ee la"

Valuta questo! L'output di un qualsiasi engine STT va MANIPOLATO...

 

X Sphinx:

qui dovresti trovare quel che ti serve: http://cmusphinx.sourceforge.net/wiki/tutorialam

 

Quindi... Se tu hai poco tempo e hai bisogno che il tuo engine stt ti riconosca PRECISAMENTE frasi target, ovvero:

User: "ACCENDI GAS E CHIUDI TAPPARELLA"

SistemaTuo: "ACCENDI GAS E CHIUDI TAPPARELLA"

Allora ti conviene confrontare l'output di Sphinx con un "set" di frasi preferibili e valutare la somiglianza tra frasi in base alla sequenza di parole (quindi l'ordine) riconosciute dall'engine e le frasi target.

Se ne hai solo 28 la cosa dovrebbe funzionare.. Altrimenti, devi utilizzare le matrici di co-occorrenza, utilizzare un microfono direzionale e campionare l'input dal microfono tra 4,0kHz e 4,2kHz e inserire un filtro di 11200 Hz (più o meno, diciamo da 9200 a 12200, devi fare prove) e gli esempi di training devono essere campionati a 4,8kHz, senza nessun filtro..

Se devi far funzionare tutto da cellulare, allora ti conviene fare come hanno fatto quelli della google: scriviti un client che manda un piccolo .mfc (feature vector) a un server, nel server ci metti Sphinx oppure Julius.

Per Julius, ad esempio, puoi mandarlo in esecuzione (dal server) con in input il file mandato dal client e con il comando "scrivi l'output in un file che sichiama come dico io e che sta in questa cartella". Successivamente apri quel file, te lo leggi e confronti il testo riconosciuto con il tuo "set" di frasi preferibili. Rimandi la frase preferibile più vicina al client e aspetti una conferma dal client.. Se l'user non ha detto quella frase, puoi chiedergli di scrivere quel che ha detto e rimandare l'output al server.

Con questo sistema, puoi riallineare -se vuoi- il modello acustico alla voce del dato user... E' facilissimo! Basta che tu quel tutorial te lo automatizzi con un codice e ti crei un piccolo DB che contiene una tabella di utenti e una di Modelli Acustici. Ogni user parte con un modello acustico "standard", che è quello che hai fatto tu, poi, con l'utilizzo, se l'user dice cose mal riconosciute, tu puoi far generare in automatico, un nuovo MA, per il dato user, utilizzando quel file .mfc e la risposta in testo dell'user!

Vualà, hai fatto un'applicazione di riconoscimento vocale con i controcazzi!

Con questo sistema, ogni user può accrescere quanto vuole (dipende dallo spazio che hai sul server), il proprio MA, inserendo nuove parole e... Se lo prevedi via client (con qualche midlet o quel che vuoi), un user può inserire anche nuove frasi preferibili.

 

Ti consiglio di montare subito il modello acustico e provare al più presto il riconoscitore Sphinx, perchè avrai brutte sorprese!

Ci vuole un training massiccio per un riconoscimento appena decente, per decente intendo che l'engine ti caccia tutte le parole che l'user ha detto, più tantissime "stop word" dovute ad accoppiamento tra microfono e ventola del portatile, il tipo che cammina al piano di sopra o il rumore dei tasti che preme il signore a 3 metri da te!

Come gol di buon riconoscimento, il tuo engine deve poter riconosere in questo modo:

User: P1 P2 P3 P4 P5

Engine: Px Px P1 Px P2 Px P3 Px P4 Px P5 Px Px

Con Px che devono essere SOLO stop word, ovvero: articoli e congiunzioni. Altrimenti tu quello che ha detto l'user non lo capisci e fai una figura di merda..

 

 Il mio problema più che altro è sapere come posso fare per assicurarmi che il trainer di PocketSphinx esegua un allineamento corretto fra i file audio e le trascrizioni... in Julius quale tecnica usi?

 

In Julius si utilizza un master label file con estensione .txt, qui vedi meglio com'è: http://www.voxforge.org/home/dev/acousticmodels/windows/create/htkjulius/tutorial/data-prep/step-2

Praticamente in questo file vengono specificati per ogni riga:

NomeFileWave (spazio) corrispondente testo del wave

Poi si registrano frasi ad un certo campionamento, utilizzando audacity (facile e gratis) e si salvano con i nomi specificati nel file di label "prompts.txt".

Si crea una lista di parole con $perl ../HTK_scripts/prompts2mlf words.mlf prompts e si utilizza l'hidden markov model per creare modelli nascosti di markov che hanno una triplice funzione, o meglio, uniscono 3 tipi di dati: testo corrispondente alla parola, parola in formato "onda" (in realtà in feature vector) e fonemi (singoli e dopo tripli, cioè tre fonemi alla volta).

Vengono creati modelli nascosti di markov decriventi relazioni tra fonema testo e fonema onda, poi modelli nascosti descriventi parole testo e parole "onda", poi modelli descriventi relazioni tra triplici fonemi del dato modello e relative onde e in fine si elaborano modelli che sono tutte le possibili parole e composizioni fonetiche del dato modello.

Hey, io ti sto spiegando solo qualitativamente, se vedi il tutorial, capisci molto in più!

Fammi sapere che ti serve e vedo che posso fare... Purtroppo i MA di Julius non possono essere utilizzati per Sphinx e vale anche al contrario...

Tuttavia .wave e .txt possono essere creati sia per elaborare MA per Julius che per Sphinx.

Il campo è vasto... Magari se mi comunichi meglio l'intorno in cui ti muovi, posso aiutarti meglio!

Buona giornata C.

Re: Italian acoustic model
User: p!Zz@b0y
Date: 2/27/2013 3:50 am
Views: 187
Rating: 1

Grazie per la risposta Calel,

io ho già creato un mini MA con il "trainer" di HMM fornito da pocketsphinx ed in effetti l'output è proprio quello che mi descrivi tu :-)

Ora però capisco perché matcha così tanti articoli. 

Ho usato SoX che è un programma bomba da riga di comando, l'ho infilato in uno script di Ruby che mi prende una frase ( "ACCENDI LA LUCE" "ALZA LA TAPPARELLA" "ATTIVA ANTIFURTO" ) alla volta dal mio file di testo, mi chiede di leggerla, e dopo averla salvata in WAV a 16KHz mono nella cartella apposta, scrive anche la trascrizione della parola nel file delle trascrizioni. Poi è compito del "trainer" leggere i miei vari file testuali (.dic .lm.DMP trascrizioni etcetc) e gli audio per generare le HMM.

Ora provo a descriverti come deve funzionare il sistema: dal momento che si tratta di un server di domotica e dovrà essere fruibile anche da disabili(che possono avere grandi difetti di pronuncia) abbiamo optato per un riconoscitore addestrabile(perché Android ha già delle API di riconoscimento vocale Online e Offline mooooolto buone). Quindi l'utente pronuncia una frase; il dispositivo android la analizza, ed invia il comando associato ad essa al server del sistema. Il sistema di domotica, ricevuto il comando, aggiornerà la pagina web visualizzata dall'utente. A questo punto la grammatica ed il Modello Linguistico(non Acustico) dovrà cambiare in funzione del contenuto della pagina web( questo dovrebbe garantire un matching migliore).

Non capisco a cosa ti riferisci parlando dicendo di inserire un filtro di 11200Hz.  Io finora ho campionato tutto a 16KHz, senza filtri o altro.

Comunque non ti scervellare, stai già facendo un sacco!

Grazie!

p!Zz@

Re: Italian acoustic model
User: calel
Date: 2/27/2013 5:02 am
Views: 191
Rating: 0

Ottimo!

Bhè filtro e campionamento dell'input (microfono), per il mio progetto è determinante!

Non posso utilizzare altri engine se non Julius (vincolo contrattuale)... Il riconoscimento vocale deve avvenire in tempo reale e in aule universitarie.

-rumore, vocio, ecc ecc, non devono influire;

-i professori non faranno training, quindi.. Mi serve l'indipendenza di user!

-l'università non ha soldi e il sistema deve funzionare in maniera ibrida: con la rete per il reperimento dei dati (modello acustico, statistiche, preferenze utente, ecc ecc) e senza rete per il riconoscimento. L'università non mi metterà a disposizione un microfono da 200 euro per ogni professore! Tantomeno garantirà la copertura wireless in tutte le aule e i plessi..

Io campionando gli esempi a 4,8kHz e la voce dell'user a 4,1 ottengo un riconoscimento migliore e meno parole errore... Il filtro mi aiuta a idolare rumori che altrimenti si andrebbero a sommare all'onda sonora da analizzare e genererebbero cose tipo:

User: FREQUENTAZIONE

Julius: FRETTA QUESTA TUTTO AZIONE NEGLI

eheheheheh ovvero:

FRE-QUEN- TA-ZIO-NE

FRE->suono voce user+rumore=FRETTA

QUEN->voce+rumore=QUESTA ecc ecc

Questi problemi mandano in panne qualsiasi manipolazione dell'output di riconoscimento....

:-((((( 

Re: Italian acoustic model
User: p!Zz@b0y
Date: 3/1/2013 4:23 am
Views: 428
Rating: 1

Molto interessante.

Io l'ho addestrato con modelli a 16K, secondo te di quanto dovrei abbassare il campionamento?

Poi i filtri immagino che servano per tagliare fuori i suoni troppo acuti o troppo gravi, giusto?

PS: anche pocketsphinx è user indipendent, e la versione Java (Sphinx 4) è ancora più potente.

Re: Italian acoustic model
User: calel
Date: 3/4/2013 3:49 am
Views: 260
Rating: 0

Mha... Dai risultati che fin ora ho ottenuto, posso scriverti...

Il training esce bene a 44100Hz (ti parlo però di Julius), due canali stereo, che poi sono le impostazioni di default di audacity. Però in tutti i paper che ho letto e tutti i tutorial e pdf, si parla di training campionato a 18000Hz. Credo che questa discrepanza che ho rilevato sia dipendente dal numero di "frasi" registrate date in pasto all'HTK per creare il modello acustico. In pratica, meno training hai, più ti conviene campionarlo fittamente, mentre, al contrario, più ne hai più puoi diradare i campioni.

Poi ho anche misurato un notevole incremento di buon riconoscimento se le frasi contengono esattamente 12 parole. Con meno di 12 parole, Julius tende a confondersi tra parole simili tipo "corso"-"corsi". Con più di 12 parole, Julius tende a infilare nell'output ancora più stop-word, tipo "chi, che, evince, ecc".

Quindi più che diminuire il campionamento del training, conviene che tu lo aumenti!

Per i filtri che utilizzo, bhè c'è poco da fare per me... Tu usi un progetto Java, quindi ti sarebbe facilissimo aggiungere sia un passa-basso che un passa-alto.. A me Julius è scritto in C e so problemi! Ad ogni modo Julius ha integrato un passa-alto, proprio per non fargli catturare il rumore di sottofondo. Non so matematicamente a che corrispondono (forse sono patate o cipolle! Non so..), io utilizzo il filtro di Julius che si attiva con la parola chiave -lv e mi stotrovando bene con un valore di 11200 (Julius di default lo tiene a 2000). Più che altro per la voce da riconoscere, dovresti considerare 3 cose, due dipendenti dal contesto dove performi il riconoscimento e una hardware:

1)Filtro passa-alto (il passa-basso conta niente), che ti serve per isolare accoppiamenti del microfono con altri dispositivi (tipo la ventola del processore) e armoniche indesiderate (tipo il vagabondo che suona con la fisarmonica a 50 metri oppure l'operai con il martello pneumatico a 300 metri..ARGHH);

2)La frequenza di campionamento della voce da riconoscere.. Quello che ho misurato io per questo aspetto è molto interessante. Con training campionati a 44100, puoi avere un riconoscimento ottimale solo con un campionamento comreso tra 40000Hz e 43000Hz in ambiente silenzioso, mentre in ambiente rumoroso, le uniche frequenze che danno buoni risultati sono (sempre) 40000Hz e (stranamente) 44100Hz. Tieni presente che diminuendo la frequenza di campionamento, diminuisce il rate di buon riconoscimento, aumentandola, aumenta il rate di parole errore (ed è più facile che la parola detta venga divisa in sillabe e "fusa" con altro rumore, creando così tante parole errore, quante sillabe ha la parola detta).

3)Il microfono.

Per ottimizzare il riconoscimento non devi solo lavorare sul training (e quindi sul modello acustico), ma è importante capire la giusta combinazione tra filtro, campionamento e caratteristiche del microfono!

Ma d'altra parte, tieni presente che Dragon, nell'ultima versione, impone di utilizzare un microfono direzionale che costa tanti dindini!

Oppure che il riconoscimento vocale della intel, fa spostare il microfono all'user, proprio per capire (attraverso calcoli cervellotici), a che distanza mettere il microfono, per attuare i settaggi appropriati (filtri e campionamento).. La cosa è complessa!

Per la questione user-indipendent, heheheh teoricamente è così.. Praticamente NO. Il modello acustico, per quanto potente possa essere, ha sempre bisogno di un "riallineamento" per un cambio di voce (sia anche solo raucedine!)..

Buona Settimana C. 

Re: Italian acoustic model
User: p!Zz@b0y
Date: 3/4/2013 4:28 am
Views: 444
Rating: 1

Molto molto, moooolto interessante...

Ti correggo solo sulla questione Java. Sphinx4 è scritto in Java mentre pocketsphinx è scritto in C. Sfruttano tutt'e due gli stessi modelli acustici e linguistici, e teoricamente eseguono un riconoscimento in modo simile fra loro ma il primo (sphinx) è molto più flessibile e configurabile mentre il secondo è nato per essere più leggero e "pret à porter" :-)

Sono sicuro che anche PocketSphinx dà la possibilità di impostare filtri, appena ne ho la conferma ti mando link etc.

Ho letto(ma devo ritrovare la pagina) che però pocketsphinx ha bisogno di avere un audio in input di bitraggio pari all'addestramento. Però questo te lo devo ancora confermare.

Ma tu devi usare Julius per una questione di licenza?

Re: Italian acoustic model
User: calel
Date: 3/5/2013 3:02 am
Views: 251
Rating: 0

Devo usare Julius non per una questione di licenza, ma per una questione contrattuale.. Sul bando di concorso (sono un borsista), è menzionato Julius come core del tool e se non rispettassi questo vincolo, mi si bloccherebbero i pagamenti e potrei incorrere anche in una penale!

Comunque proprio ieri ho organizzato i log che ho prodotto e sono arrivato a toccare il 90% di buon riconoscimento, con un modello acustico che utilizza circa 10 ripetizioni per parola... (1119 file wave per 111 parole)

Mi sono sgolato!

Senti ma perchè non ci facciamo un sitariello, o meglio un forum?

Qualcosa che tratti solo di riconoscimento vocale per la lingua italiana.. Tanto i 2 maggiori engine free, sono Julius e Sphinx...

Tu ne capisci di Sphinx e io di Julius... Secondo me sarebbe una bella cosa..

PreviousNext