本项目实现了一个两阶段声学回声消除系统,结合了传统的线性滤波算法(时延补偿与加权递归最小二乘法,TDC-wRLS)和深度学习方法(U-Net神经网络)来更有效地消除音频信号中的回声。
在远程通信系统(如视频会议、语音通话等)中,回声是一个常见问题,它会导致通信质量下降。本项目旨在构建一个高效的回声消除系统:
- 第一阶段:使用时延补偿与加权递归最小二乘法(TDC-wRLS)进行线性滤波,消除大部分线性回声
- 第二阶段:使用U-Net神经网络处理线性滤波后的信号,进一步消除非线性回声
本项目使用AEC-Challenge数据集,请从以下地址下载:
注意:如果下载的音频文件为空,可以采用GitHub Desktop进行下载。
下载AEC-Challenge数据集,将/datasets/synthetic路径下的数据放置到项目对应目录。
使用resample_audiov2.py脚本对原始数据进行重采样,完成数据规整:
python resample_audiov2.py --input_dir /datasets/synthetic --output_dir data/resampled运行preprocess_datav2.py脚本,采用TDC和线性滤波得到经过线性滤波的数据:
python preprocess_datav2.py --input_dir data/resampled --output_dir data/preprocessed数据集位于data/preprocessed目录下,按以下结构组织:
farend/: 远端参考信号,命名格式为f{编号:05d}.wavmic/: 麦克风录制的混合信号,命名格式为f{编号:05d}.waverror/: 线性滤波后的信号,命名格式为f{编号:05d}.wavnearend/: 近端的信号,命名格式为f{编号:05d}.wav
本项目的依赖库如下:
librosa==0.10.1
soundfile==0.12.1
tqdm==4.66.1
numpy==1.24.3
torch==2.0.1
matplotlib==3.7.1
pesq==0.0.3
pystoi==0.3.3
onnx==1.15.0
onnxsim==8.0.3
netron==7.6.2
thop==0.1.1-2209072238
torchsummary==1.5.1
通过以下命令安装依赖:
pip install -r requirements.txt线性滤波阶段使用时延补偿(TDC)和加权递归最小二乘法(wRLS)来消除线性回声。
- 时延估计:估计远端信号到近端信号的时延
- 时延补偿:根据估计的时延对远端信号进行补偿
- wRLS滤波:使用加权递归最小二乘法设计滤波器,消除线性回声
- 时延估计窗口长度:0.5秒
- 时延估计窗口增量:0.25秒
- wRLS窗口长度:0.02秒
- wRLS窗口增量:0.01秒
- 滤波器长度(L):5
- 权重参数(B):0.2
- 正则化参数(eps):0.001
神经网络阶段使用深度学习方法来进一步消除非线性回声。本项目支持多种神经网络架构:
| 模型类型 | 说明 |
|---|---|
| U-Net | 经典的编码器-解码器架构,适合音频频谱图处理 |
| LSTM | 循环神经网络,适合捕捉时序信息 |
| TDNN | 时延神经网络(Time Delay Neural Network),使用膨胀卷积捕捉长距离依赖 |
- 编码器路径:包含三个下采样块,每个块包含两个卷积层和一个池化层
- 瓶颈层:两个卷积层和一个Dropout层
- 解码器路径:包含三个上采样块,每个块包含一个转置卷积层和两个卷积层
- 输入:6通道(麦克风信号、远端信号和线性滤波后信号的实部和虚部)
- 输出:2通道(清晰信号的实部和虚部)
- 结构:5层膨胀卷积层(TDNN Layer),膨胀因子分别为1, 2, 3, 1, 1
- 池化层:支持多种池化方式(ASP, SAP, TAP, TSP)
- SE版本:TDNN_GRU_SE结合了SE注意力机制和GRU循环结构
- 输入:频谱图特征
- 输出:分类结果或特征嵌入
- 批次大小:16
- 学习率:0.001
- 优化器:Adam
- 损失函数:MSE
- 学习率调度器:ReduceLROnPlateau(当验证损失停止下降时降低学习率)
- STFT参数:
- FFT大小:320
- Hop大小:160
- 窗口长度:320
- 频率bins:161
评估阶段从编号9000-9999的数据中随机选择100个样本进行性能评估。
- 信噪比(SNR):衡量有用信号与噪声的比率
- 回声返回损失增强(ERLE):衡量回声消除的能力
- 感知评估语音质量(PESQ):模拟人类对语音质量的主观评分
- 均方误差(MSE):衡量信号恢复的准确性
- 相关系数:衡量处理后信号与原始信号的相似度
- STFT距离:衡量频域上的信号恢复质量
支持U-Net和LSTM两种模型:
# 训练U-Net模型
python train.py --data_dir data/preprocessed --model_type unet --batch_size 16 --lr 0.001 --epochs 100 --save_interval 10
# 训练LSTM模型
python train.py --data_dir data/preprocessed --model_type lstm --batch_size 16 --lr 0.001 --epochs 100 --save_interval 10权重文件在Releases v1.0.0 Latest的checkpoints.zip,下载完成后将lstm_best.pth和unet_best.pth放到checkpoints目录
python main.py --farend_path test/farend_speech.wav --mic_path test/nearend_mic.wav --model_type unetpython evaluate.py使用net_plot.py脚本可以将训练好的模型导出为ONNX格式并进行可视化:
python net_plot.py该脚本支持导出U-Net和LSTM的onnx模型,导出后的模型可使用Netron工具进行可视化查看。
基于100个随机样本的评估结果显示:
- 信噪比(SNR):从平均-3.54dB提升至-2.19dB(改进1.36dB)
- 回声返回损失增强(ERLE):从平均0.85dB显著提升至5.68dB(改进4.82dB)
- 感知评估语音质量(PESQ):从1.32微小提升至1.33(改进0.01)
结果表明,神经网络在线性滤波基础上能够进一步提升回声消除效果,特别是在ERLE指标上的改进最为显著,说明神经网络在消除残余回声方面非常有效。
evaluation:以下是评估过程中生成的效果图:
.
├── checkpoints/ # 存储模型检查点
│ ├── plots/ # 训练过程可视化
│ └── *.pth # 模型权重文件
├── data/ # 数据集目录
│ ├── preprocessed/ # 预处理后的数据
│ │ ├── farend/ # 远端参考信号
│ │ ├── mic/ # 麦克风录制信号
│ │ ├── error/ # 线性滤波后信号
│ └── resampled/ # 重采样数据
├── evaluation/ # 评估结果目录
│ ├── *.png # 效果对比图
│ └── *.csv # 评估结果数据
├── models/ # 模型定义
│ ├── unet.py # U-Net和LSTM网络定义
│ └── tdnn.py # TDNN网络定义
├── output/ # 处理结果输出目录
├── test/ # 测试音频文件
├── utils/ # 工具函数
│ ├── preprocessed_dataset.py # 数据集加载
│ ├── preprocess_datav2.py # 数据预处理
│ ├── preprocess_data.py # 数据预处理(旧版)
│ ├── resample_audiov2.py # 音频重采样
│ └── resample_audio.py # 音频重采样(旧版)
├── config.py # 配置参数
├── evaluate.py # 评估脚本
├── main.py # 单音频处理脚本
├── net_plot.py # 网络可视化工具
├── TDC_wRLS.py # 线性滤波算法实现
├── train.py # 训练脚本
└── requirements.txt # 依赖库
QQ群:1029629549
- 探索更复杂的神经网络架构以提高性能
- 增加数据增强方法提高模型泛化能力
- 优化模型参数减少计算资源需求
- 探索实时处理的可能性
