專案背景
目前主流的語音辨識模型多針對通用語境設計,在醫療領域面臨三大核心挑戰:
專業術語辨識率低、中英文混雜場景處理不佳與隱私合規要求嚴格。
臨床環境中,醫師經常在中文語句中夾雜英文藥品名(如 Aspirin、Metformin)、診斷碼(ICD-10)與術式名稱,
形成高度 code-switching 的口語模式,通用模型幾乎無法正確轉錄;
而臨床資料涉及病患隱私,無法上傳至第三方雲端 API 處理。
本專案為工研院(ITRI)與 9 間醫療院所的合作計畫,目標是建立一套可地端部署、能處理中英混雜醫療口語的語音辨識系統,
讓臨床人員能在院內環境中即時使用,同時確保資料不出院區。
商業 / 實務問題
- 通用 ASR 的極限:OpenAI Whisper 等通用模型在醫療術語與中英混雜語句上的字錯率(CER)遠高於一般對話場景,尤其在中文句子中穿插英文專有名詞時,容易產生漏轉、錯轉或幻覺。
- 標註資料稀缺:醫療語音的 ground truth 文字稿極難取得——需要醫療專業人員逐字審核,成本高昂且耗時。
- 隱私合規:臨床錄音包含敏感的病患資訊,必須在地端完成所有處理,不得使用雲端服務。
- 多院區差異:9 間醫院的錄音設備、環境噪音、科別用語各不相同,模型需具備跨院區的泛化能力。
技術架構
訓練 Pipeline
整套流程透過自動化 Pipeline 腳本串接,從資料前處理到模型評估一鍵完成:
- 音檔格式化 — 統一取樣率、格式、通道數
- 資料集準備 — 轉換為 HuggingFace Dataset 格式,含 pseudo-label 產生
- AdaLoRA 微調 — 基於 Whisper Large V3 Turbo,BF16 精度,DDP 雙 GPU 並行
- 合併模型 — Adapter 與 Base Model 合併為可部署的完整模型
- CER 評估 — 分別在醫療資料集與 Common Voice 上評估,含去極端值統計
- 參數記錄 — 自動記錄至 CSV + Weights & Biases 追蹤
推論服務
訓練完成的模型透過 WebSocket Server 提供即時語音辨識服務。
整合 Silero VAD(Voice Activity Detection)進行前端靜音過濾,
僅在偵測到人聲時才送入 GPU 運算,降低推論資源消耗。
支援多名臨床人員同時使用,透過異步並發處理分配推論任務。
硬體環境
- 訓練:Linux Server — 2× NVIDIA L4(24GB VRAM each),CUDA 12.1
- 框架:Python 3.12、PyTorch 2.5、HuggingFace Transformers + PEFT
- 精度:BF16 + Gradient Checkpointing(在有限 VRAM 下最大化 batch size)
我的角色與負責範圍
我在團隊中專責 ASR 語料預處理與聲學模型的訓練調教,具體包含:
- 設計並實作完整的自動化訓練 Pipeline(含三種訓練模式:全新訓練、繼續訓練、中斷恢復)
- 建立集中式參數配置系統(PipelineConfig),所有訓練與評估參數統一管理
- 處理 9 間醫院的原始語料——格式統一、品質篩選、pseudo-label 產生
- AdaLoRA 微調策略設計——秩分配(rank allocation)、目標模組選擇、超參數調校
- CER 評估系統——含多種統計指標(平均、中位數、去極端值)
- WebSocket 即時辨識服務的開發與部署
關鍵技術決策
為什麼選 AdaLoRA 而非 LoRA 或全量微調?
- 全量微調的問題:Whisper Large V3 Turbo 約有 8 億參數,全量微調在 2× L4 上 VRAM 不足,且容易產生災難性遺忘(Catastrophic Forgetting),喪失原本的通用語言理解能力。
- AdaLoRA 的優勢:相較於固定秩的 LoRA,AdaLoRA 能根據權重矩陣的重要性動態分配參數預算——對損失函數影響大的關鍵層(如 Cross-Attention)分配更多秩,冗餘層則自動剪枝。同樣的參數增量下,收斂效果優於固定 Rank LoRA。
- 領域遷移彈性:每個 Adapter 僅數 MB,可針對不同科別或院區獨立訓練,按需求載入,不影響基礎模型。
為什麼選 Whisper Large V3 Turbo?
- 推論速度:Turbo 版將解碼器從 32 層縮減至 4 層,推論速度提升近 8 倍,滿足即時辨識需求。
- Encoder 維持強大:特徵提取能力與 Large V3 相當,確保在微弱或含糊語音下仍保留足夠的語義特徵。
- 長音檔穩定性:醫療門診對話往往長達數十分鐘,Turbo 在長逐字稿場景下的幻覺發生率較低。
DDP 分散式訓練
使用 PyTorch DDP 將訓練分散至 2 張 GPU,有效 Batch Size 翻倍。
搭配 Gradient Accumulation,在有限硬體上模擬大 batch 訓練的穩定收斂效果。
同時針對醫療錄音長度不一的特性,資料載入採用按長度排序分組策略,最小化 GPU 間的等待時間。
評估方式與成果
以 CER(Character Error Rate)為主要評估指標,分別在醫療資料集與 Common Voice(通用語境)上進行雙軌評估,
確保模型在提升醫療術語辨識的同時,不犧牲通用能力。
- 醫療場景 CER 提升約 60%(相對於未微調的 Whisper Large V3 Turbo),在中英混雜的臨床口語中同樣表現穩定
- 評估系統包含 8 項統計指標:平均 CER、中位數 CER,以及去除上界 1% 極端值後的對應指標
- 所有實驗參數與結果自動記錄至 CSV 與 Weights & Biases,確保實驗可重現
- 模型已部署至多個院區,支援即時臨床語音辨識服務
挑戰與取捨
Ground Truth 資料的稀缺
最大的挑戰在於缺乏人工標註的正確轉錄文字。我們採用 Pseudo-labeling 策略:
先以未微調的 Whisper 產生初步逐字稿,再透過信心分數過濾(Log-Probability 門檻)與語速檢查,
篩選出高品質的偽標籤用於訓練。訓練後的模型再重新標註資料庫,形成疊代修正的正向循環。
為進一步解決此問題,我另外開發了 ASR ↔ TTS 閉環自我精化框架(詳見 Self-Refining Framework),
透過合成語音資料擴增訓練集規模。
BF16 與 PEFT 的相容性問題
訓練使用 BF16 精度時,在 evaluation step 觸發 model.generate() 會因 autocast 未啟用,
導致 Encoder 的 conv1 層輸入(float32)與 bias(BF16)型別不一致而崩潰。
最終透過修正量化控制邏輯與統一 CER 標準化函數解決。
多院區資料的差異性
9 間醫院的錄音品質落差極大——不同的麥克風、背景噪音(儀器嗶聲、空調聲)、口音差異。
我們透過 Corpus Annotation Pipeline(詳見另一個專案)進行標準化前處理,
搭配 Meta Denoiser 降噪與幻覺偵測,確保進入訓練的語料品質一致。