本篇文章更新時間:2026/02/01
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
內容目錄
小模型,大野心:用 9M 參數打造自己的中文發音家教
副標題:從語音可視化到 Conformer-CTC,作者如何一步步打造能在瀏覽器跑的 CAPT 系統
編輯前言:這篇文章來自 A 9M-parameter Mandarin pronunciation tutor,作者分享他如何用 300 小時語音資料與一個小到能在瀏覽器跑的模型,打造一個能精準糾錯的中文發音家教。對語音學習、ASR、或模型壓縮有興趣的人,絕對值得一讀。
核心觀點 (Key Takeaways)
- 作者從基於音高分析的 heuristic 方法,轉向以 Conformer + CTC 的深度學習架構,因為後者更穩健也更資料驅動。
- Mandarin CAPT 的關鍵在於不能自動修正。CTC 比 seq2seq 更能忠實反映「實際說出的聲音」。
- 透過 Pinyin+Tone 作為 token、Forced Alignment 與小心處理 silence,模型能精準找出錯誤發音並給出信心分數。
深入解析
作者的問題意識很明確:中文的聲調系統對非母語學習者真的很不友善,而他也發現「自己聽不出自己的錯」。於是他開始想辦法讓機器幫他「聽」。
從音高視覺化到深度學習:手刻 heuristic 的極限
作者最初嘗試用 FFT + pitch tracking,類似 Praat,那種靠規則判斷的方式。但很快就遇到大量例外:背景噪音、連音、不同人的音域差異等。於是他引用了機器學習界常講的「bitter lesson」:
當資料與運算夠多時,學習式方法幾乎一定勝過手工規則。
這也讓他決定改為訓練一個小型、能在裝置上跑的深度學習模型。
為什麼選 Conformer + CTC?
我覺得作者的選擇很精準,原因在於中文發音的「局部細節 + 全球語境」兼具。
- 局部特徵:例如 zh vs z,是毫秒級差異。CNN 擅長捕捉。
- 全球語境:聲調高低因人而異,還有 tone sandhi。Transformer 擅長長程依賴。
Conformer 正好把兩者組合在一起。
而他放棄常見的 seq2seq,理由更是點題:
seq2seq 模型會自動修正你的發音錯誤,但練口語時你不想要它「猜你想說什麼」。
CTC 則是老老實實 frame-by-frame 告訴你「你說了什麼」。這種嚴格反而更適合做發音訓練。
以 Pinyin+Tone 作為 token:讓錯誤不被 Hanzi 掩蓋
我很喜歡作者這個設計。多數 ASR 系統直接輸出漢字,結果 tone 錯了也會被「理解」掉。但 CAPT 恰恰需要抓 tone 錯。
他因此把每個音節 + 聲調都拆成獨立 token,例如:
- zhong1 ≠ zhong4
- ma5 表示原本的輕聲
總共 1254 個 token,這真的算是蠻細的 granularity。
強制對齊與沉默的 bug:關鍵細節影響分數
為了能標出每個音節的正確性,作者用 Viterbi 做 forced alignment。但他遇到一個真實又經典的問題:
當他講「我喜歡…」前多停了一秒,模型竟然判定「我(wo3)」錯到爆。
原因是:
對齊把前面一大片空白(
)當成 wo3,造成分數被拉低。
修法其實很優雅:對評分時忽略那些模型非常確定是 的 frame。程式碼很短,但效果巨大,準確率從 0.0 拉到 0.99。
筆者心得與啟發
這篇文章讓我最有感的,是作者在「發音」這個常被忽略的語言學習痛點上的細膩觀察。多數 ASR 技術都在追求「聽懂」,但 CAPT 則反其道而行,需要「聽到錯誤」。兩者的模型需求其實完全不同。
我尤其認為以下兩點很具啟發性:
- 小模型也能很強,前提是資料夠好。 作者將 Conformer 壓到 9M 參數,tone accuracy 仍有 98%+。這強烈暗示這個任務不是 compute-bound,而是 data-bound。
- 對齊與評分邏輯的細節,決定使用體驗。 CAPT 的容錯率比一般 ASR 低得多,一個小小的 silence 處理錯誤就可能讓使用者被「誤判」。
另外,我也很認同作者最後提到的 domain shift 問題:AISHELL 的語者是朗讀語,這與真實對話的速度、模糊程度、兒童聲音都相差甚遠。這也提醒了我們——如果 CAPT 想做得真實,資料來源必須更生活化。
整體而言,這是一篇技術細節飽滿、但閱讀起來不艱澀的案例分享。對想自做語音模型、或好奇 CAPT 背後挑戰的人都非常值得一讀。
