何时使用UtteranceProgressListener

Tra*_*ler 5 android text-to-speech

我有一个带有两个ImageButtons(播放,停止)的FrameLayout .默认情况下

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

单击" 播放"将启动读取文本的TTS引擎.在完成阅读文本时,我想设置可见性

GONE,停止VISIBLE

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

  • 我该如何执行上述操作?
  • UtteranceProgressListener的目的是什么?

Mar*_*nen 7

你是否意味着:

  • 阅读开始 - > 游戏已经消失,停止可见
  • 阅读结束 - > 游戏可见,停止消失

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

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

tts.speak("Hello Stack Overflow!", TextToSpeech.QUEUE_ADD, "helloText");
Run Code Online (Sandbox Code Playgroud)

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

tts.speak("Hello Stack Overflow!", TextToSpeech.QUEUE_ADD, null);
Run Code Online (Sandbox Code Playgroud)

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

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

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.
        }
    });
Run Code Online (Sandbox Code Playgroud)

onStart()说话开始时(呼叫后不久speak())触发该方法,这是切换可见按钮的一个可能位置.例如,播放按钮可以切换到停止按钮.

onDone()说话结束后触发该方法,这是切换可见按钮的另一个可能位置.例如,可以将" 停止"按钮切换为" 播放"按钮.

如你在speak()方法调用中提供了一个方法,你可以看到两种方法中都有"话语id" .如果您需要确切地知道正在讲话/完成哪些文本/因错误而失败将是有用的.


小智 5

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();

        }
    };


}
Run Code Online (Sandbox Code Playgroud)