2019-07-24 21:57:01 alice_tl 阅读数 176
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

最近在学习语音识别的一些知识,做了一些笔记,这篇文章讲讲语音识别的发展,以及相关的几个容易混淆的概念。

 

语音识别的背景

从物理声音被转换为电信号,再通过模数转换器转换为数据。一旦被数字化,就可适用若干种模型。语音识别的技术,就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术。

 

发展阶段

50年代:贝尔实验室开始语音识别的研究,主要研究基于简单的孤立词的语音识别系统。实现针对特定说话人的十个英文数字的孤立词语音识别系统。

60年代:出现三个关键的技术,提出一种时间规整的机制,采用动态规划算法实现动态时间规整DTW技术,利用音素动态跟踪的方法进行连续语音识别的开创性工作。为语音识别的后来发展奠定了基础。

70年代:语音识别技术快速发展的时期。实现大规模语音识别,大词汇量,孤立词识别。

80年代:基于隐马尔科夫模型的声学建模和基于n.gram的语言模型。尝试大词汇量、非特定人连续语音识别。

90年代:语音识别技术基本成熟的时期,基于GMM-HMM的语音识别框架得到广泛使用和研究。

20年代初期:语音识别并没有得到非常好的应用,因为系统的错误率还很高。2006年开始再度兴起。

 

学科基础

通信基础知识和信号处理、声学基本知识和特征、概率论和信息论、统计学、机器学习等等。

 

相关概念

语音识别

简称ASR(Automatic,Speech,Recognition),将声学语音进行分析,并得到对应的文字或拼音信息。

自然语言处理

简称NLP(Neuro-linguistic programming),用于将用户的语音转换为结构化的、机器可以理解的语言。

语音唤醒

简称KWS(keyword spotting),技术通过在设备或软件中预置唤醒词,当用户发出该语音指令时,设备便从休眠状态中被唤醒,并响应指令。

语音合成

简称TTS(Text To Speech),即将文本转换成语音,实现让机器说话。

声纹识别

简称VPR(Voice Print Recognition),根据说话人的声波特性进行身份辨识的服务,是生物识别技术的一种。

 

区别与联系

应用场景的区别

语音识别、声纹识别、自然语言处理,以及语音合成四者的目的和应用场景是不同的。

类型

简称

目的

应用场景

语音识别

ASR

语音——》文字

生成字幕、智慧会场、语音唤醒、智能客服

声纹识别

VPR

识别说话人的身份

身份认证、公安刑侦

语音唤醒

KWS

语音——》指令

小度音箱、小爱音箱

语音合成

TTS

文字——》语音

智能音箱

语言处理

NLP

语音——》语言

同声翻译、自动阅卷

以小米音箱为例(来自MTSC大会上小米工程师的分享)。

 

在四个阶段里,输入和输出分别是下方的内容:

阶段

唤醒KWS

语音识别ASR

语音处理NLP

语音播报TTS

IN

关键字语音

用户指令语音

用户指令文字

播报文字

OUT

是否唤醒

文字

应对处理+播报文字

播报语音

示例

小爱同学

回复我在

现在几点了

Domin:time

Intention:current time

To_speek:现在时间是九点

播放MP3音频:现在时间是九点

出于保护用户隐私和减少误识别两个因素的考虑,智能音箱一般在检测到唤醒词之后,才会开始进一步的复杂信号处理(声源定位、波束形成)和后续的语音交互过程。

一般而言,唤醒模块是一个小型语音识别引擎。由于语音唤醒的目标单一(检测出指定的唤醒词),唤醒只需要较小的声学模型和语言模型来区分出有无唤醒词出现),声学评分和解码可以很快,空间占用少,能够在本地实时。

所以讲到这里,亚马逊的音响半夜突然启动和开始说话,就不奇怪了~

 

语音识别与声纹识别的区别

最多人容易将语音识别和声纹识别混淆。

声纹识别和语音识别在原理上一样,都是通过对采集到的语音信号进行分析和处理,提取相应的特征或建立相应的模型,然后据此做出判断。但语音识别是从不同人的词语信号中寻找共同因素,声纹识别是通过语音波形中反映说话人生理和行为特征的语音参数。

声纹识别一般会连接到公安部的声纹数据库,鉴别人的身份。所承载的功能特点和人脸识别是一样的,都是为了证明,“你是张三,还是李四”。所以声纹识别不注重语音信号的语义,而是从语音信号中提取个人声纹特征,挖掘出包含在语音信号中的个性因素。

 

