語音合成:讓雅婷講台語馬ㄟ通

台語語音合成的難點

現今語音合成的系統大多都可以分為三大部分,分別為文字轉發音模組、聲學模型(Acoustic model)及聲碼器(Vocoder)。文字轉發音模組負責將使用者輸入的句子轉成相對應的發音(音標及其他發音特徵),聲學模型將音標轉成頻譜,聲碼器再將頻譜轉變為實際的音檔供人聆聽。後面兩者與語言本身特性相對無關,只要有足夠的資料就可以訓練出堪用的模型供語音合成系統使用。然而文字轉發音模組,由於語言的文字不盡然與其發音有簡單對應(如破音字、三聲變調等現象),各個語言可能有自己的轉換規則,若資料夠多的話,可以由聲學模型自行習得;但若資料不多,就得根據個別語言的聲韻規則特別設計文字轉發音模組,把聲韻規則交給文字轉發音模組來處理,讓聲學模型專心對發音與頻譜的映射建模即可。

文字轉語音系統架構圖

台語文字轉發音模組的難點在於台語一字多音的特性,比起其他語言來得更加豐富,而台語的資料又非常少,不足以讓模型對這些複雜的音韻規則進行建模。以下列舉數個台語一字多音的例子:

文白異讀

您有沒有想過「寒冷的一天」與「寒天」(果凍)用台語分別要怎麼說呢?「寒冷的一天」唸作寒(kuann)天(tinn),而果凍的「寒天」卻要唸作寒(han)天(ten);前者為「寒天」的白讀讀法,後者則為文讀讀法,同樣的漢字,用不同的發音念,竟會有不同的意思,這就是台語有趣的文白異讀現象。台語文白異讀的現象到處可見,光數字就有整套的文讀與白讀音:年份、電話號碼要念文讀,如一(it)九(kiu)九(kiu)六(liok)年、零(khong)八(pat)零(khong)零(khong),作為數詞放在量詞前面則唸白讀,如九(kau)十(tsap)六(lak)個、八(peh)百(pah)塊。因此文字轉音標系統必須先進行簡單的語意理解,分辨該數字屬於前者(表示次序、號碼)或是後者(表示數目)來選擇相對應的發音,才是一個合格的文字轉發音系統。

連續變調

我們知道國語連續三聲時,除了該詞最後一個字念三聲以外,其他字需要唸作二聲,這就是音調語言常見的變調,也就是字詞單獨念與放在句子當中時音調不同的現象。而台語也有變調,而且台語的變調實際上比起國語要複雜得多,若沒有針對變調現象做處理的話,合成出的語音將會變得怪腔怪調,甚至影響理解。我們以「火車」這個詞為例,「火」單獨念是ㄏㄨㄟˋ(四聲),後面加上「車」變成「火車」時卻改念ㄏㄨㄟ(ㄧ聲)ㄑㄧㄚ(一聲),火從四聲變成了一聲,這就是台語的變調。而若我們照每個字單獨念的音調來念「火車」,火車將念做ㄏㄨㄟˋ ㄑㄧㄚ,正好與「貨車」的發音相同,「火車」竟變成了「貨車」。由此可見,台語變調前與變調後的差異足以影響理解,這也是台語語音合成無法繞過變調這個現象的原因之一。而我們如果再考慮在「火車」後面多一個字:「火車站」,讀者應該會發現「車」的發音也變了,變得比「火車」裡面的「車」還要低一些。我們觀察到,一個字在詞尾的調,似乎會與它在詞中間的調有所不同:語言學家發現,台語中,每個調都有兩個調,一個為本調,一個為變調,一個字在詞的結尾時念本調,其餘則念變調。

台語變調子句系統示意圖

若台語變調的現象只侷限在單詞裡面,那麼我們只要將台語的句子做斷詞,再一個詞一個詞去做變調即可。但其實台語變調不只侷限在詞裡面,而是把句子切成數段子句,每段除了最後一個字念本調外,其餘皆念變調。因此要得到台語句子的子句切分,必須對台語句子做句法剖析,再根據台語的變調子句規則取出台語變調的子句。舉例來說,「他寫比較快」這句話的台語「伊寫較緊」,若當中的「寫」念ㄒㄧㄚ(一聲),意思為「他寫得比較快」;而若「寫」念ㄒㄧㄚˋ(四聲),代表的意思卻是「讓他寫比較快」。也就是說,變調子句切分甚至可以影響一句話的意思。或者反過來說,台語可以透過本、變調的選擇來更準確的表達原本可能造成歧異的句子。變調影響意思的例子還有「遮的衫攏總(ㄗㄨㄥ)五百箍」與「遮的衫攏總(ㄗㄨㄥˋ)五百箍」之間的意思差異,前者的意思為「這裡的衣服每件都是五百塊」,而後者則表示「這裡的衣服全部總共五百塊」。

 

「伊寫較緊」(他寫得比較快):

 

「伊寫較緊」(讓他寫比較快):

 

從上述的例子中可以看到,變調子句的切分與否足以改變一個句子的意思,也因此台語的文字轉發音模組需要能夠根據句子的語意找出一個最有可能的子句切分。

以下為目前雅婷台語文字轉語音的初步成果:

小結

從上述的幾個台語的音韻規則的現象的介紹,我們可以發現,台語的語音合成確實有其困難之處,對現今的語音合成技術而言也是一個不小的挑戰;歡迎加入我們,投入台灣在地語言的語言合成/辨識,為保存在地語言盡一份心力。

想在你的專案使用雅婷的台語語音合成技術?歡迎聯絡銷售人員