音频评价指标

第一个是主观评价指标,后面几个是客观评价指标

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)102t=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 分数。

### 信噪比的定义 信噪比(Signal-to-Noise Ratio, SNR)是一种衡量信号质量和噪声干扰程度的重要指标。它表示有用信号功率与噪声功率之间的比例关系,通常用于评估通信系统、音频设备以及图像处理中的信号质量[^1]。 --- ### 信噪比的计算方法 信噪比的具体计算方式取决于所处的应用领域和具体的信号形式。一般情况下,SNR 的计算公式如下: 对于连续时间信号: \[ SNR = \frac{P_{signal}}{P_{noise}} \] 其中 \( P_{signal} \) 是信号功率,\( P_{noise} \) 是噪声功率。 在离散域中,如果已知信号样本 \( s[n] \) 和噪声样本 \( n[n] \),则可以通过以下公式计算: \[ SNR = 10 \cdot \log_{10}\left(\frac{\sum_{n=1}^{N}s[n]^2}{\sum_{n=1}^{N}n[n]^2}\right) \] 当只有原始信号 \( x[n] \) 和含噪信号 \( y[n] \) 可用时,可通过估计噪声成分来间接求解: \[ n[n] = y[n] - x[n] \] 上述公式的单位通常是分贝 (dB)。 --- ### 信噪比的应用场景 #### 1. **通信系统** 在无线通信和有线传输中,信噪比被广泛用来描述接收端接收到的有效信号强度相对于背景噪声的比例。较高的 SNR 值意味着更清晰的语音通话或更高的数据传输速率。 #### 2. **音频处理** 音频设备如麦克风、扬声器等常用 SNR 来量化其性能表现。高 SNR 表明设备能够提供更加纯净的声音体验,减少杂音影响。 #### 3. **图像处理** 在计算机视觉领域,特别是涉及图像增强的任务中,SNR 被视为一种重要的评价标准之一。通过比较原图与去噪后的图片之间差异大小,可以判断某种特定算法的效果优劣[^2]。 --- ### 示例代码:Python 实现简单 SNR 计算 以下是利用 Python 编写的一个基本函数,用于计算两个数组间的信噪比值。 ```python import numpy as np def calculate_snr(signal, noise): """ Calculate Signal to Noise Ratio (SNR). Parameters: signal (numpy.ndarray): Original clean signal. noise (numpy.ndarray): Noise component. Returns: float: SNR value in dB. """ psignal = np.sum(np.power(signal, 2)) pnoise = np.sum(np.power(noise, 2)) snr_db = 10 * np.log10(psignal / pnoise) return snr_db # Example usage if __name__ == "__main__": original_signal = np.array([1, 2, 3, 4]) noisy_signal = np.array([1.1, 2.2, 3.3, 4.4]) estimated_noise = noisy_signal - original_signal result = calculate_snr(original_signal, estimated_noise) print(f"Calculated SNR: {result:.2f} dB") ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值