我有一個與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");
}
}
}
對不起 - 我想我的意思是說「指出Android有每個設備32個活動AudioTrack對象的硬性限制。」 – 2014-10-20 09:08:29
不確定它會真正解決您的問題,但是您不必每次調用'speak()'方法時都設置'UtteranceProgressListener'。在'mTts = new TextToSpeech(this,this);'後面設置一次就足夠了。 – 2014-10-20 09:37:38
另外,你應該考慮爲'TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID'使用唯一標識符,而不僅僅是一個硬編碼的''TTS停止''字符串。 – 2014-10-20 09:40:35