DevCorner: implementiamo il riconoscimento vocale

Roberto Orgiu
Roberto Orgiu
DevCorner: implementiamo il riconoscimento vocale

Nelle precedenti puntate... o meglio, in uno scorso episodio, abbiamo visto come implementare il Text To Speech ma sappiamo bene che il nostro droide è anche in grado di ascoltare, quindi perché non proviamo ad implementarlo in una nostra applicazione?

Iniziamo con il nostro file Manifest, nel quale non andranno aggiunti permessi di sorta, in quanto andremo solamente a richiamare un Intent e farci restituire il risultato: passiamo velocemente al codice Java e controlliamo che questa funzionalità sia supportata dal dispositivo in questione:

PackageManager pm = getPackageManager();
Intent intentRiconoscimentoVocale = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
List activities = pm.queryIntentActivities(intentRiconoscimentoVocale,0);
if(activities.size() == 0){
servizioRiconoscimentoPresente = false;
}

Quello che facciamo, in sostanza, è istanziare il PackageManager (linea 1), creare l'Intent del riconoscimento vocale (2), chiedere quali applicazioni supportano questa funzionalità attraverso l'istanza del PackageManager (3) e controllarne il numero (4).

A questo punto, non ci resta che avviare la procedura alla pressione del pulsante, e lo facciamo creando un Intent simile a quello che abbiamo appena utilizzato e inserire alcuni Extra per impostare, nell'ordine, che il tipo di input vocale sia libero e basato sulla lingua installata dal sistema, che l'Intent ritorni al massimo 10 risultati e quale messaggio vogliamo che appaia quando avviamo il riconoscimento vocale: una volta specificati tutti questi attributi, possiamo utilizzare startActivityForResult per avviare il nostro riconoscitore.

Intent intentRiconoscimentoVocale = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intentRiconoscimentoVocale.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intentRiconoscimentoVocale.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 10);
intentRiconoscimentoVocale.putExtra(RecognizerIntent.EXTRA_PROMPT, "Dimmi qualcosa!");
startActivityForResult(intentRiconoscimentoVocale, CODICE_DI_RICHIESTA);

Ora non ci resta che controllare, nel metodo onActivityResult (il callback in cui ritorna la nostra richiesta) che il codice di ritorno sia quello che ci aspettiamo e prendere i nostri risultati, che visualizzeremo poi come meglio crediamo: per l'esempio noi ci siamo avvalsi di una ListView, nel cui Adapter abbiamo inserito gli extra prelevati dall'Intent di ritorno nel nostro callback.

if (requestCode == CODICE_DI_RICHIESTA && resultCode == RESULT_OK){
ArrayList<String> risultati = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
listaRisultati.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,risultati));
}

Siamo pronti ad avviare la nostra applicazione e vedere all'opera il riconoscitore vocale di Android, e lo abbiamo implementato con poco più di una manciata di righe di codice.

Se volete dare un'occhiata ai sorgenti completi, fate un salto sul nostro forum, mentre se volete provare questa applicazione direttamente sul vostro smartphone, iscrivetevi alla community ufficiale di DevCorner su Google+ e buona programmazione a tutti!