2011-01-11 6 views
10

Ich versuche, die Android TTS API zu bekommen, meine "Äußerung" zu lesen und dann den onUtteranceCompleted() Listener erfolglos aufzurufen. Ich habe mein TTS-Objekt registriert und es gibt SUCCESS zurück, so dass ich nicht herausfinden kann, warum mein Rückruf nicht angerufen wird.Android TTS onUtteranceCompleted Rückruf wird nicht aufgerufen

Ich habe versucht, um Hilfe zu suchen, aber es scheint, dass andere Schwierigkeiten damit haben. Fehle ich etwas Einfaches?

Danke für jede Hilfe, die Sie anbieten können.

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

Ich sehe nichts falsch mit dem, was Sie haben, aber Sie sind wahrscheinlich besser dran mit Log-Statements als Toasts für das Tracking was los ist. Dann können Sie die Bestellung in logcat überprüfen. –

+0

Ich denke, das wird Ihnen helfen: [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

Antwort

17

Ich glaube, dass, wenn Sie mit einer ID eine Äußerung angeben, wie:

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

Ihre Äußerung abgeschlossen Methode wird nicht aufgerufen werden.

In diesem Fall ist Map die Hashmap, die Sie an die Engine übergeben, wenn Sie sprechen.

+0

Haben das gleiche Problem wie oben erwähnt. Und ich habe diesen Schlüssel zur Karte hinzugefügt und weiter gegeben. komisch ... –

+0

Normalerweise gebe ich den Hörer jedes Mal an, wenn ich anrufe. Könnte helfen. – ekawas

+0

irgendwie habe ich es jetzt funktioniert. aber keine Ahnung, warum es jetzt funktioniert. etwas war irgendwie komisch, denke ich. –

18

Rufen Sie den setOnUtteranceCompletedListener in der onInit-Funktion des tts-Objekts auf.

Wenn Sie beim Aufruf der onUtteranceCompleted-Funktion Änderungen an der Benutzeroberfläche vornehmen möchten, fügen Sie den Code in eine runOnUIThread-Methode ein.

Und erinnern Sie sich, die HashMap param Wert hinzufügen, während die Sprech() aufrufen Funktion

Beispiel:

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

dies auf API-Ebene für Sie arbeiten> = 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; 
    } 

}