wjchen

Never lose a holy curiosity.

单通道语音增强之统计信号模型

28 May 2019 » 语音


本文代码位于GitHub

1. 信号估计理论简述

信号估计理论是现代统计处理的基础课题[@ZhangXianDa2002ModernSP],在通信、语音、图像领域均有广泛应用。语音增强,就是从带噪的语音测量信号中估计原始的无噪语音,这是典型的信号估计问题。 《语音增强–理论与实践》[@loizou2007speech]一书中列举了用于语音增强的一系列统计模型。

假设麦克风采集到的带噪语音序列为,并且噪声都是加性噪声。则带噪语音序列为无噪语音序列与噪声序列的和。原始语音信号与噪声均可视为随机信号。

在时域对$x[n]$进行估计是非常困难的,通过傅立叶变换,我们可以将信号分解为频域上互相独立的系数。信号估计模型转变为对每一个频点的系数进行估计的模型,不同频点之间的参数是相互独立的。

这个方法就叫做统计信号谱分析(Statistical Spectral Analysis)。显然地,纯净信号谱$X(\omega_{k})$带有幅度与相位两参数,我们实际上是对幅度$X_{k}$和相位$\theta_{y}(k)$进行参数估计。

重组谱幅度和谱相位估计值即可恢复纯净语音谱,估计值用上标来表示:$\hat{X}(\omega_{k})=\hat{X}(k)e^{j\hat{\theta}_{x}(k)}$。

实际信号的幅度和相位是不方便直接用在运算过程中的,因为信号取值范围不定,且瞬时变化。在噪声抑制领域,更常用的语音谱估计方法是对抑制增益(Suppression Gain)进行估计,不同的估计准则称为抑制准则(Supression Rule)。

通常会根据先验信噪比、后验信噪比来估计抑制增益$H_{k}$。 并且可以在只有噪声出现的时刻更新$H_{k}$, 在语音存在的时刻进行抑制,无须每帧去调用噪声抑制算法,计算过程比直接估计信号谱灵活。

综上,语音增强的典型流程就是:

  1. 对带噪语音y[n]分帧, 每一帧进行DFT得到$Y(\omega_{k})$。

  2. 估计或者沿用上一帧的抑制增益$H_{k}$,得到纯净语音谱$\hat{X}(\omega_{k})$

  3. 对$\hat{X}(\omega_{k})$进行IDFT,得到纯净语音序列的估计$x[n]$。

为了估计模型的建模,对测量信号、估计信号、噪声信号都需要作一些数学上的假设和简化。其中对噪声一般会作以下假设:

  1. 噪声是与语音独立的加性噪声;

  2. 每一帧噪声的统计分布是稳态的;

  3. 噪声的傅立叶级数是零均值复高斯分布。

2. 最大似然估计ML

如果不考虑信号的先验分布,即认为信号值是确定信号,而不是随机信号,我们只需要分析含有信号$x$为参数的带噪信号$y$的概率分布$p(y;x)$,并使之最大。这种估计方法叫最大似然估计器(Maximum Likelihood Estimation)。将$y$的带参概率分布$p(y;x)$称为似然函数(Likelihood Function)。对纯净信号$x$的估计,表达为求解合适的$x$值,使得似然函数$p(y;x)$最大。

文献[@mcaulay1980speech]最早将最大似然估计法用在语音增强领域。对于纯净语音,可以假设纯净语音幅度$X_{k}$和相位$\theta_{y}(k)$是未知但确定,无需考虑其先验概率分布。最大似然语音增强模型表达为:

把$D_{k}e^{\theta_{d}(k)}=Y_{k}e^{\theta_{y}(k)} - X_{k}e^{\theta_{x}(k)} $代入噪声零均值复高斯分布公式中,得到:

3.贝叶斯估计

如果比最大似然估计更进一步,考虑待估计量$x$也是随机变量,且$x$的先验分布为$p(x)$,这种假设下的估计方法叫做贝叶斯估计[@ZhangXianDa2002ModernSP]。定义估计值$\hat{x}$与实际值$x$之间的误差函数为$c(\hat{x},x)$,贝叶斯估计器的目标即为找出是平均误差$E[c(\hat{x},x)]$最小的估计值$x$。

对于待估计的纯净语音谱,贝叶斯估计器可以表达为:

误差$c(\hat{x},x)$的期望值取决于待测信号与测量信号的联合概率分布。

根据条件概率密度公式对联合概率密度进行分解:

因为估计值$\hat{x}$与$p(y)$相互独立,可以把外层对$y$的积分消除,也就是:

误差函数$c(\hat{x}, x)$的计算模型,会引出不同种类的估计器。典型的误差函数有几种类型[@ZhangXianDa2002ModernSP]:

  1. 平方误差函数,对应最小均方估计。

  2. 绝对值误差函数,对应条件中位数估计。

  3. 均匀误差函数,对应最大后验估计。

