2014-02-17 3 views
3

Я делаю приложение, которое использует tts для синтеза wav-файлов каждый раз, когда запускается трансляция. Im работает на AndroidStudio (последние) и использует API-уровень 19 с минусом 15.UtteranceProgressListener не работает для Android TTS

У меня есть служба с BroadcastListener. Каждый раз, когда метод BroadcastListener OnReceive выполняется, я использую

tts.synthesizeToFile(playing, null, storagePath + "/" + "tst.wav");

Файл успешно создан, но метод onDone() из UtteranceProgressListener никогда не вызывается.

public void onCreate() { 
    super.onCreate(); 

    //Get TTS capabilities 
    //TODO: Use TextToSpeech.Engine.ACTION_CHECK_TTS_DATA to check if tts is available 
    tts = new TextToSpeech(PresenterService.this, 
      new TextToSpeech.OnInitListener() { 
       @Override 
       public void onInit(int status) { 

        //If the TTS engine was started successfully 

        if (status != TextToSpeech.ERROR) { 

         tts.setLanguage(Locale.US); 
         tts.setPitch(PRESENTER_PITCH); 
         tts.setSpeechRate(PRESENTER_RATE); 
        } 

       } 
      }); 

    tts.setOnUtteranceProgressListener(new TtsUtteranceListener()); 



    IntentFilter filter = new IntentFilter(); 
    filter.addAction("xxxxxxxxxxxxxxxxxx"); 

    mReceiver = new TrackChangedReceiver(tts); 
    registerReceiver(mReceiver, filter); 

} 

А класс TtsUtteranceListener:

public class TtsUtteranceListener extends UtteranceProgressListener { 

    @Override 
    public void onDone(String utteranceId) { 
     Log.d("TtsUtteranceListener", "utterance Done: " + utteranceId); 
    } 

    @Override 
    public void onStart(String utteranceId) { 
     Log.d("TtsUtteranceListener", "utterance Start: " + utteranceId); 
    } 

    @Override 
    public void onError(String utteranceId) { 
     Log.d("TtsUtteranceListener", "utterance Error: " + utteranceId); 
    } 
} 

Метод на слушателя:

public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 

    if (action != null) { 
     if (action.equalsIgnoreCase("xxxxxxxxxxxxxxxxx")) { 
      String playing = "test string"; 
      tts.synthesizeToFile(playing, null, storagePath + "/" + "tst.wav"); 
     } 
    } 
} 

Я использую AndroidStudio, и в режиме отладки, я могу видеть, что mUtteranceProgressListener из объект tts имеет ссылку на какой-либо объект:

[email protected] 

, но методы слушателя никогда не называются. Вызовы Log.d() никогда не работают, и любые точки останова никогда не запускаются.

Я также попытался объявив UtteranceProgressListener как анонимный класс при вызове

tts.setOnUtteranceProgressListener(new UtteranceProgressListener(){...}); 

, но то же самое ...

Может кто-то момент меня в том, что я делаю неправильно?

+0

Я думаю, что я решил. Я пробовал с tts.speak и обратный вызов работал. Это была моя предиуция. Мне просто нужно было передать параметры HashMap с параметром KEY_PARAM_UTTERANCE_ID. – ztrange

ответ

7

Хорошо, я решил. Проблема заключалась в том, что я не смог передать KEY_PARAM_UTTERANCE_ID.

if (action.equalsIgnoreCase("xxxxxxxxxxxxxxxxx")) { 
    HashMap<String, String> hashTts = new HashMap<String, String>(); 
    hashTts.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "id"); 

    String playing = "test string"; 
    tts.synthesizeToFile(playing, hashTts, storagePath + "/" + "tst.wav"); 
} 

Я проезжал параметр параметр в нуль:

tts.synthesizeToFile(playing, null, storagePath + "/" + "tst.wav"); 
0

У меня есть проводное решение для обнаружения погодных TTS закончил говорить. Хотя он не оптимизирован, но работает хорошо.

Шаг 1: Создайте этот класс в своем коде. (В том же коде, а не отдельный файл)

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

Шаг 2: Назовите это при вызове tts.speak (...)

tts.speak(...); 
new Waiter().execute(); 
Смежные вопросы