2011-06-19 13 views
5

isSpeaking()メソッドで問題が発生しました。 QUEUE_FLUSHspeak()メソッドに渡すときは、isSpeaking()が問題ありません。しかし、私が複数の発話をキューに入れるとき(QUEUE_ADDを渡す)、isSpeaking()メソッドは、複数の発話がキューに入れられた直後にfalseを返し始めます。AndroidでText-to-Speechを使用するとisSpeaking()の問題が発生する

は、その後、私はthe source code of the TtsService classを偶然見つけてこのコードを見て:

public boolean isSpeaking() { 
    return (mSelf.mIsSpeaking && (mSpeechQueue.size() < 1)); 
} 

誰もが任意のアイデアを持っています、なぜこの方法は、このような方法で実装されたのですか?

答えて

8

私もこの1つに遭遇しました。

あなたがこの質問をしたし、何の答えは地平線ではありませんので、それはだから私は誰でもコードのこの作品を書いたことは

を意味することを意図していることだけを推測することができます...

ちょうど1年となっています

最後発話」と発音した場合のみとなります。

これは意味がありますか?

唯一の問題はということです、かどうかに関係なくQUEUE_ADDまたはQUEUE_FLUSHモードでの、経験的な観察が関与深刻なタイミング競合条件があることを示唆している:onUtteranceCompleted()に呼び出された場合

  1. isSpeaking()は常にを返します。
  2. isSpeaking()は常にonUtteranceCompleted()最初tts.speak()た直後に呼ば場合が返されます。
  3. isSpeaking()は常に最後onUtteranceCompleted()と自身の間で分離する少なくとも1以上tts.speak()秒を持っているtts.speak()た直後に呼ば場合を返します。ように

、それは "意図" の正反対に動作:

onUtteranceCompleted(後)

"発話を話す場合にのみ"

なぜそれが私の向こう側にありますか?それはなぜLogCatが示すものですか?

またofficial documentationに、次の追加の点に注意してください。

注それは、オーディオミキサーに送られた、またはファイルに書き込まれた オーディオデータだ後、スピーチ項目が完了したと見なされることがありかもしれません。 は、この点の間有限遅れこと、およびオーディオハードウェアが完了したとき 再生。 "OTHで

この言葉は全く役に立たない。

3

キューが完了するとブロードキャストインテントが発生します:ACTION_TTS_QUEUE_PROCESSING_COMPLETED。

ここでは、BroadCastReceiverを登録し、これを使用してisSpeaking状態を判別するクラスの例を示します。

あなたの活動の関連する場所から

コールの初期化とシャットダウンし、このクラスで提供話し、isSpeaking機能を使用します。

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.speech.tts.TextToSpeech; 
import android.speech.tts.TextToSpeech.OnInitListener; 

public class SpeechWrapper { 

private static TextToSpeech mTts = null;   
private static boolean isSpeaking = false; 
private static BroadcastReceiver receiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(TextToSpeech.ACTION_TTS_QUEUE_PROCESSING_COMPLETED) && mTts != null) 
     { 
      isSpeaking = false; 
     } 
    } 
}; 

private static void Speak(String sMessage, int intQueueType, int delay) { 
    if (mTts == null || sMessage == null) return; 
    sMessage = sMessage.trim(); 
    isSpeaking = true; 
    if (delay > 0) { 
     mTts.playSilence(delay, intQueueType, null); 
     intQueueType = TextToSpeech.QUEUE_ADD; 
    } 
    mTts.speak(sMessage, intQueueType, null); 
} 

public static void Init(Context context) { 
    mTts = new TextToSpeech(context, (OnInitListener) context); 
    IntentFilter filter = new IntentFilter(TextToSpeech.ACTION_TTS_QUEUE_PROCESSING_COMPLETED); 
    context.registerReceiver(receiver, filter); 
} 

public static void Shutdown() { 
    if (mTts != null) { 
     mTts.stop(); 
     mTts.shutdown(); 
    } 
} 

public static boolean isSpeaking() { 
    return isSpeaking; 
} 

} 
関連する問題