2015-05-24 17:38:46 xiaoding133 阅读数 4277
  • C++语音识别开篇

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

    5918 人正在学习 去看看 杨波

              本文主要采用matlab和C语言设计并实现了一个鲁棒性语音识别实验系统,通过该系统验证各种抗噪语音特征在不同信噪比的噪声环境下的识别率,并详细介绍了系统的结构以及开发工具与平台,最后介绍了系统的功能、实验流程以及该系统的实现。

系统演示下载路径:http://pan.baidu.com/s/1o61Kaa2

一、系统结构

        本文研究的是非特定人鲁棒性语音识别,采用的是小词汇量孤立词语音。本系统使用了两种语音识别模型,分别为HMM模型和VQ模型。在系统中,利用HMM模型进行抗噪鲁棒性语音识别,采用VQ模型进行SLVQ算法的评估。通过语音库的训练得到识别模型,然后对待测试语音进行识别。其系统结构如图1-1。


图1-1系统结构图

在图1-1所示的结构图中,语音预处理与特征和模型训练器是整个系统的核心。特征提取是训练器的前提,同时也是识别器的前提。语音采集模块完成录音,可以作为语音库来训练识别模型。结果输出模块主要用于将中间识别结果以及系统其他状态信息显示出来。

二、开发工具与平台

本文的语音识别系统在PC上,采用Matlab(R2010b)作为开发工具。语音识别模型HMM采用PMT(Probabilistic Model Toolkit)[97]工具包进行二次开发。下面简单介绍下Matlab和PMT。

Matlab是一个功能强大的科学及工程计算工具,它将矩阵运算、数值分析、图形处理、编程技术等功能有机地结合在一起,被广泛应用于自动控制、系统仿真、图形图像分析、数字信号处理、人工智能、虚拟现实等领域。本系统采用Matlab的主要原因如下:

(1) 丰富的数学函数库;Matlab包含了大量的数学函数库,有求和、复数运算、矩阵运算以及傅里叶变换等函数,这些都为语音信号的处理带来了方便。

(2) 强大的图形功能;它提供了丰富的图形函数库,用一些简单的命令就可以完成多维数据的显示以及图像处理,也可以完成图形用户界面的设计,很方便地完成自己的运算和控制代码。

(3) 应用程序接口(API);它提供了应用程序接口函数库,允许用户使用C或C++语言编写程序与Matlab连接,本系统多处采用C语言编写的程序,采用MEX接口调用,弥补了Matlab速度慢的缺点。

PMT工具包是惠普开发公司提供的一个Matlab和C语言编写的概率模型包,它可以用来建立基本的静态和动态概率模型,目前支持的概率模型包括高斯混合、马尔可夫链、隐马尔可夫模型、线性动态系统等。对于每个概率模型都包括推理、学习的函数,采用最大似然估计来计算模型参数。由于工具包中很多核心函数是采用C语言编写的,提高了运行速度并且可以进行功能扩展。

2.1C-MEX技术

所谓MEX是Matlab Executable的缩写,即Matlab的可执行程序。在Windows操作系统中,它是以DLL为后缀名的文件。MEX文件是Matlab调用其他语言编写的程序算法接口。通过它,用户可以完成以下功能[98]

(1)代码重用

可以在Matlab系统中像调用Matlab的内在函数一样调用已经存在的用C语言或C++语言编写完成的算法,通过添加入口程序mexFunciton,而无须将这些函数重新编写为Matlab的M文件,从而使资源得到充分利用。

(2)速度提升

当需要进行大量的数据处理时,Matlab的执行效率往往比较低,这时可以使用其他高级编程语言进行算法的设计,然后在Matlab环境中调用,从而大幅度提高数据处理的速度。在Matlab中,可以把含有大量循环迭代的代码用C语言代替,然后编译为MEX文件。

(3)功能扩展

通过MEX文件,用户可以服Matlab对硬件访问功能不足的缺点直接对硬件进行编程,如A/D采集,D/A输出卡等,以用于数据采集或控制,进一步扩展Matlab的应用领域。

2.2MEX文件结构与执行流程

MEX文件由两个部分组成,一部分是对mex.h头文件进行包含,该文件定义了矩阵的相关操作,另一部分是入口子程序,其构成形式如下:

void  mexFunciton(int nlhs,mxArray *plhs[],intnrhs,const mxArray *prhs[]);

该函数包括四个参数,从右往左分别为一个mxArray结构体类型的指针数组prhs,该数组指向所有的输入参数;整数类型的nrhs,表示输入参数的个数;一个mxArray类型的指针数组plhs,它指向所有的输出参数;nlhs标明了输出参数的个数,为整数类型。这些参数是用来传递Matlab启动MEX文件的参数。

在该入口函数中,用户主要完成两个方面的任务。一方面,从输入的mxArray结构体中获取计算完毕的数据,然后在用户子程序中利用。另一方面,用户可以将计算完毕的结果返回给一个用于输出的mxArray的结构体,这样Matlab系统就能够识别从用户计算子程序返回的结果。

 MEX文件的执行流程图如下:


图2-2 MEX文件执行流程图

三、系统实现

系统的运行主界面如图3-3所示。从运行主界面图可以看到,系统分为四个部分:数据集区、参数设置区、结果输出区和识别控制区。下面分别介绍这四个部分。

1、数据集区:它包括新增词汇、删除词汇及语音、语音录制以及载入训练集。新增词汇和删除词汇主要为训练语音库和测试语音库增加和删除新的类别。录制语音主要为各词汇采集语音文件,用于训练和识别。录制语音界面如图3-4。

2、参数设置区:它包括特征提取参数设置、端点检测参数设置、识别器参数设置。在特征参数类型中可选择并实现了的参数有MFCC、DAS-MFCC、RASTA-PLP、PNCC、APNSCC等。端点检测参数设置主要包括是否使用端点检测以及检查方法,本系统暂不考虑端点检测给识别结果带来的影响。识别器参数设置包括识别方法的选择(VQ 、HMM)及它们的参数设置(如HMM状态个数、高斯分量数)。

图3-3 系统主界面图


图3-4 声音录制界面

3、结果输出区:主要用于输出系统操作状态信息以及识别结果信息等。

4、识别控制区:主要用于选择识别方式,主要分为测试语音数据识别、训练语音数据识别、单文件语音数据识别、批量语音数据识别、和实时语音识别(包含噪声语音识别)。测试语音数据和训练语音数据识别选项分别表示对所选数据库中的测试语音集合和训练语音集合进行识别,然后在输出模块输出该数据集的正确识别率。单语音识别对单个语音文件进行识别,给出识别结果。批量语音识别对多个语音进行识别,然后输出正确识别率(前提是这些语音文件已经加标签分类)。实时语音识别界面如图3-5所示:


图3-5 实时语音识别界面

在图3-5中,开始按钮用于实时声音采集,然后将识别结果显示在输出框,单击停止按钮,中断信号的采集。除此之外,也可以采用单文件语音识别,选择要识别的语音文件,然后单击确定按钮就可以将识别结果输出在下面。实时语音识别和单文件语音识别都可以选择是否加噪,并且可以选择不同信噪比的多种噪声类型。由于实时声音采集识别速度比较慢并且不好控制环境噪声,这里实验采用事先录制好的单文件语音识别,然后加入各种不同的噪声。

系统的流程图如图3-6所示:


图3-6 系统流程图

从图3-6可以看到,本系统的流程大致分为两部分:第一部分是直接利用现有数据库进行训练识别模型进行实验,然后保存识别模型;第二部分是载入已经保存的模型来进行实验。通过该系统可以很方便地进行鲁棒性的语音识别实验。


系统实验演示见http://pan.baidu.com/s/1o61Kaa2

四、本系统提出的一种改进的抗噪语音特征参数APNSCC提取流程



APNSCC特征参数提取主要代码,分为六步
wave2APNSCC (data)
{data为语音信号;
1.语音信号预处理
yPreEmp = filter([1, -FP.preEmCoef], 1, data);预加重
[framedY,Nframe]= buffer2(yPreEmp, FP.frameSize, FP.overlap);分帧
2.计算自相关序列
for k=1:Nframe
     [c,lags]=xcorr(framedY(:,k),lag, 'unbiased');计算无偏自相关序列
     Rp(:,k)=c(lag+1:end);
end
3.自相关序列滤波与Gammatone功率谱计算
Rp1=Rp; L=2; 滤波器长度 
for i=L+1:Nframe-L
    Rp1(:,i)=(-2*Rp(:,i-2)-Rp(:,i-1)+Rp(:,i+1)+2*Rp(:,i+2))/10;
end
aad_H=ComputeFilterResponse(iNumFilts,iFFTSize,dLowFreq,dHighFreq,dSampRate);
aad_H = abs(NormalizeGammaGain(aad_H, dSampRate));  计算Gammatone滤波器响应
adSpec=fft(Rp,iFFTSize,1);
 ad_X=abs(adSpec);
 fftMag=ad_X(1:iFFTSize/2,:);
for j = 1 : iNumFilts
aad_P(:, j)  = sum((fftMag.* repmat(aad_H(:, j),1,Nframe)) .^ 2)'; 
end
4.非对称滤波
aad_PBias = aad_Q* 0.9; 按照公式(4.15)进行滤波
for j=1:Nframe
   for i = 1 : iNumFilts,   
    if (aad_Q(j,i) > aad_PBias(j,i))
aad_PBias(j,i) = FP.dLamda * aad_PBias(j,i)  + (1 - FP.dLamda) * aad_Q(j,i);
    else
   aad_PBias(j,i) = FP.dLamdb * aad_PBias(j,i) + (1 - FP.dLamdb) * aad_Q(j,i);
    end
   end
end
aad_QS=aad_Q - aad_PBias; 
5.计算倒谱及频谱差分
aadSpec = aad_QHR .^1/ 15
 aadDCT= dct(aadSpec')';计算倒谱系数
[Cdelta,Cddelta] = specD(aad_QHR', deltaWindow, FP.ApnsccNum); 计算频谱差分
6.计算Gammatone谱熵
 H=ComputeEntroy(aad_P',1);  H= heq1(H);直方图均衡化


2016-12-25 10:37:43 guanmaoning 阅读数 4738
  • C++语音识别开篇

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

    5918 人正在学习 去看看 杨波

语音识别系统


本系统旨在构建一个语音识别系统,实现电脑自动将人类的语音内容识别出来。


源代码(MATLAB版)

应各位读者的需求,现把该语音识别系统的源代码(MATLAB版)公布如下:
下载地址为:语音识别系统


原理

系统框架图 :

系统框架图
图1  系统框架图

如上面的系统框架图所示,语音识别系统的实现原理和流程是:

  1. 训练流程:首先利用麦克风来采集语音信号,由于我们采集到的语音信号是通过AD模块转换后的,所以得到的语音信号是数字信号,接下来把声音转化成.wav的格式存储在电脑的文件夹中,作为原始的音频信号保存下来,同时把得到的数字语音信号以及它的采样频率、ID和语音长度保存在数据库中,形成一个声音的样本特征库。
  2. 测试流程:首先利用麦克风来采集语音信号,同样地,我们得到的语音信号是数字信号,接下来把声音转化成.wav的格式存储在电脑的文件夹中,作为原始的音频信号保存下来,然后把得到的语音信号进行分帧、滤波等预处理,进行特征提取;最后把得到的特征与数据库中训练时建立好的样本特征库进行特征匹配,识别出结果来。

步骤

1. 声音采集

我们调用MATLAB的voicebox工具箱中的相关函数来进行语音的采集,具体的函数如下:

函数1 :
micrecorder = audiorecorder(samplingfrequency, samplingbits, 1);
函数的相关说明:
% 用于创建录音对象
% 参数1:samplingfrequency为采样率
% 参数2:samplingbits为指定采样点的比特数
% 第三个参数nChannels(int): 1时表示单通道录音,为2时表示双通道录音,会产生立体音效果

函数2:
record(micrecorder, durata);
函数的相关说明:
%用于录音
% 参数1:micrecorder为录音对象
% 参数2:durata为录音的持续时间

函数3:
isrecording(micrecorder);
函数的相关说明:
% 判断是否正在录音
% 参数1:micrecorder为录音对象

函数4:
getaudiodata (micrecorder);
函数的相关说明:
% 用于提取录音数据
% 参数1:micrecorder为录音对象


2. 声音的预处理

1) 语音信号分帧:

因为语音信号在短时间内是平稳的,为了能够用一些比较传统的方法来对语音信号进行分析(例如:接下来的端点检测),我们需要得到短时的语音信号,所以就引出了语音信号分帧,我们是通过对语音信号进行加窗操作来分帧的,我们可以调用MATLAB的voicebox工具箱中的分帧函数:
f=enframe(x, len, inc);
其中:x为要分帧的语音信号,len为帧长,inc为帧移。
帧长和帧移的关系如图所示:

 帧长和帧移的关系图
图2   帧长和帧移的关系图

语音信号通过分帧后,变成了若干帧短时的语音信号。

2) 端点检测:

目的是为了检测出有用语音信号的开始和结束,去除静音和噪音部分,既可以减少噪音带来的干扰,也可以降低计算量。
端点检测需要两种方法结合,包括计算短时能量和短时过零率其中:
离散信号的能量计算公式如下:
离散信号的能量计算公式
短时过零率的定义如下:
短时过零率

通过短时过零率的定义可以算出语音信号的过零次数。而语音信号一般可分为无声段、清音段和浊音段。其中在短时能量方面:无声 < 清音 <<浊音,在短时过零率方面:无声 <浊音 << 清音;所以端点检测就是首先判断有声还是无声, 如果有声,则还可以判断是清音还是浊音。为正确地实现端点检测, 一般综合利用短时能量和过零率两个特征,采用双门限端点检测法。根据信号设置三个阈值:能量阈值,TL,TH;过零率阈值ZCRL、ZCRH,,当某帧信号大于TL或者大于ZCRL时,认为信号的开始、起点,但有可能是时间比较短的噪音,当大于TH或大于ZCRH时,则认为是正式的语音信号,如果保持一段时间,则确认这信号即所需信号。最后我们通过双门限端点检测法检测出有用语音信号的开始和结束,去除静音和噪音部分,既可以减少噪音带来的干扰,也可以降低计算量。

3. 特征提取

我们知道声音是通过声道来产生的,声道的结构决定了发出怎样的声音。声道的结构构成包括舌头,牙齿等。如果我们可以准确的知道这个结构,那么我们就可以对产生的声音的音素进行准确的描述。声道的结构在语音短时功率谱的包络中显示出来。而MFCCs(梅尔频率倒谱系数)就是一种准确描述这个包络的一种特征,所以我们需要把音频信号中具有辨识性的成分提取出来,如:MFCCs(梅尔频率倒谱系数),然后把其他多余的信息(例如情绪之类的)去掉。

1) 倒谱分析:

图3是一个语音的频谱图。峰值就表示语音的主要频率成分,我们把这些峰值称为共振峰(formants),而共振峰就是携带了声音的辨识属性(就是个人身份证一样)。所以它特别重要。用它就可以识别不同的声音。

语音的频谱图
图3  语音的频谱图

我们要提取的不仅仅是共振峰的位置,还得提取它们转变的过程。所以我们提取的是频谱的包络(Spectral Envelope)。这包络就是一条连接这些共振峰点的平滑曲线。如图4所示:

这里写图片描述
图4  频谱的包络图示例

将原始的频谱由两部分组成:包络和频谱的细节。这里用到的是对数频谱,所以单位是dB,对数可以把它的横坐标放大,有利于我们分析。那现在我们需要把这两部分分离,这样我们就可以得到包络了。而事实证明我们可以把原来的频谱看成:X[k]=H[k]E[k];只考虑幅度就是:|X[k] |=|H[k]||E[k] |;然后我们取的是对数频谱,所以变成:log||X[k] ||= log ||H[k] ||+ log ||E[k] ||,如图5所示:

包络和频谱的细节图
图5  包络和频谱的细节图

但是我们还没有把它们分开,我们是对log||X[k] ||= log ||H[k] ||+ log ||E[k] ||两边同时求逆傅里叶变换,得到x[k]=h[k]+e[k],变成了一个时域信号,然后得出h[k]属于低频部分,e[k]属于高频信号,最后通过低通滤波器来把h[k]滤出来。因为这里取的是对数的频谱,所以求逆傅里叶变换后,虽然也是一个时域信号,但很明显跟原来的时域不一样了,我们把现在的x[k]称为倒谱,我们所关心的h[k]就是倒谱的低频部分。h[k]描述了频谱的包络,它在语音识别中被广泛用于描述特征。总而言之,倒谱(cepstrum)就是一种信号的傅里叶变换经对数运算后再进行傅里叶反变换得到的谱。它的计算过程如图6所示:

倒谱的计算过程
图6  倒谱的计算过程

而我接下来所说的MFCC(梅尔频率倒谱系数)就是在这个基础上得来的,和前面一样,要求梅尔频率倒谱系数,我们先说一下怎么得到梅尔频率倒谱,Mel(梅尔)频率分析就是基于人类听觉感知实验的,实验观测发现人耳就像一个滤波器组一样,它只关注某些特定的频率分量(人的听觉对频率是有选择性的),把其他的频率滤掉,而剩下的这些频率恰好却可以语音特征。梅尔频率倒谱系数(Mel Frequency Cepstrum Coefficient, MFCC)考虑到了人类的听觉特征,先将原来线性频谱映射到基于听觉感知的Mel非线性频谱中,然后转换到倒谱上。其转换公式如图7所示:

梅尔频率倒谱系数转换公式
图7  梅尔频率倒谱系数转换公式

我们将频谱通过一组Mel滤波器就得到Mel频谱。公式表述就是:log X[k] = log (Mel-Spectrum)。这时候我们在log X[k]上进行倒谱分析:
1)取对数:log X[k] = log H[k] + log E[k]。
2)进行逆变换:x[k] = h[k] + e[k]。
倒谱系数h[k]就称为Mel频率倒谱系数,简称MFCC。而实际逆变换一般是通过DCT离散余弦变换来实现,取DCT后的第2个到第13个系数作为MFCC系数),获得Mel频率倒谱系数MFCC,这个MFCC就是这帧语音的特征;语音就可以通过一系列的倒谱向量来描述了,每个向量就是每帧的MFCC特征向量。因为前面都是基于一帧信号来分析的,最后形成一个特征库。

