今天來分享一個因為語言學知識不足,導致模型出現重大偏誤的故事。
沒錯,我的台羅標註又出錯了(第 n 次)。
不過好消息是,我終於有辦法徹底解決這個問題了。
先來說明一下,為什麼台羅標籤的出錯率這麼高吧。
看看教育部台語辭典的規定:
(一)「變調」原則上有連讀變調、隨前變調、三連音變調、仔前變調等幾種變調。因連讀變調為規則變調,較為容易理解;其餘為不規則變調。規則因調值不同而複雜,暫先不列說明。
(二)連讀變調:
即單字的語音會因連接另一個字而改變聲調,使句中的字音與該單字的本調不同,且這是一個必用規律,所接的字不限聲調為何,皆須變調。不過句子裡有幾種情況例外,當語氣完結、所接的字為弱讀調、主語被凸顯等情況之下,即使在句中也不變調,否則,除了最後一個字之外,句中的每一個字都變調。
聲調:陰平1、陰上2、陰去3、陰入4、陽平5、陽去7、陽入8
變調規則:1→7,2→1,3→2,4→8(-p-t-k),4→2(-h),5→7(漳),5→3(泉),7→3,8→4(-p-t-k),8→3(-h)
引用自「教育部臺灣台語常用詞辭典」
問題就在這裡:我前面的程式處理變調時,根本沒有考慮到台語的變調規則比我原本想像得複雜得多。 更麻煩的是,辭典上的台羅主要還是本調形式,實際連讀時到底怎麼變,不能只看文字就全部知道。最後很多時候還是得回去聽音檔確認。這對當時還在寫變調程式的我來說,根本是大坑。 (年少無知)
不過,深入了解後,我也終於發現為什麼我的模型會出現大量 h 錯誤了。

我才發現,四聲和八聲的 -h 韻尾在連讀變調時,會出現韻尾形式改變。 終於理解,為什麼模型之前會一直出現大量和 -h 有關的錯誤。
模型並不是分不清 -h,根本是我餵了模型錯誤的資料。(我在此鄭重對模型 wav2vec2-large-xls-r-300m 以及模型 wav2vec2-large-xls-r-300m-tsm-asr-v6 表明歉意。)
為了搞定這些變調,我試過很多方法。過程中我找到「taibun」套件,它可以透過 sandhi 參數輸出變調後的結果。原本看到的時候還覺得太好了,但事情當然沒有這麼簡單。
以一個我自己資料裡很容易出問題的詞「癩哥蛾仔」來測試:
官方的 auto 模式確實宣稱會處理包含「仔」的詞,所以我原本以為這次終於可以直接把問題交給套件解決。
結果我把自己的案例實際丟進去跑,輸出的結果還是和我從字典音檔確認到的發音不同。
所以……又不行。🥲
我這次測試的案例中,taibun 輸出的結果仍然和我從教育部辭典音檔確認到的發音不同,因此我目前還不能直接把它的輸出當成訓練資料的標準答案。 對一般的變調處理來說,它可能有它的用途,但至少以我目前的資料來說,還不能直接拿來當成實際發音的標準答案。
最後我還是只能繼續查資料、比對字典音檔。

