首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 醫院語音叫號系統:雙語(維吾爾語/中文)輪播實作與問題解決

     編輯:程式設計綜合問答

需求場景

醫院叫號系統需實現「一句維吾爾語、一句中文」交替循環播放。開發者使用科大訊飛 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 控制粒度過大。

解決方案

改為單一播放隊列,或在每句播放完成後切換語言標誌,交替從對應列表取出一句播放。簡化後的邏輯如下:

  1. 維護一個索引或隊列,記錄下一句應播放的語言。
  2. 在 onCompleted 中根據標誌決定從哪個列表取文本並啟動合成。
  3. 播放完成後翻轉標誌,實現真正的句級交替。

關鍵點總結

  • 科大訊飛 TTS 需正確設定 VOICE_NAME(維吾爾語用 "Guli",中文用 "xiaoyu")。
  • 避免在 UI 執行緒睡眠,必須用子執行緒配合 Thread.sleep 控制間隔。
  • 列表操作需同步,防止併發修改異常。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved