谷歌眼镜中的文本到语音 - 只有最后一个函数调用有效

时间:2014-10-14 11:09:48

标签: android google-glass google-gdk

这是我的代码,

   @Override
          public void onInit(int status) {
            if (status == TextToSpeech.SUCCESS) {
              initialized = true;
              tts.setLanguage(Locale.ENGLISH);

              if (queuedText != null) {
                speak(queuedText);
              }
            }
          }

          public void speak(String text) {
            // If not yet initialized, queue up the text.
            if (!initialized) {
              queuedText = text;
              return;
            }
            queuedText = null;
            // Before speaking the current text, stop any ongoing speech.
            tts.stop();
            // Speak the text.
            tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
          }

我正在调用这样的发言功能,

speak("ten");
speak("nine");

我只能听到九个。我正在尝试实施一个计数器,我将在通话之间添加延迟。

1 个答案:

答案 0 :(得分:2)

关于你如何按顺序说话,大致有两个相关的问题:

  1. tts.speak()是一个异步操作。它实际上并没有在那时进行音频,而是将其排队以供音频系统播放。它通常不久后播放,但不能保证它会立即开始说话。

  2. 调用tts.stop()会停止当前正在进行的任何发言,并且使用QUEUE_FLUSH意味着任何尚未播放的文字都不会被播放。因此,如果您在speak("nine")之后立即致电speak("ten"),那么"九"立即删除" ten"从队列中。

  3. 您有几个选择,因为我不知道哪一个会最符合您的需求。

    1. 至少,您应该从speech()函数中删除tts.stop()部分并改为使用QUEUE_ADD。
    2. 所以将代码改为这样的代码应该有效:

      public void speak(String text) {
        // If not yet initialized, queue up the text.
        if (!ttsInitialized) {
          queuedText = text;
          return;
        }
        queuedText = null;
        // Before speaking the current text, stop any ongoing speech.
        //tts.stop();
        // Speak the text.
        tts.speak(text, TextToSpeech.QUEUE_ADD, null);
      }
      
      1. 如果您需要在讲话结束后等待一段时间,则应使用tts.speak()对文本进行排队,并使用UtteranceProgressListener监控其进度。调用UtteranceProgressListener.onDone()方法时,您应该等待一段时间,然后将下一条消息排队等。
      2. 执行此操作的代码可能类似于

        private void countdown( final int start ){
          speak( ""+start );
          if( start > 0 ){
            Handler handler = new Handler();
            handler.postDelayed( new Runnable(){
              @Override
              public void run(){
                countdown( start-1 );
              }
            }, 1000 );
          }
        }
        

        并通过

        进行调用
        countdown(10);
        
相关问题