不過最後,我還是找出了一套屬於我的修正流程:
剩下的,就只能靠自己一個一個慢慢修了(QAQ)。
在發音辨識上,易混淆的四聲和八聲我已經能分清楚了;但一聲和七聲有時還是會搞混。一聲是「頭聲」,七聲是「胸聲」,帶有一點濁音的感覺,這部分真的需要再練練耳朵了。
雖然最後我沒有直接採用 taibun 來處理我的變調資料,但這個套件還是有它的價值在。
畢竟我現在遇到的問題,是不能直接把它的輸出當成我的資料標準答案,這不表示它沒用。台語相關的文字處理本來就不只有變調,未來如果需要處理其他台羅相關功能,說不定還會再遇到它。
所以先記下來。未來的我如果又挖到什麼台語文字處理的大坑,也許可以回來看看這個套件。
首先安裝:
pip install taibun
安裝完成後,就可以在 Python 裡匯入使用。
在介紹變調之前,先來看看 taibun 最基本的功能。它可以將輸入的台語漢字轉換成不同的台語書寫系統。
先用台羅示範:
from taibun import Converter
c = Converter(system='Tailo')
result = c.get("癩哥蛾仔")
print("台羅:", result)
這樣就可以將輸入的台語漢字轉換成台羅。
而如果希望進一步處理連讀變調,就可以在建立 Converter 時加入 sandhi 參數,把 sandhi 設定成 auto:
from taibun import Converter
c = Converter(system='Tailo', sandhi='auto')
# 接下來,拿我第一個案例來測。
result = c.get("癩哥蛾仔")
print("實際口語發音:", result)
可惜台語變調規則實在太複雜,sandhi='auto' 最後還是沒辦法直接解決我這次遇到的問題。
所以這個案例最後,我還是只能回去查字典音檔、比對資料,然後靠自己的耳朵確認實際發音。
不過,雖然 taibun 的自動變調功能沒有成功解決我的問題,我後來還是繼續研究了一下這個套件。畢竟它除了變調之外,還提供了不少和台語文字處理有關的功能,說不定未來整理資料或建立系統時還會用到。
接下來就來看看它還能做什麼。
除了台羅之外,taibun 也支援輸出 Zhuyin。Zhuyin 輸出的不是我們國語課本那套單純的注音符號,而是用於標示台語讀音的臺語方音符號。因個人習慣,以下簡稱「注音」。
使用方式只要把 system 改成 Zhuyin:
from taibun import Converter
c = Converter(system='Zhuyin')
result = c.get("癩哥蛾仔")
print("臺語方音符號:", result)
這樣 taibun 就會把輸入內容轉換成注音符號,而且 sandhi 參數也可以搭配這個輸出系統使用喔!
我未來也有打算在系統裡加入這個選項。對不熟悉台羅的人來說,直接看到一堆羅馬字母加上聲調符號,可能反而會有閱讀門檻。
畢竟很多人從小學習台語時,本來就是透過注音符號接觸發音。我自己小時候也不會特別去記課本上的台羅,基本上就是老師怎麼念、我就怎麼跟著念 😂。
所以未來如果真的做成系統,我希望使用者可以自己選擇要不要看發音標註,以及要使用哪一種方式。
流程目前大概會是:
接下來介紹方言功能吧!
台語本身就存在不同腔調,例如偏漳州腔和偏泉州腔,不同腔調之間可能會有不同的讀音。目前我的專題暫時以教育部臺灣台語常用詞辭典的讀音作為基準,但我不希望未來的系統因此只能處理單一種發音。
所以我也先研究了一下 taibun 的方言功能,說不定未來真的會用上。
taibun 可以透過設定 dialect 參數來指定不同的方言,目前可以選擇:
south:偏漳州腔north:偏泉州腔singapore:帶有新加坡特色的泉州腔使用方法如下:
from taibun import Converter
c = Converter(
system='Tailo',
dialect='south'
)
result = c.get("癩哥蛾仔")
print(result)
當然,這裡設定的是「偏」漳州腔或「偏」泉州腔。既然官方都寫「偏」了,就代表它本來也不可能完全對應到某個地區,甚至某一個家庭實際使用的台語。
我在做這個專題開始時就想到腔調問題,最終思考後決定以教育部辭典作為系統的參考基準,因為它對所有使用者來說相對公平。它的資料是公開的,也可以查詢,至少不是由系統自己隨便決定這個才是正確的發音。
以我自己查資料的經驗來說,我原本曾經以為家裡某些習慣的說法沒有被教育部辭典收錄。後來重新檢查才發現,其實不是辭典沒有收,而是我之前受到變調形式影響,沒有認出它和辭典中的本調形式其實是同一個詞。(我的國小台語課沒教我)
還有一件很有趣的事,明明家裡的人都來自同一個地方,但我們使用的一些不同詞彙,查教育部辭典後,卻可能分別被標註成不同腔調、甚至不同地區的用法。
一個人的台語本來就不是簡單地選擇「漳州腔」或「泉州腔」就可以解決。你家怎麼講、從哪裡來、家裡上一代怎麼講,甚至後來接觸過哪些地方的台語,都可能慢慢混合在一起。到這裡,我也順便想到一個目前還在構想中的功能,做一份屬於使用者自己的「個人台語手冊」。
除了系統目前使用的參考讀音之外,使用者也可以自己記錄一些家裡實際習慣的用法。例如:
我比較想做的,是把這些使用上的差異記錄下來。或許可以形成使用者自己的一個地圖。
而且未來如果系統發現使用者的發音和目前設定的參考讀音不同,至少可以知道這是不是使用者自己原本就存在的語言使用方式,而不是每次看到不一樣,就直接把它當成需要修正的東西。使用者在用的時候也可以順手把自己家裡的用法記錄下來。
不過這份「個人台語手冊」目前還只是我的構想,而且我也沒有打算蒐集大家家裡怎麼講台語,更沒有要順便建立什麼家庭台語資料庫。
我希望這份「個人台語手冊」首先是屬於使用者自己的資料。使用者可以選擇記錄家裡習慣的詞彙與讀音,但不需要公開,也不會被直接拿去建立其他資料庫。
當然,如果未來有人希望分享自己的內容,我也不排除設計成可以生成小卡片,讓使用者自行決定要不要分享。
今天就先分享到這裡,我目前也把文章裡的 taibun 程式碼放到 GitHub 上了。點擊「Day 9」就可以查看。
→ GitHub 實作範例:https://github.com/yifyu1122/taiwanese-asr-lab
今天的文章算是我覺得難得寫得好的吧,希望大家也喜歡。(為我之前寫的爛文章道歉)
我是微微,明天見~