2014-11-18 4 views
6

두 개의 다른 합성 언어를 재생할 수있는 Android의 Andorind 앱에 기능을 구현해야합니다. 예를 들어 두 개의 버튼이있는 경우 English와 Say French를 말하십시오.Android : 두 인스턴스의 텍스트 음성 작업이 매우 느리게 작동합니다.

나는 다음 두 가지 방법으로 그것을 시도했지만 소리가 재생되기 전에 긴 지연이 있기 때문에 둘은 비효율적으로 작동합니다

  1. 첫 번째 방법은 :에 따라로 setLocale 방법으로 하나의 TTS의 인스턴스와 언어 변경을 만들 것 언어가 재생되어야합니다. 불행히도 setLocale에 의한 언어 간 전환은 버튼을 클릭 한 후 반응에 영향을주는 많은 시간이 소요됩니다.
  2. 두 번째 접근법 : 각각의 언어에 대해 각각 두 개의 TTS 인스턴스를 생성하십시오. 불행하게도 여기서도 지연이 발생하고 첫 번째 해결 방법에는 차이점이 없습니다.

이 성가신 문제를 해결 하시겠습니까?

+0

이 질문의 현재 상태는 어떻습니까? 솔루션을 찾을 수 있었습니까? – user1339260

답변

0

사용자가 상호 작용하기 전에 두 TTS 엔진이 초기화 될 때까지 기다리는 것은 어떻습니까? (예 : OnInitListener을 생성하고 세마포어로 대기) - onInit() 메소드가 그래서 사용자가 버튼이 도입 된 지점에서 앱이 시작될 때까지 두 엔진이 이미 초기화되어있는 것입니다.

+0

실마리를 가져 주셔서 감사합니다. 나는 그것을 검사 할 것이다. – PawelP

+1

불행히도 문제는 여전히 존재합니다. 문제는 TTS 인스턴스가 이미 초기화 된 후에 발생합니다. 첫 번째 클릭 (영어 말하기)을했을 때 두 가지 버튼 "Say English"및 "Say French"를 입력하면 응답 성은 인정되지만 두 번째 버튼 (프랑스어 말하기)을 클릭하면 의미있는 지연이 나타납니다. 언어 간 전환을 요약하면 시간이 오래 걸리며 이것이 문제입니다. – PawelP

0

내가 함께 기본 응용 프로그램 스레드가 아닌 다른 스레드에서 해당 인스턴스를 만들어이 문제를 해결 :이 도움이

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

희망을.

+0

불행히도 문제는 여전히 존재합니다. 문제는 TTS 인스턴스가 이미 초기화 된 후에 발생합니다. 첫 번째 클릭 (영어 말하기)을했을 때 두 가지 버튼 "Say English"및 "Say French"를 입력하면 응답 성은 인정되지만 두 번째 버튼 (프랑스어 말하기)을 클릭하면 의미있는 지연이 나타납니다. 언어 간 전환을 요약하면 시간이 오래 걸리며 이것이 문제입니다. – PawelP

+0

글쎄, 나는 그것을 테스트하고 그것은 첫 놀이를 제외하고는 잘 작동했다. 이메일 주소를 알려 주시면 샘플 코드를 보내 드리겠습니다. – SLee

+0

해결책을 [email protected]으로 보내 주시면 감사하겠습니다. – PawelP

0

TextToSpeech가 디자인 된 것처럼 보입니다. 동시에 하나의 언어 데이터 만로드 할 수 있고 다른 언어 데이터를로드 할 수 있으면 현재 언어 데이터를 언로드하고 새 언어 데이터를로드해야합니다. 여기에 문제를 추가했습니다 : https://code.google.com/p/android/issues/detail?id=200974

Google에서 향후 문제를 해결할 것입니다. 그들은 그것을했습니다!

이제 해결 방법으로 오디오 파일을 사전 합성 한 다음 간단히 재생할 수 있습니다. 예 : Activity를 시작할 때 AsyncTask를 시작하고 백그라운드에서 사운드를 생성 할 수 있습니다. 그리고 준비가되면 UI에 버튼을 표시하여 사용자가 재생할 수있게하십시오. 또한 TextToSpeech는 안드로이드를 사용하여 자신의 서비스 프로세스에 넣는 것이 더 나은 것으로 나타났습니다. setLanguage가 언어 데이터를로드 할 때 일부 장치에서 UI의 동결을 피하기 위해 서비스의 프로세스 특성.

업데이트 2016-02-17 : 2 월 15 일부터 TextToSpeech를 버전 3.8.14로 업데이트했습니다. 지연이 없습니다! 나는 서로 다른 언어 텍스트를 하나씩 읽고 더 이상 지연하지 않는 2 개 언어를 사용하고 있습니다! Google 및 TextToSpeech 팀에게 감사드립니다. 너는 최고야!

업데이트 2016-02-18 : 더 많은 장치를 테스트했는데 여전히 Android 4.x가 사용되는 구형 장치에 문제가 있음을 발견했습니다. Android 4.1.2를 사용하는 XOOM과 Android 4.1.1을 사용하는 일부 noname 디바이스 7100에서 테스트되었습니다. 둘 다 여전히 같은 지연을 가지고 있습니다. 잘 모르겠지만 Android 4.x가 설치된 Android 기기에서 모두 UtteranceProgressListener에 문제가 있음을 확인했습니다. 이러한 장치에서 작동하게하려면 speak() 함수에 utteranceId 매개 변수를 전달해야했습니다. 그러나이 버그가없는 장치는이 매개 변수없이 제대로 작동합니다. 현재 잘 작동하는 기기는 Android 5.0.2의 LG d405입니다. 최근 TextToSpeech 업데이트를 설치하기 전에 동일한 지연 문제가있었습니다.