2012-07-10 12 views
7

私は音声変換にテキストを使用しているアンドロイドアプリケーションを開発しています。アプリケーションを開いて音声変換を実行するときに必要なことは何ですか。この終了後、私はいくつかのthing.Myコードをしたい、私は細かい作業音声に自分のアプリケーションのテキストを開くとTTS(コールバック)アンドロイドの完了を検出できません。

public class Mainactivity extends Activity implements OnInitListener, OnUtteranceCompletedListener{ 
    private static int REQ_CODE = 1; 
    private TextToSpeech tts = null; 
    private boolean ttsIsInit = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    startTextToSpeech(); 
    } 

    private void startTextToSpeech() { 
     Intent intent = new Intent(Engine.ACTION_CHECK_TTS_DATA); 
     startActivityForResult(intent, REQ_CODE); 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQ_CODE) { 
      if (resultCode == Engine.CHECK_VOICE_DATA_PASS) { 
       tts = new TextToSpeech(this, this); 
      } 
      else { 
       Intent installVoice = new Intent(Engine.ACTION_INSTALL_TTS_DATA); 
       startActivity(installVoice); 
      } 
     } 
    } 

     public void onInit(int status) { 
      if (status == TextToSpeech.SUCCESS) { 
       ttsIsInit = true; 
       int result = tts.setOnUtteranceCompletedListener(this); 
       if (tts.isLanguageAvailable(Locale.ENGLISH) >= 0) 
        tts.setLanguage(Locale.ENGLISH); 
       tts.setPitch(5.0f); 
       tts.setSpeechRate(1.0f); 

       HashMap<String, String> myHashAlarm = new HashMap<String, String>(); 
        myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM)); 
        myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "SOME MESSAGE"); 
        tts.speak("hi how are you?", TextToSpeech.QUEUE_FLUSH, myHashAlarm); 
      } 
     } 

    @Override 
    public void onDestroy() { 
     if (tts != null) { 
     tts.stop(); 
     tts.shutdown(); 
     } 
     super.onDestroy(); 
    } 

    @Override 
    public void onUtteranceCompleted(String uttId) { 
     Toast.makeText(Mainactivity.this,"done", Toast.LENGTH_LONG).show(); 
     if (uttId.equalsIgnoreCase("done")) { 
      Toast.makeText(Mainactivity.this,"inside done", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

のように見えます。しかし、どのように話し言葉が完了したかどうかを検出する方法。ありがとうございました。.....ありがとう.....ありがとう.....ありがとう.....ありがとう.....

答えて

7

APIレベル15以降を使用している場合は、TextToSpeech参照に進捗リスナーを設定できます。

setOnUtteranceProgressListener(UtteranceProgressListener listener) 

終了時にコールバックを含むTTSの進行状況を報告するコールバックを取得します。 http://developer.android.com/reference/android/speech/tts/TextToSpeech.htmlhttp://developer.android.com/reference/android/speech/tts/UtteranceProgressListener.html

を参照してください。ただし、既に廃止予定のOnUtteranceCompletedListenerを使用しています。 onUtteranceCompleted()でコールバックを取得していますか?それも機能するはずです。ここで

+0

こんにちはデビッドエラーなしで実行しますが、onUtteranceCompletedにメッセージを与えないので、この問題を解決する方法があります。私が何か間違っているかどうか。ヘルプが必要... – nilkash

+1

リスナーを設定するには、 'int result = tts.setOnUtteranceCompletedListener(thi s);'を呼んでください。 'result'変数の値を確認してください。 SUCCESS(0)またはERROR(-1)が戻ってくるはずです。また、いくつかのログを 'onUtteranceCompleted()'に追加して、実際にそこに到達するかどうかを確認してください。また、他の奇妙なエラーについては、logcatを確認してください。 –

+0

ダビッドに感謝してくれてありがとう。そのうまく動作します。私はトーストとその正常な作業の代わりにログを使用します。ありがとうございました... – nilkash

3

あなたはTTSオブジェクトののOnInit関数内setOnUtteranceCompletedListenerを呼び出し15.

private void setTtsListener() 
    { 
     final SpeechRecognizingAndSpeakingActivity callWithResult = this; 
     if (Build.VERSION.SDK_INT >= 15) 
     { 
      int listenerResult = tts.setOnUtteranceProgressListener(new UtteranceProgressListener() 
      { 
       @Override 
       public void onDone(String utteranceId) 
       { 
        callWithResult.onDone(utteranceId); 
       } 

       @Override 
       public void onError(String utteranceId) 
       { 
        callWithResult.onError(utteranceId); 
       } 

       @Override 
       public void onStart(String utteranceId) 
       { 
        callWithResult.onStart(utteranceId); 
       } 
      }); 
      if (listenerResult != TextToSpeech.SUCCESS) 
      { 
       Log.e(TAG, "failed to add utterance progress listener"); 
      } 
     } 
     else 
     { 
      int listenerResult = tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() 
      { 
       @Override 
       public void onUtteranceCompleted(String utteranceId) 
       { 
        callWithResult.onDone(utteranceId); 
       } 
      }); 
      if (listenerResult != TextToSpeech.SUCCESS) 
      { 
       Log.e(TAG, "failed to add utterance completed listener"); 
      } 
     } 
    } 
7

をターゲットにする必要はありませんので、あなたは後方互換性が役立ちますhereからいくつかのコードです。

onUtteranceCompleted関数の呼び出しでUIを変更する場合は、コードをrunOnUIThreadメソッド内に追加します。

話す()関数

例呼び出し中にハッシュマップのparam値を追加することを忘れないでください:私はあなたのソリューションを試みたが、それをonUtteranceCompletedことがsetOnUtteranceProgressListener.Andのために私にエラーを与える

TextToSpeech tts= new TextToSpeech(context, new OnInitListener() { 

@Override 
public void onInit(int status) { 

    mTts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() { 

     @Override 
     public void onUtteranceCompleted(String utteranceId) { 

      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
       //UI changes 
       } 
      }); 
     } 
    }); 

} 
}); 


HashMap<String, String> params = new HashMap<String, String>(); 

params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"stringId"); 

tts.speak("Text to Speak",TextToSpeech.QUEUE_FLUSH, params); 
関連する問題