Skip to content

Repository files navigation

BSS — 盲源分离与波束成形研究仓库

基于 PyTorch 的多通道音频盲源分离(BSS)与波束成形(BF)算法合集,采用 Hydra 配置管理,面向多通道语音增强研究。

目录


快速开始

安装

# 可编辑模式安装(推荐研究用)
pip install -e ".[dev]"

# 可选:绘图 & 房间声学模拟
pip install -e ".[research]"

运行 BSS

# 使用 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_v2

运行波束成形

python run_bf.py audio.input_file=/path/to/input.wav algorithm=mvdr

运行测试

python -m pytest test/ -v

算法清单

BSS 算法

IVA 系列

注册名 文件 在线 说明
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 系列

注册名 文件 在线 说明
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

注册名 文件 在线 说明
RCSCME bss/rcscme/rcscme.py 秩约束空间协方差矩阵估计,内部调用 ILRMA_V2 后自动选目标源

BF 算法

注册名 文件 说明
MVDR bf/mvdr.py 最小方差无失真响应波束成形,支持多种协方差估计与导向向量估计模式

论文引用

本仓库实现或参考了以下论文:

IVA / AuxIVA

@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}
}

OverIVA(过定 IVA)

@article{scheibler2019overiva,
  title={Independent Vector Analysis with more Microphones than Sources},
  author={Scheibler, Robin and Ono, Nobutaka},
  journal={arXiv:1905.07880},
  year={2019}
}

FIVE(快速独立向量提取)

@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}
}

NoisyILRMA(扩散噪声感知 ILRMA)

@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}
}

SR-ILRMA(空间正则化 ILRMA)

@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}
}

实时语音提取(RCSCME + SR-ILRMA 实时化)

@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


实验与验证

1. GC-IVE vs SR-ILRMA 对比实验

脚本: 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


2. MVDR 波束成形验证

脚本: 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


3. SR-ILRMA 实时化可行性分析

文档: 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 预热

4. SISEC2011 OverIVA 基准测试

脚本: scripts/run_sisec2011_overiva.py

在 SISEC2011 数据集上评估 AUX_OVER_IVA / AUX_OVER_IVA_ONLINE,复现过定盲源分离基准结果(M > K 场景)。


5. GC-IVE 噪声场景验证

脚本: scripts/gc_ive_noise_validation.py

验证 GC-IVE 在多种背景噪声类型下的导向向量估计(gc_ive_prepare)与分离效果,分析 gamma_bgbf_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=1024hop_length=512sample_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_SRRCSCME)通过 info.is_standard_forward 可显式检测,不再静默视为标准离线分离器。


扩展指南

添加新 BSS 算法

  1. src/bss/<family>/ 下创建文件,继承 BSSBase,用 @register_bss("NAME") 注册;
  2. 在对应 __init__.py 中导入;
  3. src/bss/configs/algorithm/ 下添加 YAML;
  4. test/ 下添加形状与数值有限性测试。

添加新 BF 算法

同理,继承 BFBase,用 @register_bf("NAME") 注册,配置放 src/bf/configs/algorithm/


依赖

类别
核心 torch >= 2.0torchaudionumpyscipysoundfilesoxrhydra-coreomegaconf
开发 pytestpytest-cov
研究(可选) matplotlibpyroomacoustics

About

implement of bss, iva, bse, ilrma for learning purpose

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages