交付之後我才去查市面上有什麼:台語即時字幕的三個教訓
對手機講台語,畫面即時出繁體中文字。願望池 #37 交付之後,我才補了一節「已經有什麼」進 README:這件事沒人在做,但每一家都做了旁邊那件。這篇講那一節怎麼來的、它應該在什麼時候寫,以及一顆 CER 30% 的模型該怎麼誠實地介紹它。
這篇講的東西
- 說明頁:https://yazelin.github.io/taigi-caption/
- 原始碼與量測紀錄(MIT):https://github.com/yazelin/taigi-caption
- 願望出處:AI 許願池 #37
順序錯的地方先講:東西做完、交付了,我才坐下來認真查市面上有什麼。
查出來的結論很單純:這件事沒有人在做,但每一家都做了旁邊那件。
教訓一:查現成的不是為了放棄,是為了知道自己補的是哪一格
願望要的是「對手機講台語,旁邊不懂台語的人當場讀得到中文字」。我做完之後補進 README 的那一節叫〈已經有什麼〉,開頭第一句寫的是:這個願望不是沒人做過,做的人都做了旁邊那件事。
雅婷逐字稿免費、三個平台都有、內建即時字幕模式,落差在它的語言選項是「國台語」混合,官方 API 文件自己寫這顆模型主要語言還是國語。教育部臺灣台語輸入法 2026 年 1 月上架、免費官方、有語音辨識,落差在它輸出的是台語漢字或臺羅,沒有華語模式,而且它是輸入法鍵盤,不是字幕畫面。
差別用同一句話最清楚。教育部那支會給你「伊講的話前後顛倒反,毋知影佗一句才是真的」,這個專案給的是「他說的話前後相反,不知道哪一句才是真的」。對只懂華語的聽者,前者會卡在「毋知影」「佗一句」。願望要的就是後者,而那正是沒有人給的東西。
所以這一格是空的:台語語音進去、華語用字的字幕出來、而且是一整片字幕畫面不是輸入法。這個專案該守的就是這一格。除此之外它的取捨是自架、開源、錄音不上傳給任何第三方、沒有時數限制、可以自己換模型調參數。想要方便就用上面那兩個,想要自己掌握就用這個。
那先查的意義在哪裡?在於我會更早知道要守的是哪一格,README 的定位段落會是動工前就寫好的規格,不是交付後才補的說明。真的撞到現成的就直接指路交回(願望池的規則本來就這樣寫),撞不到就把落差寫清楚再動手。我兩件都沒做,只是這次運氣好,落差夠大。
順帶一提,查的過程裡我還確認了一件事:Apple、Google、微軟、OpenAI 沒有一家支援台語。iOS 內建聽寫的語言清單裡有上海話,Azure 有山東話、四川話、吳語、粵語,就是沒有台語。客委會替客語做了即時翻譯服務,台語沒有對應的公部門服務。
順帶一提,查的過程裡我還確認了一件事:Apple、Google、微軟、OpenAI 沒有一家支援台語。iOS 內建聽寫的語言清單裡有上海話,Azure 有山東話、四川話、吳語、粵語,就是沒有台語。客委會替客語做了即時翻譯服務,台語沒有對應的公部門服務。
教訓二:CER 30% 要花一整段解釋,不能只丟數字
辨識用的是 MediaTek-Research/Breeze-ASR-26,它本身就把台語語音寫成華語用字的繁體中文,所以這裡沒有第二段翻譯流程。實跑用社群的 CTranslate2 int8 量化版,1.56GB,跑在 faster-whisper 上。
官方在 Taigi ASR Benchmark 公布的平均 CER 是 30.13%。我自己拿 14 段行政院公共服務台語廣播的真人音檔加 3 段合成音檔,共 17 段,套用 production 同一組防幻聽過濾器之後量到 29.7%(en token)與 30.4%(zh),跟官方是同一個量級。
但這個數字不能直接翻譯成「三成的字會錯」。台語跟華語不是一對一對應,同一句台語有好幾種合理的華語說法,以華語稿當基準算 CER 時,「意思對但用詞不同」也被算成錯。模型卡自己就寫了:一個完美的台語 ASR 也不會在華語逐字稿上拿到 0%。
所以我在 README 裡寫的期待值是這樣:它足以讓不懂台語的人當場抓到意思,但會有明顯錯字,人名、機關名、專有名詞要特別留意,不適合當正式紀錄。實際錯起來長這樣,兩個都是實測抄下來的:「駕駛朋友」被聽成「教師朋友」(這種會誤導語意),「潛伏結核」被聽成「前腹結核」(整段意思還讀得懂)。
另外三件我一併寫進限制,因為它們都會讓數字看起來比實際好看:17 段的樣本數不足以斷定語言 token 該選哪個(平均只差 0.7 個百分點,中位數方向還相反);合成語音量到的 5.6% 是最寬鬆的條件,這顆模型的訓練語料本身就是合成語音,不能拿來宣稱真人準確度;防幻聽門檻預設 -1.0,實測最接近的幻聽是 -1.02,只差 0.02,在吵雜環境有可能誤殺真的在講話的人。
教訓三:用別人微調的模型,就得自己出算力
想放上線給陌生人試玩的時候才發現:這顆是別人微調的模型,所有「託管模型 API」都跑不了它。Cloudflare Workers AI 只有內建模型,Hugging Face 也沒有任何 inference provider 在服務它。結論很單純,要嘛自己出一台機器,要嘛讓使用者驅動自己本機的後端。我選了後者,說明頁上 GitHub Pages,前端可以直接打使用者自己跑起來的服務。
配套踩到的坑也記一下:用自簽憑證連線時 Chrome 根本不讓註冊 service worker(主控台會出現 SSL certificate error),所以走 make-cert.sh 那條路的人沒有離線外殼、也不能加到主畫面,只有字幕本身能用。要完整的 PWA 行為就得有一張被信任的憑證。
這個專案已經停在這裡了
NEXT.md 最後一次更新寫的是「專案已交付,不再繼續開發」。它能跑、量測紀錄可以用 bench.py 自己重跑、限制寫得很清楚,這樣就夠了。
範圍、要不要繼續做、README 裡哪些話不能寫,是我定的;程式碼、量測腳本跟那份 VERIFICATION.md 是 AI 寫的。
下一次接願望,我會先花二十分鐘查市面上有什麼,然後把落差那一段當成規格寫在最前面,再開始寫程式。