Android:两个文本到语音转换的实例运行速度非常慢

Android:两个文本到语音转换的实例运行速度非常慢,android,instance,text-to-speech,multiple-instances,Android,Instance,Text To Speech,Multiple Instances,我需要在我的androind应用程序中实现一个功能,允许在当前活动中播放两种不同的合成语言-例如,有两个按钮,分别说英语和法语 我试着用以下两种方法来做,但都没有效果,因为声音播放之前有很长的延迟时间: 第一种方法:创建TTS的单个实例,并根据需要播放的语言,通过setLocale方法更改语言。不幸的是,通过setLocale在语言之间切换非常耗时,这会影响单击按钮后的反应 第二种方法:为各自的语言创建两个TTS实例。不幸的是,这里也会发生延迟,第一个解决方案之间没有区别 您能帮助解决这个恼人的

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

我试着用以下两种方法来做,但都没有效果,因为声音播放之前有很长的延迟时间:

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

  • 您能帮助解决这个恼人的问题吗?

    在任何用户交互之前,等待两个TTS引擎在应用程序开始时完成初始化(通过创建一个TTS引擎并等待(例如使用信号量)直到调用onInit()方法),怎么样,因此,当用户到达应用程序中引入按钮的位置时,两个引擎已经初始化了?

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

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

    希望这能有所帮助。

    看来TextToSpeech就是这样设计的。我猜它可以同时加载一种语言数据,当您请求另一种语言数据时,它必须卸载当前语言数据并加载新的语言数据。 我在这里补充了这个问题:

    也许谷歌会在将来修复它。他们做到了

    作为目前的解决办法,您可以预先合成音频文件,然后简单地播放它。F.g.您可以在启动活动时启动一些异步任务,并在后台生成声音。当它准备好时,显示UI上的按钮,允许用户播放它。 我还发现,使用android:process属性将TextToSpeech内容更好地放入自己的服务进程中,以避免在setLanguage加载语言数据时冻结某些设备上的UI

    更新2016-02-17:我刚刚从2月15日起将TextToSpeech更新为3.8.14版。不要再耽搁了!我用两种语言一个接一个地阅读不同的语言文本,没有任何延迟! 感谢谷歌和TextToSpeech团队!你是最棒的

    更新2016-02-18:我测试了更多的设备,发现仍然使用安卓4.x的旧设备仍然存在问题。在装有安卓4.1.2的XOOM和装有安卓4.1.1的noname设备7100上测试。两者仍然有相同的延迟。 不确定是否与此相关,但我注意到,两款Android设备都与Android4.x有关联,但都与OuttenceProgressListener有问题。为了让它在这样的设备上工作,我必须将outtanceId参数传递到speak()函数中。 然而,没有这个参数,这个bug所在的设备工作得很好。 目前运行良好的设备是带有安卓5.0.2的LG d405
    在我安装最近的TextToSpeech更新之前,它也有同样的延迟问题

    谢谢你的提示。我会检查的。不幸的是问题仍然存在。问题发生在TTS实例已经初始化之后。当我点击第一个按钮(说英语)时,有两个按钮“说英语”和“说法语”,那么响应是可以接受的,但是当我点击第二个按钮(说法语)时,在说任何东西之前会出现明显的延迟。总结一下,语言之间的转换需要很长时间,这就是问题所在。不幸的是,这个问题仍然存在。问题发生在TTS实例已经初始化之后。当我点击第一个按钮(说英语)时,有两个按钮“说英语”和“说法语”,那么响应是可以接受的,但是当我点击第二个按钮(说法语)时,在说任何东西之前会出现明显的延迟。总结一下,语言之间的转换需要很长时间,这就是问题所在。我对它进行了测试,除了第一个剧本外,它工作得很好。如果您告诉我您的电子邮件地址,我会将示例代码发送给您。您可以将解决方案发送到peperoni321@gmail.com,非常感谢。这个问题的状态如何?你找到解决办法了吗?