【发布时间】:2019-07-07 19:37:06
【问题描述】:
我在我的应用程序中使用文本到语音引擎。它在具有 API 23 及更高版本的模拟器 Nexus 6 上运行良好。但是在带有 API 22 的模拟器 Nexus 6 上它不会说话。 两个模拟器都使用 Pico TTS 作为首选引擎。
我的活动布局仅包含一个按钮“Speak”。 这是我的活动代码:
public class MainActivity extends AppCompatActivity {
private TextToSpeech mTTS;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button speakBtn = findViewById(R.id.button);
speakBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
speak();
}
});
mTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
int result = mTTS.setLanguage(Locale.US);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "Language not supported");
}
mTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
Log.d("TTS", "onStart called, utteranceId = " + utteranceId);
}
@Override
public void onDone(String utteranceId) {
Log.d("TTS", "onDone called, utteranceId = " + utteranceId);
}
@Override
public void onError(String utteranceId) {
Log.d("TTS", "onError called, utteranceId = " + utteranceId);
}
});
} else {
Log.e("TTS", "Initialization failed");
}
}
});
}
private void speak() {
Log.d("TTS", "speak() method called");
HashMap<String, String> map = new HashMap<>();
map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "greeting");
mTTS.speak("hello", TextToSpeech.QUEUE_FLUSH, map);
}
}
这是来自模拟器 Nexus 6 API 22 的所有日志:
02-18 13:54:09.942 9739-9739/? E/libprocessgroup: 无法创建和 chown /acct/uid_10059: 只读文件系统
02-18 13:54:09.943 9739-9739/? W/Zygote:createProcessGroup 失败,内核缺少 CONFIG_CGROUP_CPUACCT?
02-18 13:54:09.943 9739-9739/? I/art:不延迟启用 -Xcheck:jni(已启用)
02-18 13:54:09.961 9739-9748/? E/art:向调试器发送回复失败:管道损坏
02-18 13:54:09.961 9739-9748/? I/art:调试器不再处于活动状态
02-18 13:54:09.992 9739-9739/? W/art:在 Android 4.1 之前,方法 android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode)错误地覆盖了 android.graphics.drawable.Drawable 中的 package-private 方法
02-18 13:54:10.001 9739-9739/? I/art:拒绝在以前失败的类 java.lang.Class 上重新初始化
02-18 13:54:10.001 9739-9739/? I/art:拒绝在以前失败的类 java.lang.Class 上重新初始化
02-18 13:54:10.064 9739-9739/? I/TextToSpeech: 成功绑定到 com.svox.pico
02-18 13:54:10.072 9739-9757/? D/OpenGLRenderer: 使用 EGL_SWAP_BEHAVIOR_PRESERVED: true
02-18 13:54:10.074 9739-9739/? D/Atlas:正在验证地图...
02-18 13:54:10.093 9739-9739/? I/TextToSpeech:连接到 ComponentInfo{com.svox.pico/com.svox.pico.PicoService}
02-18 13:54:10.096 9739-9758/? I/TextToSpeech:设置与 ComponentInfo 的连接{com.svox.pico/com.svox.pico.PicoService}
02-18 13:54:10.111 9739-9757/? I/OpenGLRenderer:初始化的 EGL,版本 1.4
02-18 13:54:10.111 9739-9757/? W/OpenGLRenderer:无法选择带有 EGL_SWAP_BEHAVIOR_PRESERVED 的配置,正在重试而不...
02-18 13:54:10.128 9739-9757/? D/EGL_emulation: eglCreateContext: 0xae434e20: maj 2 min 0 rcv 2
02-18 13:54:10.131 9739-9757/? D/EGL_emulation: eglMakeCurrent: 0xae434e20: ver 2 0
02-18 13:54:10.134 9739-9757/? D/OpenGLRenderer:启用调试模式 0
02-18 13:54:10.174 9739-9757/? D/EGL_emulation: eglMakeCurrent: 0xae434e20: ver 2 0
02-19 09:32:25.570 9739-9739/com.example.ttsapp D/TTS:调用 speak() 方法
【问题讨论】:
-
模拟器在 API 22 中使用的语音引擎可能与在 API 23+ 中使用的语音引擎不同......(PICO vs Google)。出于某种原因,可能会调用 onError() 而不是 onDone 。你给出的代码是不必要的复杂和不完整(不可重建)......你为什么不做一个非常简单的代码示例,只是说“你好”并测试看看是否用 PICO 调用了 onError() ......和如果没有,然后慢慢添加代码片段,直到问题发生并立即!有你的答案。
-
Boober Bunz,谢谢您的回答。编辑了问题文本和代码,使其简单且可重建。 TTS 仍然不适用于模拟器 Nexus 6 API 22,但适用于 Nexus 6 API 23。
-
您可以发布您的应用程序的日志消息吗?如果出现问题,那么您应该会在 logcat 控制台中看到正确的消息。
-
太棒了!现在您可以添加一个话语进度侦听器并记录所有回调以查看发生了什么。
-
添加了一个话语进度监听器。
标签: java android text-to-speech