2016-05-11 24 views
1

Ich habe ein Problem mit meinem TextToSpeech. In der Tat, wenn ich meine Funktion "Son" (siehe unten) anrufe (wenn ich zum Beispiel klicke), muss ich 4 Sekunden auf den ersten Klick warten, bis die Stimme spricht, aber nach dem ersten Klick ist es sofort hörbar.Ich muss einige Sekunden warten, bis TextToSpeech spricht

Aber manchmal funktioniert es perfekt vom ersten Klick. Im Android-Monitor, ob es funktioniert oder nicht, kann ich sehen:

I/TextToSpeech: Sucessfully bound to com.google.android.tts 
    I/TextToSpeech: Connected to ComponentInfo{com.google.android.tts/com.google.android.tts.service.GoogleTTSService} 
    I/TextToSpeech: Set up connection to ComponentInfo{com.google.android.tts/com.google.android.tts.service.GoogleTTSService} 

Also gehe ich davon aus, dass es auf Android hängt aber ich hoffe, dass ich etwas tun kann, dass zu korrigieren ... Haben Sie eine Idee? Wenn Sie weitere Informationen benötigen, zögern Sie nicht zu fragen!

Danke Jungs!

Mein Code:

public void Son(final String texte_son){ 
    t1=new TextToSpeech(this, new TextToSpeech.OnInitListener() { 
     @Override 
     public void onInit(int status) { 
      if(status != TextToSpeech.ERROR) { 
       t1.setLanguage(Locale.FRENCH); 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
        ttsGreater21(texte_son); 
       } else { 
        ttsUnder20(texte_son); 
       } 
      } 
     } 
    }); 
} 
@SuppressWarnings("deprecation") 
private void ttsUnder20(String text) { 
    HashMap<String, String> map = new HashMap<>(); 
    map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId"); 
    t1.speak(text, TextToSpeech.QUEUE_FLUSH, map); 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private void ttsGreater21(String text) { 
    String utteranceId=this.hashCode() + ""; 
    t1.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId); 
} 

Antwort

1

Init TTS wenn Anwendung gestartet wird und speichern Sie den Zeiger darauf, nicht TTS nicht jedes Mal erstellen, wenn Sie ein Skript

public YourActivity implements Activity { 

    private Tts tts; 

    void onCreate() { 
     tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() { 
      @Override 
      public void onInit(int status) { 
       tts.setLanguage(Locale.FRENCH); 
      } 
     }); 
    } 

    void Son(String text) { 
     if (tts != null) { 
      HashMap<String, String> map = new HashMap<>(); 
      map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId"); 
     tts.speak(text, TextToSpeech.QUEUE_FLUSH, map); 
     } 
    } 
} 
+0

Inded synthetisieren müssen, es war nutzlos um immer TextToSpeech zu erstellen. Vielen Dank ! Trotzdem habe ich immer noch mein Problem, auf das erste Sprechen zu warten. Hast du eine Idee, wie das zu korrigieren ist? – ValentinLoricourt

+0

Ich kann einen Unterschied mit diesem Code sehen. Wenn ich lange genug warte (ungefähr 6 Sekunden, also ist es lang), bevor ich meinen ersten Klick mache, kommt die Stimme sofort raus. Mit meinem vorherigen Code ist Warten nutzlos. Ich weiß nicht, ob das helfen kann ... – ValentinLoricourt

+0

Es braucht etwas Zeit, um den Dienst zu starten, die Schaltfläche inaktiv zu setzen, während tts nicht initialisiert ist, und dem Benutzer einen Fortschritt anzuzeigen, so etwas. –