為什麼歌詞的假名會標錯?kuromoji 的限制與校正表
學日文的人看歌詞,最需要的功能之一就是漢字上方的假名(振り仮名)。Lyric Sync 在瀏覽器裡用 kuromoji 對每一行歌詞做分詞,再替含漢字的詞標上平假名讀音,全程在本機執行,不需要任何外部 API。但你偶爾會看到標錯的地方,這篇解釋原因。
kuromoji 做了什麼,沒做什麼
kuromoji 是一個純文字的分詞工具,帶著一本字典。它看的是「這串字在字典裡最常見的讀法是什麼」,並不會聽音檔。所以當一個詞有多種讀音時,它只能選統計上最常見的那一個。
歌詞是最容易出現這個問題的文體。例如「心」,字典預設的讀音是「しん」,但在歌詞裡幾乎都唸訓讀的「こころ」。又例如「二人」,字典可能標成「ににん」,但歌裡通常是「ふたり」。歌詞還常常刻意用漢字寫、卻用另一種讀音唱,例如把「運命」唱成「さだめ」。
要真的做到「唱什麼就標什麼」,理論上得靠語音辨識去比對實際的發音。我目前沒有做這一步,所以假名並不保證 100% 與唱法一致。
讀音校正表
我提供的折衷方案,是一份可以自己編輯的 reading-overrides.json:
{
"二人": "ふたり",
"一人": "ひとり"
}
左邊是漢字原文,右邊是你想顯示的平假名。存檔後回到瀏覽器的擴充功能頁面重新整理,就會套用,不需要改任何程式碼。
這份表也支援依前後文判斷的規則。由上而下檢查,第一條符合的生效,都不符合就維持字典的讀音。這對於「同一個字在不同詞裡讀法不同」的情況特別有用,因為單純的對照表只能一個字配一個讀音。
讀音校正是一場長期的事
校正表只能一個個補,沒辦法一次修好。所以我在說明裡直接提醒使用者:畫面上的假名是輔助,不是標準答案,看到可疑的地方請自行查證。
這個專案教我的取捨
這類工具很容易走向兩個極端:不是假裝自己 100% 準確,就是因為做不到完美而完全不做。我選擇做出 80 分的版本,把剩下的 20 分變成使用者可以自己補的機制,並且誠實寫出限制。
另外一個很實際的限制是:第一次載入時,要下載約 18MB 的日文字典,所以標註假名可能要等 5 到 15 秒,之後瀏覽器會快取。這也是為什麼我沒有把所有功能做成「即時」,而是在文件裡先把等待時間說清楚。
如果你也想試試看,可以先看上一篇談逐字跑詞的原理。