web-dev-qa-db-ja.com

TTS-UtteranceProgressListenerが呼び出されていません

ここにすべてのコードを配置したくないので、関連する部分のみを配置します。さらに必要な場合は、お気軽にお問い合わせください。

質問をした後に音声リスナーにつながるText To Speech(TTS)を使用しています...ログ出力から、TTSのonInitが呼び出されていることがわかりましたが、UtteranceProgressListenerが呼び出されておらず、理由がわかりません。どんな助けでもありがたいです。

// ---Initialize TTS variables---

        // Implement Text to speech feature
        tts = new TextToSpeech(this, new ttsInitListener());

        // set listener to the TTS engine
        tts.setOnUtteranceProgressListener(new ttsUtteranceListener());

        if (!tts.isSpeaking()) {
            tts.speak("Speak to me", TextToSpeech.QUEUE_FLUSH, null);
        }

// --- TEXT TO SPEECH && SPEECH TO TEXT METHODS ---

class ttsInitListener implements OnInitListener {

    @Override
    public void onInit(int status) {

        if (status == TextToSpeech.SUCCESS) {
            tts.setLanguage(Locale.getDefault());

        } else {
            tts = null;
            Toast.makeText(mContext, "Failed to initialize TTS engine.",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

class ttsUtteranceListener extends UtteranceProgressListener {

    @Override
    public void onDone(String utteranceId) {
        if (processStart) {
            speech.startListening(intent);
        } else {
            ...
        }

    }

    @Override
    public void onError(String utteranceId) {
    }

    @Override
    public void onStart(String utteranceId) {
    }    
}

ログ出力をすべてのTTSおよびSpeechメソッドに追加しました。 UtteranceProgressListenerのonStartも呼び出されていません。

11-30 00:38:37.299: D/OpenGLRenderer(15842): Enabling debug mode 0
11-30 00:38:39.782: I/TextToSpeech(15842): Connected to ComponentInfo{com.google.Android.tts/com.google.Android.tts.service.GoogleTTSService}
11-30 00:38:39.782: I/TextToSpeech(15842): Set up connection to ComponentInfo{com.google.Android.tts/com.google.Android.tts.service.GoogleTTSService}
11-30 00:38:39.782: D/LOOK AT ME!!!(15842): ttsInitListener - onInit
40
Psest328

答えが見つかりました...

オンラインで見つけたTTSリソースが単一のTTS文字列ソースを使用していたため、tts.speak(String text、int queueMode、HashMap params)の3番目のパラメーターがnullに設定されていることがわかりました。

将来この問題を抱えている人へ:

3番目のパラメーターをnullに設定した場合、追跡するUtteranceProgressListenerのIDはありません。修正は、ハッシュマップを作成して初期化し、新しいIDを持つ新しいTTSごとに含まれる配列に追加することを追跡することでした。これがコードです:

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

次に、tts.speakを呼び出す前に...

map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "UniqueID");

その後、すべてのパラメーターで話すことができます...

tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);
93
Psest328

WizardKnightの良い答えに追加するには:

新しいAPIはバンドルを優先するため、HashMapをバンドルに置き換えます

Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "");

その後、話す通話をするとき

tts.speak(text, TextToSpeech.QUEUE_FLUSH, params, "UniqueID");

重要なのは、通話でIDを使用することです。バンドルに入れることはできますが、それ以上何もしません。リスナーをトリガーするには、speakコールに含まれている必要があります。

26
Bill

TTが話し終えた天気を検出するための有線ソリューションがあります。

ステップ1:コードでこのクラスを作成します。

class Waiter extends AsyncTask<Void,Void,Void>{
        @Override
        protected Void doInBackground(Void... voids) {
            while (tts.isSpeaking()){
                try{Thread.sleep(1000);}catch (Exception e){}
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            //TTS has finished speaking. WRITE YOUR CODE HERE
        }
    }

ステップ2:tts.speak(...)を呼び出すときに呼び出す

tts.speak(...);
new Waiter().execute();
3
Shivam Agrawal