2012-07-10 46 views
7

我正在開發中,我使用文本到語音conversion.What我需要當我睜開應用程序運行文本到語音轉換android應用。完成後我想做一些事情。我的代碼看起來像無法檢測到TTS(回調)android的完成。

public class Mainactivity extends Activity implements OnInitListener, OnUtteranceCompletedListener{ 
    private static int REQ_CODE = 1; 
    private TextToSpeech tts = null; 
    private boolean ttsIsInit = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    startTextToSpeech(); 
    } 

    private void startTextToSpeech() { 
     Intent intent = new Intent(Engine.ACTION_CHECK_TTS_DATA); 
     startActivityForResult(intent, REQ_CODE); 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQ_CODE) { 
      if (resultCode == Engine.CHECK_VOICE_DATA_PASS) { 
       tts = new TextToSpeech(this, this); 
      } 
      else { 
       Intent installVoice = new Intent(Engine.ACTION_INSTALL_TTS_DATA); 
       startActivity(installVoice); 
      } 
     } 
    } 

     public void onInit(int status) { 
      if (status == TextToSpeech.SUCCESS) { 
       ttsIsInit = true; 
       int result = tts.setOnUtteranceCompletedListener(this); 
       if (tts.isLanguageAvailable(Locale.ENGLISH) >= 0) 
        tts.setLanguage(Locale.ENGLISH); 
       tts.setPitch(5.0f); 
       tts.setSpeechRate(1.0f); 

       HashMap<String, String> myHashAlarm = new HashMap<String, String>(); 
        myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM)); 
        myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "SOME MESSAGE"); 
        tts.speak("hi how are you?", TextToSpeech.QUEUE_FLUSH, myHashAlarm); 
      } 
     } 

    @Override 
    public void onDestroy() { 
     if (tts != null) { 
     tts.stop(); 
     tts.shutdown(); 
     } 
     super.onDestroy(); 
    } 

    @Override 
    public void onUtteranceCompleted(String uttId) { 
     Toast.makeText(Mainactivity.this,"done", Toast.LENGTH_LONG).show(); 
     if (uttId.equalsIgnoreCase("done")) { 
      Toast.makeText(Mainactivity.this,"inside done", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

當我打開我的應用程序文本到語音工作正常。但如何檢測文本到語音是否完成。需要幫助.....謝謝.....

回答

7

如果您使用API​​級別15或更高版本,您可以在TextToSpeech引用上使用設置進度監聽器

setOnUtteranceProgressListener(UtteranceProgressListener listener) 

您將獲得回調,報告TTS的進度,包括回調完成時的回調。請參閱http://developer.android.com/reference/android/speech/tts/TextToSpeech.htmlhttp://developer.android.com/reference/android/speech/tts/UtteranceProgressListener.html

但是,我注意到您已經在使用已棄用的OnUtteranceCompletedListener。你是否在onUtteranceCompleted()獲得回調?這也應該起作用。

+0

大衛你好我想你的解決方案,但它給了我錯誤setOnUtteranceProgressListener.And它onUtteranceCompleted在沒有錯誤的情況下執行,但不在onUtteranceCompleted中發送消息,因此有辦法解決此問題。無論我做任何事情wrong.Need幫助... – nilkash 2012-07-10 09:28:42

+1

你叫'INT結果= tts.setOnUtteranceCompletedListener(THI爲s);'設置監聽器。檢查'result'變量的值。 SUCCESS(0)或ERROR(-1)應該回來。另外,將一些日誌記錄添加到'onUtteranceCompleted()'來查看它是否真的到達那裏。同時檢查你的logcat是否有其他奇怪的錯誤。 – 2012-07-10 10:13:54

+0

謝謝大衛謝謝你的回覆。它的工作很好。我使用日誌而不是吐司,它的工作正常。謝謝... – nilkash 2012-07-10 10:24:48

3

下面是here一些代碼,可以幫助你是向後兼容的,所以你不必瞄準15

private void setTtsListener() 
    { 
     final SpeechRecognizingAndSpeakingActivity callWithResult = this; 
     if (Build.VERSION.SDK_INT >= 15) 
     { 
      int listenerResult = tts.setOnUtteranceProgressListener(new UtteranceProgressListener() 
      { 
       @Override 
       public void onDone(String utteranceId) 
       { 
        callWithResult.onDone(utteranceId); 
       } 

       @Override 
       public void onError(String utteranceId) 
       { 
        callWithResult.onError(utteranceId); 
       } 

       @Override 
       public void onStart(String utteranceId) 
       { 
        callWithResult.onStart(utteranceId); 
       } 
      }); 
      if (listenerResult != TextToSpeech.SUCCESS) 
      { 
       Log.e(TAG, "failed to add utterance progress listener"); 
      } 
     } 
     else 
     { 
      int listenerResult = tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() 
      { 
       @Override 
       public void onUtteranceCompleted(String utteranceId) 
       { 
        callWithResult.onDone(utteranceId); 
       } 
      }); 
      if (listenerResult != TextToSpeech.SUCCESS) 
      { 
       Log.e(TAG, "failed to add utterance completed listener"); 
      } 
     } 
    } 
7

調用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);