说对读音:为 TTS 消歧葡萄牙语异音同形词
当一个文本转语音的声音读出 “Tenho sede” 时,葡萄牙语听众期待听到的是 口渴。但完全相同的拼写 sede,也可以表示 总部——而两者用不同的元音发音。用错元音读出来,声音不仅仅是听着别扭;它会大声说出一个不同的词。对于依赖 TTS 来为自己读屏的人来说,这就是可理解与令人困惑之间的分界线。
这是一个前端问题——是字素转音素这一阶段决定了某个单词映射到 哪些声音,远在任何神经声码器把这些声音变成音频之前。再高的声码器质量也无法修复它。如果前端挑错了发音,声音就会清清楚楚地念出错误的词。
异音同形词:拼写相同,声音不同,含义不同
欧洲葡萄牙语中满是拼写完全相同、却用不同元音音质发音的单词——一个 开 元音对一个 闭 元音——其中正确的选择取决于 含义,而不仅仅是语法。举几个:
sede—— 口渴(闭 e,ˈsedɨ)对 总部/所在地(开 e,ˈsɛdɨ)。两者都是名词。forma—— 模具 / 烤盘(闭 o,ˈfoɾmɐ,写作 fôrma)对 形状 / 方式(开 o,ˈfɔɾmɐ)。molho—— 酱汁(闭 o)对 一捆(开 o)。corte—— 宫廷(闭 o)对 一道切口(开 o)。
一个朴素的 TTS 系统会为每个拼写锁定一种发音。于是它会用 总部 的元音去读 口渴——每一次都如此——而听众听到的是错误的词。
为什么”只要标注词性”行不通
显而易见的修复办法,是对句子跑一个词性(POS)标注器,然后按词性来挑选发音。这对某些词对有帮助,但只要两种含义共享同一个词性,它就 从构造上 注定失败。
再拿 sede 来说。口渴 和 总部 都是名词。POS 标注器把它们标成一样的——没有任何语法信号能把它们区分开——所以它永远只能去猜那个更常见的读法。我们精确地测量了这一点:在我们的测试集上,spaCy 和 Stanza 在 sede 的 口渴 义项上都得 0%。它们总是挑 总部。同样的结构性天花板也出现在 corte(切口 vs 宫廷)、forma(模具 vs 形状)和 molho(酱汁 vs 一捆)上:当含义在单一词性内部分裂时,语法看不见它。
数据集:标注含义,而非语法
于是我们构建了一个开放数据集,标注那个真正重要的东西——含义。bifonia-pt-homographs 是 56,891 个欧洲葡萄牙语句子,覆盖 27 个异音同形词。每个句子都被标注了该单词、它的 含义(义项)、它的词性、它的 IPA 发音,以及一个恢复了变音符号的形式(例如 sêde 对 séde),使得意图中的读法在纸面上毫不含糊。
分桶的键是含义——这正是整件事的关键。一条记录长这样:
{
"word": "sede",
"sense": "thirst",
"pos": "NOUN",
"ipa": "ˈsedɨ",
"sentence": "Depois da corrida tinha tanta sede que bebi um litro de água."
}
发音是对照 infopédia 词典(Porto Editora)核实的,而非猜测的,而且训练/测试划分是按 (word, meaning) 分层的,因此下游模型——比如一个 BiLSTM——会在两半中都见到每一个义项。它已在 Hugging Face 上以 TigreGotico/bifonia-pt-homographs 发布。
这个问题能解决到什么程度?
有了按含义标注的数据,我们就能衡量不同方法在挑选正确含义——因而挑选正确发音——上的表现:
| 方法 | 准确率 |
|---|---|
| 总是猜最常见的义项 | 约 53% |
| spaCy POS → 含义 | 约 66% |
| Stanza POS → 含义 | 约 75% |
bifonia 规则 + 含义消解器 | 约 94% |
基于 POS 的方法恰好在你预料之处停滞:它们能按语法路由,却永远无法按含义路由,所以名词内部的分裂遥不可及。我们的消解器——bifonia 库,轻量且 完全零依赖——达到 约 94%,而且关键在于,它在 POS 标注器得 0% 的 sede/口渴 情形上达到了 100%。
亮点不只是那个数字。而是一个小巧、快速、完全开放的组件,在这项任务上击败了重量级的神经 POS 标注器——因为它消解的是 含义,而不仅仅是语法。没有 GPU,没有模型下载,没有网络调用。
为什么这很重要
正确的发音是基础性的,而非装饰性的。屏幕阅读器和语音助手是盲人及仅靠语音的用户阅读世界的方式,而一个把常见词读错的前端,会悄悄地劣化它所触及的每一个句子。在源头修复异音词消歧,意味着声音说出的正是文本所表达的意思。
因为数据集是开放的,消解器又小又可分叉,任何构建葡萄牙语 TTS 前端的人都能在没有巨型模型的情况下把这件事做对——而且同样的方法可以干净地移植到像加利西亚语这样的近亲语言上,那里的开/闭元音区别制造了同样的陷阱。这份标注数据还身兼两职:它正是你训练紧凑的统计模型(比如一个逐词分类器)所需要的,供那些拥有语料、想在基于规则的消解器之外再要一个学习式消解器的团队使用。
试用它
数据集在 Hugging Face 上,地址是 TigreGotico/bifonia-pt-homographs,消解器位于 bifonia。它嵌入了更广泛的葡萄牙语语音学工作之中,背后是 面向葡萄牙语的经典 NLP 以及 面向 350 多种语言的字素转 IPA 技术栈——它们都是小巧、确定性的部件,让一个声音以其使用者实际使用的方式来念出一门语言。