web-dev-qa-db-fra.com

TTS-UtteranceProgressListener n'est pas appelé

Je ne veux pas mettre tout mon code ici, donc je mets juste les morceaux pertinents. Si vous avez besoin de plus, n'hésitez pas à demander.

J'utilise Text To Speech (TTS), ce qui conduit à un écouteur de parole après avoir posé une question ... J'ai trouvé via les sorties de journal que onInit de TTS est appelé, mais UtteranceProgressListener ne l'est pas et je ne peux pas comprendre pourquoi. Toute aide est appréciée.

// ---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) {
    }    
}

J'ai ajouté des sorties de journal à toutes mes méthodes TTS et Speech. OnStart d'UtteranceProgressListener n'est même pas appelé:

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

trouvé la réponse ...

Il s'avère que les ressources TTS que j'ai trouvées en ligne utilisaient une seule source de chaîne TTS, donc le troisième paramètre dans tts.speak (texte de chaîne, int queueMode, paramètres HashMap) a été défini sur null.

à toute personne ayant ce problème à l'avenir:

si vous définissez le troisième paramètre sur null, il n'y a pas d'ID pour UtteranceProgressListener à suivre. Le correctif créait et initialisait une table de hachage, puis l'ajout au tableau inclus pour chaque nouveau TTS avec un nouvel ID pouvait être suivi. Voici le code:

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

puis, avant d'appeler tts.speak ...

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

alors vous pouvez appeler parler avec tous les params ...

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

Pour ajouter à la bonne réponse de WizardKnight:

La nouvelle API préfère un bundle donc remplacez le HashMap par un bundle

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

puis quand vous faites l'appel vocal

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

La clé consiste à utiliser l'ID dans l'appel vocal. Vous pouvez le mettre dans le Bundle, mais cela ne fera plus rien pour vous. Il doit être dans l'appel vocal pour déclencher l'auditeur.

26
Bill

J'ai une solution filaire pour détecter la météo tts a fini de parler.

Étape 1: créez cette classe dans votre code.

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
        }
    }

Étape 2: appelez-le lorsque vous appelez tts.speak (...)

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