【问题标题】:When to use the UtteranceProgressListener何时使用 UtteranceProgressListener
【发布时间】:2018-01-20 17:11:39
【问题描述】:

我有一个带有两个 ImageButton(PlayStop)的 FrameLayout。默认情况下

播放按钮是VISIBLE停止按钮是GONE

点击播放会启动TTS引擎来读取文本。在完成阅读文本时,我想设置的可见性

播放到GONE,停止到VISIBLE

我应该使用 UtteranceProgressListener 来达到目的吗?如果没有,

  • 如何执行上述操作?
  • UtteranceProgressListener 的用途是什么?

【问题讨论】:

    标签: android text-to-speech


    【解决方案1】:

    你的意思可能是:

    • 阅读开始 -> Play 消失,Stop 可见
    • 阅读结束 -> 播放可见,停止不见了

    无论如何,UtteranceProgressListener 的目的正是您所描述的。用于监控语音合成的进度。

    您可以在说出的任何文本中添加“话语 ID”(此处为“helloText”):

    tts.speak("Hello Stack Overflow!", TextToSpeech.QUEUE_ADD, "helloText");
    

    但在你的情况下这并不是真正必要的,所以最后一个参数可以为空:

    tts.speak("Hello Stack Overflow!", TextToSpeech.QUEUE_ADD, null);
    

    应该在调用speak() 之前添加UtteranceProgressListener。例如,如果 TTS 状态为 TextToSpeech.SUCCESS,您可以在 TTS 初始化回调 onInit() 中执行此操作。

    它可以是一个单独的类,也可以只是一个匿名的内部类:

    speech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
            @Override
            public void onStart(String utteranceId) {
                // Speaking started. 
    
            }
    
            @Override
            public void onDone(String utteranceId) {
                // Speaking stopped.
    
                }
    
            }
    
            @Override
            public void onError(String utteranceId) {
                // There was an error.
            }
        });
    

    onStart() 方法在讲话开始时触发(在调用 speak() 后不久),因此这是切换可见按钮的一个可能位置。例如,播放按钮可以切换为停止按钮。

    onDone() 方法在讲话结束时触发,这是另一个可能切换可见按钮的地方。例如,停止按钮可以切换为播放按钮。

    如您所见,如果您在 speak() 方法调用中提供了“话语 ID”,则这两种方法都可以使用。如果您需要确切地知道正在朗读/结束朗读/因错误而失败的文本,这将非常有用。

    【讨论】:

    • 抱歉回来晚了。努力让 UtteranceProgressListener 工作。但目前还没有任何成果。甚至尝试将 Hashmap 和 Bundle 用于 UtteranceID。可能遗漏了什么。
    • 如果可能的话,你能检查我的代码sn-ps。我可以粘贴代码 sn-ps。
    • 你能详细说明utterance id吗?为什么需要它?
    • 就像说没有话语ID,你只会知道一些文本的合成已经开始或结束,但你不知道它是哪个文本。在简单的用例中,这不是问题,您不需要话语 ID。例如,如果您有一个说话很多且具有情境意识的应用程序(例如导航应用程序),则可能需要优先处理某些文本:如果更重要的消息排队,则某些文本可能会被打断,更重要的消息可以保护不被中断。在这种情况下,您想确切地知道当前所说的文本。
    • ...或者您可能只想在说出特定文本时在您的 UI 上触发一些视觉效果。或者您可能想按特定顺序说出几个文本,并且话语 ID 可以对应于文本在 ArrayList 或类似内容中的位置。这取决于你的想象力。
    【解决方案2】:

    UtteranceProgressListener 可用于识别 TTS 何时完成。试试下面这段代码,它会在 TTS 完成后显示祝酒词。

    public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener{
        private boolean initialized;
        private String queuedText;
        private String TAG = "TTS";
        private TextToSpeech tts;
    
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
    
            tts = new TextToSpeech(this /* context */, this /* listener */);
            tts.setOnUtteranceProgressListener(mProgressListener);
    
    
            speak("hello world");
    
        }
    
    
    
    
        public void speak(String text) {
    
            if (!initialized) {
                queuedText = text;
                return;
            }
            queuedText = null;
    
            setTtsListener(); // no longer creates a new UtteranceProgressListener each time
            HashMap<String, String> map = new HashMap<String, String>();
            map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId");
            tts.speak(text, TextToSpeech.QUEUE_ADD, map);
        }
    
    
        private void setTtsListener() {
    
        }
    
    
    
    
    
        @Override
        public void onInit(int status) {
            if (status == TextToSpeech.SUCCESS) {
                initialized = true;
                tts.setLanguage(Locale.ENGLISH);
    
                if (queuedText != null) {
                    speak(queuedText);
                }
            }
        }
    
    
    
        private abstract class runnable implements Runnable {
        }
    
    
    
    
        private UtteranceProgressListener mProgressListener = new UtteranceProgressListener() {
            @Override
            public void onStart(String utteranceId) {
            } // Do nothing
    
            @Override
            public void onError(String utteranceId) {
            } // Do nothing.
    
            @Override
            public void onDone(String utteranceId) {
    
                new Thread()
                {
                    public void run()
                    {
                        MainActivity.this.runOnUiThread(new runnable()
                        {
                            public void run()
                            {
    
                                Toast.makeText(getBaseContext(), "TTS Completed", Toast.LENGTH_SHORT).show();
    
                            }
                        });
                    }
                }.start();
    
            }
        };
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-23
      • 2013-12-16
      • 2015-04-15
      • 2014-03-17
      • 2019-02-27
      • 2017-08-15
      • 2014-09-25
      • 2015-02-15
      • 1970-01-01
      相关资源
      最近更新 更多