2011-01-11 54 views
10

我想能獲得Android TTS API來讀我的「話語」,然後不成功調用onUtteranceCompleted()偵聽器。我已經註冊了我的TTS對象並返回了SUCCESS,所以我無法弄清楚爲什麼我的回調沒有被調用。的Android TTS onUtteranceCompleted回調是沒有得到所謂的

我試過尋找幫助,但似乎其他人也有這方面的困難。我錯過了一些簡單的東西嗎

感謝您提供任何幫助。

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

我沒有看到你有什麼問題,但是你最好使用Log語句而不是Toast來跟蹤正在發生的事情。然後您可以查看logcat中的排序。 – 2011-01-11 00:28:58

+0

我認爲這將有助於你:[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 2013-09-03 11:15:01

回答

17

我認爲,除非你指定的話語與ID,如:

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

你的話語完成的方法將不會被調用。

在這種情況下,map是您發言時傳遞給引擎的Hashmap。

18

調用TTS對象的OnInit函數裏面的setOnUtteranceCompletedListener。

如果你想對onUtteranceCompleted函數的調用用戶界面的任何更改,添加代碼runOnUIThread方法中。

而且千萬記住,同時調用說話()函數中添加HashMap的參數值的方式

例子:

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

這會爲你工作的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; 
    } 

}