「正宗」這兩個字我拿掉了:阿瑋好聲音的台語只敢叫 Beta

願望池 #26 的標題寫著「正宗台灣國語與台語語音系統」,許願的人想的是視力不佳的長輩。做完之後我把介面上的「正宗」拿掉,改成「台語 Beta」。這篇講為什麼,以及一個朗讀工具的兩條聲音路徑各自會把你的字送到哪裡去。

阿瑋好聲音

這篇講的東西

願望的標題有「正宗」兩個字,我做不到,所以介面上沒有這兩個字。

台語那一欄我寫的是「台語 Beta」。不是謙虛,是我真的還沒找母語者坐下來聽過一輪,在那之前寫「正宗」就是騙人。這篇想講的其實是這件事:一個朗讀工具最難的部分不是接 API,是決定哪些話不能說。

這是做給誰的

許願的人在願望裡填的使用者是「視力不佳的長者,以及想聆聽台語內容的使用者」。這句話直接決定了三個設計:

介面字要大,大到不用瞇眼。輸入不能只有貼上,要能匯入 TXT、Markdown、文字型 PDF 跟 DOCX,因為長輩手上多半是別人傳給他的檔案,不是一段可以複製的文字。還有逐段播放,第一段做好就開始念,剩下的在背景排隊,不要讓人盯著轉圈圈等一整篇。

四條路徑,各自把字送去哪裡

我覺得語音工具最該公開的就是這張表。按下朗讀之後,那段文字實際上跑去了哪裡:

功能 實際處理方式 要網路嗎
台灣國語裝置語音 瀏覽器/作業系統自己的 zh-TW voice,直接念原文 看 voice 而定
台灣國語線上備援 後端透過非官方 edge-tts 用線上 zh-TW 聲音
華語翻台語 華語分段送 Groq 翻成 POJ,再由部署主機上的 facebook/mms-tts-nan 合成
POJ 調符直讀 分段直接交給主機上的 MMS,不經過 Groq 不用(但要後端)

文件解析全部在瀏覽器裡做,選檔不會自動上傳,只有真的按下朗讀,當下那一段才會送出去。沒有廣告,沒有 analytics。

為什麼只敢叫 Beta

台語合成用的 facebook/mms-tts-nan 是 Min Nan 的研究模型,授權是 CC BY-NC 4.0,它沒有證明過自己是自然的台灣腔。

講具體一點我聽到什麼:怪。要很勉強才猜得出它在講哪一句,多半得先知道原文才對得起來,離「腔調不太對但聽得懂」還有一段距離。而我也還不是判準,母語者才是,那一關也還沒跑(規範寫在 docs/listening-test.md,那是一道空的門檻,不是已完成的項目)。

所以台語那條路現在的狀態是:出得了聲,還不能拿來用。放在介面上是為了讓人知道它存在、也知道它現在爛在哪,不是為了給人拿去唸給長輩聽。

同一個理由延伸出兩條硬規則。第一,系統絕對不會拿國語聲音冒充台語,寧可跟你說這段做不出來。第二,不支援漢字台文直接朗讀,只吃符合 MMS 字表、用調符標聲調的 POJ;如果貼進去的是漢字,要自己選「華語翻成台語」,讓 Groq 先轉一次稿,而且轉完的 POJ 會顯示在畫面上讓人核對。我偏好把中間產物攤開來,看得到才知道它是哪裡念錯的。

edge-tts 也一樣要講明:它是 Microsoft Edge 線上語音的非官方 client,我沒有辦法對它的可用率打包票。

刻意不做的

沒有帳號,沒有登入。匿名就能用,代價是匿名訪客共用一份配額,用完要等。自架成邀請制時才需要邀請碼,而邀請碼只放在這個分頁的 sessionStorage,不寫網址、不寫 log、不進 Service Worker 快取,關掉分頁就消失。

離線的邊界我也寫死在 README 裡:PWA 外殼跟文件解析可以離線開,明確保存過的音檔可以離線重播,但離線不會生出任何新語音。「可以離線開啟」跟「可以離線用」是兩件事,混在一起講就是騙人。

站在前面兩個專案上

這支不是從零開始。國語台語與客語辭典那兩個站 留下了 PWA 分層快取、大字介面,還有一個教訓:官方單詞錄音不等於任意句子的 TTS。taigi-news-reader 留下了華語轉 POJ、MMS 合成、非同步工作、取消、配額、IndexedDB 重播這一整套後端契約。阿瑋好聲音等於把兩邊已經驗過的東西接起來,再補上長輩用得動的介面。

一如往常,範圍、要做跟不做的每一條決定、以及「什麼話不能寫在介面上」是我定的;能跑的程式碼跟測試是 AI 寫的。

先去貼一段字聽聽看。國語那條可以直接用;台語那條你聽了就知道我為什麼不敢叫它正宗。