醫院叫號系統需實現「一句維吾爾語、一句中文」交替循環播放。開發者使用科大訊飛 TTS SDK,但邏輯卡在如何交替觸發兩種語言的播放。
主活動中建立兩個列表 list_han、list_wei 分別存放中文與維吾爾語文本。啟動一個執行緒跑 Runnable,在 while(flag) 迴圈中依序播放維吾爾語,播放完成的 onCompleted 回呼中再啟動另一執行緒播放中文,並在中文播放完成後將 flag 設回 true 以繼續下一輪。
// 維吾爾語播放執行緒
Runnable runnable = new Runnable() {
@Override public void run() {
while (flage) {
flage = false;
for (int i = 0; i < list_wei.size(); i++) {
String str1 = list_wei.get(0);
mTts.startSpeaking(str1, mSynListener);
list_wei.remove(0);
try { Thread.sleep(timeInterval); } catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
};
// 維吾爾語播放完成監聽器
private SynthesizerListener mSynListener = new SynthesizerListener() {
@Override public void onCompleted(SpeechError arg0) {
if (arg0 == null) {
flage = true;
// 建立中文合成器並啟動中文播放執行緒...
}
}
// 其他方法省略
};
上述邏輯導致「所有維吾爾語播完才播中文」,而非「一句維、一句中」交替。原因在於 for 迴圈一次清空整個列表,且 flag 控制粒度過大。
改為單一播放隊列,或在每句播放完成後切換語言標誌,交替從對應列表取出一句播放。簡化後的邏輯如下:
onCompleted 中根據標誌決定從哪個列表取文本並啟動合成。VOICE_NAME(維吾爾語用 "Guli",中文用 "xiaoyu")。Thread.sleep 控制間隔。