未调用 TTS-UtteranceProgressListener

Posted

技术标签:

【中文标题】未调用 TTS-UtteranceProgressListener【英文标题】:TTS-UtteranceProgressListener not being called 【发布时间】:2013-12-16 07:14:07 【问题描述】:

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

我正在使用文本转语音 (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 ComponentInfocom.google.android.tts/com.google.android.tts.service.GoogleTTSService
11-30 00:38:39.782: I/TextToSpeech(15842): Set up connection to ComponentInfocom.google.android.tts/com.google.android.tts.service.GoogleTTSService
11-30 00:38:39.782: D/LOOK AT ME!!!(15842): ttsInitListener - onInit

【问题讨论】:

必须在 onstart 中的话语进度监听器上进行 logcat 打印输出 我刚停下来。大约 20 分钟后会回来,然后我会添加并粘贴日志 @AndroidVenkatesh 我将输出添加到 OP 【参考方案1】:

找到答案...

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

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

如果您将第三个参数设置为 null,则没有 ID 可供 UtteranceProgressListener 跟踪。修复是创建和初始化一个哈希图,然后添加到包含的数组中,为每个具有新 ID 的新 TTS 可以被跟踪。代码如下:

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

那么,在调用 tts.speak 之前...

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

那么你就可以用所有参数调用 speak...

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

【讨论】:

该唯一 ID 还可以防止您应用的 TTS 和 SpeechRecognition(此处未显示)干扰其他应用的录音和音频播放。【参考方案2】:

附加到 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 中,但它不会为你做更多的事情。它必须在通话中才能触发监听器。

【讨论】:

设置 utteranceId 解决了问题【参考方案3】:

我有一个用于检测天气的有线解决方案 tts 讲完了。

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

class Waiter extends AsyncTask<Void,Void,Void>
        @Override
        protected Void doInBackground(Void... voids) 
            while (tts.isSpeaking())
                tryThread.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();

【讨论】:

检查:while (tts! =null && tts.isSpeaking()) 这可能有效,但如上所述设置 TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID 不会那么痛苦。【参考方案4】:

只需使用这个简单的代码:

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

【讨论】:

以上是关于未调用 TTS-UtteranceProgressListener的主要内容,如果未能解决你的问题,请参考以下文章

numberOfRowsInSection 已调用但 cellForRowAt 未调用

调用 textFieldShouldBeginEditing,未调用 textFieldDidBeginEditing

JQuery:未捕获的类型错误:无法读取未定义的属性“调用”

调用结果未使用

C# Web Api 调用未从 jquery 调用

未调用 cellForRowAtIndexPath 但调用 numberOfRowsInSection