为什么Text To Speech(TTS)不能一直工作?

时间:2014-03-04 17:42:43

标签: android text-to-speech

我无法弄清楚为什么TTS不能始终如一地工作。我想了解如何改进我目前的设置。应用程序从TTS开始,欢迎用户或提示用户说出语音命令。所以在onCreate中我只有以下内容:

textToSpeech = new TextToSpeech(TTSActivity.this, this); 

我的TTSActivity类实现了OnInitListener,所以我也有以下覆盖方法:

@Override
    public void onInit(int status) {

        if (status == TextToSpeech.SUCCESS) {
            textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {

                @Override
                public void onStart(String utteranceId) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onError(String utteranceId) {               
                    // TODO Auto-generated method stub

                }

                @Override
                public void onDone(String utteranceId) {
                    //do some work here
                }
            });

            textToSpeech.setLanguage(Locale.US);
            map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "UniqueID");

            ttsString(0);

        } else if (status == TextToSpeech.ERROR){
            //try to restart TTS
            textToSpeech = new TextToSpeech(TTSActivity.this, this);
            ttsString(0);
        }
    } //end onInit() method

一些解释:textToSpeech.setOnUtteranceProgressListener()就在那里,一旦TTS引擎停止说话,我就可以激活语音识别。 map来自HashMap map = new HashMap()和ttsString是我希望TTS说话的所有字符串。所以我的ttsString(id#)方法如下所示。在我说TTS之前,我调用ttsString(id#)来设置字符串。

private void ttsString(int id)
    {   

        switch (id)
        {
            case 0:{
                metaString = "Say string one";
                    speakText(metaString);
                    break;
            }
            case 1:{
                    metaString = "Say string two";
                    speakText(metaString);
                    break;
            }
            case 2:{
                    metaString = "Say string three";
                    speakText(metaString);
                    break;
            }

        }
    }

这就是我让TTS发言的方式:

private void speakText(String text) {
        if(textToSpeech.isSpeaking()) {
            return;
        } else {
            textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, map);
        } 
    }

我没有收到TTS未绑定错误,一切都在一个时间点起作用,但不是一致的。换句话说,有时程序会说话,有时却不会。你有什么建议我这样做?重结构?

1 个答案:

答案 0 :(得分:3)

一些提示:

if (status == TextToSpeech.ERROR)中,调用ttsString(0);将始终失败,因为TTS尚未初始化。

你似乎没有调用tts.shutdown()。实际上我会在onStart()中初始化tts,并在onStop()中调用shutdown()。

在我的应用程序中,我已将TTS投入使用,因此在配置更改期间重新创建活动/片段时,不要理会所有初始化/取消初始化。

查看logcat,你应该看到有任何错误。我在使用svox语音时看到了奇怪的错误,据我记得问题来自于没有正确关机。