Android TTS onUtteranceCompleted回调未被调用

Jus*_*ell 15 android text-to-speech

我试图让Android TTS API读取我的"话语",然后调用onUtteranceCompleted()监听器失败.我已经注册了我的TTS对象,它返回SUCCESS,所以我无法弄清楚为什么我的回调没有被调用.

我试过寻求帮助,但似乎其他人也有这方面的困难.我错过了一些简单的事吗?

谢谢你尽你所能的帮助.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

eka*_*was 20

我相信,除非你指定一个带有id的话语,例如:

map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceid);
Run Code Online (Sandbox Code Playgroud)

你的话语完成方法不会被调用.

在这种情况下,map是你说话时传递给引擎的Hashmap.


sm *_*bas 20

在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);
Run Code Online (Sandbox Code Playgroud)