AI填詞能(三):一字多音的處理讓整個程式要重寫
上回講到填詞工具初步成形,但有一個重要問題,如果一個字有多個讀音(例如「長」是「長度」的tsoeng4還是「長官」的dzoeng2),程式對同一字的不同讀音都給予相同的抽取機率,以致程式會給出一個看來不合音的字,但其實是因為它有一個甚少使用的讀音,例如「三」絕大多數是指數目字的saam1音,但如果「三思而後行」的「三」saam3也被給予相同機率,便很容易被抽中在不合音的位置上。
所以每個字的讀音也需要分辨。問題是,本來收集的歌詞資料只有文字而沒有發音,單是為88首歌的數萬字標上發音,想起也令人不想努力了。
結果嘗試了兩個進路。第一是以部份歌曲作樣本,統計一個字不同讀音的使用頻率,之後以這比率調整每個字每個音的獲選的機會率。本來的想法是以之前收集的88首歌詞為「樣本」,程序如下:
- 找出所有出現在任何一首歌詞中、有多過一個可能讀音的字;
- 就每一個字,找出有這個字的歌詞;
- 辨認每一次出現這字時該使用甚麼讀音;
- 統計所有讀音的頻率。
例如「中」字在這樣本出現119次,「中文」的「中」(dzung1)佔110次而「中獎」的「中」(dzung)佔9次,相對比率為92%:8%,如果後來歌詞庫擴充,有幾百首歌詞而「中」出現300次,就可以當「中文」的「中」(dzung1)有277次而「中獎」的「中」有23次了。
本想著為這88首歌「辛苦一次」,之後收集再多的歌詞也可以以這次的比率模擬,但就是這88首歌已經有162個不同的有多個讀音的字,每個字動輒出現在三四十首歌,結果就是數千次來回於粵音字典、統計用的spreadsheet、和歌詞文檔,再要為字典沒有出現過的讀音和在字典出現而實際不會使用的讀音調整計算方法,按下無數次Cmd+C, Cmd+V和Cmd+F,按到左手也幾乎職業勞損,我也對只用88首歌計出來的「近似」比率也不太有信心,但顯然這不是可以持續的做法。
另一個進路是在寫第四季季結和2025年結以致「AI填詞能」進度慢了的時候靈機一觸想出來的。簡單來說是直面把每個字標上讀音的必要,但用一個相對無痛的方法處理每一首歌。方法如下:
- 為每首歌詞的文字檔(txt)轉換成表格格式(儲存為csv),歌詞出現的每一個中文字佔一或多列,每列是(根據粵音字典)每一個可能的讀音;
- 打開csv檔(用Excel或Google Sheet或純文字編輯器也可),讀取全首歌詞,刪去不適用的讀音;
- 把處理好的所有csv檔一次過讀取再合併計算就能直接統計每個字、每個發音的頻率了,就可以以此作為隨機抽取用字的機會率。
| 以古天樂《天命最高》為例 |
步驟(1)和(3)都是可以用Python快速處理(更重要是就算之後處理1000首歌,這樣的程式也是瞬間完成),程式碼怎寫當然是有賴ChatGPT相助了。唯有是步驟(2)還得手工作業(可能AI也可以包辦,但為確保分析準確也沒有深究如何更快做好它了),但就算是手工作業流程也順暢很多,因為只要跟著歌曲由上而下檢視一次(然後自己也想唱),再按需delete就可以了。處理一首《天命最高》,大概用了一分半鐘(以下是以兩倍速播放檔案處理實況):
結果因為處理一字多音的情況,整個程式由讀取字典和歌詞、再讀取每個字每個讀音的數據、到計算每個字每個音獲抽取的機率都要重新寫過。但我相信這個改動讓上游的數據處理基礎更加堅實,之後歌詞數據庫的更新和擴充也更易處理,2015-2019本blog 20大的粵語歌詞的文檔也準備好了,處理好其csv檔後歌詞資料庫會增至185首(本來是184,加上示範用途的《天命最高》!),下一篇便會集中討論「以機率選字」程式的各種機制,到時就可以見到可以試用作填詞的程式的雛型了。
留言