2014-11-18 10 views
6

ho bisogno di implementare funzionalità nella mia app Andorind che permette di giocare due lingue diverse sintetizzati in acitivity corrente - per esempio avere due pulsanti dire Inglese e DireAndroid: due istanze di Text-to-Speech lavorare molto lentamente

ho provato a farlo in due modi seguenti, ma ciascuno di essi funziona inefficace perché non v'è lungo ritardo prima del suono gioca:

  1. primo approccio: creare un'unica istanza del TTS e cambia lingua con il metodo setLocale a seconda di ciò il linguaggio deve essere giocato. Sfortunatamente il passaggio da una lingua all'altra di setLocale richiede molto tempo e ha un impatto sulla reazione dopo aver cliccato sul pulsante.
  2. secondo approccio: creare due istanze di TTS ciascuna per la rispettiva lingua. Purtroppo anche qui si verifica un ritardo e non c'è differenza tra la prima soluzione.

Potete per favore aiutare a risolvere questo fastidioso problema?

+0

Qual è lo stato di questa domanda? Sei riuscito a trovare una soluzione? – user1339260

risposta

0

Che ne dici di aspettare che i due motori TTS finiscano di inizializzare all'inizio della tua app, prima di qualsiasi interazione dell'utente (fai questo creando un OnInitListener e aspettando - ad esempio con un semaforo - finché il metodo onInit() non è chiamato), in modo che nel momento in cui l'utente raggiunge il punto nell'app in cui vengono introdotti i pulsanti, i due motori sono già stati inizializzati?

+0

Grazie per l'indizio. Controllerò. – PawelP

+1

Sfortunatamente il problema esiste ancora. Il problema si verifica dopo l'inizializzazione delle istanze TTS. Avendo due pulsanti "Say English" e "Say French" quando faccio clic sul primo (Say English), la risposta è accettabile ma quando faccio clic sul secondo pulsante (Say French) il ritardo significativo appare prima che venga detto qualcosa. Riassumendo il passaggio da una lingua all'altra richiede molto tempo e questo è il problema. – PawelP

0

Ho risolto questo problema creando quei casi insieme sul filo diversi dai filati principale dell'applicazione:

private class tempTask extends AsyncTask { 
    ... 
    @Override 
    protected Object doInBackground(Object... params) { 
     firstTTSObj = new TextToSpeech(getApplicationContext(), 
     new TextToSpeech.OnInitListener() { 
      @Override 
      public void onInit(int status) { 
       if(status != TextToSpeech.ERROR){ 
        firstTTSObj.setLanguage(Locale.UK); 
       }    
      } 
     }); 
     secondTTSObj = new TextToSpeech(getApplicationContext(), 
     new TextToSpeech.OnInitListener() { 
      @Override 
      public void onInit(int status) { 
       if(status != TextToSpeech.ERROR){ 
        secondTTSObj .setLanguage(Locale.KOREA); 
       }    
      } 
     }); 
     return null; 
    } 
} 

Spero che questo aiuti.

+0

Sfortunatamente il problema esiste ancora. Il problema si verifica dopo l'inizializzazione delle istanze TTS. Avendo due pulsanti "Say English" e "Say French" quando faccio clic sul primo (Say English), la risposta è accettabile ma quando faccio clic sul secondo pulsante (Say French) il ritardo significativo appare prima che venga detto qualcosa. Riassumendo il passaggio da una lingua all'altra richiede molto tempo e questo è il problema. – PawelP

+0

Beh, l'ho provato e ha funzionato bene, tranne per il primo gioco. Se mi dici il tuo indirizzo email, ti invierò il mio codice di esempio. – SLee

+0

Potete inviare la vostra soluzione a [email protected], grazie mille – PawelP

0

Sembra che sia progettato TextToSpeech. Immagino che potrebbe caricare solo una lingua i dati nello stesso momento e quando ne richiedi un'altra deve scaricare i dati della lingua corrente e caricarne una nuova. Ho aggiunto il problema qui: https://code.google.com/p/android/issues/detail?id=200974

Probabilmente Google risolverà in futuro. Lo hanno fatto!

Come soluzione temporanea per ora è possibile pre-sintetizzare il file audio e quindi semplicemente riprodurlo. F.G. è possibile avviare alcuni AsyncTask all'avvio dell'attività e generare il suono sullo sfondo. E quando è pronto, rivela il pulsante sull'interfaccia utente per consentire all'utente di riprodurlo. Inoltre ho trovato che TextToSpeech è meglio inserire nel proprio processo di servizio utilizzando android: l'attributo di processo per il servizio per evitare il blocco dell'interfaccia utente su alcuni dispositivi quando setLanguage sta caricando i dati della lingua.

AGGIORNAMENTO 2016-02-17: Ho appena aggiornato TextToSpeech alla versione 3.8.14 dal 15 febbraio. E non ci sono più ritardi! Sto usando 2 lingue per leggere i diversi testi di lingua uno per uno e nessun ritardo tra più! Grazie a Google e al team di TextToSpeech! Sei il migliore!

AGGIORNAMENTO 18/02/2016 18: Ho testato più dispositivi e ho riscontrato che il problema esiste ancora per i dispositivi precedenti in cui Android 4.x è ancora utilizzato. Testato su XOOM con Android 4.1.2 e qualche dispositivo noname 7100 con Android 4.1.1. Entrambi hanno ancora gli stessi ritardi. Non sono sicuro che sia collegato, ma ho notato che entrambi i dispositivi Android con Android 4.x hanno il problema con UtteranceProgressListener. Per farlo funzionare su tali dispositivi ho dovuto passare il parametro utteranceId nella funzione speak(). Tuttavia il dispositivo su cui questo bug è andato ha funzionato bene senza questo parametro. Il dispositivo su cui funziona correttamente per ora è LG d405 con Android 5.0.2 E aveva lo stesso problema di ritardo prima di installare l'aggiornamento recente di TextToSpeech.

Problemi correlati