基于 PyTorch 的多通道音频盲源分离(BSS)与波束成形(BF)算法合集,采用 Hydra 配置管理,面向多通道语音增强研究。
# 可编辑模式安装(推荐研究用)
pip install -e ".[dev]"
# 可选:绘图 & 房间声学模拟
pip install -e ".[research]"# 使用 CLI 入口(推荐)
run-bss audio.input_file=/path/to/input.wav algorithm=ilrma_v2
run-bss audio.input_file=/path/to/input.wav algorithm=five_online output.output_dir=outputs/demo
# 或直接调用脚本
python run_bss.py audio.input_file=/path/to/input.wav algorithm=ilrma_v2python run_bf.py audio.input_file=/path/to/input.wav algorithm=mvdrpython -m pytest test/ -v| 注册名 | 文件 | 在线 | 说明 |
|---|---|---|---|
IVA_NG |
bss/iva/iva_ng.py |
✗ | 自然梯度 IVA(Natural Gradient) |
AUX_IVA_ISS |
bss/iva/aux_iva_iss.py |
✗ | 辅助函数 IVA + 迭代源导向更新(ISS) |
AUX_IVA_ISS_ONLINE |
bss/iva/aux_iva_iss_online.py |
✓ | AUX-IVA-ISS 的在线(逐帧遗忘因子)版本 |
AUX_OVER_IVA |
bss/iva/aux_over_iva.py |
✗ | 过定 IVA,M > K,IP 更新 |
AUX_OVER_IVA_ONLINE |
bss/iva/aux_over_iva_online.py |
✓ | 过定 IVA 在线版 |
FIVE |
bss/iva/five.py |
✗ | 快速独立向量提取(SINR 最大化) |
FIVE_ONLINE |
bss/iva/five_online.py |
✓ | FIVE 在线版(逐帧特征值分解) |
GC_IVE |
bss/iva/gc_ive.py |
✓ | 几何约束独立向量提取,注入空间背景模型 |
| 注册名 | 文件 | 在线 | 说明 |
|---|---|---|---|
ILRMA |
bss/ilrma/ilrma.py |
✗ | 经典 ILRMA(逐源 IP 更新) |
ILRMA_V2 |
bss/ilrma/ilrma_v2.py |
✗ | 向量化批处理版 ILRMA,性能更优 |
ILRMA_SR |
bss/ilrma/ilrma_sr.py |
✗ | 空间正则化 ILRMA,IP 更新中注入 SV 先验 |
ILRMA_REALTIME |
bss/ilrma/ilrma_real_time.py |
✓ | 双速率实时 ILRMA(快通道 32ms / 慢通道 512ms) |
ILRMA_SR_REALTIME |
bss/ilrma/ilrma_sr_real_time.py |
✓ | SR-ILRMA 实时版,双缓冲 + 导向向量正则化 |
ILRMA_NOISY |
bss/ilrma/ilrma_noisy.py |
✗ | 扩散噪声感知 ILRMA(双组分 NMF + GEVD + Wiener) |
ILRMA_NOISY_SR |
bss/ilrma/ilrma_noisy_sr.py |
✗ | NoisyILRMA + SV 正则化(GEVD 前注入先验) |
| 注册名 | 文件 | 在线 | 说明 |
|---|---|---|---|
RCSCME |
bss/rcscme/rcscme.py |
✗ | 秩约束空间协方差矩阵估计,内部调用 ILRMA_V2 后自动选目标源 |
| 注册名 | 文件 | 说明 |
|---|---|---|
MVDR |
bf/mvdr.py |
最小方差无失真响应波束成形,支持多种协方差估计与导向向量估计模式 |
本仓库实现或参考了以下论文:
@inproceedings{ono2011stable,
title={Stable and fast update rules for independent vector analysis
based on auxiliary function technique},
author={Ono, Nobutaka},
booktitle={IEEE Workshop on Applications of Signal Processing to Audio
and Acoustics (WASPAA)},
year={2011}
}@article{scheibler2019overiva,
title={Independent Vector Analysis with more Microphones than Sources},
author={Scheibler, Robin and Ono, Nobutaka},
journal={arXiv:1905.07880},
year={2019}
}@inproceedings{scheibler2020five,
title={Fast Independent Vector Extraction by Iterative {SINR} Maximization},
author={Scheibler, Robin and Ono, Nobutaka},
booktitle={IEEE International Conference on Acoustics, Speech and Signal
Processing (ICASSP)},
year={2020}
}@inproceedings{nishida2020noisyilrma,
title={{NoisyILRMA}: Diffuse-Noise-Aware Independent Low-Rank Matrix Analysis
for Fast Blind Source Extraction},
author={Nishida, Kohei and Takamune, Norihiro and Ikeshita, Rintaro and
Kitamura, Daichi and Saruwatari, Hiroshi and Nakatani, Tomohiro},
booktitle={IEEE International Conference on Acoustics, Speech and Signal
Processing (ICASSP)},
year={2020}
}@inproceedings{hirata2024srilrma,
title={Auxiliary-Function-Based Steering Vector Estimation Method for
Spatially Regularized Independent Low-Rank Matrix Analysis},
author={Hirata, Shoma and others},
booktitle={Asia-Pacific Signal and Information Processing Association
Annual Summit and Conference (APSIPA ASC)},
year={2024}
}@article{nakashima2024realtime,
title={Real-Time Speech Extraction Based on Rank-Constrained Spatial
Covariance Matrix Estimation and Spatially Regularized Independent
Low-Rank Matrix Analysis With Fast Demixing Matrix Estimation},
author={Nakashima, Takuya and Scheibler, Robin and Togami, Masahito and Ono, Nobutaka},
journal={IEEE/ACM Transactions on Audio, Speech, and Language Processing},
year={2024}
}DOI: 10.1109/TASLP.2024.11003054
脚本: scripts/gc_ive_vs_ilrma_sr.py
测试数据: noise8_sec1.wav / noise8_sec4.wav(3 麦克风,含扩散噪声)
评估指标: 噪声抑制量(suppression,dB)与语音相关系数(corr)
| 方案 | sec1 suppression | sec1 corr | sec4 suppression | sec4 corr |
|---|---|---|---|---|
| GC-IVE | +5.0 dB | 0.724 | +4.2 dB | 0.753 |
| SR-ILRMA(sv 选源) | +1.3 dB | 0.874 | +2.2 dB | 0.806 |
| NoisyILRMA(无 SV,floor=0.7) | +7.7 dB | 0.707 | +6.9 dB | 0.755 |
| ILRMA_NOISY_SR | +24.1 dB | 0.096 | +24.2 dB | 0.107 |
结论:
- SR-ILRMA 在语音保真(corr)上最优(≈0.87),噪声抑制相对有限;
- GC-IVE 取得 suppression 与 corr 的均衡折中;
- NoisyILRMA(无 SV,Wiener floor=0.7)噪声抑制最强(≈7 dB),corr 与 GC-IVE 相当;
- ILRMA_NOISY_SR(将 SV 注入 GEVD)在确定型场景(M=N=3)下 Wiener 增益接近 0,语音被过度压制,目前无 Pareto 优势。
详见 docs/noisy_sr_ilrma_analysis.md。
脚本: scripts/mvdr_validation.py
测试框架: test/test_mvdr.py(确定性 oracle steering / EVD steering)、test/test_mvdr_optional_rir.py(pyroomacoustics RIR 模拟,可选)
MVDR 支持以下可互换的研究模式:
| 参数 | 选项 | 说明 |
|---|---|---|
covariance_mode |
rank1_residual |
混合协方差 + 秩-1 分解估计目标/噪声 SCM |
mask_split |
使用 T-F 掩码分别估计目标与噪声 SCM | |
reference_signals |
使用参考信号直接估计目标与噪声 SCM | |
steering_mode |
covariance_evd |
从目标 SCM 主特征向量估计导向向量 |
explicit |
外部提供导向向量(oracle 验证用) |
详见 docs/mvdr_validation.md。
文档: docs/ilrma_sr_realtime_plan.md
验证脚本: scripts/sr_ilrma_realtime_validation.py
ILRMA_SR_REALTIME 采用双速率异步架构:
- 快通道(32ms/帧,lock-free):直接应用当前 W 矩阵分离
- 慢通道(每 512ms 后台线程):在 5s 观测窗上运行 SR-ILRMA(3 次 IP 迭代)更新 W
与 batch SR-ILRMA 的唯一差异是在 IP 内层循环中增加 3 行 SV 正则化;快通道无任何改动,系统延迟保持 32ms。
| 版本 | corr(预期) | 备注 |
|---|---|---|
| Batch SR-ILRMA | 0.87 | 全段离线处理 |
| SR-ILRMA_REALTIME | 0.80–0.85 | 在线版协方差噪声略大,5s 预热 |
脚本: scripts/run_sisec2011_overiva.py
在 SISEC2011 数据集上评估 AUX_OVER_IVA / AUX_OVER_IVA_ONLINE,复现过定盲源分离基准结果(M > K 场景)。
脚本: scripts/gc_ive_noise_validation.py
验证 GC-IVE 在多种背景噪声类型下的导向向量估计(gc_ive_prepare)与分离效果,分析 gamma_bg、bf_forget 等参数的影响。
src/
├── bss/ # 盲源分离核心包
│ ├── base.py # BSSBase(torch.nn.Module, ABC)
│ ├── registry.py # @register_bss 注册器
│ ├── cli.py # Hydra CLI 入口
│ ├── audio.py # STFT & 音频 I/O
│ ├── utils.py # contrast_weights / nmf_update / select_target_index
│ ├── configs/algorithm/ # 算法 Hydra YAML 配置
│ ├── iva/ # IVA 系列(8 个算法)
│ ├── ilrma/ # ILRMA 系列(7 个算法)
│ └── rcscme/ # RCSCME(1 个算法)
├── bf/ # 波束成形核心包
│ ├── base.py # BFBase(torch.nn.Module, ABC)
│ ├── registry.py # @register_bf 注册器
│ ├── cli.py # Hydra CLI 入口
│ ├── mvdr.py # MVDR 波束成形器
│ └── simulation.py # RIR 仿真、验证场景
├── spatial.py # 空间处理工具(协方差、导向向量、EVD)
├── audio.py # 兼容层 → src.bss.audio
└── utils.py # 兼容层 → src.spatial
test/ # pytest 测试(15 个文件)
scripts/ # 验证与对比脚本
docs/ # 算法分析与实验文档
configs/ # 顶层 Hydra 配置
| 场景 | 形状 | 说明 |
|---|---|---|
| 输入混合 STFT | (M, T, F, 2) |
通道 × 时间帧 × 频率 × (实/虚) |
| 输出分离 STFT | (N, T, F, 2) |
源 × 时间帧 × 频率 × (实/虚) |
| 复数转换 | torch.view_as_complex(X) |
最后一维合并为复数 |
STFT 默认参数:n_fft=1024,hop_length=512,sample_rate=16000,窗函数:sqrt(hann)。
所有算法通过装饰器注册,支持统一的元数据查询:
from src.bss.registry import get_bss, get_algorithm_info
# 实例化算法
model = get_bss("ILRMA_V2", n_components=3, n_iter=50)
# 查询元数据(family / is_online / 参数列表)
info = get_algorithm_info("ILRMA_SR")非标准接口(ILRMA_SR、RCSCME)通过 info.is_standard_forward 可显式检测,不再静默视为标准离线分离器。
- 在
src/bss/<family>/下创建文件,继承BSSBase,用@register_bss("NAME")注册; - 在对应
__init__.py中导入; - 在
src/bss/configs/algorithm/下添加 YAML; - 在
test/下添加形状与数值有限性测试。
同理,继承 BFBase,用 @register_bf("NAME") 注册,配置放 src/bf/configs/algorithm/。
| 类别 | 包 |
|---|---|
| 核心 | torch >= 2.0、torchaudio、numpy、scipy、soundfile、soxr、hydra-core、omegaconf |
| 开发 | pytest、pytest-cov |
| 研究(可选) | matplotlib、pyroomacoustics |