2011-01-11 8 views
10

Sto cercando di ottenere l'API TTS di Android per leggere il mio "enunciato" e quindi chiamare il listener onUtteranceCompleted() senza successo. Ho registrato il mio oggetto TTS e restituisce SUCCESSO, quindi non riesco a capire perché la mia callback non viene chiamata.Android TTS onUtterance Il callback completato non viene chiamato

Ho provato a cercare aiuto, ma sembra che anche altri abbiano difficoltà con questo. Mi sto perdendo qualcosa di semplice?

Grazie per l'aiuto che puoi offrire.

package com.test.mytts; 

import java.util.HashMap; 

import android.app.Activity; 
import android.media.AudioManager; 
import android.os.Bundle; 
import android.speech.tts.TextToSpeech; 
import android.speech.tts.TextToSpeech.OnInitListener; 
import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MyTTS extends Activity implements OnInitListener, OnUtteranceCompletedListener 
{ 
    TextView tv; 
    private TextToSpeech _tts; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     tv = new TextView(this); 

     tv.setText("MyTTS: "); 

     super.onCreate(savedInstanceState); 
     setContentView(tv); 

     _tts = new TextToSpeech(this, this); 
    } 

    @Override 
    public void onInit(int status) 
    { 
     HashMap<String, String> myHashAlarm = new HashMap<String, String>(); 

     myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_NOTIFICATION)); 
     myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "test"); 

     if (status == TextToSpeech.SUCCESS) 
     { 
      Toast.makeText(this, "Trying to speak...", Toast.LENGTH_SHORT).show(); 

      int result = _tts.setOnUtteranceCompletedListener(this); 

      tv.append(String.valueOf(result)); 

      _tts.setSpeechRate((float) .5); 

      _tts.speak("Testing one, two, three", TextToSpeech.QUEUE_ADD, myHashAlarm); 
     } 
     else 
      Toast.makeText(this, "Failed to initialize TTS.", Toast.LENGTH_SHORT).show(); 

    } 

    @Override 
    public void onUtteranceCompleted(String utteranceId) 
    { 
     Toast.makeText(this, "onUtteranceCompleted", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onDestroy() 
    { 
     super.onDestroy(); 
     _tts.shutdown(); 
    } 
} 
+0

Non vedo nulla di sbagliato in quello che hai, ma probabilmente stai meglio usando le istruzioni di Log piuttosto che bruscamente per tenere traccia di ciò che sta succedendo. Quindi è possibile rivedere l'ordine in logcat. –

+0

Penso che questo vi aiuterà a: [http://stackoverflow.com/questions/4658376/how-to-know-when-tts-is-finished][1] [1]: http: //stackoverflow.com/questions/4658376/how-to-know-when-tts-is-finished – uriellabs

risposta

17

Credo che se non si specifica un enunciato con un ID, come: il metodo completato

map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceid); 

vostra espressione non sarà chiamato.

in questo caso, la mappa è l'Hashmap che si passa al motore quando si parla.

+0

Avendo lo stesso problema di cui sopra. E ho aggiunto questa chiave alla mappa e passata a parlare. strano ... –

+0

di solito specificano l'ascoltatore ogni volta che parlo. Potrebbe aiutare. – ekawas

+0

in qualche modo ho funzionato ora. ma non ho idea del perché funzioni ora. qualcosa era strano, credo. –

18

Chiama il setOnUtteranceCompletedListener nella funzione onInit dell'oggetto tts.

Se si desidera apportare modifiche all'interfaccia utente alla chiamata della funzione onUtteranceCompleted, aggiungere il codice all'interno di un metodo runOnUIThread.

E ricordatevi di aggiungere il valore HashMap param durante la chiamata di funzione() fa parlare i

Esempio:

TextToSpeech tts= new TextToSpeech(context, new OnInitListener() { 

@Override 
public void onInit(int status) { 

    mTts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() { 

     @Override 
     public void onUtteranceCompleted(String utteranceId) { 

      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
       //UI changes 
       } 
      }); 
     } 
    }); 

} 
}); 


HashMap<String, String> params = new HashMap<String, String>(); 

params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"stringId"); 

tts.speak("Text to Speak",TextToSpeech.QUEUE_FLUSH, params); 
2

questo lavoro per voi sul livello API> = 15

import java.util.HashMap; 
import java.util.Locale; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.speech.tts.TextToSpeech; 
import android.speech.tts.TextToSpeech.OnInitListener; 
import android.speech.tts.UtteranceProgressListener; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MainActivity extends Activity implements OnInitListener{ 

    private static final int CHECK_TTS_DATA = 0X123; 
    protected static final String TAG = MainActivity.class.getSimpleName(); 
    private TextToSpeech textToSpeech; 
    private Button buttonSayIt; 
    private EditText editTextTts; 
    String tts; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     buttonSayIt=(Button) findViewById(R.id.buttonSayIt); 
     editTextTts=(EditText) findViewById(R.id.editTextTts); 
     buttonSayIt.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       tts=editTextTts.getText().toString(); 
       Log.d(TAG, tts); 
       speach(tts,"you_utterance_id"); 
      } 
     }); 
     //check for TTs data 
     Intent checkTtsDataIntent=new Intent(); 
     checkTtsDataIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
     startActivityForResult(checkTtsDataIntent, CHECK_TTS_DATA); 

    } 

    protected void speach(String tts,String utteranceId) { 
     HashMap<String, String> params = new HashMap<String, String>(); 
     params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,utteranceId); 
     textToSpeech.speak(tts,TextToSpeech.QUEUE_FLUSH,params); 
    } 

    @Override 
    public void onInit(int status) { 
     if(status==TextToSpeech.SUCCESS){ 
      if(textToSpeech.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE){ 
       textToSpeech.setLanguage(Locale.US); 
      } 
     }else if(status==TextToSpeech.ERROR){ 
      Toast.makeText(this, "Sorry Text To Speach faild", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if(requestCode==CHECK_TTS_DATA){ 
      if(resultCode==TextToSpeech.Engine.CHECK_VOICE_DATA_PASS){ 
       textToSpeech=new TextToSpeech(this, this);  
       textToSpeech.setOnUtteranceProgressListener(utteranceProgressListener); 
      }else{ 
       Intent installTtsIntent=new Intent(); 
       installTtsIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
       startActivity(installTtsIntent); 
      } 
     } 
    } 

    UtteranceProgressListener utteranceProgressListener=new UtteranceProgressListener() { 

     @Override 
     public void onStart(String utteranceId) { 
      Log.d(TAG, "onStart (utteranceId :"+utteranceId+") "); 
     } 

     @Override 
     public void onError(String utteranceId) { 
      Log.d(TAG, "onError (utteranceId :"+utteranceId+") "); 
     } 

     @Override 
     public void onDone(String utteranceId) { 
      Log.d(TAG, "onDone (utteranceId :"+utteranceId+") "); 
     } 
    }; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 
Problemi correlati