未调用TTS-UtteranceProgressListener

Pse*_*328 39 android text-to-speech

我不想把我的所有代码放在这里,所以我只是把相关的部分.如果您需要更多,请随时询问.

我正在使用文本到语音(TTS),在它问一个问题之后导致语音监听器......我通过Log输出发现TTS的onInit被调用,但是UtteranceProgressListener没有,我无法弄清楚为什么.任何帮助表示赞赏.

// ---Initialize TTS variables---

        // Implement Text to speech feature
        tts = new TextToSpeech(this, new ttsInitListener());

        // set listener to the TTS engine
        tts.setOnUtteranceProgressListener(new ttsUtteranceListener());

        if (!tts.isSpeaking()) {
            tts.speak("Speak to me", TextToSpeech.QUEUE_FLUSH, null);
        }
Run Code Online (Sandbox Code Playgroud)
// --- TEXT TO SPEECH && SPEECH TO TEXT METHODS ---

class ttsInitListener implements OnInitListener {

    @Override
    public void onInit(int status) {

        if (status == TextToSpeech.SUCCESS) {
            tts.setLanguage(Locale.getDefault());

        } else {
            tts = null;
            Toast.makeText(mContext, "Failed to initialize TTS engine.",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

class ttsUtteranceListener extends UtteranceProgressListener {

    @Override
    public void onDone(String utteranceId) {
        if (processStart) {
            speech.startListening(intent);
        } else {
            ...
        }

    }

    @Override
    public void onError(String utteranceId) {
    }

    @Override
    public void onStart(String utteranceId) {
    }    
}
Run Code Online (Sandbox Code Playgroud)

我将日志输出添加到我的所有TTS和Speech方法中.甚至没有调用UtteranceProgressListener的onStart:

11-30 00:38:37.299: D/OpenGLRenderer(15842): Enabling debug mode 0
11-30 00:38:39.782: I/TextToSpeech(15842): Connected to ComponentInfo{com.google.android.tts/com.google.android.tts.service.GoogleTTSService}
11-30 00:38:39.782: I/TextToSpeech(15842): Set up connection to ComponentInfo{com.google.android.tts/com.google.android.tts.service.GoogleTTSService}
11-30 00:38:39.782: D/LOOK AT ME!!!(15842): ttsInitListener - onInit
Run Code Online (Sandbox Code Playgroud)

Pse*_*328 90

找到了答案......

事实证明,我在网上找到的TTS资源使用的是单个TTS字符串源,因此tts.speak(String text,int queueMode,HashMap params)中的第三个参数设置为null.

对于将来遇到此问题的任何人:

如果将第三个参数设置为null,则UtteranceProgressListener没有要跟踪的ID.该修复程序是创建并初始化一个hashmap,然后可以跟踪为每个具有新ID的新TTS添加到包含的数组中.这是代码:

HashMap<String, String> map = new HashMap<String, String>();
Run Code Online (Sandbox Code Playgroud)

然后,在调用tts.speak之前......

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

然后你可以打电话跟所有参数说话......

tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);
Run Code Online (Sandbox Code Playgroud)


小智 25

附加到WizardKnight的好答案:

新的API更喜欢Bundle,所以用Bundle替换HashMap

Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "");
Run Code Online (Sandbox Code Playgroud)

然后当你说话时

tts.speak(text, TextToSpeech.QUEUE_FLUSH, params, "UniqueID");
Run Code Online (Sandbox Code Playgroud)

关键是在发言呼叫中使用ID.你可以将它放在Bundle中,但它不会为你做任何事情.它必须在说话调用中才能触发监听器.