音源分离与音乐信息检索

音源分离要从混合音频中还原各个独立声源。本文讲清盲源分离与 ICA 的假设与局限、理想掩码到软掩码的演进、Conv-TasNet 时域分离与 Demucs 频域分离的结构差异、歌声提取与乐器分离的工程做法、SDR 与 SIR、SAR 的评估口径,以及音乐信息检索中的节拍与和弦识别与实时性约束。

引言

音源分离(Source Separation)的目标是从一段混合音频中还原出各个独立声源:把一首歌拆成人声、鼓、贝斯、其他乐器;从多人对话中提取某个说话人;从现场录音中分离出单个乐器。它是音乐制作、语音识别、听力辅助、版权检测的共同基础设施。

工程上的核心矛盾是信息不足与算力受限。混合是「多对一」的,理论上无解——一个通道的观测无法唯一确定两个源。所有分离算法都必须引入先验假设:ICA 假设源统计独立,掩码方法假设源在时频域可分,神经方法假设训练分布覆盖测试分布。假设越强,适用范围越窄。

本文按「经典 → 掩码 → 深度 → 评估 → 应用」的顺序组织。频谱分析的数学基础不在本篇——STFT、窗函数、相位重建见 audio-spectral-analysis-fft ;语音场景的阵列与去噪见语音增强篇。本篇聚焦音乐与通用音频的分离,以及分离之上的音乐信息检索(MIR)。

目录

  1. 问题定义:分离与检索
  2. 盲源分离与 ICA
  3. 频谱掩码:从 IBM 到 IRM
  4. 时域分离:Conv-TasNet
  5. 频域深度分离:Demucs 与 U-Net
  6. 歌声提取与乐器分离
  7. 评估指标:SDR、SIR、SAR
  8. 音乐信息检索(MIR)任务
  9. 实时性与工程约束

1. 问题定义:分离与检索

1.1 分离的数学形式

观测:x(t) = Σᵢ sᵢ(t)          (单通道混合)
       x(t) = A · s(t)          (多通道瞬时混合)
       x(t) = Σᵢ hᵢ(t) * sᵢ(t)  (卷积混合,含混响)

目标:从 x 恢复 sᵢ。单通道下 A 是 1×N 的欠定系统,无唯一解——这是所有困难的根本来源。

1.2 分离 vs 检索

  • 分离(Separation):输出各个源的波形。
  • 检索(MIR, Music Information Retrieval):输出结构化信息——节拍、调性、和弦、结构、乐器标签。

两者互补:分离为检索提供干净的输入,检索的先验(如节拍网格)又能约束分离。工业界的音乐分析流水线通常两者并用。

1.3 任务的难度分级

2 源分离(人声 + 伴奏):最成熟,商业可用
4 源分离(人声/鼓/贝斯/其他):Demucs 已达实用
N 源分离(任意乐器):仍是研究问题

2. 盲源分离与 ICA

**盲源分离(BSS)**指在不知道混合方式的前提下分离源。**独立成分分析(ICA)**是经典方法。

2.1 ICA 的核心假设

1. 源之间统计独立
2. 源是非高斯分布(高斯源的 ICA 不可辨识)
3. 混合是瞬时线性的(无卷积)
4. 观测通道数 ≥ 源数(超定)

2.2 算法流程

import numpy as np

def ica_separate(X, iterations=200, lr=0.01):
    """X: (M, N) 观测,返回 (M, N) 估计源(FastICA 的简化版)"""
    M, N = X.shape
    # 1. 中心化
    X = X - X.mean(axis=1, keepdims=True)
    # 2. 白化(去相关 + 单位方差)
    cov = X @ X.T / N
    d, E = np.linalg.eigh(cov)
    W_white = np.diag(1.0 / np.sqrt(d)) @ E.T
    Z = W_white @ X
    # 3. 迭代估计解混矩阵(最大化非高斯性,用负熵近似)
    W = np.eye(M)
    for _ in range(iterations):
        W = W + lr * (np.eye(M) - np.tanh(Z.T @ W.T).T @ np.tanh(Z.T @ W.T) / N) @ W
        # 正交化
        U, _, Vt = np.linalg.svd(W)
        W = U @ Vt
    return W @ Z

