未调用 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