4. 特征匹配与识别结果

在特征匹配阶段,我们使用了一种基于矢量量化(VQ,Vector Quantization)的特征匹配算法。矢量量化(VQ,Vector Quantization)是一种极其重要的信号压缩方法。VQ在语音信号处理中占十分重要的地位。广泛应用于语音编码、语音识别和语音合成等领域。VQ实际上就是一种逼近。它的思想和“四舍五入”有异曲同工之妙,都是用一个和一个数最接近的整数来近似表示这个数。我们来看一个二维VQ例子,如图8所示:

VQ划分示例
图8  VQ划分示例

在这里,我们用蓝色实线将这张图划分为16个区域。任意的一对数(也就是横轴x和纵轴y组成的任意的一个坐标点(x, y))都会落到上面这张图中的某一特定区域。然后它就会被该区域的红星的点近似。上面这些红星点就是量化矢量,表示图中的任意一个点都可以量化为这16个矢量中的其中一个,因此我们可以对特征提取阶段得到的Mel频率倒谱系数(MFCC)进行矢量量化为K个红星点(K可以根据实际情况进行调整)。在特征匹配的时候,我们先把样本特征库中的每一个样本的Mel频率倒谱系数(MFCC)都矢量量化为图8所示的二维VQ划分,每个二维VQ划分有K个区域,即有K个红星点,每个区域由该区域的红星点所代替;然后我们把测试样本的Mel频率倒谱系数(MFCC)散步在这张二维VQ划分中,每个区域都会分布若干个点,然后在每个区域中求每个点到红星点的欧式距离(两点间欧式距离的计算公式如图9所以),再把K个区域的欧式距离进行求平均,得到平均欧式距离,若某个样本的欧式距离最小,则该训练样本与测试样本特征最匹配,则我们可以判断这个训练样本与该测试样本属于同一语音信号的概率最大,得出识别的结果。

两点间欧式距离的计算公式
图9  两点间欧式距离的计算公式


结果演示

1) 语音识别系统界面,如图10所示:

语音识别系统界面
图10  语音识别系统界面

2) 点击添加声音按钮,进行添加训练样本,总共添加三个训练样本,如图11、图12和图13所示。

样本1添加过程
图11  样本1添加过程

样本2添加过程
图12  样本2添加过程

样本3添加过程
图13  样本3添加过程

3) 进行测试“关茂柠”这段语音,测试结果如图14、图15所示:

测试结果
图14  测试结果

测试结果
图15  测试结果

4) 进行测试“teacher zhou”这段语音,测试结果如图16、图17所示:

测试结果
图16  测试结果

测试结果
图17  测试结果

2016-05-26 12:53:42 by21010 阅读数 15596
  • C++语音识别开篇

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

    5918 人正在学习 去看看 杨波

语音识别概述

语音识别是指将语音信号转换为文字的过程。现在通行的语音识别系统框架如图:语音识别基本框架
信号处理模块将根据人耳的听觉感知特点,抽取语音中最重要的特征,将语音信号转换为特征矢量序列。现行语音识别系统中常用的声学特征有线性预测编码(Linear Predictive Coding,LPC),梅尔频率倒谱系数(Mel-frequency Cepstrum Coefficients,MFCC),梅尔标度滤波器组(Mel-scale Filter Bank,FBank)等。
解码器(Decoder)根据声学模型和语言模型,将输入的语音特征矢量序列转化为字符序列。
声学模型是对声学、语音学、环境的变量,以及说话人性别、口音的差异等的知识表示。语言模型则是对一组字序列构成的知识表示。

