Android:两个文本转语音实例工作非常缓慢

我需要在我的Andorind应用程序中实现function,它允许在当前的Acitivity中播放两种不同的合成语言 – 例如有两个按钮Say English and Say French

我试图通过以下两种方式来实现它,但是它们都无效,因为声音播放之前有很长的延迟:

  1. 第一种方法:创建单个TTS实例并根据要播放的语言通过setLocale方法更改语言。 不幸的是,通过setLocale在语言之间切换非常耗时,这会在点击按钮后影响反应
  2. 第二种方法:为各自的语言创建两个TTS实例。 不幸的是,延迟也发生在这里,第一种解决方案之间没有区别。

你能帮忙解决这个恼人的问题吗?

如何在任何用户交互之前等待两个TTS引擎在应用程序启动时完成初始化(通过创建OnInitListener并等待 – 例如使用信号量 – 直到调用onInit()方法),这样做当用户到达应用程序中引入按钮的点时,您已经初始化了两个引擎?

我通过在主应用程序线程以外的线程上一起创建这些实例来解决这个问题:

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; } } 

希望这可以帮助。

看起来像是TextToSpeech的设计方式。 猜猜它可以同时加载一种语言数据,当你请求另一种时,它必须卸载当前语言数据并加载新语言数据。 我在此处添加了此问题: https : //code.google.com/p/android/issues/detail?id = 200974

可能谷歌将来会修复它。 他们做到了!

作为现在的解决方法,您可以预先合成音频文件,然后简单地回放它。 Fg你可以在启动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的一些noname设备7100上测试。 两者仍有相同的延迟。 不确定是否相关,但我注意到Android设备和Android 4.x都存在UtteranceProgressListener的问题。 为了使它在这些设备上工作,我必须将utteranceIdparameter passing给speak()函数。 然而,没有这个参数,这个bug消失的设备运行良好。 它现在正常工作的设备是LG d405与Android 5.0.2并且在我安装最近的TextToSpeech更新之前它有相同的延迟问题。