第1章 绪论 语音是人类之间传递信息、情感交流的最重要、最方便以及最常见的方式。随着社会的进步、科技的发展,人们通过语音进行交流的方式从人与人之间面对面交流的方式变得越来越多样化。电话语音通信、语音留言等早已融入人们的日常生活。近年来,让机器能听会说的人机语音交互也逐渐兴起。例如,智能语音客服、语音助手、智能音箱等,为人们的生产生活提供了极大的便利。 但是,语音信号处理是一项极其困难的任务。首先,语音信号的能量随着传播距离的增加而迅速衰减,使得当前的语音技术大部分局限于近距离拾音。语音也易受环境的干扰,常见的干扰噪声如下。 (1)加性噪声:其他物体发出的噪声与语音产生叠加。 (2)混响:语音在传播过程中碰到障碍物后发生反射,与直达声产生叠加。 (3)人类噪声:其他说话人发出的声音与目标说话人的语音产生叠加。 语音信号在通过麦克风变成电信号以后,还会受到电信道各个环节带来的噪声影响。例如,电信道的噪声问题、电子元件的非线性干扰问题、互联网传输的丢帧问题等。当空气信道与电信道构成回路时,有可能会进一步出现回声、啸叫等现象,严重影响语音通信质量和语音交互体验。此外,语音的质量和可懂度还受到说话人自身的年龄、语种、情绪、健康状况等因素的严重影响。可以说,语音信号在信息的产生、传输、存储、应用这一全链条上都不可避免地会受到各种噪声和干扰因素的影响。因此,无论从技术角度还是从社会发展角度看,研究鲁棒语音信号处理都具有十分重要的意义。 从 20世纪 40年代语音处理技术步入快速发展以来,如何应对噪声和复杂场景始终是语音技术发展的主旋律。相关技术大致上可以分为四类,分别是语音特征法、统计信号处理方法、阵列信号处理方法、机器学习方法。语音特征法是历史最久的鲁棒语音处理方法。早在 20世纪 40年代, Potter等就提出了可视语音( visible speech)的思想,通过语谱图描述语音信号的结构信息,形成了最早的语音特征。随后,人们发现在短时(帧长为 20~30ms)平稳假设条件下,可以针对不同的语音处理任务抽取不同的统计特征。例如,语音检测中的短时能量、短时过零率、短时自相关系数等。随着傅里叶变换等时频域变换技术的发展,人们开始通过各种时频域变换将分帧后的时域信号转换到频域,典型的时频域变换包括短时傅里叶变换、梅尔倒谱系数、伽马通滤波器组等。这些时频域变换不仅可以清晰地呈现语音的结构信息,而且部分变换还具备滤除部分噪声的功能。它们为语音处理技术的快速发展奠定了基础。目前,大部分的语音降噪和识别算法都建立在这些语音特征上。 语音信号是一种长时非平稳的随机信号。为了挖掘语音信号中隐藏的规律,有必要为信号建立统计模型。统计信号处理方法属于这类方法。它通常首先假设数据服从某种形式的概率分布,如高斯分布、拉普拉斯分布、伽马分布等;或假设数据中蕴含某些自然规律,如低秩特性等;然后通过一定时间内的历史数据估计概率分布的统计参数,如均值、方差等,并对当前时刻的语音事件的发生概率进行预测。统计信号处理的分支众多,既包括以自适应滤波、自适应谱估计与参数估计、自适应阵列处理与波束形成等为主要内容的自适应信号处理方法,又包括独立成分分析、非负矩阵分解等为代表的盲源信号分离方法。 阵列信号处理是由一定数目的麦克风组成的,对声场的空间特性进行采样并处理的一类方法。它的研究核心是麦克风阵列的阵型及其波束图的设计。目前,阵列的设计方法主要有两种,即加性麦克风阵列和差分麦克风阵列。加性麦克风阵列直接对空间声压场进行采样和滤波处理。差分波束形成阵列则是对声压场空间的导数进行测量和处理,具有空间尺寸小、指向性强等优点。麦克风阵列在鲁棒语音处理中发挥着至关重要的作用,可以通过设计不同的麦克风阵列及其滤波算法解决很多声学问题,如声源定位、去混响、语音增强、盲源分离等。 模式识别和机器学习方法旨在对历史语音数据建模,通过模型对测试语音数据进行预测。早期的模式识别方法主要是模板匹配法,这种方法难以捕捉语音信号的时间序列信息且泛化能力较弱。之后,以高斯混合模型( Gaussian mixture model, GMM)和隐马尔可夫模型( hidden Markov model, HMM)为代表的模式识别方法占据了语音信号处理的主流。围绕着 GMM-HMM框架诞生了一批鲁棒语音处理算法和训练策略。它们主要应用于场景比较明确的数据或模型自适应任务。例如,在房间 A中训练的模型如何应用于房间 B、在说话人 A上训练的模型如何应用于说话人 B。具有代表性的方法包括基于 最大似然线性回归( maximum likelihood linear regression, MLLR)的模型自适应算法、基于概率线性判别分析( probabilistic linear discriminant analysis, PLDA)的无监督域自适应方法、面向小数据的迁移学习和多任务学习策略等。 虽然也有一些学者尝试用机器学习方法对不确定的噪声环境直接建模,例如,基于支持向量机的语音检测、基于 HMM和 k均值聚类的盲源分离、基于谱聚类的语音增强等,但是这些方法大多受制于算法自身的时间和空间复杂度而无法处理各种复杂的现实噪声环境,导致其难以步入实际使用。幸运的是,深度神经网络是一种空间复杂度与训练数据量无关的机器学习方法。理论上,它的泛化能力可以随着数量分布密度的增加而不断提高,使其具备处理任意复杂的声学环境的潜力。近年来,随着计算机计算能力的快速提高和数据量的爆炸式增长,深度神经网络的潜力得以释放,并引发了以深度学习为核心的人工智能浪潮。 2012年,深度神经网络首次被直接应用于复杂场景下的语音检测与增强问题。这种通过人工标注的大量历史数据训练的深度神经网络,突破了传统统计信号处理和模式识别方法在极低信噪比和复杂场景下的性能瓶颈问题,大幅提高了语音检测和增强的性能。此后,在学术界和工业界的共同努力下,基于深度学习的鲁棒语音处理经历了近 10年的高速发展,取得了大量的技术积累,在语音通信、智能家居、车载智能语音交互等方面获得了广泛的实际应用。但是,“天下没有免费的午餐”,这种技术对计算能力和有标注数据的要求较高。并且,当测试场景与训练场景存在严重不匹配时,其性能与同在匹配测试环境中的性能相比,会出现一定程度的下降。但是,瑕不掩瑜,无论如何,它实现了在困难声学环境下从 0到 1的突破,使语音通信、智能语音交互更大范围应用成为可能。本书将回顾近 10年来基于深度神经网络的鲁棒语音处理的发展,重点介绍开创性的算法和实际应用中性能突出的代表性算法。 本书包括 8章内容。第 1章简要介绍鲁棒语音处理的重要性和发展史。第 2章介绍深度学习的基本概念、组成要素,以及在语音处理中常用的循环神经网络、卷积神经网络。第 3章从深度神经网络架构、噪声鲁棒特征、优化目标三方面介绍语音检测技术。第 4章首先介绍单通道(单麦克风拾音)语音增强和去混响技术的基本概念与评价指标、优化目标;然后介绍单通道语音增强技术的 3个技术发展,包括基于分类损失的频域语音增强、基于回归损失的频域语音增强、时域语音增强。第 5章介绍多通道(麦克风阵列拾音)语音增强的 3个代表性技术,分别是空间特征法、基于深度学习的波束形成法、面向自组织麦克风阵列的多通道深度学习方法。第 6章介绍多说话人语音分离技术,具体包括与说话人相关( speaker-dependent)的语音分离技术和与说话人无关( speaker-independent)的语音分离技术。第 7章首先介绍声纹识别的基本概念和前沿技术;然后介绍鲁棒声纹识别,具体包括声纹识别的降噪前端和自适应技术。第 8章首先介绍语音识别的基本概念和端到端语音识别的前沿技术;然后介绍鲁棒语音识别,具体包括语音识别的降噪前端和自适应技术。 深度学习是含有多个非线性隐藏层机器学习方法的统称,主要包括各种神经网络模型。神经网络是由具有适应性的简单单元组成的广泛并行互联网络,是现代语音技术跨越式发展的驱动力之一。本章将介绍神经网络的基本概念和一些代表当前技术发展水平的神经网络结构和算法,为本书其他章节所使用的神经网络模型提供共性基础。 2.1有监督学习 有监督学习( supervised learning)旨在通过有人工标注的训练数据学习从数据特征到人工标注的映射函数,使得该映射函数可以对没有标注的测试数据做出预测。 有监督学习的核心是映射函数(或称作“模型”)在新样本上的预测准确性,即模型的泛化( generalization)能力。它不仅与模型在训练数据上的准确性有关,还与模型的复杂度有关。一种常见的有监督学习思想是通过增加模型的复杂度来提升模型在训练数据上的准确度。但是,当模型的复杂度超过某种程度时,即使模型在训练数据上的准确度继续提升,也不会改善模型的泛化能力,甚至可能造成泛化能力的下降。这种现象称为过拟合( overfitting)现象。所以,用有监督学习方法训练模型时,需要遵从以下原则: ①在模型的复杂度和训练精度之间平衡,这通常通过划分训练集中的一部分数据作为模型的开发集( development set)来实现,通过选择在开发集上预测精度最高的模型来避免过拟合问题; ②当多个模型在训练集或开发集上取得相似的精度时,选择复杂度较小的模型,该原则被称为“奥卡姆剃刀”(Occam’s razor)准则。 本书中的大部分深度学习算法都是有监督学习方法。具体地,给定 N个有标记的训练数据组成的训练集 Xtrain = {(x1, y1), (x2, y2), ··· , (xN , yN )}和任意的测试数据 xtest,其中 (xn, yn)分别表示第 n个训练数据的特征和人工标注。有监督深度学习旨在将语音处理问题转化为分类或回归问题加以解决,它通过一个包含多个非线性隐藏层的模型 y = f(x),使得 f(xtest)的预测精度尽可能高。 分类任务的预测目标是离散值,如 one-hot编码。给定一个 C类分类问题,one-hot编码 y =[y1,y2, ··· ,yC ]T是一个 C维的向量,它的其中一维是 1,表示 x所属的类别,其他维度都是 0。分类任务最常见的训练目标是最小化交叉熵(minimum cross entropy): NC ∑∑ 1)① min . yn,c log([f(xn)]c(2.1) N n=1 c=1 其中,[f(xn)]c是模型的输出 f(xn)的第 c维,它表示 xn属于第 c类的概率。 回归任务的预测目标通常是连续值。假设目标是 L维向量 y =[y1,y2, ··· , yL]T,则常见的训练损失函数是最小均方误差( minimum mean squared error): ∑NNL ∑∑ min 1 ∥yn . f(xn)∥22 = min 1 |yn,l . [f(xn)]l|2 (2.2) NN n=1 n=1 l=1 其中,yn,l表示 y的第 l维;[f(xn)]l表示模型的输出 f(xn)的第 l维。 本章其余部分将集中介绍神经网络模型 f(·)的组成成分、典型结构、优化算法等。 2.2单层神经网络 2.2.1基本模型 神经网络最基本的成分是如图 2.1(a)所示的神经元模型。它通常包括权重矩阵、偏置( bias)和非线性激活函数三部分。神经元收到来自其他神经元传递来的输入信号 x =[x1,x2, ··· ,xD]T,通过权重 w =[w1,w2, ··· ,wD]T对这些信号进行放缩 wTx,再通过神经元内部的偏置 b相应增加或降低激活函数的网络输入,最后通过激活函数 .(·)产生神经元的输出 h = .(wTx + b)。通常,激活函数是一个非线性函数。 ①本书出现的对数,如果没有底数,则默认底数为 e。 图 2.1神经网络的基本单元 如图 2.1(b)所示,给定输入 x和 J维的输出 y =[y1,y2, ··· ,yJ ]T,一个标准的单层神经网络旨在构造从 x到 y的非线性映射函数。它由输入层、隐藏层、输出层组成。假设隐藏层包含 V个神经元,则这一组神经元的网络参 . ...... ...... 数可以写成一个权重矩阵: T w 1 T w W =2 (2.3) . . . T w V 和一个偏置向量 b =[b1,b2, ··· ,bV ]T,其中, wi和 bi分别表示第 i个神经元的权重和偏置,.i =1, 2, ··· ,V。给定隐藏层的输出为 h = .(Wx + b)。输出层通常是线性变换层 Wo,用于得到网络的最终输出 y = Woh。 2.2.2激活函数 激活函数 .(·)实现了神经网络的非线性变换功能。本节介绍 7种常见的激活函数。 1.单位阶跃函数 .. . 1,x . 0 .(x)= (2.4)0, x< 0 单位阶跃函数如图 2.2(a)所示。它描述了神经元模型的皆有或者皆无特 性( all-or-none property)。这种激活函数因在 0位置处不可导,所以常用于理论分析,在实际中较少使用。 图 2.2激活函数 2. Sigmoid函数 .(x)= ξ(x)= 1 (2.5) 1+ e.x Sigmoid函数( sigmoid function)如图 2.2(b)所示。它是严格的递增函数,将连续输入变换为 0至 1区间内的值,在线性和非线性行为之间显现出较好的平衡。 3.双曲正切函数 双曲正切函数( hyperbolic tangent function,tanh function)等于双曲正弦与双曲余弦的比值,即 sinh(x) exp(x) . exp(.x) .(x)= tanh(x)= = (2.6) cosh(x) exp(x)+ exp(.x) 双曲正切函数如图 2.2(c)所示。与 Sigmoid函数相比,双曲正切函数具有水平方向压缩、垂直方向扩展的形状,在 0附近与单位阶跃函数近似。需要注意的是,双曲正切函数的导函数极值为 1,有助于解决梯度消失问题。 4.线性整流激活函数 .(x)= max(0,x) (2.7) 线性整流激活函数( rectified linear unit,ReLU)如图 2.2(d)所示。它并不是全区间可导的,但可以求得次梯度( sub-gradient),且解决了正区间内梯度消失问题,计算速度与收敛速度快。 5.参数化线性整流激活函数 参数化线性整流激活函数( parametric ReLU,PReLU)是将所有的负值都设为零,即 { x, x . 0 .(x)= (2.8) αx, x< 0 参数化线性整流激活函数如图 2.2(e)所示。在 PReLU中,负值部分的斜率 α是从数据中学习得到的,而非预先定义的。 6.指数线性单元函数 指数线性单元( exponential linear unit,ELU)函数结合了 Sigmoid函数 和 ReLU函数的特点,其特点为左侧软饱和、右侧无饱和,函数公式为 { x, x . 0 .(x)= (2.9)α[exp(x) . 1], x< 0 指数线性单元激活函数如图 2.2(f)所示。它试图将激活函数的平均值接近零,从而加快学习的速度。同时,它还能通过正值的标识来避免梯度消失的问题。 7. Softmax函数 Softmax函数将多个神经元的输出分别映射到 (0, 1)内,它们的输出值的 和为 1: exp(xi) .(xi)= ∑ (2.10) exp(xj) j Softmax函数通常用于分类问题,其每个输出节点对应一个类,相应的输出值可以看成是输入数据属于该类的概率。该函数仅用于神经网络的输出层。 2.3前馈深度神经网络 前馈深度神经网络( feedforward deep neural network)也称多层感知机,是最基础的深度学习模型,它的基本结构如图 2.3所示。由图 2.3可知,前馈深度神经网络与本书 2.2.1节介绍的单层神经网络的不同之处仅在于它包括多 图 2.3前馈深度神经网络