34

playEarcon() しばらく前に、 が を生成しないこと を発見しましたonUtteranceCompleted()

当時、 「発話が合成されたときに呼び出される」というドキュメントをonUtteranceCompleted()、イヤーコンには適用できないと解釈しました。なぜなら、イヤーコンは実際には TTS 合成の結果ではないからです。

しかし、Android のソース コードをもう一度見てみると、私の解釈を正当化する説明が見つかりません。

私のテスト治具に関するいくつかの事実:

  1. onUtteranceCompleted()earcon の前の発話 ID には常に到着します。その発話は通常の TTS 発話であり、イヤコンではありません。
  2. その後のearcon実行されます(つまり、意図したとおりです)。
  3. onUtteranceCompleted()そのearconは決して現れません。これは非常に一貫した再現可能な動作です。

TtsService のソース コードを深く掘り下げると、の到着 (または不在) に影響を与えるメソッドは 2 つしかないようですonUtteranceCompleted()

  1. TtsService.processSpeechQueue()
  2. TtsService.onCompletion()

そのコードを調べると、3 番目の候補であるTtsService.getSoundResource()が除外されていることがわかります (私の earcon の onUtteranceComplete の欠如の原因として) getSoundResource()。 null を返します。

同じロジックを使用して、最初の候補であるTtsService.processSpeechQueue()も除外できます。同じ事実 #2: イヤーコンは常に再生されるため、次の 2 つの重要なステートメントが常に実行されます。

1108   mPlayer.setOnCompletionListener(this);
...
1111   mPlayer.start();

したがって、2 番目の候補であるTtsService.onCompletion()のみが、 aplayEarcon() が生成 されない理由の可能な説明として残されていonUtteranceCompleted()ます。

public void onCompletion(MediaPlayer arg0) {
  // mCurrentSpeechItem may become null if it is stopped at the same
  // time it completes.
  SpeechItem currentSpeechItemCopy = mCurrentSpeechItem;
  if (currentSpeechItemCopy != null) {
    String callingApp = currentSpeechItemCopy.mCallingApp;
    ArrayList<String> params = currentSpeechItemCopy.mParams;
    String utteranceId = "";
    if (params != null) {
      for (int i = 0; i < params.size() - 1; i = i + 2) {
        String param = params.get(i);
        if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)) {
          utteranceId = params.get(i + 1);
        }
      }
    }
    if (utteranceId.length() > 0) {
      dispatchUtteranceCompletedCallback(utteranceId, callingApp);
    }
  }
  processSpeechQueue();
}

そこでは、dispatchUtteranceCompletedCallback()の生成に失敗する条件が 2 つだけあります。

  1. currentSpeechItemCopy == null
  2. 発話Id.長さ() == 0

しかし、私はすべての utteranceIds をログに記録し、earcon が確実にそこにあるため、条件 2 を除外できることは確かです。

また、システム ログ全体を調べます。

Log.v(SERVICE_TAG, "TTS callback: dispatch started");

欠落onUtteranceCompleted()は、dispatchUtteranceCompletedCallback()が呼び出されなかった結果である可能性がありますが、mCallbacksMap.get(packageName)null が返された結果である可能性もあります。

したがって、再び 2 つの可能性が残されていますが、どちらもあまり意味がありません。

  1. earcon のonCompletion()が呼び出されるまでに、earconmCurrentSpeechItemは null です。しかし、なぜですか?
  2. mCallbacksMapは空です。それは何で、いつ人口が増えるのですか?

このミステリーを解決するための提案やその他の説明はありますか?

4

1 に答える 1

1

android.speech.tts.TextToSpeech#playEarcon()の807​​ 行目を確認してください。テキスト読み上げサービス バインダーに渡される params 引数は null です。これは、サービスが発話 ID を受信しないことを意味します。

 public int playEarcon(String earcon, int queueMode,
         HashMap<String,String> params) {
     synchronized (mStartLock) {
         ...
         result = mITts.playEarcon(mPackageName, earcon, queueMode, null);
     }
     ...
 }
于 2012-09-12T07:29:28.270 に答える