多年来(从字面上看),我的应用程序遭遇了性能不佳的文本到语音引擎的困境,特别是调用时的初始化时间:
tts = new TextToSpeech(context, myOnInitListener);
以上情况可能会导致用户界面滞后,如果您搜索“文字转语音”初始化速度很慢,那么在SO上,你会找到很多帖子。嵌入式高品质IVONA声音曾经是最糟糕的罪魁祸首,但Google TTS engine现已获奖。
他们最近的APK更新导致初始化时出现严重延迟 - 无需测试此代码,您可以转到Android文本转语音设置并尝试在可用引擎之间切换,同时按下'听取示例&# 39;,很好地证明了这种滞后性。
为了尝试解决这个问题,我实施了以下内容:
private volatile TextToSpeech tts;
AsyncTask.execute(new Runnable() {
@Override
public void run() {
tts = new TextToSpeech(context, volatileOnInitListener);
}
});
这完全解决了初始化的滞后问题,但我担心这可能会产生副作用,我没考虑过?任何人都可以想到吗?
我也感到困惑,因为我认为TextToSpeech Constructor是异步的,因此将此构造函数移动到工作线程应该没有区别?如果这种实施是前进的方向,那么为什么Google不会在TextToSpeechSettings中实施它?
希望有人能澄清以上内容。提前谢谢。
编辑 - 当我说'构造函数是异步的时候,我真的是指它启动的引擎初始化过程,以及最终调用onInit
答案 0 :(得分:-1)
我相信TextToSpeech构造函数是异步的
这只是部分正确。许多初始化是同步执行的。这是Source
如果这种实施方式是前进的方向,那么Google为什么不在TextToSpeechSettings中实现它呢?
谷歌似乎很少检查他们的代码如何在中端和低端设备上运行,我想这个延迟并不会出现在高端设备上。 (在当前的YouTube应用程序中可以看到这种情况发生的另一个例子,我个人可以确认中等规格设备的延迟并且没有高端设备的延迟。)这是纯粹的猜测,因为我不隶属于谷歌
我担心这可能会产生副作用,我没有考虑过?任何人都可以想到吗?
唯一(明显的)副作用是您无法同步使用tts引擎,但必须等待异步任务完成。但无论如何,情况已经如此。你唯一要做的就是在UI线程之外执行一些代码,这些代码不希望在UI线程上运行。这绝不是一个问题。即使出现问题,您也只能通过在应用程序中进行测试来找到它。
一般来说,你很高兴。