2014-02-17 47 views
3

我正在製作一個應用程序,每次觸發broadcastreceiver時都會使用tts合成wav文件。我工作在AndroidStudio(最新)和使用最低15分的API 19級。UtteranceProgressListener不適用於Android TTS

我有一個BroadcastListener服務。每次執行BroadcastListener的onReceive方法的時候,我用

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

成功創建的文件,但UtteranceProgressListener的onDone()方法不會被調用。

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,回調工作。那是我的prevoius實施。我只需要在那裏傳遞一個帶有KEY_PARAM_UTTERANCE_ID參數的參數HashMap。 – 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(); 
相關問題