语音识别的分类

按使用范围分类

从语音识别的使用范围分类,可分为封闭域识别和开放域识别,具体概念及优劣如下方表格:

范围

概念

算法

应用场景

提供形式

封闭域识别

以预先指定的字/词集合为识别范围,对范围之外的语音会拒识

声学模型和语言模型进行裁剪,使得识别引擎的运算量变小

不涉及到多轮交互和多种语义说法的场景。

如电视盒子,智能音箱

一般将引擎封到嵌入式芯片或者本地化的SDK中,从而使识别过程完全脱离云端,摆脱对网络的依赖,并且不会影响识别率

开放域识别

无需预先指定识别词集合,在整个语言大集合范围中进行识别

声学模型和语音模型一般都比较大,引擎运算量也较大

实时性要求不高的客服语音质检,录制完的视频转字幕配置等。如会议字幕系统

基本上都只以云端形式提供(云端包括公有云形式和私有云形式),依赖于网络

按识别对象分类

根据识别的对象不同,语音识别任务大体可分为三类,孤立词识别、关键词识别、连续语音识别。

范围

概念

应用场景

孤立词识别

识别事先已知的孤立的词

如“开机”、“关机”等

关键词识别

检测针对的是连续语音,但它并不识别全部文字,而只是检测已知的若干关键词在何处出现

如在一段话中检测“计算机”、“世界”这两个词

连续语音识别

识别任意的连续语音,

如一个句子或一段话

按发音人分类

根据发音人,可以把语音识别技术分为特定人语音识别和非特定人语音识别。

特定人语音识别(SD)只能识别一个或几个人的语音。

非特定人语音识别(SI)可以被任何人使用系统,更符合实际需要,但要比针对特定人的识别困难得多。

2018-05-03 20:20:03 luodongri 阅读数 7028
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

目前主流的语音识别都大致分为特征提取,声学模型,语音模型几个部分。目前结合神经网络的端到端的声学模型训练方法主要CTC和基于Attention两种。

本文主要介绍CTC算法的基本概念,可能应用的领域,以及在结合神经网络进行CTC算法的计算细节。

CTC算法概念

CTC算法全称叫:Connectionist temporal classification。从字面上理解它是用来解决时序类数据的分类问题。

传统的语音识别的声学模型训练,对于每一帧的数据,需要知道对应的label才能进行有效的训练,在训练数据之前需要做语音对齐的预处理。而语音对齐的过程本身就需要进行反复多次的迭代,来确保对齐更准确,这本身就是一个比较耗时的工作。

这里写图片描述
图1 “你好”发音的波形示意图

如图1所示,是“你好”这句话的声音的波形示意图, 每个红色的框代表一帧数据,传统的方法需要知道每一帧的数据是对应哪个发音音素。比如第1,2,3,4帧对应n的发音,第5,6,7帧对应i的音素,第8,9帧对应h的音素,第10,11帧对应a的音素,第12帧对应o的音素。(这里暂且将每个字母作为一个发音音素)

与传统的声学模型训练相比,采用CTC作为损失函数的声学模型训练,是一种完全端到端的声学模型训练,不需要预先对数据做对齐,只需要一个输入序列和一个输出序列即可以训练。这样就不需要对数据对齐和一一标注,并且CTC直接输出序列预测的概率,不需要外部的后处理。

既然CTC的方法是关心一个输入序列到一个输出序列的结果,那么它只会关心预测输出的序列是否和真实的序列是否接近(相同),而不会关心预测输出序列中每个结果在时间点上是否和输入的序列正好对齐。
这里写图片描述
图2 ctc预测结果示意图

CTC引入了blank(该帧没有预测值),每个预测的分类对应的一整段语音中的一个spike(尖峰),其他不是尖峰的位置认为是blank。对于一段语音,CTC最后的输出是spike(尖峰)的序列,并不关心每一个音素持续了多长时间。
如图2所示,拿前面的nihao的发音为例,进过CTC预测的序列结果在时间上可能会稍微延迟于真实发音对应的时间点,其他时间点都会被标记会blank。
这种神经网络+CTC的结构除了可以应用到语音识别的声学模型训练上以外,也可以用到任何一个输入序列到一个输出序列的训练上(要求:输入序列的长度大于输出序列)。
比如,OCR识别也可以采用RNN+CTC的模型来做,将包含文字的图片每一列的数据作为一个序列输入给RNN+CTC模型,输出是对应的汉字,因为要好多列才组成一个汉字,所以输入的序列的长度远大于输出序列的长度。而且这种实现方式的OCR识别,也不需要事先准确的检测到文字的位置,只要这个序列中包含这些文字就好了。

