VoxForge
Dopo la laurea possiamo pensarci.
Io non è che ne sappia molto di pocketsphinx, di sicuro però c'è bisogno di mettere in rete della documentazione, anche in inglese, e metterei quel poco che conosco molto volentieri.
Il giorno prima che mi scrivessi quest'ultima risposta, anche io avevo apportato delle modifiche al modello e il riconoscimento è schizzato dal 20%~ al 70% :-) Mi ero sgolato pure io.Calcolando anche che in quel 30% di WER (word error rate) sono contate anche quelle volte in cui riconosce INIZIA invece di INIZIARE (che per il sistema di domotica non rappresenta un errore).
Praticamente il mio modello linguistico mappava(seguendo dei suggerimenti sul sito) le parole in fonemi associando ad ogni parola un fonema per ogni lettera.
In pratica TAPPARELLA era composta dai fonemi T A P P A R E L L A...Ripeto che era una soluzione trovata sul sito. Poi ho convertito il modello linguistico mappando ogni parola in se stessa, quindi ogni parola è costituita da un solo fonema, cioè se stessa.
Il prof mi ha comprato un microfono da 40 euri della Philips(anche se ha un volume bassissimo) e sto rifacendo delle registrazioni. Con il nuovo microfono sono arrivato a 274 file Wav, per solo 20 parole.
E comunque devo ancora eseguire un adattamento del modello all'utente finale. Ho notato che se testo il modello con voci a lui sconosciute ( nonostante sia dichiaratamente User Indipendent) i risultati decadono. Ti converrebbe almeno far addestrare anche il tuo modello con alcune registrazioni degli utenti finali.
Direi che comunque Julius funziona decisamente bene. Lo terrò in considerazione finito lo stage.
Buon lavoro :-)
ok...
Mha io più che documentazione metterei qualcosa di scaricabile e fruibile ;-)
Un pacchetto che permette il riconoscimento vocale XD
Hai mappato ogni parola come un singolo fonema???
hahhaha sei un pazzo!!!
Nuoooooooooo non sfrutti la navigazione fonetica!!!
In pratica gli engine di stt funzionano così:
1-senti da microfono e trasforma in mfcc;
2-ascolta dell'mfcc ogni fonema e naviga per raggiungere una parola;
3-presenta a video la parola
Questo equivale a dire che il tuo modello fonetico è inflessibile!
La maggiore utilità del training sta proprio nell'avere tanti esempi fonetici, tu così li riduci drasticamente!
ES:
TAPPARELLA t a p p a r e l l a
TAPPO t a p p o
Hai 2 esempi per costruire il fonema "t" ecc ecc
TAPPARELLA tapparella
TAPPO tappo
Hai 1 solo esempio sia del fonema "tapparella" che "tappo".
Io non farei così, per questo nonostante tutto il training e il microfono buono il tuo modello soffre mancato riconoscimento! Se usi l'HTK per la costruzione dei modelli nascosti di Markov dentro quelle matrici ci troverà cose strane pocketSphinx!
Praticamente sfrutti solo 1/3 della potenza elaborativa dell'engine!
Se una cosa del genere la facessi con Julius, ne uscirebbe fuori un modello acustico che sfrutta solo singoli fonemi, nessun albero decisionale... Cavolo... Credo che Julius non lo aprirebbe, perchè lui non funziona con modelli acustici che non sfruttano almeno 2 fonemi per volta!
Certo se mi creassi a mano o con un programmino dei falsi HMMs lo potrei far partire e in effetti riconoscerebbe anche, ma soltano perchè nel file dizionario trova il fonema e quindi la parola...
Non lo so... Stai sulla linea... Devi vedere sperimentalmente se oltrepassandola fai un guaio oppure fai una grande scoperta..
Vabbè se hai bosogno solo di poche parole e lo devi far funzionare in ambiente insonorizzato o con pochissimo rumore va bene...
Aspetto tue notizie C.
Ciao ragazzi,
ho letto il vostro scambio e volevo fare alcuni commenti/domande:
- - p!Zz@b0y: <A me infatti serve riconoscere poche decine di parole, massimo 50>
anche io ho bisogno di riconoscere pochi comandi, ora come ora sono 12 comandi composti da 2 parole l’uno e non tutte diverse tra loro, quindi sono ben al di sotto di 50 parole. Ho due possibilità: o utilizzare un acoustic model abbastanza completo (come può essere quello già disponibile per la lingua inglese) oppure crearne uno ad hoc con i soli vocaboli che voglio riconoscere. La seconda scelta è sicuramente più rapida ma mi chiedo quanto possa essere affidabile e ha il piccolo problema che ogni volta che volessi aggiungere un comando alla mia applicazione dovrei rifare il modello acustico; la prima, invece, richiede parecchie ore di speech registrato e mi pare che siamo ancora ben lontani dalle 140h di registrazione ma proverò a fare un primo acoustic model con le poche ore a disposizione (una decina) e vediamo come va.
- - calel: <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.>
Questo credo che in Sphinx sia fatto fornendo il file.grammar o.lm (il language model).
- - sulla frequenza di campionamento:
dal sito di sphinx http://cmusphinx.sourceforge.net/wiki/tutorialam
“It's critical to have audio files in a specific format. Sphinxtrain does support some variety of sample rates but by default it's configured to train from 16khz 16bit mono files in MS WAV format. YOU NEED TO MAKE SURE THAT YOU RECORDINGS ARE AT A SAMPLING RATE OF 16 KHZ (or 8 kHz if you train a telephone model) IN MONO WITH SINGLE CHANNEL.”
Confermo di aver trovato anch’io che maggiore è la frequenza di campionamento, minore è il numero di dati che devono essere raccolti per il training ma il processamento potrebbe essere molto lento e che quindi un buon compromesso è 16 kHz.
- - sui filtri:
Sphinx4 si può configurare con un filtro passa alto che compensa l’attenuazione delle alte frequenze; da quello che ho letto questo filtro è di pre-amplificazione e serve a ovviare a una attenuazione delle alte frequenze intrinseca dello speech (http://cmusphinx.sourceforge.net/sphinx4/javadoc/edu/cmu/sphinx/frontend/filter/Preemphasizer.html#PROP_PREEMPHASIS_FACTOR). Il filtro di cui parli tu (calel) serve a isolare lo speech dai rumori di sottofondo, giusto? La proprietà configurabile per realizzare questo filtro penso sia melFilterBank che di default filtra il segnale sotto i 130 Hz e sopra i 6800 Hz, tu p!Zz@b0y hai fatto passi avanti in questo senso?
Ciao missjulia83,
<- p!Zz@b0y: <A me infatti serve riconoscere poche decine di parole, massimo 50>>
Anche se la domanda l'hai fatta a p!Zz, permettimi di scriverti quel che farei io..
Se utilizzi un MA inglese e maleaguratamente devi comunque aggiungere vocaboli, sono ugualmente problemi. Quindi meglio crearne uno in italiano per le tue 24 parole, ma aggiungici anche ulteriori parole fake: stop word tipo AD, CHE, CHI, DOVE, QUANDO, ecc.
Sicuramente ci sarà un diavolo di tutorial per creare MA per sphinx, mettiti con netbeans da una parte e il tutorial dall'altro e realizzati un programmino che ti crea lui l'MA! Per Julius, ci ho messo una settimanella e mi son trovato benissimo. Mi prendo in ingresso un file di testo, me lo zappetto, mi prendo le parole le metto in un DB, mi creo tutti i file intermedi, in una data cartella, eseguo tutti gli script HTK da cartella target (cioè dove schiaffo tutti gli elaborati), mi leggo una cartella piena di wave e mi prendo i 4 file che alla fine mi servono per Julius.
E' un casino, certo! Ma dopo averlo fatto hai tutto quello che ti serve per essere autonomo.. Puoi anche utilizzare parte di quello che hai scritto per "accrescere" il tuo MA. Ti basta copiare tutto il tuo programmino da quando c'è la valutazione dei wave e incollarlo in un novo progetto ;-)
Questo ti sarà utilissimo fidati! Se ad esempio tu ti registri 20 ripetizioni delle parole che vuoi usare e testi un riconoscimento pessimo.. Pocomale, registri altre 20 ripetizioni e "accresci" il MA! (se per sphinx si utilizza HVite, vedi che non funziona proprio bene...)
< - calel: <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.>>
<missjulia83: Questo credo che in Sphinx sia fatto fornendo il file.grammar o.lm (il language model).>
Ehm, no!
il file .grammar non specifica frasi preferibili, ma solo la grammatica dell'engine stt.
Certo puoi fare molto (per aumentare l'efficacia dell'engine) attraverso l'utilizzo di una grammatica appropriata.
Potresti pensare i tuoi comandi fatti di due parole così organizzati:
OggettoDaComandare Comando
E stabilire che il tuo modo di comunicazione è solo del tipo:
TAPPARELLA ALZA
TAPPARELLA ABBASSA
Specificando una grammatica tipo (Julius like):
S: NS_B OGGETTO COMANDO NS_E
OGGETTO: OBJ
COMANDO: COM
Tu diresti al tuo engine: "aspettati come parole dette prima una parola tra quelle specificate nella categoria OBJ e poi una parola appartenente alla categoria COM".
Poi (sempre Julius like), dovresti specificare le categorie che hai creato nella grammatica nel tuo .voca così:
%NS_B
<s> sil
%NS_E
</s> sil
%OBJ
TAPPARELLA t a p p a r e l l a
PORTA p o r t a
GAS g a s
...
%COM
ALZA a l dz a
ABBASSA a b b a s s a
....
Questa non sarebbe una cattiva idea, ma... Con Julius pur specificando grammatiche tipo questa, non è detto che ottieni effettivamente il risultato sperato, perchè se lo speaker dice più di due parole oppure si mette in mezzo un diavolo di rumore, l'output è da misurare sperimentalmente.
Di certo l'engine ti sputerà qualcosa a video, che rispecchierà il più possibile le specifiche della tua grammatica, ma cosa sarà? Sarà qualcosa che è data conoscere solo in 2 modi: sperimentando, oppure studiandosi il funzionamento dell'engine..
La questione delle frasi preferibili è ben diversa dalla grammatica.
Nè Julius, nè sphinx hanno funzioni del genere "di serie".
L'obiettivo è:
Speaker: TAPPARELLA ALZA (rispettando la grammatica di sopra)
Sphinx: A CHE TAPPA RELLY SALSA DA SU (un output che evidenzia un training non esaustivo per la parola tapparella e la presenza di vocio)
L'output di Sphinx (o di Julius), per un'analisi a livello testuale dovrebbe essere catturato da un secondo WS che dovrebbe (in object oriented):
1- Prende la frase di output dell'engine e si costruisce una frase fatta di parole. La frase è un insieme ordinato di parole. La frase ha quindi una topologia, mentre le parole hanno una probabilità di occorrenza data dal numero di volte che la parola compare nel caso d'uso da modellare diviso il numero totale di parole (ci sono tanti paper a riguardo);
2- Caricarsi un set di frasi "preferibili", trattato come l'output dell'engine;
3- Confrontare la frase sparata dall'engine con le frasi corrette che ci si aspetta in questo modo:
3.1- Selezionare un array di frasi preferibili candidate, confrontando lineramente tutte le parole contenute nella frase di output.
3.1.2- Se non ci sono frase preferibili trovate, passare al punto 3.2.1, altrimenti confrontare la topologia dalla frase output con la topologia delle frasi candidate, assegnado punti di match inversamente proporzionali alla prob di occorrenza delle coppie di parole considerate. La frase preferibile è quella che ha più punti.
3.2.1- Selezionare a 2 a due le parole della frase di uotput (non già manipolate in questo passo) e utilizzare algoritmi di confronto di stringhe (tipo quelllo di hamming, ne trovi tanti già fatti in java) e per ogni nuova fusione di parole che supera il punteggio limite di numeroLettereParoleDaFondere/2 rieffettuare il passo 3.1 (questo passo fonderebbe le parole TAPPA e RELLY secondo un punteggio massimo verso la parola TAPPARELLA. L'algoritmo procederebbe nuovamente al punto 3.1 e comunque non troverebbe niente, quindi fonderebbe SALSA e DA, creando ALZA e a questo punto nel passo 3.1 verrebbe trovata la frase TAPPARELLA ALZA).
Almeno io per il dettato continuo faccio così... E mi trovo bene...
<Confermo di aver trovato anch’io che maggiore è la frequenza di campionamento, minore è il numero di dati che devono essere raccolti per il training ma il processamento potrebbe essere molto lento e che quindi un buon compromesso è 16 kHz.>
Dato un MA di 1500 e passa parole, 45 ripetizioni a parole, tutto campionato a 44100Hz, con una workstation caccavella, ci metto 50 minuti a creare un MA. Almeno per Julius, i wave devono essere tradotti in mfcc e la situazione è accettabile!
<Sphinx4 si può configurare con un filtro passa alto che compensa l’attenuazione delle alte frequenze; da quello che ho letto questo filtro è di pre-amplificazione e serve a ovviare a una attenuazione delle alte frequenze intrinseca dello speech >
Non so per Sphinx, ma per Julius, serve a non fare "sentire" all'engine rumori di piccola intensità, tipo la ventola del processore, il respiro, il rumore che fanno le labbra quando si muovono.. Tutte cose che teoricamente già sopra gli 0,8kHz non dovrebbero sentirsi, ma che in parica si sentono fino a 10,2kHz.. Ora sto lavorando a un passabanda: utilizzo il passa alto di Julius e un radiomicrofono in cui è possibile settare la sensibilità. In pratica utilizzo la sensibilità come una sorta di passabasso ;-)
<Il filtro di cui parli tu (calel) serve a isolare lo speech dai rumori di sottofondo, giusto?>
Sisi..
<La proprietà configurabile per realizzare questo filtro penso sia melFilterBank che di default filtra il segnale sotto i 130 Hz e sopra i 6800 Hz>
Per Julius questa opzione non esiste.. C'è lo switch -lv [numeroInHz].
In Julius non c'è limite superiore. Una sirena, un tagliaerba, ti falsa tutto (a meno che non ti inventi qualcosa tu!).
Buona giornata C.
Ciao ragazzi, mi sono finalmente laureato. Il 24 Aprile :-)
Sono super contento di vedere che si è aggiunta anche missjulia alla conversazione. Purtroppo non ci sono fondi per "tenermi" in università a lavorare sul modello acustico in italiano, ma io vorrei continuarlo come progetto personale.
Scrivendo la tesi, in particolare le slide per la discussione finale, mi sono reso conto di quanto sarebbe bello avere un modello acustico open source (e pure linguistico) per l'italiano. Sebbene google fornisca le API per quello online che funziona di brutto e anche per quello offline sui dispositivi Android, rimane il problema che il modello non è adattabile e non può essere usato liberamente dai progettisti. Vi posso garantire che c'è tanto bisogno di ampliare il supporto al riconoscimento vocale, e parlo soprattutto a nome dei disabili.
Ora, io avrei un progetto un po' ambizioso, ma sono convinto che sia FATTIBILE. In pratica vorrei, appoggiandomi a VoxForge, studiare un modo per raccogliere più dati per ampliare il database audio e poi, una volta che il sistema conoscerà (non per forza riconoscerà) qualche centinaio di parole, tirare su un servizio di riconoscimento vocale online che si possa auto-espandere col passare del tempo, e permettere agli utenti di scaricare anche quello offline.
Mi sembra un po' inutile ora tartassarvi di info anche perché l'idea è complessa da spiegare. Ma potesse interessarvi, che ne pensate di sentirci su skype?
Fatemi sapere, pizza
Hey pizza tanti auguri per la tua laurea!
Non ho skype, sto su FB e da lì ho altri contatti di ragazzi e signori che hanno sposato la nostra causa:
https://www.facebook.com/carlo.galliano?ref=tn_tnmn
Pizza di dove sei?
In realtà io ho idee diverse per reperire speech corpora ;-)
molto meno impegnative e che potrebbero a risultati più veloci..
Ne sa qualcosa un signore che attualmente sta utilizzando il riconoscimento vocale (engine Julius), per la domotica...
Ragazzi son proprio ferrato ;-)
Ho una versione prototipale interamente scritta da me di un server che:
- organizza, cattura e seleziona esempi sonori lunghi quanto si vuole in db;
- crea modelli acustici automaticamente, seguendo il modello fonetico italiano e avendo bisogno solo del db (wave) e di un banale txt che contiene le parole che si vogliono usare.
- riceve feed-back dal client che effettua: riconoscimento vocale (ovvio), creazione MA, potenziamento MA, allineamento MA (e permette un modo di riconoscimento vocale congiunto: più user da diversi PC..). Il feed contiene registrazione wave della frase, testo riconosciuto e corretto attraverso 3 algoritmi che ho creato io partendo da altri standard, questo feedback viene poi elaborato quando viene sottomesso dall'user (che ne controlla il giusto riconoscimento) e va in DB come banale rigo di prompt con corrispondente mfc ;-) l'ho chiamato training passivo. Funziona anche se parli al telefono oppure se parli normalmente con un'altra persona, isolando tutti i rumori tranne la voce che ha componenti più forti.
- E' gestito ad account e permette di scambiarsi e indicizzare documenti creati con riconoscimento vocale. ES: il prof. di basi di dati nella lezione parla di programmazione concorrente: le dispense che vengono create vengono indicizzate attraverso la parola link "programmazione concorrente", alla corrispondente lezione dell'altro corso. Mentre in run-time, gli studenti che seguono da portatile, possono comandare una diversa gestione dello schermo (la pagina) che permette la visualizzazione del frammento della lezione dell'altro corso, semplicemente cliccando sopra alle parole di colore rosso che appaiono nei sottotitoli.
E una versione prototipale di uno stand-alone che funziona con un MA fissato ma che sfrutta un gate software montato tra cygwin e S.O. e un compressore sonoro (sempre SW e sempre montato a cavalluccio della cygwin) che rende utilizzabile quello scassone di Julius anche con un martello pneumatico vicino e con una certa indipendenza d'user.
Tutto firmato unisannio ;-) la migliore università d'ingegneria del mondo XD
Aspetto persone volenterose di essere ricordate nella branca dello STT ;-) e assolutamente brillanti.
Modelli acustici gratis, senza dubbio (su voxforge da altre parti!), ma il tool che fa godere, lo deve avere l'università, che lo fornirà gratis agli studenti ma che si farà pagare da aziende e privati (non audiolesi).
Non so se a me rinnoveranno il contratto, in scadenza a fine giugno, ma cerco pazzi che vogliono fare cose più grosse di loro (e tanti soldi).
Buona domenica pomeriggio C.
Ciao! Ho letto il vostro articolo. Mi servirebbe sapere come potrei iniziare a studiarmi shinx. Volevo creare un assistente vocale per la mia distribuzione linux, solo che non so da cosa partire per imparare come funziona. Con il corso base di java a scuola potete immaginare come sono messo. Grazie per una futura risposta.
Ciao, la distribuzione si chiama (o meglio si chiamerá) Hexagon OS. È una derivata di debian creata con debian live e chroot. Su skype mi chiamo alberto sanfelice, ma avendo piú account sarebbe meglio che ti inviassi una mail con il link al profilo. La mia mail è [email protected]
Attualmente siamo anche su facebook, con una pagina chiamata PyrosSoftware. Grazie per l'interesse!
Ciao a tutti,
non so se qualcuno segue ancora questo thread ma nel caso avrei qualche dubbio/domanda..
Sto cercando di costruire un modello in italiano, per capire la fattibilità, e nel caso, anche le performance di un riconoscitore italiano basato su sphinx/pocketsphinx.
Ho convenuto che il modo più veloce per provare a fare un primo training di prova (per imparare come fare) fosse scaricare i campioni wav esistenti qui:
http://www.repository.voxforge1.org/downloads/it/Trunk/Audio/Main/16kHz_16bit/
e le rispettive trascrizioni qui:
http://www.repository.voxforge1.org/downloads/it/Trunk/Prompts/
Tali trascrizione le ho anche dovute modificare (con programmino java) affinchè fossero nella forma
<s> frase </s> (percorso al file)
Nel frattempo ho scaricato questo modello:
http://www.repository.voxforge1.org/downloads/it/Trunk/AcousticModels/
dal quale ho recuperato i file voxforge_it.phone e voxforge_it.dic dalla cartella etc; ho recuperato inoltre il file italian.txt dalla cartella text, dal quale, tramite i passaggi spiegati sul tutorial di sphinx, ho ottenuto il file .vocab e da esso il file .lm.dmp.
Il problema nasce nel momento in cui ho messo tutto insieme per provare a fare un train.
Ho fatto la cartella del db con la struttura indicata nel tutorial di sphinx, e quindi ho messo i vari .wav sotto la cartella wav e il resto sotto la cartella etc.
Provando a fare il train, ottengo una serie interminabile (circa 29000) di warning (che poi leggendo la sezione troubleshooting del tutorial sembrano essere degli errori veri e propri) con questa frase:
WARNING: This word: sfidano was in the transcript file, but is not in the dictionary (<s> sfidano la morte per veder felici i loro capi eppure </s> ). Do cases match?
La soluzione, come la stessa wiki propone, sarebbe quella di inserire le parole (con la loro pronuncia) nel dizionario.
A questo punto, il problema risulta evidente: pare impossibile inserire a mano 29000 parole (cosa che non basterebbe nemmeno, se io poi volessi aumentare i dati registrando altri file audio). Ovviamente ho pensato anche a fare un programma java che li crei, ma a quel punto non sarei sicuro del fonema da inserire per ogni lettera di ogni parola, in quanto, a seconda della pronuncia (per esempio "e aperta" vs "e chiusa"), potrebbe essere diverso il fonema da inserire per la stessa lettera.
La mia domanda è: esiste un modo (che io mi son perso) per costruire il file con la pronuncia delle parole, a partire da queste, oppure devo farlo per forza a mano?
Continuando a registrare qua su voxforge, se arrivassimo alle ore necessarie alla costruzione di un modello, chi e come costruirebbe a partire da quello, il dizionario con le pronunce?
Nel caso in cui debba fare il dizionario a mano, per ottenere un modello che riconosca, diciamo, 10 frasi dette da me (per cui, secondo la wiki di sphinx, servirebbe almeno 1 ora di registrazioni), dovrei quindi registrare le frasi, trascriverle, e scrivere anche tutte le parole che ho detto nel dizionario, con la loro pronuncia, è corretto?
In questo caso, nelle registrazioni cosa sarebbe meglio dire? Sempre e solo le 10 frasi che voglio che riconosca, o anche altro?
Scusate per la lunghezza del post :D
Sperando che qualuno mi risponda, auguro a tutti buona serata.
Gabriele