DSP语音识别实验报告.docx
《DSP语音识别实验报告.docx》由会员分享,可在线阅读,更多相关《DSP语音识别实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
DSP语音识别实验报告
DSP课程设计之袁州冬雪创作
实验陈述
语音识别
院(系):
电子信息工程学院自动化系
设计人员:
李彬学号:
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口输出.本次实验所需达到的方针是:
可以识别特定人所说的特定字,若符合,则显示识别成果,并输出相应的字.
三、实验原理:
语音识别原理方框图如下图所示:
语音信号
端点检测及
特征参数提取
写入FLASH
预处理
A/D
语音识别
形式匹配
形式库
各模块工作原理为:
(一)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的数据和程序存储空间.
SRAM
TMS
320C
5402
TLC320AD
50
TLC2272
摹拟输入
FLASHROM
LM386
摹拟输出
(三)语音信号识别模块
语音信号中含有丰富的信息,如何从中提取出对语音识别有用的信息是语音识此外关键.特征提取就是完成这项工作,它对语音信号停止分析处理,去除对语音识别无关紧要的冗余信息,获得影响语音识此外重要信息.对于非特定人语音识别来讲,希望特征参数尽可以多地反映语义信息,尽可以减少说话人的个人信息(对特定人语音识别来讲,则相反).从信息论角度讲,这是信息压缩的过程.
语音识此外步调分为两步.第一步是根据识别系统的类型选择可以知足要求的一种识别方法,采取语音分析方法分析出这种识别方法所要求的语音特征参数,这些参数作为尺度形式由机器存储起来,形成尺度形式库,这个语音参数库成为“模板”,这一过程称为“学习”或“训练”.第二步就是识别.其原理框图如下图所示:
判决
测度估计
参数分析
预处理
输入识别输出
语音
语音库
训练类聚
语音识此外原理框图
语音信号的预处理包含反混叠滤波,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)参数提取算法流程图:
初始化,常数定义,函数声明
变量定义,主要处理FFT变换数组的鸿沟问题
计算HammingWindow的系数,并保管
DSK初始化,设置DSP运行频率为100MHz
打开CODEC设备,
并停止初始化
进入死循环,等待用户修改节制变量t
等待CODEC读入数据
将数据放入缓冲区
语音回放,
检查输入是否正确
操纵短时过零率和短时
平均能量停止端点检测
操纵得到的端点数据计
算临界带频谱特征矢量
保管得到的倒谱系数
停止识别并打印成果
(2)断定识别阶段流程图如下:
初始化实验板
把训练过程中得到
的数据读入缓冲区
计算缓冲区I中的数据
的间隔矩阵d[i][j]
由间隔矩阵计算累计间隔矩阵accmatrix[i][j]
最小匹配间隔
dist[i]=accmatrix[m-1][n-1]
从I个最小匹配间隔中找出
最小值,得出成果
(二)主程序
#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]*3pn或者过零率检测到语音段开端
{
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);*/
}