目录
设计任务
现代机器人工业中,我们希望控制系统更加人性化,例如可以听懂人的语音指令,从而使机器使用起来更加方便。特定语音辨识可以通过将一些特定语音存储于计算机中,当下达语音指令时,下达的指令与计算机存储的指令进行比对,从而确认该指令是否执行或执行哪一个指令操作。
1、录入“开”、“关”等语音命令;
2、用麦克给出语音命令,读入计算机,确定语音命令词的起始字元;
3、确定语音命令与计算机命令库中的命令的相似性,给出相似度最高的命令元素作为控制指令;
4、设计GUI界面。
设计原理及设计方案
语音辨识技术基本概述
语音识别是解决机器“听懂”人类语言的一项技术。作为智能计算机研究的主导方向和人机语音通信的关键技术,语音识别技术一直受到各国科学界的广泛关注。广泛意义上的语音识别按照任务的不同可以分为4个方向:说话人识别、关键词检出、语言辨识和语音识别。本课题主要研究语音辨识方向。
语言辨识技术是通过分析处理一个语音片断以判别其所属语言种类的技术,本质上也是语音识别技术的一个方面。它是一种将语音信号转化为可理解文本的技术,涉及语音信号的采集、特征提取和模式匹配等步骤。它的应用非常广泛。可以用于语音助手(如Siri、手机助手等)的命令识别、语音转写、语音翻译、语音搜索、电话自动语音应答系统等领域。
语音辨识系统基本原理
语音识别本质上是一种模式识别的过程,本次课程设计利用MATLAB,实现基于马尔科夫模型的数据特征提取,在此基础上编程实现特定语音实例的语音识别;它主要包括语音信号预处理、特征提取、特征建模、测度估计、识别判决等几个功能模块。
一个语音识别主要由学习和识别两个过程组成,学习过程就是要采用语言的分析方法分析出某种识别方法所要求的语音特征参数,这些参数被存储起来作为模板。识别过程就是模式匹配的过程,它也是整个系统的核心,其作用是根据语音和不同的层面按照相应的准则求取待测语音特征参数和语音信息与模式库中相应模板之间的测度,形成系最佳的识别输出。
预处理模块:对原始语音信号进行预处理,包括去除不重要的信息和背景噪声、进行语音信号的端点检测、分帧和预加重等操作。
特征提取模块:计算语音的声学参数,并提取关键的特征参数用于后续处理。常用的特征参数包括线性预测(LPC)参数、线谱对(LSP)参数、线性预测倒谱系数(LPCC)、Mel频率倒谱系数(MFCC)、感知加权的线性预测(PLP)参数、动态差分参数和高阶信号谱类特征等。其中,MFCC参数因其良好的抗噪性和鲁棒性而被广泛应用。
训练阶段:通过输入多个训练语音样本,经过预处理和特征提取后得到特征向量参数,建立一个匹配度较高的训练语音的参考模式库。
识别阶段:将输入语音提取的特征向量参数与参考模式库中的模板进行相似性度量比较,常用的相似性度量方法包括动态时间规整(DTW)和隐马尔可夫模型(HMM)。根据相似性度量的结果,系统会选择与输入语音最匹配的模板,然后结合判别规则和专家知识(如构词规则、语法规则等),得出最终的识别结果。
基于HMM的语音辨识实现
隐马尔可夫法(HMM)是一种用于语音信号建模和识别的统计模型,在语音识别领域已有数十年的历史。它的出现对于自然语音识别系统的发展起到了重要作用。HMM模型建立了一个双重随机过程,其中一个过程是隐含的,用具有有限状态数的Markov链来模拟语音信号的统计特性变化;另一个过程是可观测的,与Markov链的每个状态相关联的观测序列的随机过程。这种模型可以很好地描述语音信号的整体非平稳性和局部平稳性。人的言语过程本身也是一个双重随机过程,语音信号是由大脑根据语法知识和言语需要发出的音素参数流组成的可观测时变序列。因此,HMM模型可以很好地模仿这一过程,成为一种较为理想的语音模型,在语音识别领域得到广泛使用。
Markov链
HMM算法定义
HMM在语音识别的应用
基于HMM算法的语音辨识设计方案
利用HMM算法实现语音辨识步骤如下:
1、读取训练数据样本。
2、数据预处理:方便特征提取和模型训练。常用的预处理步骤包括预加重、分帧,加窗,端点检测和MFCC特征提取等。
3、HMM模型训练:使用已经预处理好的语音数据,采用Baum-Welch算法训练HMM模型。模型训练的过程包括模型初始化、模型训练和模型优化等步骤。
4、待识别语音读取。
5、语音识别:将待识别语音数据进行预处理,得到特征向量后,使用Viterbi算法计算每一个机器库中的HMM模型的对观测序列的最大输出概率,选择使观测序列概率最大的HMM模型对应的词作为语音识别识别结果。
6、评估分析。
课程设计的步骤和结果
总体UI设计
![](https://img-blog.csdnimg.cn/direct/2171f1309abe480a9b1a485a15635791.png)
音频文件的读取
通过调用MATLAB中的audioread函数读取本地wav格式的音频文件,或者通过录音的方式加载音频文件,可以调用audiorecorder和recordblocking这两个函数调用麦克风和设置录音时长。这里要注意的是,语音信号的频率范围是300-3000hz,所以采样频率一般为8000Hz和16000Hz,可以满足奈奎斯特采样定理,采样频率大于真实信号最大频率的2倍,这样不会导致频谱混叠。
音频文件预处理
语音信号的预处理是语音信号处理的重要部分,对后续的特征提取和模型训练等步骤具有重要影响。预处理步骤一般包括端点检测,预加重,分帧,加窗等,随后进行MFCC特征参数的提取。
预加重
预加重是一种高通滤波技术,用于提高语音信号的高频部分的能量,减少低频部分的能量,使得语音信号在后续处理中更容易区分不同的音素。预加重可以通过一阶高通滤波器实现,其差分方程为:
其中,x(n)表示输入的语音信号,y(n)表示输出的预加重信号,coeff为预加重系数,通常取值为0.95左右,即增强高频部分的能量,减少低频部分的能量。通过滤波器的处理,可以得到预加重后的音频信号。
![](https://img-blog.csdnimg.cn/direct/4698f734c64949a98ad843364995cd5e.png)
分帧
语音信号是时域信号,为了方便进行后续处理,需要将其分割为多个短时段的信号帧。通常采用帧长为20-30ms,帧移为10ms的分帧方式。分帧后,每一帧信号可以看作是一个平稳的信号,可以进行傅里叶变换等频域处理。假如采样率为16000hz,那么我们设置帧长为256个采样点,大约为16ms,帧移为80个采样点,大约为5ms进行分帧。
![](https://img-blog.csdnimg.cn/direct/aae810ac2daf40fa9f6e566a8631c7bc.png)
加窗
分帧后的信号帧是有突变的,将其直接进行频谱分析会导致频谱泄漏,影响后续处理的效果。为了减小频谱泄漏,需要对每一帧信号进行加窗处理。常用的窗函数有汉明窗、汉宁窗等,一般选择长度与帧长相同的窗函数。
![](https://img-blog.csdnimg.cn/direct/96003212c908471b9a549c3c78269b51.png)
提取MFCC参数
MFCC(Mel频率倒谱系数)是一种常用的语音特征参数,它是一种基于人的听觉模型,被广泛应用于语音识别、语音合成、说话人识别等领域。采用MFCC参数作为语音辨识能够提取语音信号中的关键特征,它可以对语音信号的频率特性进行了模拟,能够提取出语音信号中与人耳感知相关的关键特征。这些特征包括语音的音调、共振峰位置和带宽等,能够有效地区分不同的语音信号。
MATLAB实现MFCC参数提取步骤如下:
将加窗后的信号映射到Mel频率谱:使用Mel滤波器组将信号转换为Mel频率谱,通常使用20~40个滤波器,每个滤波器的中心频率不同。在得到加窗后的信号后,对其进行FFT变换得到幅度谱,然后取平方后映射到生成的梅尔频率系数上,得到梅尔倒谱系数(MFCC)。选择Mel频率谱的目的是模拟人类听觉系统的频率感知特性。
对Mel频率谱进行DCT变换:得到MFCC系数之后进行DCT变换可以压缩信号的能量,将高频部分的信息压缩到低频部分,从而获得更具有代表性的特征。通常选择前12个MFCC系数作为特征向量。
对MFCC系数进行加权处理:使用一个窗口函数对MFCC系数进行相乘加权,以减小信号两端的边界效应。常用的窗口函数有倒谱提升窗口,窗口大小通常为12。
差分处理进一步提取语音信号的动态特征:MFCC特征参数只能反映语音信号在短时间内的频率分布情况,不能反映语音信号的动态变化。而语音信号中的一些重要信息,比如语音的音调、语速、发音等,都会随着时间的变化而发生变化。因此,为了更好地反映这些动态变化,需要对MFCC特征进行差分处理,提高语音识别的准确率。
合并特征向量:将MFCC系数和差分系数合并成一个特征向量矩阵。
端点检测
端点检测是语音信号处理中的一个重要步骤,其目的是确定语音信号的开始和结束位置,以便后续的处理,如语音识别等。
在语音信号中,常常存在一些静音段(无声段)和噪声段,如果不进行端点检测,会导致后续处理的效果受到影响。因此,通过端点检测,可以将语音信号从静音段和噪声段中分离出来,得到纯净的语音信号,从而提高语音处理的准确性。其基本思想是根据语音信号的特征,在时间上确定语音段和非语音段的边界,一般采用瞬时能量和过零率相结合的方法。
其中,MATLAB程序通过设置一个状态机来跟踪语音信号的状态,包括静音状态、可能开始状态和语音段状态和语音结束状态。程序从静音状态开始,如果当前帧的能量大于能量低门限amp2或过零率大于低过零率门限zcr2,则认为当前帧可能处于语音段,将状态转移为语音可能开始状态,如果当前帧的能量超过高能量门限amp1,则认为进入了语音段,将状态转移为语音状态,并记录当前帧为语音段的起始点x1。如果当前帧的能量已知大于低能量门限或过零率大于过零率门限,则保持在语音段状态,如果当前帧的能量和过零率均小于门限值,则认为语音段即将结束,状态转移为结束状态并记录当前帧为语音段的结束点x2。
![](https://img-blog.csdnimg.cn/direct/b556ffdb34c049d3963a4d64fa92c8c5.png)
![](https://img-blog.csdnimg.cn/direct/987451ee2a93427abdbfa9d02690be67.png)
![](https://img-blog.csdnimg.cn/direct/cd08613960a74bd4ae320b5f3b0843de.png)
HMM机器训练
HMM训练的目标是通过训练数据来估计模型参数,使其能够较好地描述观测序列的生成过程。训练过程使用Baum-Welch算法,通过迭代更新模型参数来最大化输出观测序列的概率。
初始模型参数设定
根据Baum-Welch算法由训练数据得到HMM参数时,首先要解决的就是先得找出初始的参数值,这样才能根据这些初始值,再经过训练得到系统的参数。初始值的选择影响了整个系统的识别效果。不同的初始模型参数会产生不同的训练结果。由于是在局部最大的条件下得到的模型参数,所以应选取较好的初始模型,使局部极大与全局最大接近。这个问题一般都是采用经验值来解决。经验认为,和A参数初值的选取影响不大,在满足以下四个条件下,可以随机选取或均匀取值不为0:因此选取比较简单的方法对模型初始化:初始化初始状态概率(hmm.init)为一个大小为N的列向量,其中第一个元素为1,其余为0。初始化状态转移概率矩阵A(hmm.trans),采用简单的均匀分布方式,每个状态的转移概率相等,最后一个设置概率为1,只能转移为本身,在孤立词识别过程中,通常定义三个状态,即状态一:音节的开始;状态二:音节的中间;状态三:音节的结束;并且结构为顺序执行,这样就可以定义出一个顺序状态转移的转移概率矩阵,最后一个元素状态转移概率为1表示结束不能转移到其他状态。
初始化输出观测值概率B(hmm.mix)为连续混合高斯分布(GMM模型初始化)。假设我们的语音过程有三个状态,每个状态进行高斯混合模型建模所包含的成分有3个,首先我们将每一个待训练的特征参数序列平均分成三份子序列,每一个子序列代表着一个状态,然后对每一份子序列(子状态)进行kmeans聚类算法分为3类进行建模,即建模为混合成分为3的高斯混合模型。然后调用相关函数计算每个混合模型成分的均值、方差,然后根据每一类的样本数目除总的样本数目,得到每一个成分的权重,并将所有结果保存在mix结构体中,这样便可以完成初始化发射概率矩阵。
Baum-Welch算法训练
HMM模型的Baum-Welch算法用于迭代地训练模型参数。Baum-Welch算法是一种无监督学习算法,也称为前向后向算法或期望最大化(Expectation-Maximization,EM)算法其基本思想是通过迭代的方式不断调整HMM模型的参数,使得模型对观测序列的匹配度最大化。它用于在给定观测序列的情况下,通过最大化似然函数来估计HMM模型的参数。
算法的主要步骤包括:
(一)初始化:首先需要初始化隐马尔可夫模型参数。上一步已经完成。
(二)Expectation(E)步骤:计算每个时间步长上期望的隐状态。这包括两个关键计算:使用前向算法计算每个时间步长(t)的前向概率,使用后向算法计算每个时间步长(t)的后向概率,通过前向概率和后向概率的乘积计算每个状态在每个时间点处的状态转移概率,然后遍历所有的训练样本,统计在计算在所有训练数据中,从状态i转移到其他所有状态的次数。计算状态转移的期望次数,即在时刻t处于状态i并在时刻t+1处于状态j的期望次数。
(三)Maximization(M)步骤:根据E步骤的期望概率重新估计模型参数,使用期望状态概率重新估计初始状态概率向量,使用期望状态转移次数更新状态转移矩阵A;使用期望观测概率更新观测概率矩阵B。
(四)收敛检查:检查模型参数的变化是否满足预设的收敛条件(设置达到最大迭代次数40)。若不满足,返回步骤2,重新进行E步骤。若收敛,终止算法。经过多次迭代,Baum-Welch算法找到一个合适的模型参数估计,使HMM能够在给定观测序列条件下,最大化其似然。这使得该HMM可以生成具有类似观测序列分布的新序列,并用序列标注、解码等工作。
HMM识别过程
在训练完成HMM模型后,我们需要使用Viterbi算法来找出观测序列的最优状态序列所在的HMM模型,以便识别出所说的单词或音节。
Viterbi算法是一种动态规划算法,用于寻找给定观测序列的最优状态序列。它通过计算每个时间步t的每个状态j的输出概率值和最优路径来实现。
在MATLAB程序中主要步骤为:
(一)初始化:首先从HMM模型中获取初始概率矩阵、转移概率矩阵A、高斯混合模型和状态数量,以及观测序列长度。
(二)将HMM模型中的概率值转换为对数形式,这是因为在计算中使用log函数可以避免概率值为0的情况,并且对数运算可以将概率乘法转换为加法运算,可以大大减少运算量。
(三)应用Viterbi算法求解该HMM模型的最大输出概率。
(四)通过比较不同词汇的HMM模型最大输出概率,确定哪个词的HMM模型最有可能与待识别语音符合完成识别目的。