模型的训练

现代的语音识别系统中声学模型和语言模型主要利用大量语料进行统计分析,进而建模得到。

声学模型

语音识别中的声学模型充分利用了声学、语音学、环境特性以及说话人性别口音等信息,对语音进行建模。目前的语音识别系统往往采用隐含马尔科夫模型(Hidden Markov Model,HMM)建模,表示某一语音特征矢量序列对某一状态序列的后验概率。隐含马尔科夫模型是一种概率图模型,可以用来表示序列之间的相关关系,常常被用来对时序数据建模。
隐含马尔科夫模型是一种带权有向图,图上每一个节点称为状态。每一时刻,隐含马尔科夫模型都有一定概率从一个状态跳转到另一个状态,并有一定概率发射一个观测符号,跳转的概率用边上的权重表示,如图所示, S0 和 S1 表示状态, a 和 b 是可能发射的观测符号。
隐含马尔科夫模型假定,每一次状态的转移,只和前一个状态有关,而与之前之后的其它状态无关,即马尔科夫假设;在每一个状态下发射的符号,只与当前状态有关,与其它状态和其它符号没有关系,即独立输出假设。
隐含马尔科夫模型一般用三元组 λ=(A,B,π) 表示,其中 A 为状态转移概率矩阵,表示在某一状态下转移到另一状态的概率;B 为符号概率矩阵,表示在某一状态下发射某一符号的概率;π 为初始状态概率矢量,表示初始时处在某一状态的概率。
隐含马尔科夫模型示意图
隐含马尔科夫模型可以产生两个随机的序列,一个是状态序列,一个是观测符号序列,所以是一个双重随机过程,但外界只能观测到观测符号序列,不能观测到状态序列。可以利用维特比算法(Viterbi Algorithm)找出在给定观测符号序列的条件下,发生概率最大的状态序列。对于某一观测符号序列的概率,可以通过前向后向算法(Forward-Backward Algorithm)高效地求得。每一个状态的转移概率和观测符号发射概率可以通过鲍姆—韦尔奇算法(Baum-Welch Algorithm)计算得到。
语音识别中一般使用隐含马尔科夫模型对声学单元和语音特征序列之间的关系建模。一般来说,声学单元级别较小,其数量就少,但对上下文的敏感性则会大。大词汇量连续语音识别系统中一般采用子词(Sub-word)作为声学单元,如在英语中采用音素,汉语中采用声韵母等。
声学模型中隐含马尔科夫模型的拓扑结构一般采用从左向右的三状态结构,每一个状态上都有一个指向自身的弧,如图所示,表示利用三状态模型对音素 / t / 的建模 。
对音素 / t /的建模
由于连续语音中具有协同发音的现象,故需要对前后三个音素共同考虑,称为三音子(Triphone)模型。引入三音子后,将引起隐含马尔科夫模型数量的急剧增加,所以一般会对状态进行聚类,聚类后的状态称为 Senone。
语音识别任务中的声学特征矢量取值是连续的,为了消除量化过程造成的误差,所以考虑使用连续概率密度函数来对特征矢量对状态的概率进行建模。混合高斯模型(Gaussian Mixture Models,GMM)可以对任意的概率密度函数进行逼近,所以成为了建模的首选。
邓力等将深度学习引入语音识别的声学建模中,用深度神经网络对声学特征矢量和状态的关系进行建模 ,极大地提升了语音识别的准确率,此后深度学习在语音识别声学建模上的应用开始蓬勃发展,如利用声学特征矢量上下文关系的循环神经网络(Recurrent Neural Networks,RNN)及其特殊情况长短时记忆网络(Long Short-term Memory,LSTM)等。

语言模型

语言模型可以表示某一字序列发生的概率。语音识别中常用的语言模型是 N 元文法(N-Gram),即统计前后 N 个字出现的概率。N 元文法假定某一个字出现的概率仅与前面 N-1 个字出现的概率有关系。
设现在有一字序列W=(w1,w2,w3,,wU),则其发生概率可以被分解为如下形式:

P(W)=P(w1,w2,w3,,wn)=P(w1)P(w2|w1)P(w3|w1,w2)P(wn|w1,w2,w3,,wn1)

但是,这样的概率无法统计。根据马尔科夫假设,则只需考虑前 N 个字符发生条件下的概率即可。假设 N=2 则有
P(W)=P(w1)P(w2|w1)P(w3|w2)P(wn|wn1)

再根据贝叶斯公式,可以得出某一个字在另一个字的条件下发生的概率
P(wn|wn1)=P(wn,wn1)P(wn1)

由此,在大量的语料中统计出相邻的字发生的概率,再统计出单个字出现的概率,即可。
由于必然会有一些生僻词组在语料中未曾出现,但其也存在着发生的概率,所以需要算法生成这些生僻词组的概率,即平滑。常用的平滑方式有古德-图灵平滑(Good-Turing Soothing)和卡茨平滑(Katz Smoothing)等。

基于加权有限状态转换器的解码

语音识别中的“解码”问题可以表示为如下过程:对于一个长度为T的给定的声学观测
(acoustic observation)序列X=(x1,x2,x3,,xT),求出一个长度为U的对应的字( word )序列W=(w1,w2,w3,,wU),使得后验概率P(W|X)最大化,即求得字序列W,有

W^=argmaxP(W|X)

后验概率P(WX)不易直接求得。根据贝叶斯公式可得:
W^=argmaxP(W|X)=argmaxP(X|W)P(W)P(X)

由于声学观测序列已经给定,所以声学观测的概率是常数,故可以归约为如下形式:
W^=argmaxP(W|X)=argmaxP(X|W)P(W)

目前一般采用的大词汇量语音识别技术,会将声学、语音学以及语言学的知识引入进系统中去。用 H 表示隐含马尔科夫模型的状态序列,C 表示上下文相关的音素序列,L 表示音素序列,并假设声学特征序列、隐含马尔科夫模型的状态序列、音素序列、字序列之间是独立的,可以将式子展开,得:
W=argmaxHCLP(X|H)P(H|C)P(C|L)P(L|W)P(W)

