【问题标题】:setOnUtteranceProgressListener not at all working for Text To Speech for API > 21setOnUtteranceProgressListener 根本不适用于 API > 21 的 Text To Speech
【发布时间】:2019-02-13 10:31:46
【问题描述】:

我希望setOnUtteranceProgressListener 应该在演讲结束后通知Toast。它似乎不起作用。 我使用了setOnUtteranceProgressListener,在发言功能上我提到了paramaters,如下所示..

    Bundle params = new Bundle();
    params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, MainActivity.this.getPackageName());

我在调用 speak 函数时给出了一个“UniqueId”,如下所示。

    myTTS.speak(message,TextToSpeech.QUEUE_FLUSH,params,"UniqueId");

在我的program 中,文本到语音引擎完成讲话后,它应该运行一个 Toast 通知它已完成讲话。但 setOnUtteranceProgressListner 似乎不起作用。

    myTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
        @Override
        public void onStart(String utteranceId) {

        }

        @Override
        public void onDone(String utteranceId) {

            Toast.makeText(MainActivity.this,"Finished speaking.",Toast.LENGTH_LONG).show();
        }

        @Override
        public void onError(String utteranceId) {

        }
    });

全部代码如下..

    public class MainActivity extends AppCompatActivity {
String message;
private TextToSpeech myTTS;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    myTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if(myTTS.getEngines().size() == 0){
                Toast.makeText(MainActivity.this,"No Engines Installed",Toast.LENGTH_LONG).show();
            }else{
                myTTS.setLanguage(Locale.US);

                if (status == TextToSpeech.SUCCESS){
                    //Toast.makeText(MainActivity.this,"Status working.",Toast.LENGTH_LONG).show();
                    message = "How may i help you.";
                }

            }
        }
    });

    myTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
        @Override
        public void onStart(String utteranceId) {

        }

        @Override
        public void onDone(String utteranceId) {

            Toast.makeText(MainActivity.this,"onDone working.",Toast.LENGTH_LONG).show();
        }

        @Override
        public void onError(String utteranceId) {

        }
    });
}

请给出解决方案。

【问题讨论】:

    标签: java android text-to-speech


    【解决方案1】:

    主要问题有:

    1) 在 tts 初始化之前设置进度监听器。

    2) 尝试从后台线程制作 Toast。

    我还有一些其他建议的更改,但不是必需的:

    public class MainActivity extends AppCompatActivity {
        String message = "How may I help you?";
        String mostRecentUtteranceID;
        private TextToSpeech myTTS;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            myTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
                @Override
                public void onInit(int status) {
                    if(myTTS.getEngines().size() == 0){
                        Toast.makeText(MainActivity.this,"No Engines Installed",Toast.LENGTH_LONG).show();
                    }else{
                        if (status == TextToSpeech.SUCCESS){
                            ttsInitialized();
                        }
                    }
                }
            });
        }
    
        private void ttsInitialized() {
    
            // *** set UtteranceProgressListener AFTER tts is initialized ***
            myTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                @Override
                public void onStart(String utteranceId) {
    
                }
    
                @Override
                // this method will always called from a background thread.
                public void onDone(String utteranceId) {
    
                    // only respond to the most recent utterance
                    if (!utteranceId.equals(mostRecentUtteranceID)) { 
                        Log.i("XXX", "onDone() blocked: utterance ID mismatch.");
                        return; 
                    } // else continue...
    
                    boolean wasCalledFromBackgroundThread = (Thread.currentThread().getId() != 1);
                    Log.i("XXX", "was onDone() called on a background thread? : " + wasCalledFromBackgroundThread);
    
                    Log.i("XXX", "onDone working.");
    
                    // for demonstration only... avoid references to 
                    // MainActivity (unless you use a WeakReference)
                    // inside the onDone() method, as it
                    // can cause a memory leak.
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // *** toast will not work if called from a background thread ***
                            Toast.makeText(MainActivity.this,"onDone working.",Toast.LENGTH_LONG).show();
                        }
                    });
                }
    
                @Override
                public void onError(String utteranceId) {
    
                }
            });
    
            // set Language
            myTTS.setLanguage(Locale.US);
    
            // set unique utterance ID for each utterance
            mostRecentUtteranceID = (new Random().nextInt() % 9999999) + ""; // "" is String force
    
            // set params
            // *** this method will work for more devices: API 19+ ***
            HashMap<String, String> params = new HashMap<>();
            params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, mostRecentUtteranceID);
    
            myTTS.speak(message,TextToSpeech.QUEUE_FLUSH,params);
    
        }
    
    }
    

    【讨论】:

    • 我可以要你的 gmail id。
    • 如何在没有直接来自主活动的按钮的情况下运行 speak() 方法。
    • 不,但您可以随时提出其他问题。很高兴我能/可以提供帮助。
    • 请调查这个问题。 stackoverflow.com/questions/52217161/…
    • 是否可以从 AsyncTask 调用语音识别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多