2.3 ICA 的局限

- 只能处理瞬时混合,真实房间是卷积混合(需扩展为频域 ICA)
- 频域 ICA 有排列歧义(各频点独立解混,源顺序不一致,需靠相邻频点连续性对齐)
- 幅度歧义(解混矩阵的缩放不确定)
- 对高斯源、相关源失效

ICA 在现代音乐分离中已基本被深度方法取代,但仍是理解分离问题的必修课,也是无监督场景(无训练数据)下少数可用的方法。

3. 频谱掩码:从 IBM 到 IRM

掩码方法假设「在时频域,每个时频点主要由一个源主导」。这是深度分离的基础。

3.1 理想二值掩码(IBM)

IBM(t,f) = 1  若 |S_target(t,f)| > |S_interf(t,f)|
           0  否则

IBM 是上界参考——它需要知道干净源(只有评估时才有)。IBM 下的分离质量很高,说明「时频稀疏性」假设在音乐上大致成立。

3.2 理想比率掩码(IRM)

IRM(t,f) = |S_target| / (|S_target| + |S_interf|)      (幅度域)
IRM(t,f) = |S_target|² / (|S_target|² + |S_interf|²)   (功率域,更常用)

IRM 是软掩码,保留部分能量,听感比 IBM 更自然(IBM 的硬切换会产生「水声」伪影)。

3.3 掩码的估计

实际中用神经网络从混合谱估计掩码:

# 训练目标:网络输出 M(t,f) ≈ IRM(t,f)
# 损失:MSE 或 源域 SI-SDR(后者更直接优化分离质量)
def estimate_mask(mixture_spec, model):
    mask = model(mixture_spec)          # (F, T, sources)
    estimates = mask * mixture_spec[..., None]
    return estimates

3.4 相位问题

掩码只作用于幅度,相位沿用混合相位。这是掩码方法的根本缺陷:当两个源在某时频点能量接近时,混合相位与目标源相位差异大,重构失真明显。

改进方向:复数掩码(同时估计幅度与相位)、相位重建(用 Griffin-Lim 或神经相位估计)。后者在音乐分离中已被证明能显著提升质量。

4. 时域分离:Conv-TasNet

Conv-TasNet 直接在时域做分离,绕过 STFT 的相位问题。

4.1 结构

波形 ──▶ 编码器(1D 卷积,学出「基函数」)──▶ 分离网络 ──▶ 掩码 ──▶ 解码器(转置卷积)──▶ 各源波形
import torch, torch.nn as nn