式 子中,P(X|H) 称为声学模型,表示声学特征序列对隐马尔科夫状态序列的后验概率;P(HC)P(CL)P(LW)分别表示状态序列对上下文相关的音素序列、上下文相关的音素序列对音素序列,以及音素序列对字序列的后验概率;P(W)表示句子发生的概率,称为语言模型。这些概率都是由前面的“训练”过程得到的。
目前,语音识别的解码一般基于加权有限状态转换器(Weighted Finite State Transducer)进行。
加权有限状态转换器是一种赋权有向图,其每一个节点表示一个“状态”,当接受到一个输入符号以后,就会由对应的弧跳转到另一个“状态”,并“发射”一个输出符号,弧上还可以赋予权值。其形式化描述如下:
半环K上的加权有限状态转换器T是一个八元组T=(Σ,Δ,Q,I,F,E,λ,ρ),其中Σ为输入符号集合,Δ为输出符号集合,Q为状态集合,I,Q为初始状态集合,F,Q为终止状态集合,五元关系EQ×(Σϵ)×(Δϵ)×K×Q表示转移函数,映射λIK表示初始状态的权值,映射ρFK表示终止状态的权值 。
为了扩大加权有限转换器的适用范围,将“权重”的含义推广到更一般的代数结构——半环上去。给定集合K及其上的两种运算 ,如果K,,0¯为带有单位元0¯的交换幺半群,K,,1¯为带有单位元 1¯ 的幺半群,且 运算对于运算具有分配性,0¯对于运算为零化子,即对于任意的aKa0¯=0¯a=0¯。于是,由首状态到末状态“路径”上各个弧的总权重,可以由运算求“积”得到,而多条路径的总权重,则可以由求和得到。下图表示了一个简单的加权有限状态转换器。其输入符号集为{a,b,c},在图中表示为弧上冒号前的符号,输出符号集为{x,y,z},在图中表示为弧上冒号后的符号,半环为实数域,在图中表示为斜线后的数,双圆圈表示终止状态。
这里写图片描述
在语音识别中,路径的总权重可以看作在输入序列的条件下,输出序列的联合概率,又因为马尔科夫链的无后效性假设,所以总权重可以看作路径上权重的乘积。由于计算机运算,需要防止浮点数的下溢,这些概率常常取对数,即表 中对数半环,其中 log 运算的定义为xlogy=log(ex+ey);又由于语音识别中常需要在加权有限状态转换器上寻找权值最优的路径,故定义了热带半环。

半环 集合 0¯ 1¯
对数半环(Log) R{,+} log + + 0
热带半环(Tropical) R{,+} Min + + 0

可以利用加权有限状态转换器的组合(composition)操作,将不同层次的加权有限状态转换器合并起来。比如,在实际的语音识别系统中,一般会构建四个加权有限状态转换器:表示隐含马尔科夫模型状态序列到上下文相关音素序列映射的H,表示上下文相关音素序列到音素序列映射的C,表示音素序列到字序列的L,以及语言模型G,将此四个加权有限状态转换器组合,形成HCLG,其对应着语音学和语言学的知识,其上弧的权重,可以看作输入隐含马尔科夫模型状态,输出对应的字发生的概率。
声学模型P(X|H) 根据训练得出。将一句语音输入训练好的网络前馈以后,得到一个矩阵,其列表示帧数,行表示此帧对隐含马尔科夫模型状态的概率分布,即一个某帧对某隐含马尔科夫状态的概率查询表。
于是,语音识别的解码问题可以归结为在加权有限状态转换器 HCLG 的最优路径搜索问题,只是路径的总权值除了要考虑 HCLG 弧上的权值以外,还要考虑声学模型的权值,令总权值最大化。
根据带权有向无环图单源最短路径算法 ,考虑到事实“对于图的最短路径上的某一节点u,若其在此路径上的前驱为σ,则σ必然在源点到u的最短路径(之一)上”,可以使用由源点开始,逐层构建最短路径树的方法进行。实际系统中,由于搜索图的庞大,为了减少对计算机内存的消耗,常使用启发式的波束搜索(Beam Search)技术,即设定一个阈值,在搜索树中保留阈值范围内的路径,裁剪掉阈值范围以外的路径。加权有限状态转换器上的解码过程可以用伪代码简略地描述为

foreach frame:
foreach token:
    if token->cost > cut_off:
        foreach arc:
            if arc.weight > cut_off:
                add arc to token
else:
        delete token

其中,token表示保存路径的数据结构,其每一个节点可以保存弧,以及当前这条路径的总代价。
在实际的语音识别系统中,最优路径不一定与实际字序列匹配,我们一般希望能够得到得分最靠前的多条候选路径,即N-best。为了紧凑地保存候选路径,防止占用过多内存空间,我们一般采用词格(Lattice)来保存识别的候选序列。词格没有一般的定义,常用的方法是利用有限状态自动机的数据结构来构建词格。

后记:这是我学习语音识别的一个小结,也是我毕设的一个章节。拿出来给大家看看,有错误的地方希望大家不吝赐教。

参考文献

  1. Huang X, Acero A, Hon H, et al. Spoken Language Processing[J]., 2000.
  2. Rabiner L R. A tutorial on hidden Markov models and selected applications in speech recognition[J]. Proceedings of the IEEE, 1989, 77(2): 257-286.
  3. Mohri M, Pereira F C, Riley M, et al. Weighted Finite-state Transducers in Speech Recognition[J]. Computer Speech & Language, 2002, 16(1): 69-88.
2015-01-05 16:56:22 u012637501 阅读数 17962
  • C++语音识别开篇

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

    5918 人正在学习 去看看 杨波
一、语音识别技术
转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)
    语音识别技术,广泛来说是指语意识别和声纹识别;从狭义上来说指语音语义的理解识别,也称为自动语音识别(ASR)。其关键技术包括选择识别单元、语音端点检测、特征参数提取、声学模型及语音模型的建立。语音识别技术目前在桌面系统、智能手机、导航设备等嵌入式领域均有一定程度的应用。其主要技术难题是识别系统的适应性较差、受背景噪声影响较大,未来的发展方向应是无限词汇量连续语音非特定人语音识别系统。
(1)信号处理及特征提取模块
    该模块的主要任务是从输入信号中提取特征,供声学模型处理。同时,它一般也包括了一些信号处理技术,以尽可能降低环境噪声、信道、说话人等因素对特征造成的影响。
(2)统计声学模型
    典型系统多采用基于一阶隐马尔科夫模型进行建模。
(3)发音词典
    发音词典包含系统所能处理的词汇集及其发音。发音词典实际提供了声学模型建模单元与语言模型建模单元间的映射。
(4)语言模型
    语言模型对系统所针对的语言进行建模。理论上,包括正则语言,上下文无关文法在内的各种语言模型都可以作为语言模型,但目前各种系统普遍采用的还是基于统计的N元文法及其变体。
(5)解码器
    解码器是语音识别系统的核心之一,其任务是对输入的信号,根据声学、语言模型及词典,寻找能够以最大概率输出该信号的词串,从数学角度可以更加清楚的了解上述模块之间的关系。
    当今语音识别技术的主流算法,主要有基于动态时间规整(DTW)算法、基于非参数模型的矢量量化(VQ)方法、基于参数模型的隐马尔可夫模型(HMM)的方法、基于人工神经网络(ANN)和支持向量机等语音识别方法.

