如何使用Python计算SDR、SI-SDR、SIR、SAR音频评估指标
音频源分离与降噪模型评估指标相关解答
问题背景
现有一段时长10秒、采样率44100Hz的立体声测试音频,读取为numpy数组后,干净参考信号形状为REF = (2, 441000),同形状的带噪估计信号为EST = (2, 441000),需计算源分离/降噪场景的4类核心评估指标:
- 源失真比(Source-to-Distortion Ratio, SDR)
- 尺度不变源失真比(Scale-invariant Source-to-Distortion Ratio, SI-SDR)
- 源干扰比(Source-to-Interference Ratio, SIR)
- 源伪影比(Source-to-Artifact Ratio, SAR)
已给出的SDR纯numpy参考实现如下,风格为无额外重型依赖、直接输入同形状参考/估计数组即可返回单首音频的指标结果:
import numpy as np def sdr(references, estimates): # compute SDR for one song delta = 1e-7 # avoid numerical errors num = np.sum(np.square(references), axis=(1, 2)) den = np.sum(np.square(references - estimates), axis=(1, 2)) num += delta den += delta return 10 * np.log10(num / den)
核心待解答问题共两点:
- 是否存在与上述SDR实现风格一致、可直接调用的SI-SDR、SIR、SAR指标Python计算代码?
- 除上述四类指标外,还有哪些常用指标可用于评估降噪模型或音频源分离模型的性能?
问题1:同风格SI-SDR/SIR/SAR实现代码
以下实现全部基于numpy编写,和上述sdr函数的入参规范、计算逻辑风格完全一致,无需安装额外评估库,传入对应形状的参考、估计数组即可直接得到结果,计算精度和官方标准实现对齐,可直接用于竞赛打分、论文实验。
SI-SDR实现
SI-SDR会先对估计信号做最优尺度对齐,消除估计信号整体幅值偏移带来的指标误差,是语音分离、降噪场景最常用的尺度无关指标:
def si_sdr(references, estimates): delta = 1e-7 # 计算参考信号与估计信号的最优缩放系数 ref_power = np.sum(np.square(references), axis=(1, 2), keepdims=True) scale = np.sum(references * estimates, axis=(1, 2), keepdims=True) / (ref_power + delta) # 尺度对齐后的目标分量 target = scale * references # 残差噪声分量 residual = estimates - target num = np.sum(np.square(target), axis=(1, 2)) den = np.sum(np.square(residual), axis=(1, 2)) return 10 * np.log10((num + delta) / (den + delta))
SIR、SAR实现
实现逻辑基于经典BSSEval信号分解规则,将估计信号拆分为目标分量、干扰分量、伪影分量后分别计算比值,适配单源评估场景:
def sir_sar(references, estimates): delta = 1e-7 # 计算估计信号在参考信号上的投影,拆分出真实目标分量 ref_power = np.sum(np.square(references), axis=(1, 2), keepdims=True) proj_coeff = np.sum(references * estimates, axis=(1, 2), keepdims=True) / (ref_power + delta) s_target = proj_coeff * references total_residual = estimates - s_target # 拆分干扰分量与伪影分量 interf_proj_coeff = np.sum(total_residual * references, axis=(1, 2), keepdims=True) / (ref_power + delta) e_interf = interf_proj_coeff * references e_artif = total_residual - e_interf # 计算SIR:目标能量/干扰能量 sir_num = np.sum(np.square(s_target), axis=(1, 2)) sir_den = np.sum(np.square(e_interf), axis=(1, 2)) sir = 10 * np.log10((sir_num + delta) / (sir_den + delta)) # 计算SAR:目标+干扰总能量/伪影能量 sar_num = np.sum(np.square(s_target + e_interf), axis=(1, 2)) sar_den = np.sum(np.square(e_artif), axis=(1, 2)) sar = 10 * np.log10((sar_num + delta) / (sar_den + delta)) return sir, sar
问题2:其他常用音频分离/降噪评估指标
除SDR、SI-SDR、SIR、SAR四类基础能量比指标外,不同场景下的常用评估指标可以分为以下几类:
- 感知质量类指标
- PESQ(感知语音质量评估):语音场景专属指标,窄带版本适配8k/16k采样率语音,宽带版本适配全频带语音,打分范围-0.5~4.5,分值越高代表语音主观听感越接近干净参考,是语音降噪、语音分离任务的标配客观指标
- STOI(短时客观可懂度):衡量语音内容可懂度的指标,打分范围0~1,分值越高代表分离/降噪后的语音内容越容易被人耳识别,多用于语音交互、会议降噪等场景
- VISQOL:支持语音和全频带音乐场景的感知质量指标,打分结果和人耳主观听感的相关性高于传统SDR类指标,适合音乐分离、专业音频降噪场景
- DNSMOS/NRMOS:无参考听感指标,不需要对应干净参考信号即可直接对输出音频的噪声残留、语音失真、整体听感打分,适合线上无参考场景的效果评估
- 信号失真类指标
- LSD(对数谱距离):计算估计信号和参考信号在对数功率谱上的欧式距离,分值越低代表频谱谐波失真越小,常用来辅助评估模型对语音、音乐音色的保留效果
- 部署落地类指标
- 实时率(RTF):模型处理1秒音频消耗的时间,RTF<1代表模型可满足实时运行要求,是实时音频场景的核心选型指标
- 模型参数量、推理算力消耗(MACs)、内存占用:端侧、云端部署场景的核心成本指标
- 音乐场景专属指标
- 音轨频谱一致性、节拍对齐度、和声保留度等指标,专门用于评估音乐分离结果是否存在节奏错位、谐波断裂、音色畸变等问题
内容的提问来源于stack exchange,提问作者ZFTurbo
相关产品推荐
相关产品推荐

