8

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

tts = new TextToSpeech(context, myOnInitListener);

以上可能会导致 UI 滞后,如果您在 SO 上搜索“文本到语音初始化缓慢”,您会发现很多帖子。嵌入的高品质 IVONA 语音曾经是最糟糕的罪魁祸首,但现在谷歌 TTS 引擎获得了大奖。

他们最近的 APK 更新导致初始化出现严重滞后 - 无需代码来测试这一点,您可以转到 Android 文本到语音设置并尝试在可用引擎之间切换,同时按下“收听示例”,显示滞后'很好'。

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

private volatile TextToSpeech tts;

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

这已经完全治愈了初始化的滞后,但我担心这可能会产生我没有考虑过的副作用?有人能想到吗?

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

希望有人能澄清上述情况。提前致谢。

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

4

1 回答 1

-1

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

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

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

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

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

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

一般来说,你很高兴。

于 2016-03-29T14:51:11.377 回答