2012-03-17 4 views
0
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 


      } 
     } 
    } 

I'm using [the iSpeech library's音声合成class](http://www.ispeech.org/androidsdkdoc/com/ispeech/SpeechSynthesis.html). When I call theは、文章のすべてを一度に起動し、一度に一つの文を渡し、method in a for`ループを話します。私はこれがメソッドが非ブロックであるためだと思います。オープンソースではないので、どのように動作するのか分かりません。前の文が終わるまで1つの文が始まらないようにするにはどうすればいいですか?SpeechSynthesis.speak(String)をブロックするにはどうすればいいですか?

+0

無記号、悪い表現の質問、それに入れていない努力を。 –

答えて

2

通常、これらの種類のライブラリでは、コードはサウンドが正常に再生されるのを待つことはありません。

documentation of your libraryから、あなたが次の文を読む前にPLAY_SUCCESSFULSpeechSynthesisEventのために耳を傾けなければならないようです。

それはあなたのニーズに合った場合javax.speech.synthesisは、音声が完了するまで待つことはなく、単純なメカニズム、それをチェックアウトしていますhttp://java.sun.com/products/java-media/speech/forDevelopers/jsapi-guide/Synthesis.html

+0

ご注意いただきありがとうございます。しかし、私はAndroidアプリを書いているので、javax.speech、javax.speech.synthesisライブラリは使用できません。私はwaitenginestateメソッドを使用することはできません。 – Coenni

関連する問題