JavascriptProva

lunedì 20 giugno 2016

Esercizi con OnUtteranceCompletedListener per intercettare la fine del "discorso" di TTS.

Mettiamo a posto il TextToSpeech...

Fin qua credo di saper scrivere abbastanza il codice:
 public void onCreate(){
  TTS=new TextToSpeech(this,new TextToSpeech.OnInitListener() {
   
   @Override
   public void onInit(int status) {
    if(status==TextToSpeech.SUCCESS){
     int result=TTS.setLanguage(Locale.ITALIAN);
     TTS.setOnUtteranceCompletedListener(listener);
     TTS.speak("Ciao, ciccio bello", TextToSpeech.QUEUE_FLUSH, null);
    }
    
   }
  });
Che è stato scritto nel contesto di un Service.
Questo parla.
Lo riscrivo da capo e verifico che parli una volta chiamato il Service.
  TTS=new TextToSpeech(this,new TextToSpeech.OnInitListener() {
   
   @Override
   public void onInit(int status) {
    if(status==TextToSpeech.SUCCESS){
     TTS.setLanguage(Locale.ITALIAN);
     TTS.speak("Io sono il codice che dovrebbe parlare",TextToSpeech.QUEUE_FLUSH,null);
     
    }
    
   }
  });
E funziona!
Adesso voglio una conseguenza quando ha terminato di parlare.
Provo a usare onUtteranceCompletedListener.
Ma per fare questo devo usare Hashmap.
Vediamo...

Sono due righe.
Creiamo innanzitutto la HashMap, subito dopo il setLanguage(Locale.ITALIAN).
HashMap map=new HashMap();
Quindi ci devo inserire un valore, che è TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID.

Proviamo...
map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "key");
E adesso imposto map come ultimo parametro del metodo speak.
Rifacciamo tutto:
  TTS=new TextToSpeech(this,new TextToSpeech.OnInitListener() {
   
   @Override
   public void onInit(int status) {
    if(status==TextToSpeech.SUCCESS){
     TTS.setLanguage(Locale.ITALIAN);
     HashMap map=new HashMap();
     map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"key");
     TTS.speak("Io sono il codice che dovrebbe parlare",TextToSpeech.QUEUE_FLUSH,map);
     
    }
    
   }
  });
E mettiamo un'azione da eseguire in onUtteranceCompletedListener. Devo però impostare il listener a TTS:
   @Override
   public void onInit(int status) {
    if(status==TextToSpeech.SUCCESS){
     TTS.setLanguage(Locale.ITALIAN);
     TTS.setOnUtteranceCompletedListener(listener);
     HashMap map=new HashMap();
     map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"key");
     TTS.speak("Io sono il codice che dovrebbe parlare",TextToSpeech.QUEUE_FLUSH,map);
     
    }
    
   }
  });
Fatto questo creo il listener:
  OnUtteranceCompletedListener listener=new TextToSpeech.OnUtteranceCompletedListener() {
   
   @Override
   public void onUtteranceCompleted(String utteranceId) {
    // TODO Auto-generated method stub
    
   }
  };
E ci metto una segnalazione da fare in LogCat:
  OnUtteranceCompletedListener listener=new TextToSpeech.OnUtteranceCompletedListener() {
   
   @Override
   public void onUtteranceCompleted(String utteranceId) {
    Log.v("SPEAKER","UTTERANCE COMPLETED LISTENED");
    
   }
  };
E vediamo se appena terminato di parlare mi dà questo segnale in LogCat...

06-21 07:39:58.249: V/SPEAKER(9142): UTTERANCE COMPLETED LISTENED
Ottimo!

Nessun commento:

Posta un commento