DSP语音识别实验报告之欧阳物创编.docx
- 文档编号:9433509
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:25
- 大小:100.20KB
DSP语音识别实验报告之欧阳物创编.docx
《DSP语音识别实验报告之欧阳物创编.docx》由会员分享,可在线阅读,更多相关《DSP语音识别实验报告之欧阳物创编.docx(25页珍藏版)》请在冰点文库上搜索。
DSP语音识别实验报告之欧阳物创编
DSP课程设计
时间:
2021.02.07
命题人:
欧阳物
实验报告
语音识别
院(系):
电子信息工程学院自动化系
设计人员:
李彬学号:
07212072
设计人员:
宋淦泉学号:
07212077
成绩:
工程设计50
报告20
答辩30
总分
评语:
指导教师签字:
日期:
一、设计任务书
1、实验概述
2、实验目的
二、设计内容
三、设计方案、算法原理说明
1、设计步骤
2、算法原理说明
四、程序设计、调试与结果分析
1、算法流程图
2、主程序
3、测试过程及结果分析
五、设计(安装)与调试的体会
1、编程及程序运行中遇到的问题及解决办法
2、本次实验的心得体会
六、参考文献
一、设计任务书
实验概述:
语言是人类特有的功能,声音是人类最常用的工具。
通过语音传递信息是人类最重要最有效最常用和最方便的信息交换形式。
语音信号是人类进行思想沟通和情感交流的最主要的途径。
让计算机能听懂人类的语言,是自计算机诞生以来人类梦寐以求的想法。
在本实验中,将针对DTW算法,实现对最简单的单音信号进行语音识别的问题。
语音识别以语音为研究对象,它是语音信号处理的一个重要研究方向,是模式识别的一个分支,涉及到生理学、心理学、语言学、计算机科学以及信号处理等诸多领域,甚至还涉及到人的体态语言(例如人在说话时的表情、手势等细微动作可帮助对方理解),其最终目标是实现人与机器进行自然语言通信。
语音识别技术主要包括特征提取技术、模式匹配准则及模训练技术三个方面。
此外,还涉及到语音识别单元的选取。
语音识别系统的研究涉及微机技术、人工智能、数字信号处理、模式识别、声学、语言学和认知科学等多种学科领域,是一个多学科综合性研究领域。
语音识别系统的分类---根据对说话人说话方式的要求,可以分为孤立字(词)语音识别系统、连接字语音识别系统以及连续字语音识别系统。
根据对说话人的依赖程度可以分为特定人和非特定人语音识别系统。
根据词汇量大小,可以分为小词汇量、中等词汇量、大词汇量以及无限量词汇量语音识别系统。
一般来说,语音识别的方法有三种:
基于声道模型和语音知识的方法、模版匹配的方法以及利用人工神经网络的方法。
基于声道模型和语音知识的方法起步较早,在语音识别技术提出的开始,就有了这方面的研究。
但由于其模型及语音知识过于复杂,还没有达到实用阶段。
人工神经网络的方法是80年代末期提出的一种新的语音识别方法。
人工神经网络本质上是一个自适应非线性动力学系统,模拟人类神经活动的原理,具有自适应性、并行性、鲁棒性、容错性和学习特性,在结构和算法上都显示出实力。
但由于存在训练、识别时间太长的缺点,目前仍处于实验探索阶段。
模版匹配方法中,要经过四个步骤:
特征提取、模版训练、模版分类、判决。
实验目的:
1、掌握5402DSP片上外设TLC320AD50CODEC编译码的内部结构、工作原理以及在C语言下的编程方法;
2、掌握通过C语言实现5402DSP片上外设FLASH的读写操作;
3、掌握FFT(快速傅里叶变换)、DTW(动态时间规整)算法,从而实现语音识别系统的开发;
4、熟练使用CCS5000集成开过程。
5、发环境完成对程序的调试
二、设计内容:
语音识别(SpeechRecognition)主要是指让机器听懂人说的话,即在各种情况下,准确地识别语音的内容,从而根据其信息,执行人的各种意图或执行特定的任务,其最终目标是实现人与机器进行自然语言通信。
5402DSP是整个硬件系统的信号处理中心,完成了语音数据的获得、语音特征向量的提取和语音识别功能。
本实验要求用TMS320C5402进行语音识别,使用CODEC(编译码器)对外部输入数据进行采集,DSP对语音信号进行保存和识别后再由CODEC口输出。
本次实验所需达到的目标是:
能够识别特定人所说的特定字,若符合,则显示识别结果,并输出相应的字。
三、实验原理:
语音识别原理方框图如下图所示:
各模块工作原理为:
(一)CODEC模块
CODEC模块以TLC320AD50为核心,其内部集成了16位A/D和D/A转换器,采样速率最高可达22.05KHZ,并可通过外部编程进行设置。
在TLC320AD50C内部DAC之前有插值滤波器,而在ADC之后有抽样滤波器,接受和发送可以同时进行。
它采用两组模拟输入和两组模拟输出,有足够的共模抑制能力,可工作在差分或单端方式。
输入增益和输出衰减可以通过外部编程控制。
AD50芯片使用差分输入、单端输出方式,这就需要将音频信号转换成差分信号,采用TLC2272低噪声的运算放大器实现转换功能。
最后,AD50单端输出信号经音频功率放大器LM386放大后输出。
CODEC内部电路如下图所示:
(二)Flash存储器
DSK提供了一个256K×16bit字的低电平flash存储器。
FLASH可用于DSP的数据和程序存储空间。
模拟输入
模拟输出
(三)语音信号识别模块
语音信号中含有丰富的信息,如何从中提取出对语音识别有用的信息是语音识别的关键。
特征提取就是完成这项工作,它对语音信号进行分析处理,去除对语音识别无关紧要的冗余信息,获得影响语音识别的重要信息。
对于非特定人语音识别来讲,希望特征参数尽可能多地反映语义信息,尽量减少说话人的个人信息(对特定人语音识别来讲,则相反)。
从信息论角度讲,这是信息压缩的过程。
语音识别的步骤分为两步。
第一步是根据识别系统的类型选择能够满足要求的一种识别方法,采用语音分析方法分析出这种识别方法所要求的语音特征参数,这些参数作为标准模式由机器存储起来,形成标准模式库,这个语音参数库成为“模板”,这一过程称为“学习”或“训练”。
第二步就是识别。
其原理框图如下图所示:
输入识别输出
语音
训练类聚
语音识别的原理框图
语音信号的预处理包括反混叠滤波,A/D变换,预加重,加窗和分帧处理等。
预加重的目的是提升高频部分,使信号的频谱变得平坦,以保持在信号的整个频带内,具有同样的信噪比,便于声道参数分析。
在语音信号的数字处理中常用的是矩形窗和汉明窗等,窗口的形状、长度对短时分析参数的影响很大,为此,应选择合适的窗函数。
语音信号有10ms~30ms的短时平稳性,一般每秒的帧数为33帧~100帧。
为了使帧与帧之间平滑过渡,前一帧与后一帧之间必须保持一定的帧移,帧长与帧移的比值一般取为0~1/2。
经过预处理的语音信号,就要对其进行特征参数的分析,在提取特征参数之前应先对提取的语音信号进行起点和终点检测,它是特征训练和识别的基础。
端点检测通常采用时域分析法,进行端点检测的主要依据是能量、振幅和过零率。
但是某些单词的端点检测却存在问题,准确地检测出声音区间是很困难的。
我们采用了短时过零率和短时平均能量结合进行端点检测。
设分帧之后第n帧语音信号为
,因为每一帧语音信号的短时能量有一个缺陷,即它对高电平非常敏感,所以采用短时平均幅度函数
来进行判断,此外,设所有语音信号的平均能量为pn,则当2*
>pn时将该帧语音判为语音信号的起点,当4*
短时过零率表示一帧语音中语音信号波形穿过横轴(零电平)的次数。 对于连续语音信号,过零即意味着时域波形通过时间轴,而对于离散信号,如果相邻的取样值符号改变则称为过零。 过零率就是样本改变符号的次数。 定义语音信号的短时过零率为 , 当 时,则判断语音已经开始,将这个条件与利用短时平均幅度求起点的条件取与,得到最终求得的语音起点,这样可以达到更加精确的效果,而判断语音终点,利用短时平均幅度的条件就足够了。 下一步要提取语音的特征参数,识别参数可以选择: 频谱、倒谱、线性预测系数,音长、音调、声调等超音段信息函数。 对特征参数的要求是: (1)提取的特征参数能有效地代表语音特征,具有很好的区分性。 (2)各阶参数之间有良好的独立性。 (3)用于语音识别的距离测度有多种,如欧氏距离及其变形的距离、似然比测度、加权了超音段信息的识别测度等。 特征参数要计算方便,具有高效的计算方法,以保证语音识别的实时实现。 由于语音波是一个非平稳过程,因此适用于周期、瞬变或平稳随机信号的标准傅立叶变换不能用来直接表示语音信号,所以我们采用短时傅立叶变换对语音信号的频谱进行分析,即利用了短时谱。 而利用短时傅立叶变换求取的语音信号的短时谱,它是按实际频率分布的,用按实际频谱分布的频谱作为语音特征,由于它不符合人耳的听觉特性,将会降低语音信号处理系统的性能,所以我们又将实际的线性频谱转化为了临界带频谱特征矢量。 语音库就是声学参数模板。 它是用训练与聚类的方法,从多次重复的语音参数,经过长时间的训练而聚类得到的。 由于语音信号具有相当大的随机性,即使是同一人在不同时刻说的同一句话、发的同一个音,也不可能具有完全相同的时间长度。 语音识别中也不能简单的将输入参数和参考模板直接做比较。 为此,一种简单的方法是采用对未知语音信号均匀地伸长或缩短直至它与参考模板的长度相一致。 采用这种方法能达到的精度完全取决于端点检测的精度。 将特征参数进行一定的处理后,为每个词条得到一个模型,保存为模板库。 在识别阶段,语音信号经过相同的通道得到语音参数,生成测试模板,与参考模板进行匹配,将匹配分数最高的参考模板作为识别结果。 同时还可以在很多先验知识的帮助下,提高识别的准确率。 测度估计是语音识别的核心。 求取测试语音参数与模板之间测度的方法有很多种。 如动态时间规整法(DTW)、有限状态矢量量化法,隐马尔可夫模型法等。 对于输入信号计算而得的测度,判决选出可能的结果中最好的结果,由识别系统输出,这一过程就是判决。 因此,选择适当的各种距离测度的门限值成了主要的问题。 我们采用了动态时间规整算法(DTW)来进行测度估计。 DTW(DynamicTimeWarping)即动态时间归整算法,为解决语音识别中语速多变的问题提供了一条有效的途径。 当词汇表较小时,对提高系统的识别精度非常有效。 这种方法中,未知单词的时间轴要不均匀地扭曲或弯折,以便使其特征与模板特征对正。 在归整过程中,输入的是两个时间函数,典型的有幅度,LPC系数,倒谱系数。 动态时间归整是将时间归整和距离测度结合起来的一种非线性归整技术。 如设测试语音参数共有N帧矢量,而参考模板共有M种矢量,且N不等于M,则动态时间归整就是寻找一个时间归整函数j=w(i),它将测试矢量的时间轴I非线性的映射到模板的时间轴j上,并使该函数w满足: 上式中,d[T(i),R(w(i))]是第i帧测试矢量T(i)和第j帧矢量R(j)之间的距离测度,D则是处于最优时间归整情况下两矢量之间的匹配路径。 由于DTW不断地计算两矢量的距离以寻找最优的匹配路径,所以得到的是两矢量匹配时累积距离最小的归整函数,这就保证了它们之间存在最大的声学相似。 实际中DTW是采用动态规划技术DP(DynamicProgramming)来加以具体实现的。 规整过程如下图所示: 通常,归整函数w(i)被限制在一个平行四边形内,它的一条边的斜率为2,另一条边的斜率为1/2。 归整函数的起始点为(1,1),终止点为(N,M)。 w(i)的斜率为0,1,2,否则就为1或2。 我们的目的是寻找一个归整函数,在平行四边形内由点(1,1)到点(N,M)具有最小代价函数。 总代价函数的计算式为: 上式中,D[c(k)]为匹配点c(k)以前所有允许值中最小一个。 因此,总代价函数是该点本身的代价与到达该点的最佳路径的代价之和。 这样就可以得到待测模板和一个参考模板的最小匹配距离。 把待测模板和所有的参考模板都进行比较,得到各自的最小匹配距离,再从里面找出最小的一个,就是要求的结果。 四、程序设计、调试与结果分析 (一)算法流程图 算法主要分为两个部分,一是参数即特征值的提取,二是语音的识别和训练。 下面分别进行说明。 (1)参数提取算法流程图: (2)判断识别阶段流程图如下: (二)主程序 #include"type.h" #include"board.h" #include"codec.h" #include"mcbsp54.h" #include"flash.h" #include"stdio.h" #include"tms320.h" #include"math.h" #include"dsplib.h" #include"stdlib.h" #defineVOICELEN8000//声音的长度 #defineSHIFT160//每帧的样本点数 #defineWINDOW256//窗的长度 #defineWEISHU16//维数 #defineCEPBUFFERLEN16*16 #defineMAXREAL100000000000.0 #pragmaDATA_SECTION(jf,".input")//自定义数据段 DATAjf[WINDOW]; /*************************************************************************/ /*FunctionPrototypes*/ /************************************************************************/ voidtezheng(DATA*fan);//提取特征向量的函数的声明 voidcheckstart();//断点检测的函数声明 voidrecvoice();//语音识别的函数声明 voidtrain();//训练或学习的函数声明 voiddelay(s16period);//延时子程序 floatdtw(DATA*cep,DATA*rcep);//dtw算法的函数声明 u16min(u16a,u16b,u16c); floatlmin(floata,floatb,floatc); /**********************************************************************/ /*GlobalVariables*/ /**********************************************************************/ HANDLEhHandset; s16data[VOICELEN]; DATAtempdata[WINDOW]; intbegin=0; intend=0; intstart=0; intt=3; unsignedintnum_frame=0; u16dest=0x8000; intcheckresult=-535; /**************************************************************************/ /*MAIN*/ /*********************************************************************/ voidmain() { u16i=0; u16j=0; intt=3; floathamming[WINDOW]; DATAfan[CEPBUFFERLEN]; for(i=0;i { hamming[i]=0.54-0.46*cos(2*i*3.14159/(WINDOW-1));//汉明窗 } if(brd_init(100))//初始化DSK板 return; /*OpenHandsetCodec*/ hHandset=codec_open(HANDSET_CODEC);//为一个codec事件分配一个识别句柄 /*Setcodecparameters*/ codec_dac_mode(hHandset,CODEC_DAC_15BIT);/*DACin15-bitmode*/ codec_adc_mode(hHandset,CODEC_ADC_15BIT);/*ADCin15-bitmode*/ codec_ain_gain(hHandset,CODEC_AIN_6dB);/*6dBgainonanaloginputtoADC*/ codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB);/*-6dBgainonanalogoutputfromDAC*/ codec_sample_rate(hHandset,SR_8000); while (1) { i=0; printf("请读入语音数据\n"); while(i { /*Waitforsamplefromhandset*/ while(! MCBSP_RRDY(HANDSET_CODEC)){};//判断A/D转换的数据是否准备好 /*Readsamplefromandwritebacktohandsetcodec*/ data[i]=*(volatileu16*)DRR1_ADDR(HANDSET_CODEC);//读取A/D转换数据 *(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=data[i];//将数据写入D/A转换器 data[i]/=100; i++; } checkstart();//检测开始 fan[0]=num_frame;//将帧数放入fan[0]函数中 printf("语音信号的起点: %d\n",start); printf("语音信号的终点: %d\n",end); printf("有效的语音数目: %d\n",end-start); printf("有效的帧数目: %d\n",num_frame); if(num_frame! =0) { for(i=start-1;i { for(j=0;j { tempdata[j]=data[i+j]*hamming[j];//加汉明窗 } tezheng(&fan[(i+1-start)/SHIFT*WEISHU]);//调用特征函数 } train(fan); if(t==3) { recvoice(); } num_frame=0; begin=0; end=0; start=0; } else; delay(1000);//延时后重新开始接收数据 } } /*********************************************************************/ /*****************************端点检测********************************/ voidcheckstart() { inti,j,m=0,k=0,z[SHIFT]={0},zero[VOICELEN/SHIFT]={0}; floaten=0,pn=0; floatshorten,shortpn; for(i=0;i { en=en+abs(data[i]); } pn=en/VOICELEN;//计算所有取样信号的平均幅值 for(j=0;j { z[j]=0.5*abs(data[j+1]/abs(data[j+1])-data[j]/abs(data[j]));//z存一帧语音的过零点数 zero[0]=zero[0]+z[j];//zero[m]存第m段的过零点率 } for(i=SHIFT;i { shorten=0; shortpn=0; for(j=0;j { shorten=shorten+abs(data[i+j]);//shorten存一帧语音幅值 z[j]=0.5*abs(data[j+i+1]/abs(data[j+i+1])-data[j+i]/abs(data[j+i]));//z存一帧语音的过零点数 zero[m]=zero[m]+z[j];//zero[m]存第m段的过零点率 if(j==SHIFT-1) { printf("过零率=%d",zero[m]); m++; } } shortpn=shorten/SHIFT;//计算每帧信号平均幅度即短时平均幅度 printf("总的平均幅值=%f",pn); printf("短时平均幅值=%f\n",shortpn); /*printf("%f\n",shortpn);*/ if((shortpn*2>pn)||(zero[m-1]*3 { if(start==0) {start=i; begin=1;} } if((begin==1)&&(shortpn*4 { end=i; break; } } if(begin==0) { printf("没有语音输入\n"); } if(end==0&&begin! =0) { printf("语音信号太长\n"); } begin=0; k=(end-start)/SHIFT; if(k>0) num_frame=k; elsenum_frame=0; /*printf("%d\n",num_frame);*/ } voidtezheng(DATA*fan)//特征提取函数 { inti,j,k,m=1; floatff[18],jj[WINDOW],te[WEISHU]={0}; for(j=0;j { jf[j]=tempdata[j]; } cbrev(jf,jf,WINDOW/2);//输入序列jf倒序,倒序后存入jf中 rfft(jf,WINDOW,1);//就算实序列FFT,将频谱存放在jf中 for(i=0;i { jj[m]=jf[i]*jf[i]+jf[i+1]*jf[i+1]; m++; } for(j=1;j<=17;j++) { ff[j]=1960*(j+0.53)/(26.28-j);///划分临界带 } for(j=1;j { for(k=WINDOW*ff[j]/8000+1;k<=WINDOW*ff[j+1]/8000;k++) { te[j]=te[j]+jj[k];//求临界带内频率带功率谱叠加 } } for(i=0;i fan[i]=te[i]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 语音 识别 实验 报告 欧阳 创编
![提示](https://static.bingdoc.com/images/bang_tan.gif)