RNN+CTC模型的训练

下面介绍在语音识别中,RNN+CTC模型的训练详细过程,到底RNN+CTC是如何不用事先对齐数据来训练序列数据的。
首先,CTC是一种损失函数,它用来衡量输入的序列数据经过神经网络之后,和真实的输出相差有多少。

比如输入一个200帧的音频数据,真实的输出是长度为5的结果。 经过神经网络处理之后,出来的还是序列长度是200的数据。比如有两个人都说了一句nihao这句话,他们的真实输出结果都是nihao这5个有序的音素,但是因为每个人的发音特点不一样,比如,有的人说的快有的人说的慢,原始的音频数据在经过神经网络计算之后,第一个人得到的结果可能是:nnnniiiiii…hhhhhaaaaaooo(长度是200),第二个人说的话得到的结果可能是:niiiiii…hhhhhaaaaaooo(长度是200)。这两种结果都是属于正确的计算结果,可以想象,长度为200的数据,最后可以对应上nihao这个发音顺序的结果是非常多的。CTC就是用在这种序列有多种可能性的情况下,计算和最后真实序列值的损失值的方法。

详细描述如下:

训练集合为S={(x1,z1),(x2,z2),...(xN,zN)}, 表示有N个训练样本,x是输入样本,z是对应的真实输出的label。一个样本的输入是一个序列,输出的label也是一个序列,输入的序列长度大于输出的序列长度。

对于其中一个样本(x,z)x=(x1,x2,x3,...,xT)表示一个长度为T帧的数据,每一帧的数据是一个维度为m的向量,即每个xiRmxi可以理解为对于一段语音,每25ms作为一帧,其中第i帧的数据经过MFCC计算后得到的结果。

z=(z1,z2,z3,...zU)表示这段样本语音对应的正确的音素。比如,一段发音“你好”的声音,经过MFCC计算后,得到特征x, 它的文本信息是“你好”,对应的音素信息是z=[n,i,h,a,o](这里暂且将每个拼音的字母当做一个音素)。

特征x在经过RNN的计算之后,在经过一个softmax层,得到音素的后验概率yykt(k=1,2,3,...n,t=1,2,3,...,T)表示在t时刻,发音为音素k的概率,其中音素的种类个数一共n个, k表示第k个音素,在一帧的数据上所有的音素概率加起来为1。即:

t1Tykt=1,ykt0

这个过程可以看做是对输入的特征数据x做了变换Nw:(Rm)T(Rn)T,其中Nw表示RNN的变换,w表示RNN中的参数集合。

过程入下图所示:
这里写图片描述

以一段“你好”的语音为例,经过MFCC特征提取后产生了30帧,每帧含有12个特征,即xR30×14(这里以14个音素为例,实际上音素有200个左右),矩阵里的每一列之和为1。后面的基于CTC-loss的训练就是基于后验概率y计算得到的。

路径π和B变换

在实际训练中并不知道每一帧对应的音素,因此进行训练比较困难。可以先考虑一种简单的情况,已知每一帧的音素的标签z, 即训练样本为xz,其中z不再是简单的[n,i,h,a,o]标签,而是:

z=[n,n,n,...,nT1,i,i,i,...iT2,h,h,h,...hT3,a,a,a,...,aT4,o,o,o,...,oT5]

T1+T2+T3+T4+T5=T
在我们的例子中, z=[n,n,n,n,n,n,n,i,i,i,i,i,i,h,h,h,h,h,h,h,a,a,a,a,a,a,o,o,o,o,o,o,o]z包含了每一帧的标签。在这种情况下有:
p(z|x)=p(z|y=Nw(x))=yz11yz22yz33....yzTT (1)

该值即为后验概率图中用黑线圈起来的部分相乘。我们希望相乘的值越大越好,因此,数学规划可以写为:

minwlog(yz11.yz22.yz33...yzTT) (2)

subject to: y=Nw(x) (3)

