【音频技术实践】系列
语音信号去混响(dereverberation)最新研究总结
语音去混响算法之WPE( Weighted Prediction Error for speech dereverberation)
前言
随着神经网络的不断发展,数据规模的不断增大,算力的不断提高,语音领域已经逐步走向成熟。如今的研究人们大多把精力放在如何训练一个更好的神经网络模型,提出新的结构,这都得益于有了较大的数据集,我们可以简单直接的用神经网络去拟合。本着学习的态度,我们也应该了解之前如何对语音信号进行更精细的分析,从科学的角度探索语音的奥秘。
一、语音信号的线性产生模型
语音是由气流激励声道,最后从唇鼻辐射出来而形成。传统的基于声道的语音产生模型,就是从这一角度描述语音的产生过程。包括激励模型、声道模型和辐射模型,这三个模型分别与肺部的气流和声带共同作用形成的激励、声道对声音的修饰以及唇鼻的辐射作用一一对应。如下图1:
1. 激励模型
激励的情况可根据发清音和浊音分为两大类。
发浊音时,气流对紧绷的声带冲击产生振动,在声门处形成准周期的脉冲串。声带的紧绷程度不同,振动的频率不同,基音频率也不同。因此发浊音时声带的不断张开和关闭产生的脉冲波,类似于斜三角形的脉冲。将其变换到频域,可以看出它相当于一个低通滤波器。因此通常将它表示为z变换的全极点模型:
G
(
z
)
=
1
(
1
−
g
1
z
−
1
)
(
1
−
g
2
z
−
1
)
G(z) = \frac{1}{(1-g_1 z^{-1})(1-g_2 z^{-1})}
G(z)=(1−g1z−1)(1−g2z−1)1
其中
g
1
,
g
2
g_1,g_2
g1,g2都接近与1。这样,斜三角波可以看做是加权的单位脉冲通过上述的低通滤波器的输出。
单位脉冲表示为z变换的形式:
E ( z ) = A v 1 − z − 1 E(z) = \frac{A_v}{1-z^{-1}} E(z)=1−z−1Av
其中
A
v
A_v
Av是调节浊音的幅值或能量的参数。因此整个激励模型可以表示为:
U
(
z
)
=
G
(
z
)
E
(
z
)
=
A
v
1
−
z
−
1
×
1
(
1
−
g
1
z
−
1
)
(
1
−
g
2
z
−
1
)
U(z) = G(z)E(z) = \frac{A_v}{1-z^{-1}} \times \frac{1}{(1-g_1 z^{-1})(1-g_2 z^{-1})}
U(z)=G(z)E(z)=1−z−1Av×(1−g1z−1)(1−g2z−1)1
发清音时声带处于松弛状态,不发生振动,气流直接进入声道。所以激励信号相当于随机白噪声。实验中可以用均值为0,方差为1 并在时间或幅值上为白色分布的序列来表示。
需要指出,此处为简单的模型,而实际发声中要复杂很多,有很多人提出不同的方法模拟激励信号。
2. 声道模型
声道模型同样可分为两大类:
- 发元音的情况
此时声道的口腔为稳定的某种形状的谐振腔,由声门来的准周期脉冲激励声道而产生响应。 - 发辅音的情况
此时可分为塞音、擦音、鼻音等情况。
关于声道的数学模型有两种观点:一种是将声道看做是由多个不同截面积的声管串联形成的系统,称为声管模型2。另一种是将声道视为一个谐振腔,共振峰就是这个腔体的谐振频率,从这个角度出发来描述声道的模型,即为共振峰模型。由于人耳听觉的柯迪氏器官的毛细胞是按照频率感受来排列其位置的,所以共振峰模型很有效。
实践表明:用前三个共振峰来代表一个原因就足够了,对于较复杂的辅音或鼻音,大概要用五个以上的共振峰才行。
通常用如下式的全极点模型来刻画共振峰特性:
V
(
z
)
=
1
∑
i
=
0
p
a
i
z
−
i
V(z) = \frac{1}{\sum^{p}_{i=0}{a_iz^{-i}}}
V(z)=∑i=0paiz−i1
p
p
p为全极点滤波器的阶,一般在8-12范围内取值。它的每一对极点对应一个共振峰。
a
i
a_i
ai为声道模型参数,它随声道的调音运动不断变化。一般在10-30ms内认为声道参数保持不变,这也是语音信号短时分析的理论依据之一。
对于一些鼻音和摩擦音,声道传输函数中也包含一些零点。对于这种情况,可以在上式中引入若干个零点,这时的模型会相对复杂。
3. 辐射模型
有研究表明,口唇端的辐射效应在高频段较为明显,在低频段影响较小,因此可以用一个高通滤波器来表示辐射模型,例如:
R
(
z
)
=
1
−
r
z
−
1
R(z) = 1-rz^{-1}
R(z)=1−rz−1
实际信号分析时,常常采用这样的预加重技术,即在采样之后插入一个一阶高通滤波器。在语音合成时再进行“去加重”处理,即可恢复原来的语音。
综上所述,完整的语音信号产生模型可以用三个子模型串联而成,其传递函数为:
H
(
z
)
=
U
(
z
)
V
(
z
)
R
(
z
)
H(z) = U(z)V(z)R(z)
H(z)=U(z)V(z)R(z)
二、模型求解方法
按照线性模型理论,语音信号是由激励信号和声道响应卷积产生。解卷就是将各卷积分量分开。解卷算法分为两大类,一类称为“参数解卷”,即线性预测分析,另一类算法称为“非参数解卷”,即同态解卷积,对语音信号进行同态分析后,将得到语音信号的倒谱参数,此时同态分析也称为倒谱分析或者同态处理。
同态处理是一种较好的解卷积方法,它可以较好的将语音信号中的激励信号和声道响应分离,并且只需要用十几个倒谱系数就能相当好的描述语音信号的声道特性,因此占很重要的位置。通常的加性信号可以用线性系统处理,满足线性叠加原理。然后很多信号是由乘性信号或者卷积信号组合的信号。这样的信号不能用线性系统处理,得用非线性系统处理。但是非线性系统分析起来困难,同态语音信号就是将非线性问题转换为线性问题处理。语音信号可以看做是声门激励信号与声道响应的卷积结果。
三、代码与实验结果
下面是LPC法求解的代码与结果,欢迎大家交流探讨。
def spectrum_estimation_lpc(u, p, fs, n_fft):
ar, _ = lpc_coeff(u, p)
S = np.abs(np.log(np.power(np.abs(np.fft.rfft(u, 2 * n_fft)), -2) ))
U = np.abs(np.log(np.power(np.abs(np.fft.rfft(ar, 2 * n_fft)), -2) ))
return U,S
def source_estimation(audio, fs, n_fft):
win = np.ones(win_length) # 可自定义窗函数
audio_frames, nf = enframe(audio, win, inc) # 分帧 默认帧长等于窗长
print(audio_frames.shape)
source = np.zeros((n_fft+1, nf))
for i in range(nf):
audio_oneframe = audio_frames[i].T
U, S = spectrum_estimation_lpc(audio, 12, fs, n_fft) # LPC法估计声道频谱
source_oneframe = np.multiply(1/U,S)
source[:,i] = source_oneframe
return source
四、参考文献
韩纪庆, 张磊, 郑铁然. 高等院校信息与通信工程系列教材 语音信号处理[M]// 高等院校信息与通信工程系列教材, 语音信号处理. 清华大学出版社, 2004. ↩︎
Smith, J.O. Physical Audio Signal Processing,http://ccrma.stanford.edu/~jos/pasp/, online book, 2010 edition.
这本书出自斯坦福CCRMA研究所的Smith, J.O.,非常好的一本关于音频信号处理的书,强烈推荐 ↩︎