摘要
语音是人们沟通交流最直接、最自然的交互方式。自计算机问世以来,人们就一直希望可以通过语音实现人和计算机之间的交互,而语音识别技术,目标就是通过把人类的语音中的词汇内容转换为相应的文本,架起了人机交互的桥梁。对于一个语音识别系统,速度和精度是两个核心指标,直接决定着系统是否可用。其中,识别速度的提升意味着可以降低成本,同时提供更多的语音服务,一直是语音识别技术研究的重点方向。在语音识别系统中,声学模型得分的运算量一般会达到整个系统的40%-70%,因此也是识别速度优化的重点模块。本文就来讲讲如何优化声学模型得分计算。
基本概念介绍
特征向量:语音数据在识别前首先会被分成多帧数据,一般帧长为25毫秒,帧移为10毫秒。每一帧语音数据经过特征提取之后,会生成一帧特征,称之为一个特征向量或特征矢量 ,其中n为特征向量的维数。
HMM state:语音识别中的建模单元,简称为state,使用混合高斯模型(GMM)模型描述,每个mixture服从正态分布其中为均值向量,为协方差矩阵,是对角阵。
似然值:特征向量O在state上的声学模型得分。其计算步骤分为两步:
a)计算O在每个mixture分量上的似然值,其计算公式为:
其中,j表示state的第j个mixture分量, 是常量, 为O在第j个mixture分量上的似然值。
其中,m为state中mixture分量的个数, 为O在state上的似然值,等于各mixture的似然值在log域的相加,因而这步被称为logAdd操作。
优化方法
下面先介绍三种无损识别精度的优化方法:
1、代码加速:使用SSE指令或者intel IPP加速库
这种方法利用编程语言指令集的优化,通过减少CPU需要操作的指令数来达到加速。其中的intel IPP加速库直接提供了一套计算似然值的函数库,加速效果非常明显,可以达到40%。
2、硬件加速:使用GPU加速
GPU一直以其强大的计算能力著称,十分适合矩阵相乘这类计算密集型的运算。为了能充分发挥GPU的加速效果,我们需要对似然值的计算公式略作改写:
经过转换之后,每个mixture都可以用一个行向量表示,m个mixture可以组成一个大矩阵M = (A1,A2,…,Am)T,同理n帧的特征矢量也可以组成一个矩阵F = (Z1,Z2,…,Zn)。这样同时求解多个mixture在多帧上的似然值就可以用两个矩阵的乘积来实现。而每个state各mixture分量的logAdd过程相互独立,因此这一步也可以在GPU上并行计算。一般情况下,GPU可以达到100倍以上的加速效果,也就意味着GPU可以将原来在语音识别中最耗时的声学得分计算所占比重降到低于1%。由于这种方法需要一个额外的硬件设备GPU,价格比较昂贵,因而并没有被大规模使用。
3、 CPU cache加速:一次计算state在多帧特征上的似然值
这种方法利用了语音识别的特点,在识别过程中一旦某个state被激活之后,在后面的连续几帧中这个state极有可能仍会处于活跃状态,即在处理后面的特征时还需要计算这个state的似然值。那么我们可以在第一次激活state时,同时计算这个state在从当前帧开始的连续多帧,也不会导致过多不必要的计算。另一方面却可以利用CPU cache,不用多次从内存中加载state的模型参数到CPU中,从而达到加速的目的。这种方法约有10%的加速效果,一般配合方法1使用。
上面介绍的三种方法,都是对声学模型得分进行了精确计算,因此不会带来任何识别精度的下降。如果想做进一步优化,就需要对state的似然值计算公式做些调整。
1、动态高斯选择法
其思想是用似然值最大的mixture分量来近似logAdd:
那么如何来选出这个最大值呢?大家可能认为这还不简单?把每个mixture的似然值先计算出来,然后选个最大值就可以了。那接下来我们看看有没有更好的方法?仔细分析mixture似然值的计算公式:
我们会发现,这是一个随i增加而递减的函数。我们可以先计算出 ,在计算其他的时,在i从1增加的n的过程中,我们可以判断当前已经计算出来的值是否比 小,如果已经比 小,那们这个mixture一定不是最大的,因为随着i的增加,这个值会不断减小,因而这个mixture就可以直接跳过,从而减少计算量。这种方法约有15%的加速效果,但是会带来0.5个点左右的识别率损失