venerdì 24 luglio 2009

Speech Recognition: Cosa ci propone l'Open Source


I software di riconoscimento vocale, sono caratterizzati da un contenuto tecnologico avanzato e fanno uso di complessi algoritmi di analisi del suono e di confronto di caratteristiche (feature) del suono con altrettante caratteristiche memorizzate atte al riconoscimento. Quando si parla di sistemi di Speech Recognition, vengono subito in mente nomi famosi, quali IBM Via Voice e Dragon Naturally Speaking. Senza dubbio sono dei sistemi validi, che migliorano di anno in anno e che oramai hanno raggiunto dei livelli di accuratezza impressionanti, raggiugibili sempre attraverso un adeguato periodo di addestramento (training). L'Open Source non è rimasto a guardare, e nel tempo ha fornito dei prodotti eccellenti, quali Julius e Sphinx.
Entrambi sono stati sviluppati in C/C++ ed in alcuni casi Java, e sono supportati da autorevoli gruppi di ricerca.
Un software di Speech Recognition, è generalmente caratterizzato da alcuni moduli contraddistinti:
a) Una parte dedita all'acquisizione del parlato ed estrazione di features, ovvero di caratteristiche contenute nel segnale vocale che sono decisive per le operazioni riconoscimento delle singole unità (fonemi) che costituiscono una parola o una frase.
b)Una parte di riconoscimento vero e proprio, che confronta le feature con altrettante feature contenute in un database, al fine di individuare la parola pronunciata.
c) Un modulo di learning o training il quale, prendendo in ingresso file di parlato dettato, assieme al file della corrispondente trascrizione del dettato, crea il cosidetto "modello acustico" ovvero una serie di informazioni essenziali per il riconoscimento.
Naturalmente, questa descrizione è molto generica e necessariamente ambigua per via della necessità di dare un'idea in poche righe, e per capire fino in fondo il funzionamento di un software di Speech Recognition si rende recessaria un'analisi di ciascun passaggio che il sistema affronta nel processo di riconoscimento.
Nei prossimi post cercherò di affrontare la questione, partendo dalla base di tutto, ovvero dall'analisi dei suoni.
Ad ogni modo torniamo ai nostri open source, in particolare a Sphinx4, ottimo ASR speaker independent, realizzato in Java per quanto concerne la parte di decoder e facilmente modificabile in base alle differenti esigenze. Insieme ai sorgenti vengono forniti anche delle demo con cui è possibile impratichirsi per realizzare delle piccole applicazioni interessanti. Consiglio peraltro di anticipare la manipolazione di sphinx4 con una buona lettura sulle tecniche utilizzate nella speech recognition, questo perchè trattasi di un argomento fortemente caratterizzato da un susseguirsi a cascata di applicazioni di analisi e trattamento dei suoni ed analisi statistiche. All'interno delle directory di ogni demo, è contenuto un file .xml delle configurazioni. Su questo file è possibile agire al fine di attuare quelle che vengono dette nel gergo dello speech recognition: operazioni di "tuning" ovvero di variazioni di variabili al fine di rendere l'ASR più accurato possibile (utilizzare sempre il WER come misura dell'accuratezza!) e trattasi in questo caso di variabili relative a pesi e probabilità, oppure valori utilizzati per la parte di front-end, ovvero quella che preleva il segnale sonoro dal vostro microfono (tempo di silenzio, sensibilità,...). Ma creare una demo tutta nostra non è così immediato, in quanto non è sufficiente fare una versione personalizzata copiando un pò il codice degli esempi. Se vogliamo ad esempio realizzare un'applicazione di riconoscimento vocale in italiano, è necessario allora creare un modello acustico ed anche un "modello di linguaggio". A questo punto devo però introdurre un punto dolente:
il modello acustico, che non è altro che una rappresentazione numerica (generalmente modelli statistici basati su catene nascoste di Markov - HMM) che deriva dal training di diverse decine di ore di parlato diversificato per sesso ed età, non è facilmente realizzabile. Non è banale trovare tutta questa mole di parlato con la relativa trascrizione dettata! Perlomeno per lingue differenti dall'inglese. Un piccolo aiuto arriva da voxforge, un progetto libero in cui vengono rilasciati gratuitamente dei "corpus" di parlato nelle varie lingue.
Ad ogni modo, sia recuperandoli, che creandoli noi stessi con l'aiuto di parenti ed amici, dovremo avere una buona mole di file vocali con la relativa trascrizione per poterli dare in pasto al modulo di training.
Il modulo di training per sphinx4 viene assolto da un software anch'esso aperto che si chiama SphinxTrain. E' un pò macchinoso, in quanto utilizza C++ da compilare su Visual Studio per generare gli eseguibili che vengono utilizzati per realizzare il modello acustico, ed il perl per lanciare in sequenza tutta una serie di eseguibili con gli opportuni argomenti. Ad ogni modo, una volta messo a punto, permette di creare dei modelli pronti per l'utilizzo con Sphinx4 nella propria applicazione demo. Ho realizzato diverse applicazioni con cui riesco a fare riconoscere il parlato umano in italiano ristretto a particolari contesti.
Per Sphinx4 e SphinxTrain è necessario dotarsi della Jdk, del Perl e di Visual Studio (o equivalente).

lunedì 2 febbraio 2009


Salve a tutti. Iniziamo con una panoramica sulla tecnologia Flash/Flex/Actionscript, che stà prendendo sempre più piede nelle applicazioni internet, permettendo la realizzazione di RIA (Rich Internet Application). Tempo addietro, Adobe, ha rilasciato sotto licenza open source un framework: Flex. Esso è un insieme di librerie scritte in Actionscript3 che permettono di realizzare in breve tempo applicativi interpretati dal flash player. In questo contesto, il flash player può essere considerato a tutti gli effetti una virtual machine che interpreta ed esegue del codice, in questo caso codice Actioscript3 scritto facendo uso del framework flex. Come si evince, il principio di funzionamento a simile a Java: una JVM (Java Virtual Machine) che interpreta degli applicativi (i file .class).
Con flex, una volta realizzato un applicativo, sarà necessario creare un corrispondente file in formato .swf, che è un file contenitore degli script e risorse che costituiscono l'applicativo. Ebbene il nostro flash player è in grado di prendere un file .swf ed eseguirlo in maniera analoga a come in java la JVM esegue un file .jar.
Un file .swf eseguito da flash player, può fare molte cose:
a)lavorare lato client mostrando interfaccie e funzionalità usabili ed efficaci;
b)comunicare verso dei server in maniera tale da inviare e ricevere dati (il cosidetto remoting).
Nei successivi post, ci occuperemo per l'appunto delle attività di remoting, che permettono di realizzare degli applicativi che manipolano dati anche di una certa complessità ed importanza al fine di mostrarli agli utenti con interfaccie grafiche altamente performanti dal punto di vista dell'usabilità.