在工作线程上初始化TextToSpeech对象

bra*_*all 8 java android text-to-speech google-text-to-speech

多年来(从字面上看),我的应用程序遭遇了性能不佳的文本到语音引擎的困境,特别是调用时的初始化时间:

tts = new TextToSpeech(context, myOnInitListener);
Run Code Online (Sandbox Code Playgroud)

以上可能导致UI滞后,如果您在SO上搜索"文本到语音初始化缓慢",您会发现很多帖子.嵌入式高品质IVONA声音曾经是最糟糕的罪魁祸首,但Google TTS引擎现已获此殊荣.

他们最近的APK更新导致初始化时出现严重滞后 - 无需测试此代码,您可以转到Android文本到语音设置并尝试在可用引擎之间切换,同时按"收听样本",显示延迟很好".

为了尝试解决这个问题,我实施了以下内容:

private volatile TextToSpeech tts;

AsyncTask.execute(new Runnable() {
    @Override
    public void run() {
        tts = new TextToSpeech(context, volatileOnInitListener);
    }
});
Run Code Online (Sandbox Code Playgroud)

这完全解决了初始化的滞后问题,但我担心这可能会产生副作用,我没有考虑过?任何人都可以想到吗?

我也很困惑,因为我相信TextToSpeech构造函数是异步的,因此将此构造函数移动到工作线程应该没有区别?如果这种实现是前进的方向,那么Google为什么不在TextToSpeechSettings中实现它呢?

希望有人能澄清以上内容.提前致谢.

编辑 - 当我说"构造函数是异步的"时,我真的指的是它启动的引擎初始化过程,以及最终调用onInit

F43*_*d1r -1

我曾相信 TextToSpeech 构造函数是异步的

这只是部分正确。许多初始化是同步执行的。这是来源

如果这种实现是前进的方向,那么 Google 为什么不在他们的 TextToSpeechSettings 中实现它呢?

谷歌似乎很少检查他们的代码在中低端设备上的运行情况,我想在高端设备上不会出现延迟。(发生这种情况的另一个例子可以在当前的 YouTube 应用程序中看到,我个人可以确认中型设备上有延迟,而高端设备上没有延迟。)这纯粹是猜测,因为我不隶属于谷歌。

我担心这可能会有我没有考虑到的副作用?有人能想到吗?

唯一(明显)的副作用是您无法同步使用 tts 引擎,而必须等待异步任务完成。但无论如何,情况已经如此了。您要做的唯一一件事就是在 UI 线程之外执行一些代码,这些代码不希望在 UI 线程上运行。这永远不应该是一个问题。即使出现问题,您也只能通过在应用程序中测试来发现它。

一般来说,你可以走了。