第十二章 语音去混响(Dereverberation)
当声源发声时,由于反射和延迟现象,会出现同一个声音多次到达人耳的情形,人耳能明显区别出的是回声(这时反射和原始声音到达时间差可长达50ms,甚至数百上千毫秒)。如果反射的声音和原始声音时间在10ms~30ms之间,由于人耳的时间掩蔽特性会增强人耳的听感,但是对于ASR语音识别是有影响的。这被称为混响RT60 是标准的混响时间测量方法,表示从测试信号突然停止到声压级降低 60 dB 所用的时间。 当前去混响算法主要分为三个类别:
- 波束形成 波束形式是空域滤波方法,来自其它方法的混响由于空域上的选择性会被滤除,这就要求目标方向是正确的,在360度的3D场景中,需要先定位出目标方向,而在定位目标方向时,混响是有影响的。波束形成技术内容和实例加起来比较多,后面章节再展开。
- 语音增强技术方法 当前去混响方法主要分为三个类别:
- 基于统计模型的去混响方法
- 基于LPC方法
- 基于特征值分解法
3.盲反卷积 声学脉冲响应的未知情况下,根据观察到的信号,设计出反向滤波器来削弱混响的影响。
基于语音增强方法
谱减法
基本思想
估计每一帧的音素及其能量,对新出现的帧,减掉其之前各帧中存在的音素能量。 混响能量的功率谱密度(power spectral density,psd)可以用下式近似表示:
γrr[n,k]=e−2ΔTγxx[n−T,k]
γrr是混响语音的psd,n是离散时间索引,k是离散频点索引。衰减因子Δ=3ln(10)RT60。
根据谱减法有:
|ˆS[m,k]|=(|X|−√γrr)[m,k]
ˆS是估计的纯净语音STFT值,X是带混响的采集到的语音的STFT值,m是帧索引。
混响时间估计
在Amazon的AWS有篇文献Blind estimation of reverberation time,其给出了混响时间估计方法,就是式子9.1中的RT60,进而可以求出Δ。该文献中将9.1中的指数部分使用a[n]来代替:
a[n]=an=(e−1τr)n=e−nr
由声音衰减模型可得衰减信号y(n)=a(n)x(n)的似然估计如下:
L(y;a,σ)=(12πa(N−1)σ2)N/2×exp(−ΣN−1n=0a−2ny(n)22σ2)
为了求得参数a和σ,对4取对数得:
lnL(y;a,σ)=−N(N−1)2ln(a)−N2ln(2πσ2)−12σ2N−1∑n=0a−2ny(n)2
对9.5式分别对a和σ求偏导数,并令其等于零,可以得a,σ理论最优解。
∂ln(L(y;a,σ))∂a=1aσ2N−1∑n=0na−2nx(n)2−N(N−1)2a
然而要解11.6并不好解,可以进行量化以减少计算量a∈[0,1),可以假设a可以取的值是a∈A=a1,a2,⋯,aQ, 通常建Q≤10,对于绝大多数情况可以将Q=2。则式11.4可以写为:
L(aj;y)=−N2{(N−1)ln(aj)−ln(2πNN−1∑n=0a−2njx[n]2−1)}
对于逐帧计算的情况,a的值可能会随着帧而发生波动。这就需要在波动情况下为每一帧选择最优的估计。说话间隙的无声期声音衰减并不会变化。设β=a−2,则可以定义:
g[n]=βN−1n∑r=n−N+1βr−nx[r]2
这样,式子9.6的递归求解过程可以变成下式:
g[n+1]=β−1(g[n]+βnx[n+1]2−x[n+1−N]2)
为了加速这一计算过程,可以预先计算好所有的β, ln(aj)和ln(2π/n),最后,ln(g[n])可以使用查找表计算得到。
- 谱减法改进 当估计到的回声能量大于信号的能量值时,谱减法会得到负值。这可以通过将谱减法转化成权重的形式,这在webrtc的很多算法中都有这个思想。
G[m,k]=|X[m,k]|−γ12rr[m,k]|X[m,k]|
剔除负值可以使用门限的方法如下:
|ˆS[m,k]|={G[m,k]Xpm,k]when≥λ√γrr[m,k]γ√γrr[m,k]other
当λ=0.1,则衰减为20dB.可以进一步使用下式提升混响的psd估计.
γrr[ˆm,k]=ηγrr[ˆm−1,k]+(1−η)|X[m,k]|2
η=1/(2Δ)1/(2Δ)+O/(fs)
基于LPC的去混响
- LPC(linear predictive coding)
语音信号x(n)可以使用p阶线性预测器来表示:
s(n)=−P∑i=1ais(n−i)+e(n)
ai是预测系数,e(n)是预测误差。LPC的系数可以做成预测误差滤波器:
A(z)=1+p∑i=1aizi
其对应的全零点滤波器是:
V(z)=11+∑pi=1aizi=1A(z)
使用MSE准则计算系数:
J=E[e2(n)]=E{(s(n)−p∑i=1ais(n−i))2}
令∂J∂ai=0可以得到如下:
P∑u=1auE{s(n−i)s(n−u)}=E{s(n)s(n−u)};1≤u≤P
式17用矩阵表示为下式:
Rssa=rss;a=[a1,a2,⋯,ap]T
则在10ms~30ms这段稳态时间内,语音信号的LPC系数如下:
Rssa=rss;a=[a1,a2,⋯,ap]T
由于互相关矩阵Rss是Toeplitz矩阵,可以使用Levinson-Durbin算法高效计算获得。
- 混响场景的LPC 麦克风采集到的信号可以用下式表示:
x(n)=hTs(n)+V(n)
x是麦克风采集到的信号,s声源发声的原始信号。对于混响存在的场景,则麦克风采集到的信号可以表示为:
x(n)=p∑i=1bix(n−i)+e(n)
则LPC的系数安装9.19可得:
ˆb=^Rxx−1^rxx
- 多通道优化 对于多通道情况,可以将代价函数进行平均,这样最后求得的系数是多个通道系数的均值,这样有助于减小绕动干扰,增加系统的鲁棒性。也可以结合bf方法。
一个去混响开源算法是WPE
小节
本章主要给出了混响问题描述和统计模型以及LPC编码两种思路,统计模型的思路和前面章节的方法非常相似,这里也并未分析具体的WPE算法的代码,另外,还有一些基于多通道的盲源辨识方法。