class ConvTasNet(nn.Module):
    def __init__(self, N=512, L=16, B=256, H=512, X=8, R=3, C=2):
        super().__init__()
        # 编码器:把波形映射到 N 维表示
        self.encoder = nn.Conv1d(1, N, L, stride=L // 2, bias=False)
        # 分离网络:1x1 卷积 + 深度可分离卷积块(TCN)
        self.sep = SeparationNet(N, B, H, X, R, C)
        self.decoder = nn.ConvTranspose1d(N, C, L, stride=L // 2, bias=False)

    def forward(self, x):
        w = self.encoder(x)                     # (B, N, T)
        m = self.sep(w)                         # (B, C, N, T)
        return self.decoder(w.unsqueeze(1) * m) # (B, C, T)

4.2 与 STFT 的对比

维度STFT + 掩码Conv-TasNet
变换固定(DFT)学习(1D 卷积)
相位沿用混合相位隐式建模
延迟帧长相关编码器核长相关
参数量中等较小
可解释性高(频谱可见)低

Conv-TasNet 的编码器相当于学出来的滤波器组,比固定 DFT 更贴合语音与音乐的结构。

4.3 延迟问题

Conv-TasNet 是非因果的(TCN 用了双向信息),实时实现需要改成因果并接受质量下降。实时版通常限制感受野、减少层数,或改用流式结构。

5. 频域深度分离:Demucs 与 U-Net

Demucs 是当前音乐分离的事实标准(v4 版本 4 源分离的 SDR 已超过 9 dB)。

5.1 Demucs 的核心思想

1. 波形域与频谱域混合建模(hybrid transformer 版本)
2. U-Net 结构 + 双向 LSTM 建模长程依赖
3. 多源输出(人声/鼓/贝斯/其他),端到端训练
# Demucs v4 (HT Demucs) 的推理接口(示意)
import demucs.api
separator = demucs.api.Separator(model="htdemucs")
origin, separated = separator.separate_audio_file("song.mp3")
# separated: {"drums": tensor, "bass": ..., "other": ..., "vocals": ...}

5.2 U-Net 的编码器-解码器

U-Net 用下采样-上采样 + 跳跃连接,兼顾全局上下文与局部细节。对分离任务,下采样捕捉乐器的整体包络,跳跃连接保留瞬态细节(鼓的打击)。

输入谱 ──▶ 编码器(下采样 4~6 层)──▶ 瓶颈 ──▶ 解码器(上采样)──▶ 各源掩码
                 │                              ▲
                 └────────── 跳跃连接 ──────────┘

5.3 混合域建模

纯频域方法在相位上吃亏,纯时域方法在长程建模上吃亏。**HT Demucs(Hybrid Transformer)**同时用波形分支与频谱分支,在两者上做分离再融合,这是当前最优的架构。

6. 歌声提取与乐器分离

6.1 歌声提取(Vocal Extraction)

歌声提取是最成熟、商业价值最高的分离任务(卡拉 OK、翻唱、采样)。

专门的数据集:MUSDB18、MUSDB18-HQ、MedleyDB、iKala
主流模型:Demucs htdemucs、Spleeter(4 源)、MDX-Net 系列

工程要点:

  • 人声与伴奏的频谱重叠严重(人声基频常落在伴奏的谐波上),分离质量天生受限。
  • **清音(sibilant)**在 4~10 kHz,与镲片重叠,是残留伪影的重灾区。
  • 单声道 vs 立体声:立体声信息(人声通常居中)可显著提升分离质量。

6.2 乐器分离

鼓:瞬态为主,频谱宽,分离相对容易
贝斯:低频集中,与人声、吉他低频重叠
钢琴/吉他:谐波丰富,与多个乐器重叠,最难

6.3 分离的用途

音乐制作:提取采样、remix、伴奏制作
版权检测:旋律与和弦指纹
听力辅助:突出人声(助听器)
语音识别:先分离再识别(鸡尾酒会问题)

7. 评估指标:SDR、SIR、SAR

BSS Eval 是分离评估的标准工具,把误差分解成三个分量。

s_target  目标源的投影(希望保留的)
e_interf  其他源的干扰(希望抑制的)
e_noise   算法引入的伪影(希望最小)

SDR = 10·log10( ‖s_target‖² / ‖e_interf + e_noise‖² )   总质量
SIR = 10·log10( ‖s_target‖² / ‖e_interf‖² )              干扰抑制
SAR = 10·log10( ‖s_target + e_interf‖² / ‖e_noise‖² )    伪影抑制
import museval   # 或 nussl

scores = museval.evaluate(references, estimates, win=1.0, hop=0.5)
# 输出 (SDR, ISR, SIR, SAR),形状 (nsrc, nframes)

7.1 指标的口径陷阱

1. 必须逐源报告,不能用平均值掩盖某个源极差
2. 窗长与 hop 要固定(win=1s, hop=0.5s 是惯例)
3. 允许尺度缩放(scale-invariant)——SI-SDR 是常用变体
4. 前 1 秒常因算法未收敛而极差,评估时通常剔除

7.2 SI-SDR 与感知质量

SDR 是能量指标,与人耳感知不完全一致。工程上必须同时看客观指标与主观听感,方法见 audio-quality-testing 。

8. 音乐信息检索(MIR)任务

分离之上的结构化分析,统称 MIR。

8.1 节拍与速度

BPM 估计:自相关 / 梳状滤波 / 神经节拍跟踪
拍点检测:起始点(onset)检测 + 节拍网格对齐
难点:变速、自由节奏、弱拍起
import librosa

y, sr = librosa.load("song.mp3")
tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
onset_env = librosa.onset.onset_strength(y=y, sr=sr)

8.2 和弦与调性

流程:色度特征(chroma)提取 → 和弦模板匹配 / HMM / 神经分类
特征:12 维色度向量(每个音级一个 bin)
评估:和弦序列准确率(需对齐的标注)

8.3 结构分析

音乐结构:前奏/主歌/副歌/桥段的分段
方法:自相似矩阵(SSM)+ 新颖度曲线

8.4 与深度学习的结合

现代 MIR 大量使用序列模型与 Transformer。相关的模型架构、预训练与部署见 llm 专题中的序列建模部分。MIR 的一个特殊挑战是标注数据稀缺——音乐有版权,公开标注数据集远少于语音与图像。

9. 实时性与工程约束

9.1 分离的延迟

离线分离:整首歌一次处理,可用非因果模型(Demucs 默认)
实时分离:需要因果模型 + 分块处理
  块大小 0.5~2 s(非因果模型无法真正实时)
  真正的低延迟分离(< 100 ms)目前质量明显低于离线

9.2 算力预算

Demucs htdemucs 离线:一首 4 分钟歌约 10~60 s(GPU 更快)
实时分离(实时因子 < 1):需要模型压缩、量化、剪枝
  典型手段:INT8 量化(体积减 4 倍,速度提升 2~3 倍)

9.3 浏览器端

Web Audio 与 WASM 让浏览器可以做轻量分离。用 AudioWorklet 接收音频、WASM 跑模型推理、再送回音频图。算力与内存受限,通常只能跑极小的模型。实现参考 audio-worklet-realtime 。

9.4 分离与编码的交互

分离后的源如果还要压缩传输,编码器(Opus/AAC)的感知模型会影响最终质量。分离伪影在低码率下会被放大——这是「先分离后编码」流水线的隐藏成本。

权衡取舍

维度方案 A方案 B建议
方法ICA(无监督)深度分离(监督)有训练数据用深度,无数据用 ICA
变换域STFT 掩码时域(TasNet)音乐用混合域,语音可时域
掩码幅度掩码复数掩码低信噪比重叠多用复数掩码
模型Conv-TasNet(轻)Demucs(重)实时用轻量,离线用 Demucs
源数2 源(人声/伴奏)4 源(多乐器)卡拉 OK 用 2 源,制作 4 源
评估SDR(能量)主观 MOS必须两者结合
实时分块(有延迟)离线(高质量)交互用分块,生产用离线

常见坑清单

  1. 期待单通道完美分离:欠定问题无唯一解,重叠严重的源必然有残留,需管理预期。
  2. 忽略相位问题:只用幅度掩码在重叠段失真明显,应上复数掩码或相位重建。
  3. ICA 用于卷积混响:瞬时 ICA 不适用,需频域 ICA 且要处理排列歧义。
  4. 评估用整段 SDR 平均:掩盖了某源的极差表现,必须逐源逐窗报告。
  5. 不剔除前 1 秒:算法未收敛导致 SDR 极低,评估惯例是剔除起始段。
  6. 分离后直接低码率编码:伪影被感知编码放大,需先评估再编码。
  7. 非因果模型用于实时:Demucs 默认双向,实时需改因果并接受质量下降。
  8. 训练数据与测试分布不符:真实录音与仿真混合的域差距会让指标虚高。
  9. 立体声信息未利用:人声居中的先验在立体声下能显著提升质量,别只用单声道。
  10. 只看客观指标:SDR 高但听感差的例子很多,必须结合主观试听。

小结

音源分离是先验假设 + 数据驱动的工程。ICA 提供了「独立源可分离」的理论起点,掩码方法把问题转成时频域的逐点分类,深度方法则用学出来的变换与长程建模把质量推到实用。当前 2~4 源的音乐分离已达到商业可用,任意源数仍是开放问题。

实践上,最值得投入的是:高质量的分离模型(Demucs 级)、相位重建(重叠段的失真来源)、以及与下游任务的联合优化(编码、识别、MIR)。分离不是终点,而是音乐分析流水线的一环。

继续深入建议读 audio-spectral-analysis-fft 补齐 STFT 与相位重建的数学,读 audio-quality-testing 掌握客观与主观质量评估的完整方法,读 llm 了解序列建模与模型压缩的通用技术。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「音频工程」更多文章

  1. 音视频同步与时间码
  2. 音频硬件接口与驱动栈
  3. 响度标准化与交付规范