【问题标题】:TextToSpeech OnUtteranceCompletedListener causes delayTextToSpeech OnUtteranceCompletedListener 导致延迟
【发布时间】:2014-04-24 09:39:19
【问题描述】:

我需要 TextToSpeech 引擎一个接一个地说出我的话,并且我试图抓住一个单词的结束来开始说下一个单词。但是OnUtteranceCompletedListener 会导致语音延迟。 所以我的问题是,我该如何解决这个问题或更好地实现OnUtteranceCompletedListener

public class AndroidTextToSpeechActivity extends Activity implements TextToSpeech.OnInitListener {

    int result = 0, CURRENT_WORD = 0;
    HashMap<String, String> myHash;
    String[] words;
    Button btnSpeak;
    TextToSpeech tts;
    Handler hand = new Handler();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text = "Hi there how are you";
        words = text.split(" ", 50);
        myHash = new HashMap<String, String>();
        tts = new TextToSpeech(this, this);

        btnSpeak = (Button) findViewById(R.id.btnSpeak);
        btnSpeak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                hand.postDelayed(run, 300);
            }
        });
    }

    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            result = tts.setLanguage(Locale.getDefault());
            tts.setPitch(1f);
            tts.setSpeechRate(1f);
        } else
            Log.e("TTS", "Init failed");
    }

    Runnable run = new Runnable() {
        public void run() {
            text = words[CURRENT_WORD];
            tts.speak(text, 1, myHash);
            tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() {

                @Override
                public void onUtteranceCompleted(String utteranceId) {
                    CURRENT_WORD++;
                    hand.post(run1);
                }
            }); 
        }
    };

}

【问题讨论】:

    标签: android text-to-speech onutterancecompleted


    【解决方案1】:

    您可以通过不在每次运行中重新创建 OnUtteranceCompleteListener 来加快速度

    OnUtteranceCompletedListener listener=new OnUtteranceCompletedListener(){
        @Override
        public void onUtteranceCompleted(String utteranceId) {
            CURRENT_WORD++;
            hand.post(run1);
        }
    }
    tts.setOnUtteranceCompletedListener(listener);
    Runnable run = new Runnable() {
        public void run() {
            text = words[CURRENT_WORD];
            tts.speak(text, 1, myHash);
        }
    };
    

    此外,您可以使用 onUtteranceCompleted 方法调用 speak() 方法,而不是使用 Runnable 通过处理程序调用引擎的 speek() 方法

    OnUtteranceCompletedListener listener=new OnUtteranceCompletedListener(){
        @Override
        public void onUtteranceCompleted(String utteranceId) {
            CURRENT_WORD++;
            if(CURRENT_WORD<max_words){
                String text=words[CURRENT_WORD];
                tts.speak(text,1,myHash);
            }
        }
    }
    tts.setOnUtteranceCompletedListener(listener);
    Runnable run = new Runnable() {
        public void run() {
            text = words[CURRENT_WORD];
            tts.speak(text, 1, myHash);
        }
    };
    

    【讨论】:

    • 是的,这大大简化了我的代码,并减少了侦听器和可运行对象的初始化。现在延迟更小了,但仍然是大约 1 秒,这对于说话来说太多了。
    • 你能说延迟减少了多少?
    • 我猜大约是 40 毫秒,但每个单词之间的停顿仍然比正常的大约 200 毫秒(0.2 秒)长,这些数字确实很少,但在正常说话速度下,停顿大约是 0.5秒,这个停顿大约是 0.8,这让讲话听起来很奇怪。
    【解决方案2】:

    如果Locale.getDefault() 语言不受支持或需要数据文件,您的代码将失败。此外,如果在您按下btnSpeak 后,onInit() 没有返回 300 毫秒,speak() 将不起作用。 您应该在 xml 布局文件中禁用 btnSpeak 并在 onInit 中启用它。在btnSpeak listener 循环通过words 并调用speak()

    btnSpeak = (Button) findViewById(R.id.btnSpeak);
        btnSpeak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                for (int i = 0; i < words.length; i++) {
                    tts.speak(text, 1, myHash);
                    // call playSilence (long durationInMs, 1, myHash) 
                    // if you want a slight delay between each word.
                }
            }
        });
    

    【讨论】:

    • 您的代码是正确的,但没有解决我的延迟问题,因为在完整的代码中,我在说出一个单词时制作了一些动画,这就是为什么我必须为每个单词捕捉事件 Utterance Completed。我只发布了这部分代码,因为无论是动画还是其他任何东西,延迟都是在 OnUtteranceCompletedListener 中创建的。本地化的注释也是正确的,我正在完整代码中进行这些检查(并禁用按钮)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多