[#wpdev] SpeechRecognition timing

Nello sviluppo di applicazioni che fanno uso delle API di riconoscimento vocale, in particolare in scenari di in-app dialog, può nascere l’esigenza di regolare il timing entro cui il riconoscimento vocale del comando deve essere riconosciuto. Se avete avuto modo di utilizzare i comandi vocali, avrete sicuramente notato che, trascorso un certo tempo in cui il comando non viene ricevuto, il riconoscimento viene annullato.

Sebbene il sistema di riconoscimento vocale incluso in Windows Phone 8 disponga di un algoritmo capace di discriminare il silenzio dal parlato (esclusione rumore di fondo), di default questo resta in attesa di un input vocale per 5 secondi. Trascorso questo tempo, se non c’è input vocale, l’operazione di riconoscimento viene finalizzata. Questo comportamento può essere desiderato (lasciamo l’app in attesa di un comando), o potrebbe creare qualche problema. Supponiamo infatti di avere una lista di elementi da far “leggere” alla nostra applicazione (usando lo SpeechSynthesizer ) e, per ogni elemento, vogliamo opzionalmente dare un comando vocale: il comportamento di default bloccherebbe ovviamente l’esecuzione del ciclo.

Per fare in modo che lo SpeechRecognizer “smetta” di attendere l’input vocale entro un determinato lasso di tempo, possiamo utilizzare l’InitialSilenceTimeout che accetta, come parametro, un timrstamp:

SpeechRecognizer recognizerCommand = new SpeechRecognizer();
recognizerCommand.Settings.InitialSilenceTimeout = TimeSpan.FromMilliseconds(500);

Se in questo lasso di tempo (nell’esempio 500ms) non viene ricevuto nessun input vocale riconoscibile (al netto del rumore di fondo filtrato dall’algoritmo), allora riconoscitore va in timeout finalizzando l’operazione di riconoscimento. Se siamo all’interno del nostro ipotetico ciclo, questo non verrà interrotto.

Il sistema di riconoscimento vocale decisamente raffinato e, oltre al timeout appena discusso, ci permette di lavorare su altri 2 parametri in funzione delle esigenze.

Abbiamo infatti il BabbleTimeout che ci permette di regolare il tempo in cui il sistema deve restare in attesa dell’input in caso, quello che viene ricevuto, è silenzio (o rumore di fondo) e EndSilenceTimeout che, come facilmente deducibile, definisce il tempo in cui il riconoscitore deve essere finalizzato dopo aver ricevuto l’ultimo input vocale. Di default, questo intervallo di tempo è di 150ms.

Quindi, ricapitolando:

InitialSilenceTimeout definisce il tempo in cui il riconoscitore resta in attesa di un input vocale
BabbleTimeout definisce per quanto tempo il sistema deve restare in attesa se, quello che riceve è solo silenzio (o rumore di fondo)
EndSilenceTimeout definisce il lasso di tempo in cui il riconoscitore deve essere finalizzato dopo aver ricevuto l’ultimo input

 

IMPORTANTE: questi settings funzionano solo quando utilizziamo le custom grammars, quindi, nell’utilizzo del riconoscitore standard (dettatura), non funzioneranno.

,