3.1 最小均方估计(MMSE)

最小均方估计(Minimum Mean Square Error Estimation)[@ephraim1985speech]使用平方误差函数,平均误差为:

为求平均误差的极大值,可对估计量$\hat{x}$求导,并求极值点。

显然极值点的$\hat{x}$为被估计量$x$的条件均值:

亦可以使用贝叶斯公式展开,得到:

在语音增强的模型里,纯净语音谱的估计为其在带噪语音谱下的条件均值。

上式中,为得到纯净语音谱需要分别估计谱幅度和谱相位: $\hat{X}, \hat{\theta}_{x}$。

同时估计谱幅度和谱相位是很难的,研究者提出了许多分别估计谱幅度和谱相位的方法,估计完成后再用两者重组复语音信号。

3.1.1 MMSE谱幅度估计

最小均方根估计器MMSE short-time spectral amplitude

	def mmse_stsa_gain(parameters=None):
		gamma = parameters['gamma']
		ksi = parameters['ksi']
			
		vk = ksi * gamma / (1 + ksi)
		j0 = np.i0(vk / 2)
		j1 = np.i1(vk / 2)
			
		A = sqrt(pi * vk) / 2 / gamma
		B = (1 + vk) * j0 + vk * j1
		C = np.exp(-0.5 * vk)
		gain = A * B * C
		return gain

3.1.2 MMSE对数谱幅度估计

对数最小均方根估计器The MMSE log spectral amplitude (MMSE-LSA), 或者缩写为LogMMSE估计器。

	def logmmse_gain(parameters=None):
		gamma = parameters['gamma']
		ksi = parameters['ksi']
		A = ksi / (1 + ksi)
		vk = A * gamma
		ei_vk = 0.5 * expn(1, vk)
		gain = A * np.exp(ei_vk)
		return gain

3.1.3 MMSE平方谱幅度估计

频谱幅度平方估计器MMSE magnitude squared[@wolfe2003efficient]

	def mmse_sqr_gain(parameters=None):
		gamma = parameters['gamma']
		ksi = parameters['ksi']
			
		vk = ksi * gamma / (1 + ksi)
		j0 = np.i0(vk / 2)
		j1 = np.i1(vk / 2)
			
		A = ksi / (1 + ksi)
		B = (1 + vk) / gamma
		gain = sqrt(A * B)
		return gain

3.2 最大后验估计 MAP

当贝叶斯估计器采用均匀误差函数时,平均误差为:

显然要使得平均误差最小,就是要求目标估计$\hat{x}$,使得 $p(x|y)$最大。这种估计模型称作最大后验估计(Maximum A Posteriori Estimation)。这个模型的意思是只有估计值$\hat{x}$与原始值$x$相等,误差才为0,其他时候误差均匀为1。估计值可以表达为:

在语音增强的模型里,纯净语音谱的估计为其在带噪语音谱下的条件均值。

文献[@wolfe2003efficient]提出了两种基于最大后验估计(Maximum A Posteriori Estimation)的语音增强算法。一种是同时求解幅度和相位的混合最大后验估计: 另外一种是单纯估计幅度的方法,两种估计器最后的噪声抑制增益略有不同。

3.2.1 幅度和相位混合最大后验估计

[@wolfe2003efficient]

def map_joint_gain(parameters=None):
	gamma = parameters['gamma']
	ksi = parameters['ksi']
	
	eps = 1e-6
	gain = (ksi + sqrt(ksi^ 2 + 2 * (1.0 + ksi)* ksi/ (gamma + eps))) / 2.0/ (1.0 + ksi)
	return gain

3.2.2 纯幅度最大后验估计

[@wolfe2003efficient]

def map_sa_gain(parameters=None):
	gamma = parameters['gamma']
	ksi = parameters['ksi']
	
	eps = 1e-6
	gain = (ksi + sqrt(ksi^ 2 + (1.0 + ksi)* ksi/ (gamma + eps))) / 2.0/ (1.0 + ksi)
	return gain


参考文献

[1] 张贤达, 现代信号处理. 清华大学出版社有限公司, 2002.

[2] P. C. Loizou, Speech enhancement: theory and practice. CRC press, 2007.

[3] R. McAulay and M. Malpass, Speech enhancement using a soft-decision noise suppression filter,” IEEE Transactions on Acoustics, Speech, and Signal Processing, vol. 28, no. 2, pp. 137-145,1980.

[4] Y. Ephraim and D. Malah, Speech enhancement using a minimum mean-square error log-spectral amplitude estimator,” IEEE transactions on acoustics, speech, and signal processing,vol. 33, no. 2, pp. 443-445, 1985.

[5] P. J. Wolfe and S. J. Godsill, Efficient alternatives to the ephraim and malah suppression rule for audio signal enhancement,” EURASIP Journal on Applied Signal Processing, vol. 2003, pp.1043-1051, 2003.