我需要在我的Andorind应用程序中实现功能,允许在当前的Acitivity中播放两种不同的合成语言 - 例如有两个按钮说英语和说法语
我试图通过以下两种方式进行此操作,但由于播放声音之前有很长的延迟,因此两者都无效:
你能帮忙解决这个恼人的问题吗?
答案 0 :(得分:0)
如何在任何用户交互之前等待两个TTS引擎在应用程序启动时完成初始化(通过创建OnInitListener并等待 - 例如使用信号量 - 直到onInit( )方法被调用),以便当用户到达应用程序中引入按钮的点时,您已经初始化了两个引擎?
答案 1 :(得分:0)
我通过在主应用程序线程以外的线程上一起创建这些实例来解决这个问题:
private class tempTask extends AsyncTask {
...
@Override
protected Object doInBackground(Object... params) {
firstTTSObj = new TextToSpeech(getApplicationContext(),
new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR){
firstTTSObj.setLanguage(Locale.UK);
}
}
});
secondTTSObj = new TextToSpeech(getApplicationContext(),
new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR){
secondTTSObj .setLanguage(Locale.KOREA);
}
}
});
return null;
}
}
希望这有帮助。
答案 2 :(得分:0)
看起来像是TextToSpeech的设计方式。猜猜它可以同时加载一种语言数据,当你请求另一种时,它必须卸载当前语言数据并加载新语言数据。 我在这里添加了这个问题: https://code.google.com/p/android/issues/detail?id=200974
谷歌将来可能会修复它。他们做到了!
作为现在的解决方法,您可以预先合成音频文件,然后简单地回放它。 F.G.你可以在启动Activity时启动一些AsyncTask并在后台生成声音。当它准备就绪时,在UI上显示按钮以允许用户播放它。 另外我发现TextToSpeech更好地使用服务器的android:process属性进入自己的服务进程,以避免在setLanguage加载语言数据时冻结某些设备上的UI。
更新2016-02-17:我刚刚从2月15日将TextToSpeech更新到3.8.14版本。没有更多延迟!我正在使用2种语言逐一阅读不同的语言文本,之间没有任何延迟! 感谢Google和TextToSpeech团队!你是最好的!
更新2016-02-18:我测试了更多设备,发现仍然使用Android 4.x的旧设备存在问题。使用Android 4.1.2在XOOM上测试,在Android 4.1.1上测试一些非名称设备7100。两者仍有相同的延迟。 不确定是否相关,但我注意到Android 4.x的Android设备都存在UtteranceProgressListener的问题。为了使它在这些设备上工作,我必须将utteranceId参数传递给speak()函数。 然而,没有这个参数,这个bug消失的设备运行良好。 目前工作正常的设备是LG d405和Android 5.0.2 在安装最近的TextToSpeech更新之前,它有相同的延迟问题。