2014-11-18 15 views
6

trzeba zaimplementować funkcję w moim Andorind aplikacji, która pozwala grać w dwóch różnych syntetyzowanych języków w bieżącym acitivity - na przykład mający dwa przyciski Say angielski i francuskaAndroid: dwie instancje Text-to-Speech działa bardzo powoli

próbowałem zrobić to w dwóch następujących sposobów ale oba z nich pracuje nieefektywnie, ponieważ istnieje duże opóźnienie zanim dźwięk gracz

  1. pierwsze podejście: tworzyć pojedynczą instancję TTS i zmienić język metodą setlocale zależności od tego, należy odtwarzać język. Niestety przełączanie się między językami przez setLocale jest czasochłonne, co ma wpływ na reakcję po kliknięciu przycisku.
  2. Drugie podejście: utwórz dwa wystąpienia TTS dla każdego języka. Niestety występuje tu również opóźnienie i nie ma różnicy między pierwszym rozwiązaniem.

Czy możesz pomóc rozwiązać ten denerwujący problem?

+0

Jaki jest status tego pytania? Czy udało Ci się znaleźć rozwiązanie? – user1339260

Odpowiedz

0

Co powiesz na to, aby dwa silniki TTS zakończyły inicjowanie na początku aplikacji, przed każdą interakcją użytkownika (zrób to, tworząc OnInitListener i czekając - np. Z semaforem - do czasu, aż metoda onInit() zostanie nazywa się), tak że zanim użytkownik dojdzie do punktu w aplikacji, w której są wprowadzane przyciski, masz już zainicjalizowane dwa silniki?

+0

Dzięki za podpowiedź. Sprawdzę to. – PawelP

+1

Niestety problem nadal występuje. Problem występuje po zainicjowaniu instancji TTS. Po dwukrotnym kliknięciu "Powiedz angielski" i "Powiedz" po francusku ", kiedy klikam pierwszy (Powiedzmy po angielsku), reakcja jest akceptowalna, ale kiedy klikam drugi przycisk (Powiedzmy po francusku) pojawia się znaczące opóźnienie, zanim cokolwiek zostanie powiedziane. Podsumowując, przełączanie między językami trwa długo i to jest problem. – PawelP

0

I rozwiązać ten problem tworząc te przypadki razem na wątku innego niż wątek główny aplikacji:

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

nadzieję, że to pomaga.

+0

Niestety problem nadal istnieje. Problem występuje po zainicjowaniu instancji TTS. Po dwukrotnym kliknięciu "Powiedz angielski" i "Powiedz" po francusku ", kiedy klikam pierwszy (Powiedzmy po angielsku), reakcja jest akceptowalna, ale kiedy klikam drugi przycisk (Powiedzmy po francusku) pojawia się znaczące opóźnienie, zanim cokolwiek zostanie powiedziane. Podsumowując, przełączanie między językami trwa długo i to jest problem. – PawelP

+0

Cóż, testowałem to i działało dobrze, z wyjątkiem pierwszej gry. Jeśli podasz mi swój adres e-mail, wyślę ci mój przykładowy kod. – SLee

+0

Czy możesz przesłać swoje rozwiązanie na [email protected], bardzo dziękuję – PawelP

0

Wygląda tak, jak zaprojektowano TextToSpeech. Zgadnij, że może załadować tylko jedno dane językowe w tym samym czasie, a kiedy zażądasz innego, musisz wyładować bieżące dane językowe i załadować nowe. Dodałem tutaj problem: https://code.google.com/p/android/issues/detail?id=200974

Prawdopodobnie Google to naprawi w przyszłości. Zrobili to!

Jako rozwiązanie tymczasowe możesz teraz wstępnie zsyntetyzować plik audio, a następnie po prostu go odtworzyć. F.g. możesz uruchomić AsyncTask podczas uruchamiania działania i wygenerować dźwięk w tle. A kiedy będzie gotowy, odsłoni przycisk w interfejsie użytkownika, aby umożliwić użytkownikowi jego odtworzenie. Zauważyłem także, że TextToSpeech może być lepiej wprowadzony do własnego procesu serwisowego z użyciem atrybutu android: process dla Usługi, aby uniknąć zamrożenia interfejsu użytkownika na niektórych urządzeniach, gdy setLanguage ładuje dane językowe.

AKTUALIZACJA 2016-02-17: Właśnie zaktualizowałem TextToSpeech do wersji 3.8.14 z 15 lutego. I nie więcej opóźnień! Używam 2 języków, czytając teksty różnych języków jeden po drugim i bez żadnych opóźnień! Dzięki Google i zespół TextToSpeech! Jesteś najlepsza!

AKTUALIZACJA 2016-02-18: Przetestowałem więcej urządzeń i stwierdziłem, że problem nadal występuje w przypadku starszych urządzeń, na których nadal używany jest system Android 4.x. Testowany na XOOM z Androidem 4.1.2 i niektórym noname device 7100 z Androidem 4.1.1. Obie wciąż mają te same opóźnienia. Nie jestem pewien, czy jest to powiązane, ale zauważyłem, że zarówno urządzenie z systemem Android z Androidem 4.x ma problem z UtteranceProgressListener. Aby działał na takich urządzeniach, musiałem przekazać parametr wypowiadający do funkcji speak(). Jednak urządzenie, w którym ten błąd zniknął, działało dobrze bez tego parametru. Urządzenie, na którym obecnie działa dobrze, to LG d405 z Androidem 5.0.2. I miało to ten sam problem z opóźnieniem, zanim zainstalowałem ostatnią aktualizację TextToSpeech.

Powiązane problemy