DevCorner: le prime parole del nostro smartphone

Roberto Orgiu
Roberto Orgiu
DevCorner: le prime parole del nostro smartphone

Ormai sappiamo che il nostro droide è in grado di capire cosa diciamo e di pronunciare delle frasi ma, molto probabilmente, non abbiamo mai investigato sul funzionamento di questi meccanismi: perché non inoltrarci quindi in questa parte dello sviluppo per Android?

Come argomento dell'appuntamento odierno di DevCorner abbiamo scelto di testare il funzionamento del Text To Speech: iniziamo con il dire che non servono permessi aggiuntivi, ma tutto il lavoro va fatto nel nostro codice Java.

In primis dobbiamo dichiarare una variabile che contiene la chiave per l'inizializzazione dei "modi" del motore di sintesi (lo facciamo più per comodità che per reale necessità):

static final String KEY = TextToSpeech.Engine.KEY_PARAM_STREAM;

Ora, nel metodo OnCreate della nostra Activity (che implementa TextToSpeech.OnInitListener per gestire gli eventi legati al motore) andiamo ad inizializzare il motore tramite la linea seguente, passando al costruttore sia il listener sia il Context necessario:

TextToSpeech tts = new TextToSpeech(this,this);

Passiamo quindi ad analizzare il metodo onInit del nostro motore di sintesi, nel quale dovremo controllare che lo status non sia un fallimento, impostare la lingua (nel nostro esempio abbiamo scelto l'italiano, ma avremmo potuto usare anche inglese, francese, spagnolo o tedesco) e infine controllare che la localizzazione scelta sia supportata, agendo di conseguenza:

public void onInit(int status) {
	if(status == TextToSpeech.SUCCESS){
	int result = tts.setLanguage(Locale.ITALIAN); //impostiamo l'italiano
		if(result == TextToSpeech.LANG_MISSING_DATA || 
			result == TextToSpeech.LANG_NOT_SUPPORTED){
		// Mancano i dati vocali: installali per continuare
		}else{
		//giunge qui se tutto va come previsto
		}
	}else{
	//Il Text To Speech sembra non essere supportato
	}
}

Il motore di sintesi può agire utilizzando diversi parametri: può funzionare usando le impostazioni della sveglia, delle notifiche o della musica, ad esempio.

Queste modalità, che abbiamo dichiarato dentro un apposito array statico, vengono scelte tramite uno spinner ed inserite dentro un HashMap alla chiave KEY che abbiamo dichiarato ad inizio articolo, come esemplificato dal metodo seguente, nel quale, grazie alla variabile pos (che ci arriva dal metodo onItemSelected) inseriamo nella nostra mappa le impostazioni richieste

myModes.put(KEY,MODES[pos]);

A cosa ci serve questo paragrafo apparentemente slegato dagli altri? La risposta è presto pronta: a finalizzare un metodo che farà parlare il nostro dispositivo, sia che le impostazioni di default siano selezionate, sia che l'utente preferisca utilizzare quelle impostate per altre applicazioni

public void speak(String text, double speechSpeed){
	tts.setSpeechRate((float)speechSpeed);
	if(myModes.containsKey(KEY))
		tts.speak(text, TextToSpeech.QUEUE_FLUSH, myModes);
	else
		tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}

Il metodo qui sopra, come abbiamo spiegato poche righe sopra, si occupa di far sintetizzare al nostro droide la stringa noi scelta, indicando ad Android il testo da sintetizzare, la modalità di esecuzione e, a seconda dei casi, la mappa delle funzionalità aggiuntive oppure un parametro nullo nel caso le configurazioni siano quelle di default.

Come di consueto, potrete trovare tutte le risorse relative a questo tutorial sul thread del nostro forum mentre, se volete provare la nostra applicazione direttamente sul vostro smartphone, iscrivetevi alla community ufficiale di DevCorner su Google+ e scaricate quindi il software dal badge sottostante, diventando dei tester per questo tutorial.