iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0
佛心分享-SideProject30

打造台語發音檢測系統:可憐大四生的專題實錄系列 第 9

Day 9 終於揪出罪魁禍首!但是為什麼我介紹套件介紹到開始口音大戰。這不是畢專嗎?拜託停手!

  • 分享至 

  • xImage
  •  

今天來分享一個因為語言學知識不足,導致模型出現重大偏誤的故事。

沒錯,我的台羅標註又出錯了(第 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 參數輸出變調後的結果。原本看到的時候還覺得太好了,但事情當然沒有這麼簡單。

以一個我自己資料裡很容易出問題的詞「癩哥蛾仔」來測試:

  • 字典本調:thái-ko-ia̍h-á
  • taibun變調後發音:Thai-kō ià á
  • 字典音檔發音:thai-kō-iā-á

官方的 auto 模式確實宣稱會處理包含「仔」的詞,所以我原本以為這次終於可以直接把問題交給套件解決。
結果我把自己的案例實際丟進去跑,輸出的結果還是和我從字典音檔確認到的發音不同。

所以……又不行。🥲

我這次測試的案例中,taibun 輸出的結果仍然和我從教育部辭典音檔確認到的發音不同,因此我目前還不能直接把它的輸出當成訓練資料的標準答案。 對一般的變調處理來說,它可能有它的用途,但至少以我目前的資料來說,還不能直接拿來當成實際發音的標準答案。

最後我還是只能繼續查資料、比對字典音檔。

修正流程圖

不過最後,我還是找出了一套屬於我的修正流程:

  1. 將變調規則知識餵給 LLM,讓它協助初步標註。
  2. 用表現最好的模型重新跑過一次資料,抓出可疑數據。
  3. 查詢字典原音 + 查表比對 + 與 LLM 反覆確認 + 最後靠耳朵聽。

剩下的,就只能靠自己一個一個慢慢修了(QAQ)。

在發音辨識上,易混淆的四聲和八聲我已經能分清楚了;但一聲和七聲有時還是會搞混。一聲是「頭聲」,七聲是「胸聲」,帶有一點濁音的感覺,這部分真的需要再練練耳朵了。

雖然最後我沒有直接採用 taibun 來處理我的變調資料,但這個套件還是有它的價值在。
畢竟我現在遇到的問題,是不能直接把它的輸出當成我的資料標準答案,這不表示它沒用。台語相關的文字處理本來就不只有變調,未來如果需要處理其他台羅相關功能,說不定還會再遇到它。

所以先記下來。未來的我如果又挖到什麼台語文字處理的大坑,也許可以回來看看這個套件。

要如何使用 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 參數也可以搭配這個輸出系統使用喔!

我未來也有打算在系統裡加入這個選項。對不熟悉台羅的人來說,直接看到一堆羅馬字母加上聲調符號,可能反而會有閱讀門檻。
畢竟很多人從小學習台語時,本來就是透過注音符號接觸發音。我自己小時候也不會特別去記課本上的台羅,基本上就是老師怎麼念、我就怎麼跟著念 😂。

所以未來如果真的做成系統,我希望使用者可以自己選擇要不要看發音標註,以及要使用哪一種方式。
流程目前大概會是:

  1. 華語輸入轉換成台語漢字(這部分目前還沒有確定使用哪個工具,taibun 本身做不到)
  2. 使用者選擇發音標註方式(台語方音符號/台羅/不顯示)
  3. 系統根據使用者的設定處理標註,如果需要顯示發音,再透過 taibun 轉換成對應的標註方式。

接下來介紹方言功能吧!

方言功能

台語本身就存在不同腔調,例如偏漳州腔和偏泉州腔,不同腔調之間可能會有不同的讀音。目前我的專題暫時以教育部臺灣台語常用詞辭典的讀音作為基準,但我不希望未來的系統因此只能處理單一種發音。

所以我也先研究了一下 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

今天的文章算是我覺得難得寫得好的吧,希望大家也喜歡。(為我之前寫的爛文章道歉)

我是微微,明天見~


上一篇
Day 8|Codex開大,但是全程做白工(´థ౪థ)
下一篇
Day 10 圖解大破程:Hugging Face 模型在訓練前資料被怎麼處理
系列文
打造台語發音檢測系統:可憐大四生的專題實錄11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言