Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让SpeechSynthesis.speak(字符串)阻止?_Java_Android_Multithreading_Text To Speech_Ispeech - Fatal编程技术网

Java 如何让SpeechSynthesis.speak(字符串)阻止?

Java 如何让SpeechSynthesis.speak(字符串)阻止?,java,android,multithreading,text-to-speech,ispeech,Java,Android,Multithreading,Text To Speech,Ispeech,我正在使用[iSpeech库的SpeechSynthesis类](http://www.ispeech.org/androidsdkdoc/com/ispeech/SpeechSynthesis.html). 当我调用for`-循环中的speak方法,一次传递一个句子时,所有句子立即开始。我猜这是因为该方法是非阻塞的。它不是开源的,所以我看不出它是如何工作的。我怎样才能使它在前一句话完成之前不会开始一句话?通常对于这些类型的库,代码不会等待声音停止播放(出于充分的理由) 从中可以看出,在阅读下一

我正在使用[iSpeech库的
SpeechSynthesis
类](http://www.ispeech.org/androidsdkdoc/com/ispeech/SpeechSynthesis.html). 当我调用
for`-循环中的speak
方法,一次传递一个句子时,所有句子立即开始。我猜这是因为该方法是非阻塞的。它不是开源的,所以我看不出它是如何工作的。我怎样才能使它在前一句话完成之前不会开始一句话?

通常对于这些类型的库,代码不会等待声音停止播放(出于充分的理由)

从中可以看出,在阅读下一个句子之前,你应该先用
PLAY\u SUCCESSFUL
speechsynthevent


如果它适合您的需要,
javax.speech.synthesis
有一个相当简单的机制,可以一直等到演讲结束,请查看它:

没有代码,措辞拙劣的问题,没有投入任何精力。感谢关注。但我正在编写Android应用程序,所以我不能使用javax.speech、javax.speech.synthesis库。而且我不能使用waitenginestate方法。
 public boolean playing=false;
  private void prepareTTSEngine() {
        try {
            synthesis = SpeechSynthesis.getInstance(this);


            synthesis.setSpeechSynthesisEvent(new SpeechSynthesisEvent() {

                public void onPlaySuccessful() {
                    Log.i(TAG, "onPlaySuccessful");
                    playing=true;

                }

                public void onPlayStopped() {
                    Log.i(TAG, "onPlayStopped");
                    playing=false;

                }

                public void onPlayFailed(Exception e) {
                    Log.e(TAG, "onPlayFailed");
                    e.printStackTrace();
                    playing=false;
                }

                public void onPlayStart() {
                    Log.i(TAG, "onPlayStart");
                    //playing=true;

                }

                @Override
                public void onPlayCanceled() {
                    Log.i(TAG, "onPlayCanceled");
                    playing=false;
                }


            });

            //synthesis.setVoiceType("usenglishfemale1"); // All the values available to you can be found in the developer portal under your account

        } catch (InvalidApiKeyException e) {
            Log.e(TAG, "Invalid API key\n" + e.getStackTrace());
            Toast.makeText(_context, "ERROR: Invalid API key", Toast.LENGTH_LONG).show();
        }

    }

         prepareTTSEngine();
        String speech= MapLocationOverlay.mSelectedMapLocation.getShortDesc();
        synthesis.setVoiceType("usenglishfemale");

        BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
        iterator.setText(speech);
        int start = iterator.first();

        for (int end = iterator.next();end != BreakIterator.DONE; start = end, end = iterator.next()) {
            if(speech !=null && speech.substring(start,end).compareTo("")!=0)
            {
                String sentence_next=speech.substring(start,end);                   
                        //set ready flag to true (so isReady returns true) 


                while(playing==true)
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                            try {
                                synthesis.speak(sentence_next);
                            } catch (BusyException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (NoNetworkException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }


enter code here


            }
        }
    }