未调用TTS-UtteranceProgressListener

时间:2013-11-30 05:10:50

标签: android text-to-speech

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

我正在使用文本到语音(TTS),在它提出问题后导致语音监听器...我通过日志输出发现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);
        }

// --- 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) {
    }    
}

我将日志输出添加到我的所有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

4 个答案:

答案 0 :(得分:84)

找到答案......

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

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

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

HashMap<String, String> map = new HashMap<String, String>();

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

map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "UniqueID");

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

tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);

答案 1 :(得分:22)

附加到WizardKnight的好答案:

新的API更喜欢Bundle,所以用Bundle

替换HashMap
Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "");

然后当你发言时

tts.speak(text, TextToSpeech.QUEUE_FLUSH, params, "UniqueID");

关键是在讲话中使用ID。你可以将它放在Bundle中,但它不会为你做任何事情。它必须在说话调用中才能触发听众。

答案 2 :(得分:3)

我有一个用于检测天气的有线解决方案已完成发言。

第1步:在代码中创建此类。

class Waiter extends AsyncTask<Void,Void,Void>{
        @Override
        protected Void doInBackground(Void... voids) {
            while (tts.isSpeaking()){
                try{Thread.sleep(1000);}catch (Exception e){}
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            //TTS has finished speaking. WRITE YOUR CODE HERE
        }
    }

第2步:在调用tts.speak(...)

时调用它
tts.speak(...);
new Waiter().execute();

答案 3 :(得分:0)

只需使用以下简单代码:

mTTS.speak(text, TextToSpeech.QUEUE_FLUSH, null, "MyUniqueUtteranceId");