1、项目6熟悉常见语音处理技术单句语音内容识别1实训目标(1) 熟练掌握通过python_speech_features库的mfcc函数进行MFCC特征提取。(2) 能够通过hmmlearn库中HMM模块实现HMM语音识别模型的构建。(3) 熟练掌握HMM模型的训练和测试。2实训环境环境版本说明Windows1064电脑操作系统Python3.8.5Python语言版本pandas1.3.0主要用于数据读取、清洗等操作NumPy1.21.6主要用于Python中的数值计算jieba0.42.1主要用于文本分词Gensim4.2.0主要用于检索文本、计算文本相似度、训练词向量、建模主题等Matplo
2、tlib3.3.0主要用于数据可视化PaddlePaddle2.4.2是一个深度学习框架,提供了高效的计算框架和优化算法PaddleSpeech1.2.0主要用于语音和音频中的各种关键任务的开发scikit-learn1.0.2广泛地用于统计分析和机器学习建模等数据科学领域Librosa0.8.1主要用于分析一般的音频信号,是一个非常强大的Python语音信号处理的第三方库NETK3.5是一个常用的自然语言处理工具包,可用于文本处理、语义分析、词性标注等SciPy1.7.3是一个科学计算工具包,可用于数学、科学、工程学等领域pyttsx32.9.0主要用于将文本转换成语音3实训说明单句语音内容
3、识别是一种语音识别任务,它的目标是从一个语音信号中识别出一个短语、句子或命令等特定的文本内容,通常应用于语音交互式系统、语音控制系统、语音助手等领域。基于HMM模型的单句语音内容识别是一种经典的语音识别方法。其基本思路是将语音信号转换成一系列状态,然后通过对状态序列的统计建模,将其与文本序列进行匹配,从而实现语音到文本的转换,通用流程图如图3-1所示。4实训步骤4.1 数据读取及特征提取在单句语音识别中,数据读取和特征提取是两个非常关键的步骤。它们对于整个语音识别系统的性能和准确度具有重要影响。对于语音识别任务来说,首先需要获取原始的音频数据。数据读取是将原始音频文件转换成计算机可以处理的数字
4、信号的过程。特征提取是从原始音频信号中提取对语音识别任务有用的特征的过程。训练集使用一共100个音频数据,中文发音从1-10的单音节数据,数据格式为wav文件,部分数据如图4-1所示。OOOOO0OOOOO00O1_1.wav1_2,wav1_3.wavl_4.wav1_5.wav1_6.wav1_7.wav1_8,wav1_9.wav1_10.wav2_1.wav2_2,wav2_3.wav2_4,wavO0O0OOOO0OOOOO2_5.wav2_6.wav2_7.wav2_8.wav2_9.wav210.wav3_1.wav3_2.wav33.wav3_4.wav3_5.wav3_6.w
5、av3_7.wav3_8WaVOOOOOOOO0OOOOO3-9.wav3J0.wav4_1.wav4_2.wav4_3.wav4.4.wav4_5.wav46.wav4_7.wav4_8.wav4_9.wav4J0.wav5J.wavSZwavOOOO0OO00O0OOO5_3.wav5_4.wav5_5,wav5_6,wav5_7.wav5_8.wav5_9,wav5_10.wav6_1.wav6_2.wav6_3.wav6_4,wav6_5,wav6_6,wavO000OOOO0OOOOO6_7.wav6_8.wav6_9.wav610.wav7_1.wav7_2.wav73.wav7_
6、4,wav7_5.wav7_6.wav77WaV7_8.wav7_9.wav710.wavOOOOOOOOO0OOOO8_1.wav8_2.wav8_3.wav8_4.wav8_5.wav8_6.wav8_7.wav8_8.wav89.wav8_10.wav9Jwav9_2,wav9_3.wav94.wavO0O00OOO0OOO0O9_5.wav9_6.wav9_7,wav9_8.wav9_9.wav9_10.wav10_1.wav10_2.wav10_3.wav10_4.wav10_5.wav10_6.wav10_7.wav10_8.wav图4-1音频数据在数据准备阶段,生成字典存储路径信
7、息和存储标签信息,这是在构建训练集和测试集中必须的准备步骤,如代码4-1所示。代码4-1生成字典存储路径信息和存储标签信息frompython_speech_featuresimportmfccfromscipy.ioimportwavfilefromhmmlearnimporthmmimportjoblibimportnumpyasnpimportosimportwarningswarnings.filterwarnings(ignore)defgen_wavlist(wavpath):#定义一个空字典,用于存储.wav文件的路径信息,key为文件名,ValUe为文件的完整路径wavdict
8、二#定义一个空字典,用于存储标签信息,key为文件名,VaIUe为该文件的标签Iabeldict=for(dirpath,dirnames,filenames)inos.walk(wavpath):#遍历所有的文件forfilenameinfilenames:#若文件扩展名为wav,则执行以下操作iffilename.endswith(.wav):# 生成文件的完整路径filepath=os.sep.join(dirpath,filename)# 获取文件名作为字典的keyfileid=filename.StripC.wav)# 将文件的完整路径存储到字典中,以文件名为keywavdictfi
9、leid=filepath# 将文件的标签信息存储到字典中,以文件名为keylabel=fileid.split(J)llabeldictfileid=label#返回存储了.wav文件路径信息和标签信息的两个字典returnwavdict,Iabeldict#准备训练所需数据CATEGORY=,2,3,4,5,6,7,8,9,10wavdict,Iabeldict=gen_wavlist(trainmg_data)PrintC路径字典:W,wavdict)PrintC标签字典:nIabeldict)运行代码4-1,得到的部分结果如下。路径字典:4_4:,training-data4-4.wa
10、v,7_3:trainmg_data/7_3.wav,7_6:training_data/7_6.wav,6_4:training_data/6_4.wav,7_5:training_data/7_5.wav,5_5:training_data/5_5.wav,trainingdata/2Lwav,37/trainingdata/3LWaV,54:trainingdata/54.wav,trainmg_data/5_10.wav林签字典:4_4:4,7_3:3,7_6:6,6_4:4,7_5:5,5_5:5,5_4:4,3_6:6,10_9:9,4,1_6:6,9_9:9,6_9:9,5_7:
11、7,8_2:2,9_6:6,6_8:8,7_4:4,4_5:5,3_2:2,2_3:3,10.4:4,2_2:2,2_6:6,10J:,7,3J0:10,5_10:10,在Python中,除了可以通过项目5介绍到的IibroSa库实现MFCC特征提取之外,还可以利用python_speech_features库实现。python_speech_features库主要关注基本语音特征提取,相对简单且计算速度较快,而Iibrosa库提供了更广泛的音频处理功能和参数选项,具有更高的易用性和适应不同应用场景的能力。本任务主要通过python_speech_features库的mfcc函数进行MFCC特
12、征提取。更换构建MFCC特征提取函数如代码4-2所示。代码4-2MFCC特征提取代码defcompute_mfcc(file):# 读取音频文件fs,audio=wavfile.read(file)# 使用mfcc函数计算音频文件的特征mfcc_feat=mfcc(audio,SamPIerate=(fs2),numcep=26)# 返回MFCC特征returnmfcc_feat在代码4-2中,mfcc函数的常用参数说明如表4-1所示。表4-1mfcc函数的常用参数及其说明参数名称参数说明signal接收NUmPy,表示正则化参数。无默认值samplerate接收int或float,表示音频信
13、号的采样率,以HZ为单位。无默认值numcep接收int,表示提取的MFCC的个数,即MFCC的维度。默认为13代码4-2所编写的函数compute,mfcc集成到后续HMM语音识别模型的类中,便于对音频特征进行提取,在训练测试阶段直接调用。4.2构建HMM语音识别模型HMM语音识别模型包括了4个模块,如图4-2所示。图4-2HMM语音识别模型读者可以将HMM语音识别模型的模块集成到Model类中,如代码4-3所示。代码4-3HMM语音识别模型#特征提取,feat=compute-mfcc(wadictwavid)defcompute_mfcc(file):# 读取音频文件fs,audio=w
14、avfile.read(file)# 使用mfcc函数计算音频文件的特征mfcc_feat=mfcc(audio,samplerate=(fs2),numcep=26)# 返回MFCC特征returnmfcc_featclassModel():definit_(self,CATEGORY=None,n_comp=3,n_mix=3,cov-type=diag,n_iter=1000):初始化模型CATEGORY:类别标签列表,如apple,banana,orangen_comp:HMM-GMM模型的组件数量n_mix:HMM-GMM模型的混合数量cov_type:协方差类型:paramn_it
15、er:迭代次数super(Model,self).init()self.CATEGORY=CATEGORYself.category=Ien(CATEGORY)self.n_comp=n_compself.n_mix=n_mixself,cOVjyPe=cov_typeself.n_iter=n_iter#关键步骤,初始化models,返回特定参数的模型的列表self.models=forkinrange(self.category):model=hmm.GaussianHMM(n_components=self.n_comp,n_mix=self.n_mix,covariance_type=
16、self.cov_type,n_iter=self.n_iter)self.models.append(model)#模型训练deftrain(self,Wavdict=None,Iabeldict=None):If11!f使用给定的音频数据和标签进行模型训练wavdict:音频数据字典,键为文件名,值为音频数据Iabeldict:标签数据字典,键为文件名,值为类别标签IfHffforkinrange(10):subdata=model=self.modelskforxinwavdict:iflabeldictx=self.CATEGORYk:mfcc_feat=compute-mfcc(wa
17、vdictx)model.fit(mfcc_feat)#使用特定的测试集合进行测试deftest(self,Wavdict=None,Iabeldict=None):使用给定的音频数据和标签进行模型测试wavdict:音频数据字典,键为文件名,值为音频数据Iabeldict:标签数据字典,键为文件名,值为类别标签result=forkinrange(self.category):subre=label=model=self.modelskforxinwavdict:mfcc_feat=compute-mfcc(wavdictx)#生成每个数据在当前模型下的得分情况re=model.score(
18、mfcc_feat)subre.append(re)label,append(labeldictx)#汇总得分情况result,append(subre)# 选取得分最高的种类result二np.vstack(result).argmax(axis=O)# 返回种类的类别标签result=self.CATEGORYlabelforlabelinresultPrintC识别得到结果:11,result)Print(噱始标签类别:n,label)# 检查识别率为:正确识别的个数/总数totalnum=Ien(Iabel)correct=sum(lforiinrange(totalnum)ifres
19、ulti=labeli)recognition_rate=correct/totalnumPrintC识别率:.2f.format(recognition-rate)在代码4-3中,HMM模型可以通过hmmlearn库中HMM模块的GaussianHMM函数进行实现。GaussianHMM函数的常用参数说明如表4-2所示。表4-2GaussianHMM函数的常用参数及其说明参数说明参数名称n_components接收int,表示隐状态(状态数)的个数。默认为1CovarianceJype接收int,表示最大迭代次数。默认为10接收str,表示协方差矩阵的类型,可选值有“diag”(对角线协方差
20、矩阵,默认值)、“full”(完整协方差矩阵)Wtied(所有状态共享一个协方差矩阵)。默认为“diag”n_mix接收int,表示高斯混合模型的数量。默认为143模型训练与测试调用构建好的Model函数,对HMM模型进行训练并输出训练集上的识别表现,如代码4-4所示。代码4-4训练HMM模型并输出训练集上的识别表现# 进行训练与测试models=Model(CATEGORY=CATEGORY)models.train(wavdict=wavdict,Iabeldict=Iabeldict)models.save()运行代码4-4,得到的识别结果如下。识别得到结果:4,3,6,4,5,5,4,
21、4,9,4,4,9,9,7,2,6,8,4,5,2,3,4,2,4,2,9,10,8,9,7,9,8,7,7,2,3,3,8,6,10,2,7,2,3,4,3,5,3,6,5,10,10,3,2,3,7,8,2,5,2,7,4,5,8,3,9,8,4,4,5,4,10,9,4,10,9,8,8,9,4,7,7,9,9,6,5,8,7,10,10原始标签类别:4,3,6,4,5,5,4,6,9,4,6,9,9,7,2,6,8,4,5,2,3,4,2,6,2,10,10,8,9,7,9,8,7,7,2,3,3,8,5,10,2,7,2,3,4,3,5,3,6,5,10,10,3,2,3,7,8,2
22、5,2,7,4,5,8,3,9,8,6,6,5,4,10,9,6,1O,9,8,8,9,4,7,7,1O,9,6,5,8,7,1O,10识别率:0.91从代码4-4的输出结果可以看出,HMM模型对不同的数字发音都能有良好的拟合,在训练集上的识别率达到0.91。接下来在测试集上进行测试,并输出测试集上得识别结果,如代码4-5所示。代码4-5预测测试集# 获取测试集信息testdict,testlabel=gen_wavlist(test_data)# 模型加载models.load()#在测试集上作测试models.test(wavdict=testdict,labeldict=testlab
23、el)运行代码4-5,得到的测试结果如下。识别得到结果:4,6,3,9,5,2,8,9,7原始标签类别:4,6,3,10,5,2,8,9,7识别率:0.9从测试结果中可以看出,在测试集合上HMM模型识别率可以达到0.9。基于HMM的语音识别方法具有较好的性能,其已经在很多领域得到了广泛应用。但也存在一些问题,如对噪声和语音变化的适应性较差,需要进一步改进和优化。5实训小结技术点自评达标未达标能够通过python_speech_features库实现MFCC特征提取能够通过hmmleam库中的HMM模块实现HMM语音识别模型的构建能够对构建的HMM模型进行训练和测试心得体会(如遇到的问题及解决方法、存在的不足之处等):