目标函数对于后验概率矩阵y中的每个元素ykt的偏导数为:
log(yz11.yz22.yz33...yzTT)ykt={yz11...yzi1i1.yzi+1i+1....yzTTyz11.yz22.yz33...yzTT,ifk=ziandt=i0

也就是说,在每个时刻t(对应矩阵的一列),目标只与yztt是相关的,在这个例子中是与被框起来的元素相关。

其中Nw可以看做是RNN模型,如果训练数据的每一帧都标记了正确的音素,那么训练过程就很简单了,但实际上这样的标记过的数据非常稀少,而没有逐帧标记的数据很多,CTC可以做到用未逐帧标记的数据做训练。

首先定义几个符号:
L={a,o,e,i,u,uˇ,b,p,m,...}

表示所有音素的集合

π=(π1,π2,π3,...,πT),πiL

表示一条由L中元素组成的长度为T的路径,比如z就是一条路径,以下为几个路径的例子:

π1=(j,j,i,n,y,y,e,e,w,w,u,u,u,r,r,e,e,n,n,r,r,u,u,sh,sh,u,u,i,i)
π2=(n,n,n,n,i,i,i,i,h,h,h,h,a,a,a,a,a,a,a,a,a,o,o,o,o,o,o,o,o,o)
π3=(h,h,h,h,h,h,a,a,a,a,a,a,a,o,o,o,o,n,n,n,n,n,n,i,i,i,i,i,i,i)
π4=(n,i,h,a,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o)
π5=(n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,i,h,a,o)
π6=(n,n,n,i,i,i,h,h,h,h,h,a,,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o)

这6条路径中,π1可以被认为是“今夜无人入睡”, π2可以被认为是在说“你好”,π3可以被认为是在说“好你”,π4,π5,π6都可以认为是在说“你好”。

定义B变换,表示简单的压缩,例如:
B(a,a,a,b,b,b,c,c,d)=(a,b,c,d)

以上6条路径为例:
B(π1)=(j,i,n,y,e,w,u,r,e,n,r,u,s,h,u,i)
B(π2)=(n,i,h,a,)
B(π3)=(h,a,o,n,i)
B(π4)=(n,i,h,a,o)
B(π5)=(n,i,h,a,o)
B(π6)=(n,i,h,a,o)

因此,如果有一条路径πB(π)=(n,i,h,a,o),则可以认为π是在说“你好”。即使它是如π4所示,有很多“o”的音素,而其他音素很少。路径π=(π1,π2,...,πT)的概率为它所经过的矩阵y上的元素相乘:

p(π|x)=p(π|y=Nw(x))=p(π|y)=t=1Tyπtt

因此在没有对齐的情况下,目标函数应该为{π|B(π)=z}中所有元素概率之和。 即:
maxwp(z|y=Nw(x))=p(z|x)=B(π)=zp(π|x) (4)

在T=30,音素为[n,i,h,a,o]的情况下,共有C295120000条路径可以被压缩为[n,i,h,a,o]。 路径数目的计算公式为CT1,量级大约为(T1)。一段30秒包含50个汉字的语音,其可能的路径数目可以高达108,显然这么大的路径数目是无法直接计算的。因此CTC方法中借用了HMM中的向前向后算法来计算。

训练实施方法

CTC的训练过程是通过p(z|x)w调整w的值使得4中的目标值最大,而计算的过程如下:
这里写图片描述

因此,只要得到p(z|x)ykt,即可根据反向传播,得到p(z|x)w。下面以“你好”为例,介绍该值的计算方法。

首先,根据前面的例子,找到所有可能被压缩为z=[n,i,h,a,o]的路径,记为{π|B(π)=z}。 可知所有π均有[n,n,n,....,n,i,.....,i,h,.....h,a,....a,o,...,o]的形式,即目标函数只与后验概率矩阵y中表示n,i,h,a,o的5行相关,因此为了简便,我们将这5行提取出来,如下图所示。

这里写图片描述

在每一个点上,路径只能向右或者向下转移,画出两条路径,分别用q和r表示,这两条路径都经过yh14这点,表示这两点路径均在第14帧的时候在发“h”音。因为在目标函数4的连加项中,有的项与yh14无关,因此可以剔除这一部分,只留下与yh14有关的部分,记为{π|B(π)=z,π14=h}

p(z|y)yh14

= B(π)=zp(π|y)yh14

= B(π)=zt=1Tyπttyh14
=B(π)=z,π14=ht=1Tyπttyh14+B(π)=z,π14ht=1Tyπttyh14yh14

=B(π)=z,π14=ht=1Tyπttyh14

这里的q和r就是与yh14相关的两条路径。用q1:13q15:30分别表示qyh14之前和之后的部分,同样的,用r1:13r15:30分别表示ryh14之前和之后的部分.。可以发现,q1:13+h+r15:30r1:13+h+q15:30同样也是两条可行的路径。q1:13+h+r15:30r1:13+h+q15:30qr这四条路径的概率之和为:
yq11..yq1313.yh14.yq1515....yq3030q

+yq11..yq1313.yh14.yr1515....yr3030q1:14+r14:30

+yr11..yr1313.yh14.yq1515....yq3030r1:14+q14:30

+yr11..yr1313.yh14.yr1515....yr3030r

=(yq11....yq1313+yr11.....yr1313).yh14.(yq1515....yq1530+yr1515....yr3030)

可以发现,该值可以总结为:(前置项).yh14.(后置项)。由此,对于所有的经过yh14的路径,有:

B(π)=z,π14=ht=1Tyπtt=().yh14.(后置项)$

定义:
α(14)(h)=().yh14=B(π1:14)=[n,i,h]t=1tyπtt

该值可以理解为从初始到yh14这一段里,所有正向路径的概率之和。并且发现,α14(h)可以由α13(h)α13(i)递推得到,即:
α14(h)=(α13(h)+α13(i))yh14

该递推公式的含义是,只是在t=13时发音是“h”或“i”,在t=14时才有可能发音是“h”。那么在t=14时刻发音是“h”的所有正向路径概率α14(h)就等于在t=13时刻,发音为“h”的正向概率α13(h)加上发音为“i”的正向概率α13(i),再乘以当前音素被判断为“h”的概率yh14。由此可知,每个αt(s)都可以由αt1(s)αt1(s1)两个值得到。α的递推流程如下图所示:

这里写图片描述

即每个值都由上一个时刻的一个或者两个值得到,总计算量大约为2.T.。类似的,定义βt(s), 递推公式为:

β14(h)=(β15(h)+β15(a))yh14

因此有:

B(π)=z,π14=ht=1Tyπtt=().yh14.(后置项)$

=α14(h)yh14.yh14.β14(h)yh14

=α14(h)β14(h)yh14

然后:

p(z|y)yh14

= B(π)=z,π14=ht=1Tyπttyh14

= α14(h)yh14.yh14.β14(h)yh14yh14

=α14(h)β14(h)(yh14)2

得到此值后,就可以根据反向传播算法进行训练了。
可以看到,这里总的计算量非常小,计算αβ的计算量均大约为(2.T.),(加法乘法各一次),得到αβ之后,在计算对每个ykt的偏导值的计算量为(3.T.),因此总计算量大约为(7.T.),这是非常小的,便于计算。

目前,深度学习的算法已经大规模应用于腾讯云的语音识别产品中。腾讯云拥有业内最先进的语音识别技术,基于海量的语音数据,积累了数十万小时的标注语音数据,采用LSTM,CNN,LFMMI,CTC等多种建模技术,结合超大规模语料的语言模型,对标准普通话的识别效果超过了97%的准确率。腾讯云的语音技术,应用涵盖范围广泛,具备出色的语音识别、语音合成、关键词检索、静音检测、语速检测、情绪识别等能力。并且针对游戏,娱乐,政务等几十个垂直做特殊定制的语音识别方案,让语音识别的效果更精准,更高效,全面满足电话客服质检、语音听写、实时语音识别和直播字幕等多种场景的应用。

2019-08-14 11:57:52 asrgreek 阅读数 926
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

由于LSTM在序列化建模中的,在声学建模中经常使用LSTM模型。在语音识别中,通常为了获得更低的wer,我们通常使用多层的lstm结构。”多层“就会带来如下显而易见的问题:

  • 模型参数变多,训练慢
  • 梯度信息回流受阻,导致梯度消失

为了解决上述问题,下面我们介绍几种在声学建模中常见的lstm变种。

一、LSTMP

该变种的主要目的是为了减小模型参数。具体结构如下:
在这里插入图片描述
与传统的LSTM相比,LSTMP在记忆块(memory blocks)与模型的输出层之间引入了映射层。具体的公式对比如下:
在这里插入图片描述
需要说明的是:
1、rtr_{t}表示的是recurrent projection,也就是说rtr_{t}会作为下一个时间点各个门的输入;
2、ptp_{t}表示的是non-recurrent projection,这个映射可有可无,对结果影响不大。

通过加入了映射层,模型参数能得到有效减少,模型参数的计算可以参考https://blog.csdn.net/u014665013/article/details/81531620,下面我们给出直观的答案:
假设我们的cell units的大小是256,输入的维数是100,输出的维数是30,那么传统的LSTM参数个数是:在这里插入图片描述结果为:372992

但是加入projection layer之后,假设输出维度为128,的参数个数是:
结果为:270848在这里插入图片描述
模型参数减少了相对(372992-270848)/372992=27.39%。

参考文献:
1、《LONG SHORT-TERM MEMORY BASED RECURRENT NEURAL NETWORK ARCHITECTURES FOR LARGE VOCABULARY SPEECH RECOGNITION》
2、《Long Short-Term Memory Recurrent Neural Network Architectures for Large Scale Acoustic Modeling》

二、Highway LSTM

该变种的主要目的是为了解决多层LSTM网络引起的梯度弥散问题。Highway翻译成中文就是”高速公路“,也就是说Highway LSTM提供了一条”高速公路“,让信息(细胞状态)可以在不同层之间畅通无阻的流通。

具体结构如下:
在这里插入图片描述
通过上图,我们可以看出Highway LSTM增加了一个控制门,叫carry gate(上图中的dt(l+1)d_{t}^{(l+1)}),用来控制低层的细胞状态有多少信息可以传递给高层的细胞状态(这是一种空间上的捷径,具体什么叫空间上的捷径,在下面的Residual LSTM中会详细介绍)。如果carry gate为1,那么就像是一条”高速公路“,低层的细胞状态就可以畅通无阻的流向高层。

与传统的LSTM相比,公式如下:
在这里插入图片描述
从公式对比中我们可以看出,在Highway LSTM,l+1层t时刻的细胞状态不仅取决于l+1层t-1时刻的细胞状态(与传统LSTM相同),而且还取决于l层t时刻的细胞状态(Highway LSTM特有)

参考文献:
1、《Highway long short-term memory RNNs for distant speech recognition》

三、Residual LSTM

通过使用Highway LSTM建模发现,当从3层HLSTM增加到8层时,字错误率(wer)反而上升了,如下:
在这里插入图片描述
这就是所谓的Degration problem,即随着网络深度的增加训练/开发集的错误率不降反增。为了解决这个问题,Residual LSTM被提出。Residual LSTM也是借鉴了Highway LSTM的思想。具体结构如下:

在这里插入图片描述
从图中我们可以看出,
1、Residual LSTM有一条空间上的捷径(对应绿色方块的Shortcut Path)。绿色方块怎么理解呢?它表达的是l层的输入xtlx_{t}^{l}是来自l-1层的输出htl1h_{t}^{l-1}。这里的空间指的是不同层的LSTM之间(论文中空间上的捷径用a spatial shortcut表达)。当然Residual LSTM也有一条时间上的捷径,怎么体现呢?图中l层t时刻的细胞状态依赖于l层t-1时刻的细胞状态,因此说它也提供了一条时间上的捷径(这一点传统LSTM也有,论文中时间上的捷径用a temporal shortcut path表示)
2、与Highway LSTM不同,Highway LSTM通过额外引入了carry gate来限制空间上的捷径的畅通程度。而Residual LSTM则直接使用output gate代替carry gate来限制空间上的捷径的畅通程度。通过这个代替,能有效超过减少10%的参数数量。
3、与Highway LSTM不同,Highway LSTM的时间捷径和空间捷径是应用在同一个对象上,即细胞状态。而Residual LSTM的时间捷径是应用在细胞状态,而空间捷径是应用在输出层。
这样做的好处,引用论文原话为:

Compared with the previous work, high- way LSTM, residual LSTM separates a spatial shortcut path with temporal one by using output layers, which can help to avoid a conflict between spatial and temporal-domain gradient flows.

与传统LSTM相比,公式如下:
在这里插入图片描述
注意,Residual LSTM公式下的xtlx_{t}^{l}就是来自l-1层的输出htl1h_{t}^{l-1}
通过公式我们可以看到,Residual LSTM也有一个映射层,即mtlm_{t}^{l}。与LSTMP不同的是,LSTMP是先通过输出门在做映射,而Residual LSTM是先映射在通过输出门。

作者使用了3,5,10层的Highway LSTM和Residual LSTM做实验,实验结果如下:
在这里插入图片描述
实验结果表明随着层数的加深,Residual LSTM的wer不断地在提升,而Highway LSTM反而变差。说明Residual LSTM能很好的解决Degration problem。

参考文献:
1、《Design of a Deep Recurrent Architecture for Distant Speech Recognition》

2018-01-05 10:58:01 w_manhong 阅读数 13050
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

语音识别对特征参数有如下要求:

1. 能将语音信号转换为计算机能够处理的语音特征向量

2. 能够符合或类似人耳的听觉感知特性

3. 在一定程度上能够增强语音信号、抑制非语音信号

常用特征提取方法有如下几种:

(1)线性预测分析(LinearPredictionCoefficients,LPC)

    拟人类的发声原理,通过分析声道短管级联的模型得到的。假设系统的传递函数跟全极点的数字滤波器是相似的,通常用12-16个极点就可以描述语音信号的特征。所以对于n时刻的语音信号,我们可以用之前时刻的信号的线性组合近似的模拟。然后计算语音信号的采样值和线性预测的采样值。并让这两者之间达到均方的误差(MSE)最小,就可以得到LPC。

(2)感知线性预测系数(PerceptualLinearPredictive,PLP)

    一种基于听觉模型的特征参数。该参数是一种等效于LPC的特征,也是全极点模型预测多项式的一组系数。不同之处是PLP是基于人耳听觉,通过计算应用到频谱分析中,将输入语音信号经过人耳听觉模型处理,替代LPC所用的时域信号,这样的优点是有利于抗噪语音特征的提取。

(3)Tandem特征和Bottleneck特征

    这是两种利用神经网络提取的两类特征。Tandem特征是神经网络输出层节点对应类别的后验概率向量降维并与MFCC或者PLP等特征拼接得到。Bottleneck特征是用一种特殊结构的神经网络提取,这种神经网络的其中一个隐含层节点数目比其他隐含层小的多,所以被称之为Bottleneck(瓶颈)层,输出的特征就是Bottleneck特征。

(4)基于滤波器组的Fbank特征(Filterbank)

    亦称MFSC,Fbank特征的提取方法就是相当于MFCC去掉最后一步的离散余弦变换,跟MFCC特征相比,Fbank特征保留了更多的原始语音数据。

(5)线性预测倒谱系数(LinearPredictiveCepstralCoefficient,LPCC)

    基于声道模型的重要特征参数。LPCC是丢弃了信号生成过程中的激励信息。之后用十多个倒谱系数可以代表共振峰的特性。所以可以在语音识别中取得很好的性能。

(6)梅尔频率倒谱系数(MelFrequencyCepstrumCoefficient,MFCC)

     基于人耳听觉特性,梅尔频率倒谱频带划分是在Mel刻度上等距划分的,频率的尺度值与实际频率的对数分布关系更符合人耳的听觉特性,所以可以使得语音信号有着更好的表示。1980年由Davis和Mermelstein搞出来的。从那时起。在语音识别领域,MFCC可谓是鹤立鸡群,一枝独秀。

Q: MFCC为何一枝独秀

    人通过声道产生声音,声道的shape决定了发出怎样的声音。声道的shape包括舌头,牙齿等。如果我们可以准确的知道这个形状,那么我们就可以对产生的音素phoneme进行准确的描述。声道的形状在语音短时功率谱的包络中显示出来。而MFCC就是一种准确描述这个包络的一种特征。

声谱图

    处理语音信号,如何去描述它很重要,因为不同的描述方式放映它不同的信息,而声谱图的描述方式是最利于观测和理解的。

    由上图可知,这段语音被分为很多帧,每帧语音都对应于一个频谱(通过短时FFT计算),频谱表示频率与能量的关系。在实际使用中,频谱图有三种,即线性振幅谱、对数振幅谱、自功率谱(对数振幅谱中各谱线的振幅都作了对数计算,所以其纵坐标的单位是dB(分贝)。这个变换的目的是使那些振幅较低的成分相对高振幅成分得以拉高,以便观察掩盖在低幅噪声中的周期信号)。

 

                        

    先将其中一帧语音的频谱通过坐标表示出来,如上图(a)。旋转90度,得到图(b)。把这些幅度映射到一个灰度级表示,得到了图(c)。这样操作的原因是为了增加时间维度,,得到一个随着时间变化的频谱图,这个就是描述语音信号的声谱图(spectrogram)。这样就可以显示一段语音而不是一帧语音的频谱,而且可以直观的看到静态和动态的信息。

       

倒谱分析(CepstrumAnalysis)

    下面是一个语音的频谱图。峰值就表示语音的主要频率成分,我们把这些峰值称为共振峰(formants),而共振峰就是携带了声音的辨识属性,用它就可以识别不同的声音。因此,需要把它提取出来。要提取的不仅是共振峰的位置,还得提取它们转变的过程。所以我们提取的是频谱的包络(SpectralEnvelope)。这包络就是一条连接这些共振峰点的平滑曲线。

                      

    由上图可以看出,原始的频谱由两部分组成:包络和频谱的细节。因此需要把这两部分分离开,就可以得到包络了。按照下图的方式进行分解,在给定logX[k]的基础上,求得logH[k]和logE[k]满足logX[k]=logH[k]+logE[k]。

     

    由上面这个图我们可以看到,包络主要是低频成分,而高频主要是频谱的细节。把它俩叠加起来就是原来的频谱信号了。即,h[k]是x[k]的低频部分,因此将x[k]通过一个低通滤波器就可以得到h[k]了,也就是频谱的包络。

 

    以上解卷过程的专业术语叫做同态信号处理,(另一种方法为基于线性变换)。语音本身可以看成是声道冲击信息(包括话者个性信息、语义信息,表现为频谱低频成分)经过声门激励的一个响应函数,在时域上表现为卷积形式。为将二者分离开来,求得声道共振特征和基音周期,需要把这种非线性问题转化为线性问题第一步通过FFT将其变成了乘性信号(时域的卷积相当于频域的乘积);第二步通过取对数将乘性信号转化为加性信号;第三步进行逆变换,使其恢复为卷性信号。此时,虽然前后均是时域序列,但它们所处的离散时域显然不同,所以后者称为倒谱频域。计算过程如下图所示。

 

附上MFCC求取流程:https://blog.csdn.net/xiaoding133/article/details/8106672

 

2019-11-11 19:42:43 qq_40168949 阅读数 34
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

声学模型

描述一种语言的基本单位被称为音素Phoneme,例如BRYAN这个词就可以看做是由B, R, AY, AX, N五个音素构成的。英语中貌似有50多个音素,可以用50几个HMM state来表示这些音素,这种表示方法就是context independent模型中的单音素monophone模式。然而语音没有图像识别那么简单,因为我们再说话的时候很多发音都是连在一起的,很难区分,所以一般用左中右三个HMM state来描述一个音素,也就是说BRYAN这个词中的R音素就变成了用B-R, R, R-AY三个HMM state来表示。这样BRYAN这个词根据上下文就需要15个state了,根据所有单词的上下文总共大概需要几千个HMM state,这种方式属于context dependent模型中的三音素triphone模式。这个HMM state的个数在各家语音识别系统中都不一样,是一个需要调的参数。所以声学模型就是如何设置HMM state,对于信号中的每一frame抽怎样的特征,然后用训练什么分类器。【1】

英文的建模单元

 kaldi工具箱timit例子中找到的现在英语标准的61-48-39的建模单元,从61个phone的基础上把发音相似的phone归成一个phone,降建模单元减为48个,同样的思路,再减为39个。要用这个建模单元表时,你得首先保证你数据库的标注文本都是用这样的phone标的。【2】

中文的建模单元

通常来说汉语声母、韵母建模比按phone建模识别效果要好,下图是于胜民前辈文章中的汉语建模单元(声韵母,一共61个)。可以看出,其中对韵母i的建模有i1, i2, i3,是因为在不同的情况下有不同的调。

在这里插入图片描述
在这里插入图片描述
因此,中文的声韵母建模一般是带调的建模方式,建模单元会更多,在阿里用过249个声韵母带调建模单元的。有一些建模单元的选取也会根据使用的音库而做一些增减,比如说儿化音比较重的音库,就会在文本标注中都把儿化音标出来了,然后通过列出数据库的所有建模单元,再听各种单元的发音,最后把发音相似的单元归为一个,类似英语中做的phone的映射。

感言:无论你识别哪种语言,构造语言的建模单元很重要的一点是你要自己去听你数据库里的发音,最好不要照搬别的建模单元,因为数据库间是有差别的。当然,如果你的数据库里本身有phone表,那你就简单听听音频,看看文本,对数据库做个直观认识就好了,就用人家自带的phone单元就好,就不用自己瞎忙活啦

参考:
【1】传统语音识别(GMM+HMM
【2】英文,中文,日语中的声学建模单元
【3】语音识别科普篇-术语定义-音素/音节/音标

CTC语音识别

阅读数 719

NLP之语言模型

阅读数 5676

没有更多推荐了,返回首页