2012-07-10 47 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);