2014-10-20 39 views
1

我有一個與Android TTS的問題。文本到語音崩潰

我已經構建了一個遊戲,爲遊戲的每個週期發佈一個數字。經過多次循環後,遊戲崩潰。看看logcat,看起來AudioPlayer沒有空間「AudioFlinger?沒有更多可用的曲目名稱」。

所以經過一番搜索,我發現了這個問題。

AudioFlinger could not create track. status: -12

哪有益指出Android有每個設備32個活性AudioTrack對象的硬性限制。回到logcat,我發現它已經宣佈了32次。所以,似乎我已經沒有物體了。

所以我最初的想法是關閉TTS引擎並在30次公告後重新初始化它,遊戲中會暫停一段時間,但不會太糟糕。這不幸的是並沒有做到這一點。似乎關閉TTS引擎不會重置AudioTrack對象。

我玩過這個遊戲,發現你可以在崩潰前玩,關閉程序,重新啓動它,並繼續玩沒有崩潰(直到它連續32次)。所以有一個發佈AudioTrack對象的方法,在logcat中,它講述了在線搜索「AwesomePlayer reset」,我不認爲有一種方法可以控制AwesomePlayer。

所以我的問題是,如何清除AudioTrack對象?有一個函數「release()」,並且只有一組音頻軌道,我只是不確定如何讓它工作。

有關如何清除AudoTrack對象的任何其他想法都會受到歡迎。

謝謝TC

P.S.我很確定我已經正確實施了TTS這裏是我的代碼

private void playNumber() { 
    if (inPlay) { 

     numbersPlayed += 1; 

     Log.d("TOM", "playNumber"); 

     Locale loc = new Locale("spa", "ESP"); 
     mTts.setLanguage(loc); 

     String genNum = String.valueOf(generatedNumber); 
     Log.d("TOM", "genNum to String"); 

     HashMap<String, String> map = new HashMap<String, String>(); 

     Log.d("TOM", "toHashMap"); 

     map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "TTS Stopped"); 

     Log.d("TOM", "mapPut"); 

     mTts.speak(genNum, TextToSpeech.QUEUE_FLUSH, map); 

     Log.d("TOM", "TTSSpeak"); 

     mTts.setOnUtteranceProgressListener(new UtteranceProgressListener() { 

      @Override 
      public void onStart(String utteranceId) { 
       enterLock = true; 

       Log.d("TOM", "uttStart"); 
      } 

      @Override 
      public void onDone(String utteranceId) { 
       enterLock = false; 
       timerCount.start(); 
       Log.d("TOM", "uttDone"); 
      } 

      @Override 
      public void onError(String utteranceId) { 
       Log.d("TOM", "uttError"); 
      } 
     }); 
    } 
} 

public void onInit(int i) { 

    if (generatedNumber == -2) { 
     enterLock = false; 
     Toast.makeText(this, getString(R.string.ttsReady_toast), Toast.LENGTH_SHORT).show(); 
     Log.d("TOM", "onInit: " + Boolean.toString(inPlay)); 
    } else { 
     playNumber(); 
     Log.d("TOM", "New Start Play"); 
    } 
} 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == MY_DATA_CHECK_CODE) { 
     if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { 
      mTts = new TextToSpeech(this, this); 
      Log.d("TOM", "ttsEngineOK"); 
     } else { 
      Intent installIntent = new Intent(); 
      installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
      startActivity(installIntent); 
      Log.d("TOM", "ttsEngineError"); 
     } 
    } 
} 
+0

對不起 - 我想我的意思是說「指出Android有每個設備32個活動AudioTrack對象的硬性限制。」 – 2014-10-20 09:08:29

+0

不確定它會真正解決您的問題,但是您不必每次調用'speak()'方法時都設置'UtteranceProgressListener'。在'mTts = new TextToSpeech(this,this);'後面設置一次就足夠了。 – 2014-10-20 09:37:38

+0

另外,你應該考慮爲'TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID'使用唯一標識符,而不僅僅是一個硬編碼的''TTS停止''字符串。 – 2014-10-20 09:40:35

回答

0

我想通了我的問題。

我真的覺得有點傻,這個問題跟TTS引擎無關。當玩家得到正確答案時,我正在玩的媒體播放器剪輯中出現了實際問題。按照我設置的方式,每次答案正確時,都會創建一個新的mediaplayer對象,因此這會達到32 AudioTrack限制,而不是TTS。我只是把mediaPlayer.create函數放在onCreate中它應該已經存在的地方,現在一切都很好!

這教導我不把所有的代碼放在上面,我相信有更多經驗的人會馬上注意到這一點。