二、非特定人、大词汇量、连续语音识别系统
       连续数字语音识别系统经过训练和识别两个部分。此训练可以看作是对 HMM 建立模型的过程。通过对参数重新评估,调整模型的各种参数,得到具有较好鲁棒性的模型。对基本模型进行改进和优化,可以有效提高精确度,获得更好的识别率。识别过程则可以认为是使用现有的 HMM 模型库、数据字典和语法控制组成识别网络,运用搜索算法寻找最佳匹配过程。 首先对等待识别的语音信号进行采样,然后通过转换变成电信号。预处理这 些电信号,也就是对信号进行增加预重、帧数分离、检测端点等操作。处理过后,对语音信号提炼生成特征的矢量数据。按识别模块中的 HMM 模型和词典要求组合,形成合词模型后完成识别,将结果和语言模型进行匹配,淘汰那些不符合语法限制的句子和词组,最后输出符合规范的识别的过程,就是语音识别的全过程。特征值、HMM 模 型、语法和数据字典都是影响识别率高低的重要因素。
    语音识别过程通常包括"前段"和"后端"两部分:“前端”模块 主要的作用是进行端点检测(去除多余的静音和非说话声)、降噪、 特征提取等;“后端”模块的作用是利用训练好的声学模型和语言模型对用户说话的特征向量进行统计模式识别(又称解码),得到其包含的文字信息,此外,后端模块还存在一个自适应的反馈模块,可以对用户的语音进行自学习,从而对声学模型和语音模型进行必要的校正,进一步提高识别的准确率。一个完整的非特定人大词汇量连续语音识别系统可大致分为三部分:语音信号预处理与特征提取、声学模型训练、语言模型训练、搜索算法与识别。
0.识别单元的选择

   选择识别单元是语音识别研究的第一步,分为单词、音节、音素。

(1)单词单元:广泛应用于中小词汇语音识别系统,但不适合大词汇系统,原因在于模型库太庞大,训练模型任务繁重、模型匹配算法复杂,难以满足实时性要求。

(2)音节单元:多见于汉语语音识别,主要因为汉语是单音节结构的语言,而英语是多音节。虽然汉语大约有1300个音节,但若不考了声调只有约408个无调音节。

(3)音素单元:目前广泛被应用到大词汇量语音识别系统中,原因是在于汉语音节仅有声明和韵母构成,并且声明和韵母的声学特性相差很大。

    总结,对大词汇量语音识别系统来说,通常识别单元越小,则计算量也越小,所需的模型存储量也小,要求的训练数量也少,但对应语音段的定位和分割较困难,因此识别模型规则也变得更复杂。

1、预处理模块

       对输入的原始语音信号进行处理(输入的语言信号首先要进行反混叠滤波 采样 A/D 转换 等过程进行数字化, 之后要进行预处理, 包括预加重 加窗和 分帧 端点检测等。),滤除掉其中的不重要的信息以及背景噪声,并进行语音信号的端点检测(找出语音信号的始末)、语音分帧(近似认为在10-30ms内是语音信号是短时平稳的,将语音信号分割为一段一段进行分析)以及预加重(提升高频部分)等处理。

目前主流的语音信号端点检测方法:

(1)短时能量En:反应语音振幅或能量随着事件缓慢变化的规律;

(2)短时平均过零率Zn:对于离散信号而言,是样本改变符号的次数,可以粗略分别清音和浊音;

(3)双门限端点检测:短时平均能量和过零率两者结合可以起到区分语音信号中的静音与语音信息的作 用,完成端点检测。一段完整的语音信号的可以分为三段:静音段、过渡段、语音段。 在静音段,过零率或能量越过了低门限,进入过渡段。在过渡段,过零率或能量都降低至低门限以下,则恢复到静音态;过零率或能量中的其中一个越过了高门限,则为进入了语音段。在低噪声情况下,双门限端点检测简单可靠。但在噪声较大的情况下,该方法失去判断能力,所以此方法的抗噪能力较差。 

2、声学特征提取

       语音信号是一种典型的时变信号,然而如果把音频的参考时间控制在几十毫 秒以内,则得到一段基本稳定的信号。去除语音信号中对于语音识别无用的冗余信息,保留能够反映语音本质特征的信息,并用一定的形式表示出来。也就是提取出反映语音信号特征的关键特征参数形成特征矢量序去掉那些相对无关的信息如背景噪声、信道失真等,以便用于后续处理目前的较常用的提取特征的方法还是比较多的,不过这些提取方法都是由频谱衍生出来的。

目前主流的语音信号特征提取方法:

(1)线性预测系数(LPCC):很好的模拟语音信号,语音信号是由声带振动发出的, 声带可以不振动也可以有周期的振动,分别对应清音(consonants)和浊音(vowels),每一段声管则对应一个 LPC 模型的极点。通常极点个数在 12-16 个左右,即可清晰地描述信号的特征了。

(2)Mel频率倒谱系数(MFCC)参数

   人的听觉系统却是一种特殊的非线性系 统,它对不同频率信号的响应灵敏度有较大区别。 MFCC参数比 LPC 参数更能够充分利用人耳的感知特性提高系统的识别性能因其良好的抗噪性和鲁棒性而应用广泛。MFCC的计算首先用FFT将时域信号转化成频域,之后对其对数能量谱用依照Mel刻度分布的三角滤波器组进行卷积,最后对各个滤波器的输出构成的向量进行离散余弦变换DCT,取前N个系数。在sphinx中也是用MFCC特征的,用帧frames去分割语音波形,每帧大概10ms,然后每帧提取可以代表该帧语音的39个数字,这39个数字也就是该帧语音的MFCC特征,用特征向量来表示

(3)小波分析

3、声学模型训练(模版匹配方法)

      声学模型的训练,即为建模过程。声学模型是识别系统的底层模型,是语音识别系统中最关键的部分。声学模型表示一种语言的发音声音,可以通过训练来识别某个特定用户的语音模式和发音环境的特征。根据训练语音库的特征参数训练出声学模型参数,在识别时可以将待识别的语音的特征参数同声学模型进行匹配与比较,得到最佳识别结果。

目前主流的声学模型训练方法

(1)动态时间规整(DTW):现实生活中语音信号的 随机性较强,就是同一人说的话,也不太可能说出一句一模一样的话来。就算字词都一样,发音的时间长短也可能不一样。因此,需要寻找一种变换关系来削除这种时间上的距离偏差,这种结合时间变换关系求特征序列之间距离的技术算法 称为动态时间规整算法(DTW:DynamicTimeWarping)。动态时间规整(DTW)算法 的算法的思想,就是将待识别的语音信号均匀的升长或缩短,使其与参考模板的长度一致。同时,使语音信号的时间轴进行不均匀的扭曲和弯折,最终达到与模板的特征对齐。DTW 是较早的一种模式匹配和模型训练技术, 它把整个单词作为识别单元,在训练阶段将词汇表中每个词的特征矢量序列作为模板存入模板库,在识别阶段将待识别语音的特征矢量序列依次与库中的每个模板进行相似度比较,将相似度最高者作为识别结果输出。DTW 应用动态规划方法成功解决了语音信号特征参数序列比较时时长不等的难题,在小词汇量、孤立词语音识别中获得了良好性能。但因其不适合连续语音大词汇量语音识别系统, 目前已逐渐被 HMM 和 ANN模型替代。
(2)矢量量化(VQ)技术
    矢量量化(VectorQuantization)是一种适用于小词汇量、孤立词的语音识别的 信号压缩方法 。矢量量化器的设计其核心思想是:为某一个特定的信源设计一 个优化的码书,那么来自同一个信息源所产生的信号与该码书的平均量化失真就应远远小于他与其他信息的信号与该码书的平均量化失真,也就是说编码器本身存在一定的区分能力。 
