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中,但它不会为你做任何事情.它必须在说话调用中才能触发监听器.
| 归档时间: |
|
| 查看次数: |
10635 次 |
| 最近记录: |