深度学习 回声消除 AEC

我的书:

购买链接:

京东购买链接

淘宝购买链接

当当购买链接

本篇阐述基于深度学习回声消除的核心思想和简单demo(包括训练代码+部署C代码),相关源码获取请扫描《实时语音处理实践指南》一书中出版社二维码,根据书中步骤联系出版社获取

承接书中实时性要求,这里在展示基于深度学习回声消除的核心原理时,还考虑算力和内存消耗,故而这里选择了10ms(16kHz采样率信号,160个点)处理帧长;由于AEC存在Near和Far端两个信号,如果按照频点计算,那么网络输入dimension将是单通道的两倍,所以这里选择了频带而非频点,这里借鉴了Bark子带划分法,但是密度要比起密集一些;

深度学习依赖训练数据集、特征选取、模型搭建和loss计算;本篇从特征选取、模型网络大小、定点化部署模型以及C实现前向计算几个部分,SIMD优化留待后续再做了。

在构建训练数据集时,通过实际场景一句句录制不太现实,大部分读者都没有这个资源,所以这里采用算法进行构建数据集,麦克风采集的人声从网上下载开源数据集即可,但是被麦克风采集到的参考信号由于经过了扬声器和房间传输变换,和原始参考信号并不一致,为了简便,这里看两张扬声器和房间冲击频响的图,通过扬声器和房间脉冲响应的图可以看到,对于幅度谱而言,就是频点上加了个增益,而本文选择的label正式子带幅度谱,基于这一假设,可以使用滤波器来模拟这一过程,因为麦克风实际录音时已经有混响和反射在原始语音信号里的,这里只做频响上的变换。这可以通过《实时语音处理实践指南》二阶IIR滤波器用以描述,实际上开放的源码也正是如此实现的,《实时语音处理实践指南》第九章数字音效介绍的弥补声场的缺陷就可以看成是对扬声器和房间响应的补充,理解这部分有助于构建更合适的训练数据集,这里不再赘述。

1979年由Allen和Berkley提出的镜像法是常用的方法之一。这一方法接近所谓的波动方程,声波方程的频域方程是亥姆霍兹方程,这些方程描述的是声波在流体(空气、液体)中的传播。由训练代码可以知道,通常AEC的ref信号是扬声器播放之前的信号,没有经过扬声器和房间响应变换,而麦克风采集到的信号频响是变换过了,所以这个数据集实际上有些瑕疵,不过这并不会导致回声消不掉。

以下介绍训练+部署的代码,代码并未公开,只在出版社随书代码,可购买书籍,并扫描书中电子工业出版社二维码获取

信号处理模型

首先数据集和训练都是基于10ms,16kHz采样信号,帧长就是160点,采用50%重叠,至于重叠法的作用和原理,见《实时语音处理实践指南》,分析和综合窗选择:

w(n) = sin[\frac{\pi}{2}\sin^2(\frac{\pi n}{N})]

频带的选择

为了实时性,频带要尽量的少,为了处理的精度,频带又要尽量的多,按照Bark子带划分效果并不好,Rnnoise选择Bark子带的原因是假定了噪声是平稳的,而对于AEC场景,回声就是人声,并不是平稳信号,所以用Bark子带法太过模糊,需要根据基频和共振峰《实时语音处理实践指南》中阐述过其产生机理和特点,这里不赘述,频带选择见代码。

增益选择较为简单,就是 g_b=\sqrt{\frac{E_x(b)}{E_y(b)}}

其中E_x(b)​是麦克风采集到的带噪信号的子带能量,​分母E_y(b)是far端参考信号,如果想训练AEC+NS,这里的分子用E_s(b)​即可。对于pitch,可以用在这里辅助gain的计算以增强鲁棒性。

 图1 处理过程

网络模型

网络模型的输入时麦克风采集到的信号(近端)和喇叭播放之前的信号(远端,或参考信号),近端和远端提取了一样的频带+倒谱作为特征,共计116个点。

模型的定点化是通过在训练时约束权重参数实现的:

训练过程

aec_output_loss至少要到小数点后六位,我训练构建的near和far端数据各3.2G,如果不改代码,训练和测试数据必须是16kHz,16bit裸数据。我训练的一个epoch需要300s(5min),训练时间因个人电脑差异可以能略有变化。

AEC起作用demo

这里给一段实录信号测试结果,这个是分为18个子带的效果。读者在实际测试时,如果发现效果很差的序列,不妨加出版社读者群向我反馈,以便针对性的扩充训练集以便尽可能完善训练集的构造。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页