(3)隐马尔可夫模型HMM 

     HMM是对语音信号的时间序列结构建立统计模型,将其看作一个数学上的双重随机过程:一个是用具有有限状态数的Markov链来模拟语音信号统计特性变化的隐含(马尔可夫模型的内部状态外界不可见)的随机过程,另一个是与Markov链的每一个状态相关联的外界可见的观测序列(通常就是从各个帧计算而得的声学特征)的随机过程。

    HMM 模型是语音信号时变特征的有参表示法。它由相 互关联的两个随机过程共同描述信号的统计特性,其中一个 是隐蔽的 (不可观测的) 具有有限状态的 Markor 链, 另一个是 与 Markor 链的每一状态相关联的观察矢量的随机过程 (可观测的) 。HMM 很好的模拟了人得语言过程, 目前应用十分广泛。目前的主流语音识别系统多采用隐马尔可夫模型HMM进行声学模型建模。声学模型的建模单元,可以是音素,音节,词等各个层次。对于小词汇量的语音识别系统,可以直接采用音节进行建模。而对于词汇量偏大的识别系统,一般选取音素,即声母,韵母进行建模。识别规模越大,识别单元选取的越小。 

        人的言语过程实际上就是一个双重随机过程,语音信号本身是一个可观测的时变序列,是由大脑根据语法知识和言语需要(不可观测的状态)发出的音素的参数流(发出的声音)。HMM合理地模仿了这一过程,是较为理想的一种语音模型。用HMM刻画语音信号需作出两个假设,一是内部状态的转移只与上一状态有关,另一是输出值只与当前状态(或当前的状态转移)有关,这两个假设大大降低了模型的复杂度。所以 HMM 可以 非常精确地描述语音信号的产生过程。 

       语音识别中使用HMM通常是用从左向右单向、带自环、带跨越的拓扑结构来对识别基元建模,一个音素就是一个三至五状态的HMM,一个词就是构成词的多个音素的HMM串行起来构成的HMM,而连续语音识别的整个模型就是词和静音组合起来的HMM。总之 HMM 模型较为完整的表达了语音的声学模型,采用统计的训练方法将 上层的语言模型和底层的声学模型融入统一的语音识别搜索算法中,并获得更好 的效果。

(4)人工神经网络模型(ANN)

     神经网络是由许多被称为节点的简单非线性模拟处理要素密集互连配置而成的,是 一种模仿了生物神经元的系统模型。网络通过令每一个节点的输出与一些其他的节点输入连接形成,类似于真实神经元的突触连接。每个神经元表达了一种特定的输出函数,称为激励函数,每两个神经元之间的连接都包含一个连接强度,也就是作用于通过该连接的信号的加权值。经过训练之后的神经网络,具有信息特征抽取、知识概括和学习记忆的能力,而模型学习到的信息或知识则储存在每个单元节点之间的连接矩阵上。一个神经网络的表现是由节点定义,拓扑结构以及学习算法这三个特征组成的集体性质决定的。 

   ANN本质上是一个自适应非线性动力学系统,是由结点互连组成的计算网络, (优点)人工神经网络(ANN) 基本上能够模拟人类神经的活动原理,具有学习特性、容错性、并行性、自适应性和鲁棒性,是一个自适应非线性动力学系统,且具有较强的分类能力和输入输出映射能力。这些能力是 HMM 模型不具备的, 可用于处理一些环境信息十分复杂, 背景知识不清楚, 推理规则不明确的问题, 允许样品有较大的缺损、 畸变, 因此对于噪声环境下非特定人的语音识别问题来说是一种很好的解决方案。(缺点)由于语音训练和识别时间太长,实现和应用较难等不利因素,所以到目前为止该方法停留在实验阶段,目前大部分应用神经网络的语音识别系统都采用了 BP 网并取得了较好的识别效果.将 ANN 与 HMM 结合分别利用各自优点进行识别将是今后的一条研究途径。ANN 具有 较好的区分复杂分类边界的能力,显然它十分有助于模式识别。在这些研究中,大部分 

采用基于反向传播算法(BP 算法)的多层感知网络。 

a.BP神经网络:BP 神经网络在训练的时候,正向传播之后输出层没有得到期望输出,则采用反向传 播算法,提高网络系统对样本的似然度(Likelihood)。将样本的实际输出与期望输出之间的差值即误差信号,并在逐层反向传播的过程中由误差反馈不断调整网络的权值。网络学习效果的提升可以由增加隐藏层层数实现。 在诸多神经网络中,BP 是应用较多的一种,用于语音识别时也具有较好的效果,这 是由于 BP 神经网络具有许多独特的优点:(1)它可以联想模式对,将复杂的声学信号映射为不同级别的语音学和音韵学的表示;(2)可以通过插值进行归纳,因此相关特征 

可通过训练获取(3)对不同的类,他可以在超平面中形成不相交的区域,很适合捕捉细微的规律;(4)输入可以是二值或连续值,也可以是声学属性或语音特征的任意组合; (5)对数据的分布不做先验假设,对模型使用全局约束,因此能构造光滑的类边界, 识别精度好。虽然 BP 神经网络具有强大的计算能力,能够好的应用于语音识别,但随着对识别 性能要求的提高,网络本身仍有一些问题逐渐暴露出来,以下方面亟待改进: 

(1)局部极小值问题; 

(2)增加神经网络的可理解性。人们暂时仍然无法直接理解网络学习存储在连接矩阵上的知识; 

(3)加快神经网络学习速度。目前大部分神经网络算法都无法回避的一个部分就是迭代问题,为了获得好的学习效果,迭代需要大的计算开销。 

b.神经网络训练

    神经网络的学习也称为训练,是指通过神经网络所在环境的刺激作用,调整神经网 络的自由参数。能够从环境中学习和在学习中获得系统工作效果提升,是神经网络最有意义的性质。在神经网络中,一般有两类训练算法。 

(1)有监督学习算法。不但需要训练用的输入信号,同时需要与输入相对应的表示所需输出的目标信号。网络通过计算实际输出与每组输入对应的目标输出之间的差值来调整权值,做出正确反应。 

(2)无监督学习算法。不要求有目标输出,算法提供一个关于网络学习表示方法质量的测量尺度,根据尺度将自由参数最优化,当网络与输入数据统计规律性一致,就能形成内部表示方法记忆输入特征,由此进行类别识别。 

4、语言模型训练

       语音识别中的语言模型主要解决两个问题一是如何使用数学模型来描述语音中词的语音结构二是如何结合给定的语言结构和模式识别器形成识别算法。语言模型是用来计算一个句子出现概率的概率模型。它主要用于决定哪个词序列的可能性更大,或者在出现了几个词的情况下预测下一个即将出现的词语的内容。换一个说法说,语言模型是用来约束单词搜索的。它定义了哪些词能跟在上一个已经识别的词的后面(匹配是一个顺序的处理过程),这样就可以为匹配过程排除一些不可能的单词。语言模型一般指在匹配搜索时用于字词和路径约束的语言规 则,它包括由识别语音命令构成的语法网络或由统计方法构成的语言模型, 语言处理则可以进行语法、 语义分析.

       语言建模能够有效的结合汉语语法和语义的知识,描述词之间的内在关系,从而提高识别率,减少搜索范围。语言模型分为三个层次:字典知识,语法知识,句法知识。

         对训练文本数据库进行语法、语义分析,经过基于统计模型训练得到语言模型。

目前主流的语言建模方法

