安卓:两个Text-to-Speech实例工作非常缓慢

6

我需要在我的Andorind应用程序中实现一个功能,允许在当前活动中播放两种不同的合成语言 - 例如有两个按钮Say English和Say French

我尝试了以下两种方法,但它们都效果不佳,因为在声音播放之前存在长时间的延迟:

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

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


这个问题的状态是什么?你找到解决方案了吗? - Sergey Podolsky
3个回答

0

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

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

希望这能有所帮助。

不幸的是问题仍然存在。问题发生在TTS实例已经初始化之后。有两个按钮“说英语”和“说法语”,当我点击第一个按钮(说英语)时,响应速度是可以接受的,但是当我点击第二个按钮(说法语)时,在任何东西被说出之前会出现显著的延迟。总结一下,切换语言需要很长时间,这就是问题所在。 - PawelP
我测试了一下,除了第一次播放之外,它都运行良好。如果您告诉我您的电子邮件地址,我会发送给您我的示例代码。 - sam
请将您的解决方案发送至peperoni321@gmail.com,非常感谢。 - PawelP

0

看起来这就是TextToSpeech的设计方式。猜测它只能同时加载一种语言数据,当您请求另一种语言时,它必须卸载当前语言数据并加载新的语言数据。 我已经在这里添加了问题: https://code.google.com/p/android/issues/detail?id=200974

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

作为现在的解决方法,您可以预先合成音频文件,然后简单地播放它。例如,您可以在启动Activity时启动一些AsyncTask,并在后台生成声音。当准备好时,在UI上显示按钮以允许用户播放它。 此外,我发现将TextToSpeech放入自己的服务进程中使用android:process属性更好,以避免在某些设备上设置语言时UI冻结。

更新2016-02-17:我刚刚将TextToSpeech更新到2月15日的3.8.14版本。不再有延迟!我正在使用两种语言逐个阅读不同的语言文本,不再有延迟! 感谢Google和TextToSpeech团队!你们是最棒的!

更新于2016年2月18日:我测试了更多的设备,发现在仍在使用Android 4.x的旧设备上问题仍然存在。在安装有Android 4.1.2的XOOM和安装有Android 4.1.1的一些无名设备7100上进行了测试。两者仍然存在相同的延迟问题。 不确定是否相关,但我注意到两个安装有Android 4.x的Android设备都存在UtteranceProgressListener的问题。为了使其在这些设备上正常工作,我必须将utteranceId参数传递到speak()函数中。 然而,在这个bug已经消失的设备上,没有传递该参数也可以正常工作。 目前正常工作的设备是安装有Android 5.0.2的LG d405,并且在我安装最近的TextToSpeech更新之前也存在相同的延迟问题。


0
你可以在应用程序启动时等待两个TTS引擎完成初始化,然后再进行任何用户交互(通过创建一个OnInitListener并等待 - 例如使用信号量 - 直到调用onInit()方法),这样当用户到达应用程序中引入按钮的点时,你已经初始化了这两个引擎,如何?

谢谢你的提示,我会去检查一下。 - PawelP
1
不幸的是问题仍然存在。问题发生在TTS实例已经初始化之后。有两个按钮“说英语”和“说法语”,当我点击第一个按钮(说英语)时,响应速度是可以接受的,但是当我点击第二个按钮(说法语)时,在任何东西被说出之前会出现显著的延迟。总结一下,切换语言需要很长时间,这就是问题所在。 - PawelP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接