自然度分数不可靠?用语言学维度探针测试TTS自动评测器
做 TTS 评测的人,很多都盯着一张自然度 MOS 分数表看结果。分数高就觉得系统没问题,分数低就觉得模型不行。但真正落过地、听过大量合成语音的人会明白,自然度只是一个很粗的聚合指标。它很可能把一个重要缺陷平均掉,也可能对某些明显错误完全不敏感。
最近我看到一篇论文标题是“Beyond Naturalness: Probing Automated Text-To-Speech Evaluators on Linguistically Grounded Dimensions”,意思是说,别只看自然度,要拿着语言学维度的探针去测一测那些自动 TTS 评测器。这个思路非常值得做。它解决的是一个很实际的问题:自动评测器到底能不能代替人耳,能不能在语调、重音、停顿、语义匹配这些更细的维度上给出可靠判断。
这篇文章就把这套思路拆开讲。先说明自然度分数为什么不够,再讲怎么构建探测样本,然后把探测方法落到自己的评测流程里,最后给出常见坑和排查顺序。
1. 先搞清楚“自然度分数”到底漏掉了什么
1.1 MOS 和自动评测器的本质
传统 TTS 评测主要靠主观听感实验,让一批试听者给合成音频打分,通常打的是自然度、相似度、清晰度这几项,最后用平均意见分数(MOS)来代表整体水平。这个分数本身没有错,它反映的是大众听感的一个平均倾向。
问题出在“平均”这两个字上。一段语音如果有 5 秒非常自然,但中间 1 秒出现明显破音或者语法重音错位,听感实验里很多试听者会下意识忽略那个瞬间,最后给个 7 分。分数没有说谎,但它把错误稀释了。
自动评测器更麻烦。像 UTMOS 这类 MOS 预测模型,本质上是学了一个从音频特征到人类分数的映射。它学到的还是“人的平均分数”,所以它继承的同样是平均化倾向,甚至更强。因为训练数据里的标注本身就存在这个现象:试听者对局部异常的敏感度不一致,标注噪声会被模型进一步平滑掉。
还有一个关键点:自动评测器不一定理解语言。它可能能感知到音质变差、停顿变长,但未必能判断这个停顿是不是放在了错误的位置;它能感知到语调起伏,但未必知道这个起伏是不是违反了句子的语义重点。这就是标题里“语言学维度”四个字的价值所在。
1.2 声学质量和语言表达是两个层面
很多评测人员会把“听着自然”和“表达正确”混在一起。实际上这是两个层面:
- 声学层面:音色是否稳定、有无爆音、底噪是否明显、频谱是否连续、语速是否均匀。
- 语言层面:重音是否落在正确词上、疑问句的语调是否上扬、停顿是否断在意群边界、多音字是否按语义读对、合成文本和预期语义是否对齐。
自然度分数能部分反映声学层面,但语言层面经常是盲区。尤其现在端到端 TTS 模型越来越强,声学缺陷越来越少,剩下的问题恰恰集中在语言表达上。你听一句“我想吃苹果”和“我想吃苹果”,重音位置不同,意思完全不同,但自然度分数可能几乎一样。
所以我在实际评测里,早就不会只看一个总分了。我会把听感拆成几个独立维度分别打分。这篇论文的思路和我做的方向一致,只不过它把“人耳拆维度”升级成了“用探针去测自动评测器”。
2. 用“探测”的方式测试评测器:核心方法论
2.1 什么叫探测一个评测器
探测这个词在 NLP 里很常见。它的思路是:你有一个黑盒模型,不确定它内部是不是真的理解某个属性,那就构造一批只改变这个属性、其他条件完全相同的输入,看模型的输出会不会跟着变。
放到 TTS 评测器上,就是构造一对或多对音频样本。每对样本只在某一个语言学维度上有差异,比如重音位置不同,其他因素全部保持一致。然后把这对样本丢给自动评测器打分,观察分数差异。
如果评测器真的有语言理解能力,它应该能区分这两段音频,给出和语义方向一致的分数变化。如果分数没变化,或者变化方向是错的,就说明评测器对这个语言学维度不敏感,甚至是盲的。
这个方法说起来简单,做起来有几个前置条件。第一,音频对必须控制得干净,不能同时改了两三个变量,否则你没法判断分数变化到底来自哪个维度。第二,语言维度的定义要可操作,不能只说“语调不对”,要具体到“陈述句末尾降调被改成了升调”。第三,要有足够多的样本量,单对样本不能说明问题。
2.2 适合探测的语言学维度
标题里说的是 linguistically grounded dimensions,实际落地时可以从这些维度入手:
| 维度 | 具体表现 | 可构造的对照方式 |
|---|---|---|
| 重音位置 | 强调词不同导致语义焦点不同 | 同一句话,强调“我”还是强调“苹果” |
| 语调模式 | 陈述、疑问、感叹的调型差异 | 陈述句末尾改成上扬调 |
| 停顿时长与位置 | 意群边界是否恰当 | 在主谓之间插入长停顿,或把停顿移到错误位置 |
| 多音字 | 文本语义决定读音 | 同一文本不同读音版本 |
| 语义一致性 | 合成内容与前置文本冲突 | 前文说喜欢,后文读成不喜欢 |
| 韵律层级 | 词边界、短语边界是否清晰 | 去掉词间停顿,让整句糊在一起 |
这些维度有一个共同点:它们都依赖语言知识,而不是单纯的声学质量。一个只学了声学特征的评测器,理论上应该在这些维度上表现不稳定。
3. 构造探测样本的具体思路
3.1 从最小对照开始
我第一次做这类探测时,踩过最大的坑就是变量没控制住。本来只想对比重音位置,结果合成时语速也变了,情绪也变了,最后分数差异出来根本没法解释。
所以我的建议是先做最小对照。拿一句语义歧义小的短句,比如“他昨天去了学校”,分别生成“他昨天去了学校”和“他昨天去了学校”两个重音版本。注意,两个版本除了重音位置,其他声学参数尽量一致。
这里有个实际操作问题:普通 TTS 模型不会直接给你重音控制参数。你需要看模型是否支持 emphasis、stress、accent 这类标记,或者能不能通过韵律控制接口调整。有些模型支持 SSML 标签,有些模型需要通过复读、标点、换词来间接引导。如果模型完全不具备重音控制能力,你就没法构造这个维度的样本,那么你测的其实是“这个模型能不能表达重音”,而不是“评测器能不能感知重音”。
所以在构造样本之前,先确认两件事:第一,模型能不能稳定生成带特定语言属性的音频;第二,生成的音频是不是真的体现了这个属性。第二点不能只靠耳朵判断,最好做一个简单的人工校验,找一个能听出重音差异的人确认一下。
3.2 多对样本比单对样本可靠
一对样本不够。哪怕是同一个模型、同一个句子,不同 seed 生成的音频也会有随机波动。自动评测器对随机波动可能很敏感,给你一个很大的分数差,但这个差异和语言维度无关。
稳妥做法是每个条件生成 5 到 10 条,凑成一组。然后分别计算两组的平均分、中位数和标准差。不要只看均值,如果标准差特别大,那这个维度的分数差异可能只是噪声。
我一般还会做一个反向对照。比如我构造了 10 对“重音位置错误”的样本,那我也要构造 10 对“重音位置正确”的样本,然后看评测器在两组之间的分数差异。如果正确组的平均分明显高于错误组,说明评测器在这个维度上有一定判别力;如果两组分数几乎重叠,说明这个维度对它是盲区。
3.3 评测器输出不一定是单一分数
自动评测器不止一种。传统 MOS 预测器输出 1 到 5 的分数;基于大语言模型的评测器会输出带解释的评分;还有一些评测器输出的是多个子分数。探测之前要确认评测器的输出结构。
如果评测器只输出一个自然度总分,那么探测结果只有一种:看总分是否随语言维度变化。如果评测器同时输出自然度、流畅度、重音准确性、韵律自然度等子分数,那信息量大很多。你可以看到重音维度的错误是否只影响“重音准确性”子分数,而不影响“音质”子分数。这本身就是评测器的建模行为分析。
4. 评测器敏感度实验结果怎么看
4.1 三类典型结果
按我的经验,探测结果通常可以归为三类。
第一类,评测器对这个维度敏感,且方向正确。比如重音错误组的分数明显低于重音正确组。这说明评测器已经学到了相关的语言表达规律,可以在评测流程里依赖它来进行这一维度的回归测试。
第二类,评测器完全不敏感。两组分数几乎没有差异,或者差异远小于随机波动。这说明评测器在这一维度上是盲的。这时候你必须保留人工听测环节,不能指望自动评测器帮你拦住这类错误。
第三类,评测器敏感但方向错误。错误组分数反而更高。这种情况最危险。它意味着评测器不仅没有起到筛选作用,还会给你一个错误的正反馈,让你误以为修改方向是对的。
判断属于哪一类,不能只看一组数据。至少连续测试 3 个模型、每个模型 10 条以上样本,再下结论。而且要看差异是否稳定:如果这次差异 0.5 分,下次差异只有 0.1 分,那评测器对这类样本的判别能力就是脆弱的。
4.2 为什么有些维度会失灵
自动评测器失灵的原因通常有三个。
第一,训练数据本身缺少细粒度标注。如果训练数据里只有自然度总分,没有重音位置、语调模式、停顿边界这些维度标签,那评测器根本没有机会学到这些概念。
第二,评测器的输入形式限制。有些评测器只接受音频,有些会结合文本。如果评测器只能用音频特征,它能感知到的只是声学层面的变化,很难判断重音是否落在语义正确的词上。如果评测器结合了文本输入,它能利用文本先验来做更多判断,但这也可能引入新的问题:它可能只根据文本猜测一个合理分数,根本没认真听音频。
第三,测试样本的差异不够大。有些语言维度差异非常细微,比如时长的微小变化、重音的轻微偏移,人耳都需要反复听才能分辨,评测器自然更难。所以刚开始探测时,先用差异较大的极端样本,比如把重音从句首挪到句尾,或者把停顿从 200ms 拉到 1200ms。等确认评测器能感知大差异后,再把差异逐步缩小,找到它的敏感边界。
5. 把探测方法纳入自己的 TTS 评测流程
5.1 一套可落地的检查清单
我自己的 TTS 评测流程里,已经加入了一个“语言维度探测”步骤。整体顺序是这样:
- 先跑常规自然度、相似度评测,确认整体分数没有大问题。
- 再跑语言维度探测,优先选重音、语调、停顿这三个维度,因为它们最常见也最容易出问题。
- 每组探测样本人工校验一遍,确认语言学属性确实被合成出来了。
- 用自动评测器打分,同时保留 3 到 5 个试听者的主观判断。
- 对比自动分数和主观判断是否一致,不一致就要重新检查样本。
这套检查流程不需要很重的投入。每次模型迭代时,固定选 20 到 30 句测试文本,生成探测样本,跑一轮自动评测,再找 1 到 2 个人快速听一遍。耗时在一个小时以内,但能提前发现很多单纯看 MOS 发现不了的问题。
5.2 自动化脚本的大致思路
如果评测样本很多,手一个个跑会非常累。可以写一个简单的脚本把这些步骤串起来:
这个脚本的核心价值不是自动化本身,而是把样本的组织方式固定下来。每个样本都要有明确的元信息:维度、条件、模型、seed、合成参数。没有这些元信息,分数差异出来之后你根本没法定位原因。
5.3 怎么定判断阈值
评测器分数差异到底多大才算“敏感”,没有一个通用阈值。它取决于评测器的量纲和标准差。我一般这么处理:
先跑一组完全相同的重复样本,看评测器自身的重测稳定度。如果同一段音频跑两次,分数波动就有 0.3,那组间差异小于 0.5 就基本不构成证据。如果评测器非常稳定,重测波动只有 0.05,那组间差异 0.2 可能就已经有判别力。
另外要注意,自动评测器分数不要直接当绝对质量来理解。它更像一个相对指标,适合做回归对比。同一个评测器、同一个模型、同一组样本,模型 A 得分比模型 B 高 0.3,这个相对关系有一定参考价值;但模型 A 得分 4.2 不代表它真的可以上线。
6. 常见问题和排查顺序
6.1 先看探测样本本身
遇到评测结果不符合预期,比如重音错误组的分数反而更高,第一件事不是怀疑评测器,而是回去听样本。很多时候问题是样本没构造对。
重点检查:重音真的落到了目标词上吗?停顿真的插在预定的位置吗?模型是不是漏掉了你的控制标记?合成时是不是因为 seed 不同,导致同一组样本里的音色、语速也有差异?
我踩过最典型的坑是用文本强调符号控制重音,结果模型把符号当成噪声处理了,生成出来的两个版本没有实质差异。看起来是在测重音,实际上测了两次同样的合成,分数自然没有差异。
6.2 再看评测器的输入和版本
样本没问题之后,再检查评测器本身。不同版本的评测器权重可能完全不同。同一个 UTMOS 模型,不同 checkpoint 对重音维度的敏感度就可能不一样。所以评测时必须固定评测器版本,升级评测器后,之前的基线对比全部失效。
还要看评测器是否接受文本输入。有些评测器同时支持纯音频和音频加文本两种模式,两种模式的输出可能完全不同。纯音频模式下评测器只能靠声学线索推断语言结构,效果会差很多。如果你的评测器支持文本输入,建议把两种模式都跑一下,分别记录。
6.3 最后看统计口径
如果样本、评测器都没问题,分数差异仍然解释不了,那就看看统计方式。是不是只用了均值,没有看标准差?是不是只测了一个句子,没有覆盖多个句型和长度?是不是把不同维度的样本混在一起算分数了?
这些统计口径的问题看起来很小,影响却很大。混合统计最容易掩盖单维度异常。比如你有 10 条重音错误样本和 10 条停顿错误样本,错误程度不同,混在一起算平均分,可能得到的结果是“整体分数没变化”,但实际是重音错误被拉低了,停顿错误被拉高了,两者抵消了。
把每个维度分开统计,分别对照正确组和错误组,再下结论,这才是探测方法的核心纪律。
最后留几个我会优先看的点
如果只记住一件事,那就是:自然度分数不是终点,评测器也不是免检的。自动评测器本身需要被评测,尤其是在重音、语调、停顿、语义一致性这些语言学维度上。
我个人的实践顺序是:先用人工耳朵确认模型能表达某个语言属性,再用一组严格对照的音频去探测评测器的敏感度,最后把敏感度结果写进评测基准文档。这个过程中,样本控制比评测器选型更关键,通常大部分异常都出在样本或合成参数上,而不是评测器本身。
如果你正在做 TTS 评测,建议从重音维度开始。它构造成本最低,语义影响最明显,评测器的表现也最能说明问题。跑完一组你就知道手里的自动评测器到底是在帮你看门,还是只给你一个漂亮的数字。