(1)基于规则模型
(2)基于统计模型

    统计语言模型是用概率统计的方法来揭示语言单位内在的统计规律,其中N-Gram模型简单有效,被广泛使用。它包含了单词序列的统计。N-Gram模型基于这样一种假设,第n个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积(即根据前面N-1个词汇的历史来决定下一个词可能出现的概率)。这些概率可以通过直接从语料中统计N个词同时出现的次数得到常用的是二元的Bi-Gram和三元的Tri-Gram。

         Sphinx中是采用二元语法和三元语法的统计语言概率模型,也就是通过前一个或两个单词来判定当前单词出现的概率P(w2| w1),P(w3| w2, w1)。

5、语音解码和搜索算法

       解码器:即指语音技术中的识别过程。针对输入的语音信号,根据己经训练好的HMM声学模型、语言模型及字典建立一个识别网络,根据搜索算法在该网络(识别网络)中寻找最佳的一条路径,这个路径就是能够以最大概率输出该语音信号的词串,这样就确定这个语音样本所包含的文字了。所以解码操作即指搜索算法是指在解码端通过搜索技术寻找最优词串的方法。连续语音识别中的搜索,就是寻找一个词模型序列以描述输入语音信号,从而得到词解码序列。搜索所依据的是对公式中的声学模型打分和语言模型打分。在实际使用中,往往要依据经验给语言模型加上一个高权重,并设置一个长词惩罚分数。当今的主流解码技术都是基于Viterbi搜索算法的,Sphinx也是。模型参数得到后可以用 Viterbi 算法来确定与观察序列对 应的最佳的状态序列。建好模型后,在识别阶段就是要计算每个模型产生观察符号序列的输出概率,输出概率最大的模型所表示的词就是我们的识别结果。

    基于动态规划的Viterbi算法在每个时间点上的各个状态,计算解码状态序列对观察序列的后验概率,保留概率最大的路径,并在每个节点记录下相应的状态信息以便最后反向获取词解码序列。Viterbi算法本质上是一种动态规划算法,该算法遍历HMM状态网络并保留每一帧语音在某个状态的最优路径得分。

    连续语音识别系统的识别结果是一个词序列。解码实际上是对词表的所有词反复搜索。词表中词的排列方式会影响搜索的速度,而词的排列方式就是字典的表示形式。Sphinx系统中采用音素作为声学训练单元,通常字典就用来记录每个单词由哪些个音素组成,也可以理解为对每个词的发音进行标注。

     N-best搜索和多遍搜索:为在搜索中利用各种知识源,通常要进行多遍搜索,第一遍使用代价低的知识源(如声学模型、语言模型和音标词典),产生一个候选列表或词候选网格,在此基础上进行使用代价高的知识源(如4阶或5阶的N-Gram、4阶或更高的上下文相关模型)的第二遍搜索得到最佳路径。



2007-08-11 20:51:00 tongyue 阅读数 1346
  • C++语音识别开篇

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

    5918 人正在学习 去看看 杨波
 

构建语音识别系统

告诉你:如何构建语音识别系统,用嘴“打”字

你还用书板上用笔画来画去,等着字一个一个地蹦出来吗?或者是忙着在键盘上,把一个一个的字的零件进行拆解?告诉你一个好消息,现在用嘴就能“打”字了,你难道不想把双手放在后脑袋上,动动嘴皮子,实现1分分钟打出150到200个的字,这样的轻松快速地输入?

其实,语音录入系统已经是装机的必备的,他先进的识别技术可以识别95%以上的汉字,在新的操作系统Windows Vista中,已经把语音录入作为一种输入法,如果你用的不是最新的操作系统,那你不必着急,你可以自己安装。

安装语音录入的系统要求:CPU要233M以上,操作系统要Windows 200或Windows XP以上,要有耳麦或麦克风。

1.检查麦克风

如果你的麦克风使用正常,就可以跳过这一步。

试着打开录音机程序(开始――程序――附件――娱乐一-录音机),按下录音按钮,对着耳麦说上几句,看看录音机能不能录下你说的话。

如果没有录上,你需要对麦克风进行设置:由于麦克风不是即插即用设备,你再启动系统之前,要先插好麦克风,然后在启动系统。

打开音量控制面板(在任务栏系统托盘中,右击小喇叭,选择打开音量控制),打开录音控制(选项――属性――录音),确保录音控制没有静音,并选中MIC。打开音量控制(选项――属性――播放音量),确保录音输入没有静音。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


再试着录一段话,如果还是没录上。那可能就是声卡伺服程序设置有问题了,我就遇到这样的问题,我使用的计算机主板是威胜的,他有一个专门的声卡伺服程序,打开那个伺服程序,对声卡的录入部分进行勾选,问题就解决了。

2.下载语音识别程序

现在使用的语音识别系统主要有2大类:一类是微软的Microsoft Speech SDK 5.1,一类是IBM的IBM Viavioce 9.1,他们都是免费的,公开的程序。

微软的Microsoft Speech SDK 5.1下载地址是:

http://www.microsoft.com/downloads/details.aspx?FamilyID=5e86ec97-40a7-453f-b0ee-6583171b4530&DisplayLang=en

SpeechSDK51.exe 开发包,大小64M左右

SpeechSDK51LangPack.exe 中文语言包,大小81.5M左右

 

 

IBM的IBM Viavioce 9.1下载地址是:(应用较多的)

         http://down.wz222.com/ibm9.1.iso  (大小276M)

用迅雷下载,速度很快的,由于它的安装光盘的镜像文件,需要用DAEMON Tools 虚拟光驱进行解压安装,DAEMON Tools程序网上到处都有,百度一下就可以。

你可以根据喜爱,任意地选择一个进行下载并安装。

3.使用前调试

微软的Microsoft Speech SDK 5.1

打开控制面板――声音语音和音频设备――语音,打开语音属性面板。选择语言:简体中文;新建:识别配置文件,根据提示完成配置。注意,每一个要使用语音录入的人都要设置保存自己的配置文件,一个语音录入系统可以保存好几个人的配置文件,在使用时可以点击语音工具(在系统托盘中。麦克风没被按下时才显示语音工具,麦克风被按下时,则显示听写模式。如果没有显示,可以点击那个小小的向下按钮,不进行选择,然后再在任务栏其他地方点一下就出来了),选择用户,下一级菜单中选择已保存的用户,进行录入。

 

 

 

 

 

 


IBM的IBM Viavioce 9.1

在安装完成后,自动进入用户配置文件。新建用户和选择用户都在Viavioce主菜单----用户---- Viavioce选项----用户选项卡中

4.如何使用

微软的Microsoft Speech SDK 5.1

右击任务栏中麦克风图案,选择设置,打开文字服务和输入语言,选高级选项,勾选兼容配置。

  打开录音控制(如果你的录音控制处于关闭),点击(左击)麦克风和听写模式,打开Word程序,对着耳麦念文章,Word就能为你写下来。

IBM的IBM Viavioce 9.1

启动IBM语言中心,打开Word,选择一种中文输入法,点击IBM语言中心麦克风按钮,即可使用。

5.结束录入

要关闭语音录入。点击(左击)麦克风,使他处于不选状态,打开录音控制,勾选录音控制中全部静音。

相信经过一段时间的交流与磨合,我相信你一定会爱死语音录入的。

           

          际头小学  童跃

          2007 8 8

语音识别的架构

阅读数 421

语音识别

阅读数 721

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