无法检测TTS(回调)的完成(安卓)。

10

我正在开发一个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();
       } 
   }
}

我的应用中,文字转语音功能能够正常工作。但我该如何检测文字转语音是否完成呢?需要帮助......谢谢.....

3个回答

10
如果您使用的是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()上的回调?那也应该可以工作。

嗨David,我尝试了你的解决方案,但在setOnUtteranceProgressListener处出现错误。而对于onUtteranceCompleted,它执行时没有错误,但是在onUtteranceCompleted中没有显示消息,所以有没有解决这个问题的方法。是否我做错了什么。需要帮助... - nilkash
1
调用 int result = tts.setOnUtteranceCompletedListener(this); 来设置监听器。检查 result 变量的值。应该返回 SUCCESS(0)或 ERROR(-1)。还要在 onUtteranceCompleted() 中添加一些日志以查看它是否真的到达了那里。同时检查 logcat 是否有其他奇怪的错误。 - David Wasser
谢谢David,感谢您的回复。它很好地运行了。我使用日志记录而不是toast,它也很好地工作了。谢谢... - nilkash

8

在tts对象的onInit函数内调用setOnUtteranceCompletedListener。

如果您想在onUtteranceCompleted函数被调用时对UI进行任何更改,请将代码添加到runOnUIThread方法中。

并且在调用speak()函数时记得添加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);

4
这里有一些代码来自于这里,它可以帮助您实现向后兼容性,这样您就不必针对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");
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接