语音合成应用程序的用户界面在安卓设备上运行缓慢。

8
在我的应用程序中,我正在使用TTS。我有20个不同的活动,当用户向左或向右滑动时这些活动会发生变化。根据活动,会朗读出一段文字。我使用单独的线程执行tts,并且活动选择是在主线程中完成的。但问题是非常缓慢,UI感觉很卡顿。当我向左或向右滑动时,一旦tts朗读完毕,活动就会改变,这不应该发生,因为我正在为tts使用单独的线程。
以下是代码:
TTS类:
public class textToSpeech {

TextToSpeech tts=null;

public textToSpeech(Context con)
{
    tts = new TextToSpeech(con,new TextToSpeech.OnInitListener() {

        @Override
        public void onInit(int status) {

            if(status != TextToSpeech.ERROR) // initialization me error to nae ha
            {
                tts.setPitch(1.1f); // saw from internet
                tts.setSpeechRate(0.4f); // f denotes float, it actually type casts 0.5 to float
                tts.setLanguage(Locale.US);
            }

        }
    });
}

public void SpeakText (String text)
{
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); // TextToSpeech.QUEUE_FLUSH forces the app to stop all the sounds that are currently playing before speaking this text
}


public void stopSpeak()
{
    tts.stop();
}

手势读取器类:(独立类)

public void decideAlphabet()
{
    tts.stopSpeak();

    threadForTTS.start();

    switch (i)
    {
        case 0:
            activities=null;
            activities = new Intent(contxt,A.class); 
            contxt.startActivity(activities); 

            break;

        case 1:
            activities=null;
            activities = new Intent(contxt,B.class);
            contxt.startActivity(activities);

            break;
                   ....... 20 more case statements for selecting activities
              }

当检查到向右或向左滑动时,将调用decideActivity()方法。

注意:

在此应用程序中添加tts之前,UI正常运行,没有延迟或缓慢。添加TTS后,应用变慢了。我该如何解决这个问题?

敬礼


有人能帮忙吗? - user2498079
1个回答

8

我曾经遇到同样的问题,当我看到以下logcat错误时,准备发表评论:...skipped x many frames. The application may be doing too much work on its main thread.

当然,我确定TTS是从另一个线程调用的,我使用Thread.currentThread().getName()进行了检查。但是,事实证明OnInit仍在主线程上运行,而设置语言似乎是一项昂贵的操作。将onInit的内容快速更改为在新线程中运行,UI冻结/choreographer抱怨就停止了:

@Override
public void onInit(int status) {
   new Thread(new Runnable() {
      public void run() {
         if(status != TextToSpeech.ERROR) // initialization me error to nae ha
         {
            tts.setPitch(1.1f); // saw from internet
            tts.setSpeechRate(0.4f); // f denotes float, it actually type casts 0.5 to float
            tts.setLanguage(Locale.US);
         }
      }
   }
}).start()

忘了提醒你,除非将初始状态设置为final,否则可能会出现代码错误。 - sham
非常感谢!我已经为此苦苦挣扎了很长时间。TTS初始化一直冻结我的UI屏幕。我从未想过可以覆盖onInit方法并在线程中运行它。我认为这是TTS变慢并冻结主UI线程的唯一功能性解决方案! - pajus_cz
1
我尝试过这个解决方案,但对于英语以外的任何语言都不起作用。它无法正确设置语言。 - mthandr
@mobilepotato7 你是如何设置语言的?此外,你的设备上是否实际安装了其他 TTS 语言包? - sham
@sham 只需使用 mTextToSpeech.setLanguage(locale) 来设置语言即可。如果不将其放在后台线程中,它可以正常工作,但当然,在外部运行时,它会冻结用户界面。 - mthandr
显示剩余2条评论

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