全部文章

· Casimiro Ferreira· 1 分钟阅读

说对读音:为 TTS 消歧葡萄牙语异音同形词

  • Datasets
  • Portuguese
  • TTS
  • Grapheme-to-Phoneme
  • NLP
  • Accessibility
  • FOSS

说对读音:为 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-homographs56,891 个欧洲葡萄牙语句子,覆盖 27 个异音同形词。每个句子都被标注了该单词、它的 含义(义项)、它的词性、它的 IPA 发音,以及一个恢复了变音符号的形式(例如 sêdesé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 技术栈——它们都是小巧、确定性的部件,让一个声音以其使用者实际使用的方式来念出一门语言。