【问题标题】:Initialising the TextToSpeech object on a worker thread在工作线程上初始化 TextToSpeech 对象
【发布时间】:2016-07-01 00:43:44
【问题描述】:

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

tts = new TextToSpeech(context, myOnInitListener);

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

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

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

private volatile TextToSpeech tts;

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

这已经完全解决了初始化的滞后问题,但我担心这可能会产生我没有考虑过的副作用?谁能想到?

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

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

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

【问题讨论】:

  • 我认为你是对的。

标签: java android text-to-speech google-text-to-speech


【解决方案1】:

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

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

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

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

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

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

总的来说,你很高兴。

【讨论】:

  • 我认为您不了解该过程的工作原理。 onInit 是一个接口回调,依赖于绑定到TextToSpeechService
  • dispatchOnInit 仅在进程失败时从 initTts 调用。否则在返回结果之前调用connectToEngine
  • 我在阅读代码时实际上错过了一个括号。对不起,我更新了我的答案。
  • 谢谢。 That is only partially true. A lot of the initialization is executed syncronously。你能澄清一下吗?你的意思是这个过程只有在没有失败的情况下才是异步的?
  • 这是其中的一部分,但我特别提到了 getEngineInfo 和 getHighestRankingEngine 调用,它们在内部调用了 packagemanager。根据我的经验,pm 查询相当慢。
猜你喜欢
  • 2014-09-02
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2013-05-16
相关资源
最近更新 更多