You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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)

核心待解答问题共两点:

  1. 是否存在与上述SDR实现风格一致、可直接调用的SI-SDR、SIR、SAR指标Python计算代码?
  2. 除上述四类指标外,还有哪些常用指标可用于评估降噪模型或音频源分离模型的性能?

问题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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:15:31