第一个是主观评价指标,后面几个是客观评价指标
1.MOS (Mean Opinion Score, 平均意见得分)
- 评价方法
MOS 是一种主观评估方法,通过让一组听众对合成的语音质量进行评分来衡量语音的自然度或质量。评分通常在 1 到 5 的范围内,1 表示“非常差”,5 表示“非常好”。
使用方法: 听众会根据语音的自然度、清晰度、情感表达等进行评分,最终通过平均听众的评分得到该语音的 MOS 值。
- 置信区间
由于不同听众的评分可能会有所不同,因此 MOS 通常会附带一个置信区间,通过得分样本的均值,方差,分别临界值(通常为95%的临界值)来计算。
区间表示在 95% 的情况下,真实的平均分会落在该区间内。置信区间越小,说明听众的评分越一致;置信区间越大,说明评分差异较大。
- CMOS
COMS (Comparative Mean Opinion Score)是直接让听众比较, 并给予评分,因此是一个相对评分, 如下:
-3: A 比 B 差很多
-2: A 比 B 差一些
-1: A 比 B 略差
0: A 和 B 差不多
+1: A 比 B 略好
+2: A 比 B 好一些
+3: A 比 B 好很多
CMOS 主要用于评估多个语音系统之间的相对质量,尤其是在研究不同模型、算法或数据集对语音合成效果的影响时。由于 CMOS 是一种比较性的评价方式,它可以更清楚地揭示不同系统之间的细微差异。
总结:
CMOS 是通过让听众比较两段语音,给出相对评分的主观评估方法。
它不同于 MOS 的绝对评分,更注重对比不同系统生成的语音质量。
2. MCD (Mel Cepstral Distortion, 梅尔倒谱差异)
MCD单位为dB, 计算公式如下:
MCD = 10 ln ( 10 ) 2 ∑ t = 1 T ( c t ( ref ) − c t ( syn ) ) 2 \text{MCD} = \frac{10}{\ln(10)} \sqrt{2 \sum_{t=1}^{T} \left( c_t^{(\text{ref})} - c_t^{(\text{syn})} \right)^2} MCD=ln(10)102∑t=1T(ct(ref)−ct(syn))2
c t ( ref ) c_t^{(\text{ref})} ct(ref) : 参考语音的第t个梅尔倒频系数
c t ( syn ) c_t^{(\text{syn})} ct(syn) : 合成语音的第t个梅尔倒频系数
T T T: 倒谱系数的维度, 一般为13 或 25, 维度越大细节特征越多
3. TTS 字词错误率
- 编辑距离
编辑距离指通过插入、删除或替换字符来使生成文本与参考文本匹配所需要的最小操作数(通常使用 Levenshtein 距离计算
-
词错误率(Word Error Rate, WER)
WER = 编辑距离 / 单词总数
-
字符错误率(Character Error Rate, CER)
CER = 编辑距离 / 字符数
4.STOI
Short-Time Objective Intelligibility (STOI) 是一种用于评估语音信号可懂度的客观评价指标,适用于语音增强、去噪等任务。
STOI 的设计初衷是模拟人类在听觉上对语音可懂度的感知,通常用于对比增强语音和原始干净语音之间的差异。
STOI 通过计算输入的干净语音和失真语音(例如经过噪声、增强或变换后的语音信号)之间的相似度来评估语音信号的可懂度。它的主要流程可以归纳如下:
- 将语音信号划分为短时帧(通常是 20ms 长)。
- 对每个帧进行短时傅里叶变换 (STFT) 并提取出频谱。
- 通过频带加权,对干净语音和失真语音之间的差异进行分析。
- 计算每个帧的对数相似度,得出 STOI 分数。
STOI 的输出是一个介于 0 到 1 之间的分数,数值越高表示语音可懂度越好,越接近 1 表示信号与参考信号的相似性越高。
import numpy as np from scipy.io import wavfile from pystoi import stoi # 加载干净语音和失真语音
fs_clean, clean_speech = wavfile.read("clean_speech.wav")
fs_noisy, noisy_speech = wavfile.read("noisy_speech.wav") # 确保采样率相同
assert fs_clean == fs_noisy, "Sampling rates do not match!" # 计算 STOI 分数
stoi_score = stoi(clean_speech, noisy_speech, fs_clean, extended=False) print(f'STOI Score: {stoi_score:.4f}')
注:extended=True:是使用扩展的 STOI 计算方法(ESTOI),一种更加准确的STOI评估方法。
5.PESQ
Perceptual Evaluation of Speech Quality (PESQ) 是一种用于客观评估语音质量的标准化指标。它最初由 ITU-T(国际电信联盟-电信标准化部门)在 P.862 建议书中提出,用于评估通信系统中的语音质量。PESQ 被广泛用于语音编解码器、语音增强、去噪等语音处理技术的质量评估。
PESQ 是一种基于感知模型的质量评估算法,它通过模拟人耳对语音失真的感知能力来评估语音的质量。PESQ将参考语音信号(干净的原始语音)与失真语音信号(例如经过编码、传输、增强或去噪后的语音)进行对比,生成一个质量分数,通常在 -0.5 到 4.5 之间, 值越高越接近无损。
步骤:
- 将语音信号划分为短时帧。
- 模拟人类听觉系统处理语音信号的方式,提取出感知特征。
- 通过计算参考信号和失真信号之间的感知差异,给出一个量化的 PESQ 分数。
import numpy as np
from scipy.io import wavfile
from pesq import pesq
from pesq import PesqError # 加载干净语音和失真语音
fs_clean, clean_speech = wavfile.read("clean_speech.wav")
fs_noisy, noisy_speech = wavfile.read("noisy_speech.wav") # PESQ 算法支持的采样率为 8000 或 16000 Hz,确保采样率一致
if fs_clean != fs_noisy: raise ValueError("Sampling rates do not match!")
if fs_clean not in [8000, 16000]: raise ValueError("PESQ only supports 8000 Hz or 16000 Hz") # 计算 PESQ 分数 try: pesq_score = pesq(fs_clean, clean_speech, noisy_speech, 'wb') # 'wb' for wide-band (16000 Hz), 'nb' for narrow-band (8000 Hz) print(f'PESQ Score: {pesq_score:.4f}')
except PesqError as e: print(f'Error calculating PESQ: {e}')
-
读取语音信号: 使用 scipy.io.wavfile.read 读取干净的语音文件和失真的语音文件。
-
确保采样率一致: PESQ 只支持两种采样率:8000 Hz (窄带) 和 16000 Hz (宽带),因此需要确保两种语音信号的采样率相同并且符合 PESQ 支持的采样率。
-
计算 PESQ: 调用 pesq 函数传入采样率、干净语音和失真语音,并选择 wb 或 nb 模式来指示是宽带(16kHz)还是窄带(8kHz)计算。返回的 pesq_score 是 PESQ 分数。