语音合成(TTS)系统已经渗透到智能助手、有声书、车载导航等场景,但合成语音的质量到底如何,很难单凭一句“听起来不错”下结论。评估体系通常分为主观评测和客观评测两类:主观评测依赖人工听音打分,客观评测则通过算法自动计算相似度或感知质量。MOS评分是主观评测的代表,而STOI、PESQ则是使用最广泛的客观指标。它们从不同角度量化语音质量,只有理解各自的计算逻辑和适用边界,才能在实际项目中选对工具、避免被单一分数误导。

一、MOS评分:主观评价的黄金标准
MOS(Mean Opinion Score,平均意见得分)源自ITU-T P.800建议书,是语音质量主观评测的经典方法。测试时邀请一定数量的听音人,在安静环境下试听若干条合成语音样本,然后对每条样本的整体质量进行打分。分数采用5分制:5分表示“非常好”,4分表示“好”,3分表示“一般”,2分表示“差”,1分表示“很差”。最后对所有听音人给出的分数取算术平均,得到该样本或该系统的MOS值。
MOS实验设计看似简单,但细节决定可靠性。听音人需要覆盖不同年龄、性别和听音经验,样本顺序要随机化,避免疲劳效应。通常一个系统至少需要15到20名有效听音人,每条样本试听前要有提示音,试听后留出足够时间打分。为了减少个体偏差,有时还会剔除明显偏离整体分布的异常分数。经过严格流程得到的MOS分数能够直接反映人类对合成语音自然度、清晰度和舒适度的综合感受,因此被公认为评估TTS系统的“金标准”。
然而MOS的局限性也很明显:组织一次主观评测耗时耗力,成本高,而且不同批次实验之间难以完全复现。听音人的状态、设备、环境噪声都会影响结果,导致同一系统在不同实验室可能得到差异明显的MOS值。此外,MOS只能给出整体印象分,无法定位具体是哪一段音素或哪一个声学特征出了问题。因此工程实践中往往需要引入客观指标做补充,在快速迭代和横向对比时发挥自动化优势。
二、STOI与PESQ:客观指标如何量化语音质量
STOI(Short-Time Objective Intelligibility)是一种衡量语音可懂度的客观指标,它不关心语音是否好听,只关心听者能否听懂内容。STOI的计算思路是把参考语音和待测语音按短时帧(通常384ms)切分,对每一帧做STFT得到频谱包络,然后计算两者包络之间的相关系数,再对所有帧的相关系数取平均。最终STOI值在0到1之间,越接近1表示可懂度越高。STOI最初用于评估语音增强算法,后来被广泛用于TTS、降噪等场景,因为它对噪声和失真比较敏感,且计算简单。
PESQ(Perceptual Evaluation of Speech Quality)则更贴近人耳的主观听感,是ITU-T P.862标准定义的客观算法。PESQ的输入是参考语音和待测语音,内部先做电平对齐和时间对齐,然后通过感知模型提取响度、掩蔽等特征,比较两者差异,最后映射到一个类似MOS的分数范围(通常为-0.5到4.5)。PESQ分数可以直接和MOS做粗略对比,值越高说明感知质量越好。由于PESQ模拟了人耳听觉特性,它对编解码失真、丢包、延迟等损伤有较好的区分能力,但对某些非线性失真(如变调、变速)可能不够敏感。
下面用Python代码演示如何批量计算STOI和PESQ。需要安装pystoi和pesq这两个库,示例中对一段合成语音与对应参考语音计算两项指标。注意音频采样率通常要求16kHz,且两个文件长度需一致或先做对齐。
from scipy.io import wavfile
from pystoi import stoi
from pesq import pesq
# 读取参考语音和待测语音(均为16kHz单声道wav)
rate_ref, ref_signal = wavfile.read("reference.wav")
rate_deg, deg_signal = wavfile.read("synthesized.wav")
# 确保采样率一致
assert rate_ref == rate_deg == 16000, "采样率必须为16kHz"
# 计算STOI(可懂度,0到1)
stoi_score = stoi(ref_signal, deg_signal, 16000, extended=False)
print(f"STOI: {stoi_score:.4f}")
# 计算PESQ(感知质量,范围约-0.5到4.5)
pesq_score = pesq(16000, ref_signal, deg_signal, 'wb') # 'wb'为宽带模式,'nb'为窄带
print(f"PESQ: {pesq_score:.4f}")
三、评估流程:从样本集到综合得分
完整的TTS评估不能只跑一两条样本,需要构建具有代表性的测试集。测试集的设计要考虑文本覆盖度,包括不同长度的句子、数字、英文缩写、多音字、标点停顿等,同时最好包含不同性别和音色的参考录音。如果测试目的是对比不同TTS模型或同一模型的不同版本,测试集必须固定不变,所有系统使用相同的文本和参考语音,才能保证对比公平。
实操中通常先对每个样本分别计算STOI和PESQ,再对所有样本的分数取平均,得到系统级的客观指标。如果条件允许,还应该抽取一部分样本进行正式MOS主观评测,然后将MOS与STOI、PESQ做相关性分析。常用的相关系数有皮尔逊相关系数和斯皮尔曼秩相关系数。一般来说,PESQ与MOS的相关性高于STOI与MOS的相关性,因为PESQ侧重感知质量,STOI侧重可懂度。但当语音存在严重背景噪声或混响时,STOI的变化往往更明显。
下表展示了一个假设的对比实验结果,用于说明多指标综合判断的必要性。系统A的PESQ较高但STOI偏低,说明自然度可能不错但某些词的可懂度有损失;系统B反之,听感可能机械但内容清楚。仅看一个指标会得出片面的结论。
| 系统 | MOS(主观) | PESQ | STOI |
|---|---|---|---|
| 基线TTS | 3.2 | 2.85 | 0.86 |
| 改进版TTS A | 3.8 | 3.45 | 0.84 |
| 改进版TTS B | 3.6 | 3.10 | 0.91 |
四、常见误区与选型建议
第一个常见误区是认为MOS分数可以完全被PESQ替代。PESQ虽然经过感知加权,但本质上仍是信号层面的相似度计算,无法捕捉语义是否通顺、韵律是否自然等高层听感。例如一个TTS系统把“银行”读成“银航”,PESQ可能只下降一点点,但人类听音员会明显察觉语义错误并打低分。因此关键版本发布前仍建议做小规模主观评测,客观指标用于大规模回归测试。
第二个误区是盲目追求STOI接近1。STOI衡量的是可懂度,当语音清晰到一定程度后,继续提升可懂度空间有限,对听感自然度的贡献也很小。如果一个TTS系统的STOI已经达到0.95以上,再去优化可懂度收益不大,应该转向韵律、情感表达等影响自然度的维度。类似地,PESQ在4.0以上时提升难度加大,且人耳可能难以区分0.2分的差异。
评估指标的选择应遵循“目的导向”:如果只关心内容能否被听懂,STOI足够;如果关心整体音质和自然度,PESQ更合适;如果最终体验由真实用户决定,MOS仍然是不可替代的参考。
实际工程中建议将三者结合:日常训练迭代时用STOI和PESQ做快速回归,每个里程碑版本再做一次小规模MOS实验(如20人×20条样本),并保留主观与客观分数的对应记录。长期积累下来,可以建立自己业务场景下的指标映射关系,甚至训练一个轻量级的MOS预测模型,用客观特征预测主观分数,进一步提升评估效率。