DSP语音识别实验报告

时间:2024.5.13

DSP课程设计

实验报告

语音识别

):电子信息工程学院自动化系

设计人员:##

评语:

指导教师签字:

日期:

目录

一、     设计任务书

1、          实验概述

2、          实验目的

二、     设计内容

三、     设计方案、算法原理说明

1、          设计步骤

2、          算法原理说明

四、     程序设计、调试与结果分析

1、          算法流程图

2、          主程序

3、          测试过程及结果分析

五、     设计(安装)与调试的体会

1、          编程及程序运行中遇到的问题及解决办法

2、          本次实验的心得体会

六、     参考文献

一、 设计任务书

实验概述:

语言是人类特有的功能,声音是人类最常用的工具。通过语音传递信息是人类最重要最有效最常用和最方便的信息交换形式。语音信号是人类进行思想沟通和情感交流的最主要的途径。让计算机能听懂人类的语言,是自计算机诞生以来人类梦寐以求的想法。在本实验中,将针对DTW算法,实现对最简单的单音信号进行语音识别的问题。

语音识别以语音为研究对象,它是语音信号处理的一个重要研究方向,是模式识别的一个分支,涉及到生理学、心理学、语言学、计算机科学以及信号处理等诸多领域,甚至还涉及到人的体态语言(例如人在说话时的表情、手势等细微动作可帮助对方理解),其最终目标是实现人与机器进行自然语言通信。

   语音识别技术主要包括特征提取技术、模式匹配准则及模训练技术三个方面。此外,还涉及到语音识别单元的选取。

语音识别系统的研究涉及微机技术、人工智能、数字信号处理、模式识别、声学、语言学和认知科学等多种学科领域,是一个多学科综合性研究领域。

语音识别系统的分类---根据对说话人说话方式的要求,可以分为孤立字(词)语音识别系统、连接字语音识别系统以及连续字语音识别系统。根据对说话人的依赖程度可以分为特定人和非特定人语音识别系统。根据词汇量大小,可以分为小词汇量、中等词汇量、大词汇量以及无限量词汇量语音识别系统。

   一般来说,语音识别的方法有三种:基于声道模型和语音知识的方法、模版匹配的方法以及利用人工神经网络的方法。

  基于声道模型和语音知识的方法起步较早,在语音识别技术提出的开始,就有了这方面的研究。但由于其模型及语音知识过于复杂,还没有达到实用阶段。

人工神经网络的方法是80年代末期提出的一种新的语音识别方法。人工神经网络本质上是一个自适应非线性动力学系统,模拟人类神经活动的原理,具有自适应性、并行性、鲁棒性、容错性和学习特性,在结构和算法上都显示出实力。但由于存在训练、识别时间太长的缺点,目前仍处于实验探索阶段。 

模版匹配方法中,要经过四个步骤:特征提取、模版训练、模版分类、判决。

       

实验目的:

1、          掌握5402DSP片上外设TLC320AD50 CODEC编译码的内部结构、工作原理以及在C语言下的编程方法;

2、          掌握通过C语言实现5402DSP片上外设FLASH的读写操作;

3、          掌握FFT(快速傅里叶变换)、DTW(动态时间规整)算法,从而实现语音识别系统的开发;

4、          熟练使用CCS5000集成开过程。

5、          发环境完成对程序的调试

二、 设计内容:

语音识别(Speech Recognition)主要是指让机器听懂人说的话,即在各种情况下,准确地识别语音的内容,从而根据其信息,执行人的各种意图或执行特定的任务,其最终目标是实现人与机器进行自然语言通信。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的数据和程序存储空间。

DSP语音识别实验报告

(三)语音信号识别模块

语音信号中含有丰富的信息,如何从中提取出对语音识别有用的信息是语音识别的关键。特征提取就是完成这项工作,它对语音信号进行分析处理,去除对语音识别无关紧要的冗余信息,获得影响语音识别的重要信息。对于非特定人语音识别来讲,希望特征参数尽可能多地反映语义信息,尽量减少说话人的个人信息(对特定人语音识别来讲,则相反)。从信息论角度讲,这是信息压缩的过程。

语音识别的步骤分为两步。第一步是根据识别系统的类型选择能够满足要求的一种识别方法,采用语音分析方法分析出这种识别方法所要求的语音特征参数,这些参数作为标准模式由机器存储起来,形成标准模式库,这个语音参数库成为“模板”,这一过程称为“学习”或“训练”。第二步就是识别。其原理框图如下图所示:

DSP语音识别实验报告 

语音识别的原理框图

语音信号的预处理包括反混叠滤波,A/D变换,预加重,加窗和分帧处理等。预加重的目的是提升高频部分,使信号的频谱变得平坦,以保持在信号的整个频带内,具有同样的信噪比,便于声道参数分析。在语音信号的数字处理中常用的是矩形窗和汉明窗等,窗口的形状、长度对短时分析参数的影响很大,为此,应选择合适的窗函数。语音信号有10 ms~30 ms的短时平稳性,一般每秒的帧数为33帧~100帧。为了使帧与帧之间平滑过渡,前一帧与后一帧之间必须保持一定的帧移,帧长与帧移的比值一般取为0~1/2。

经过预处理的语音信号,就要对其进行特征参数的分析,在提取特征参数之前应先对提取的语音信号进行起点和终点检测,它是特征训练和识别的基础。端点检测通常采用时域分析法,进行端点检测的主要依据是能量、振幅和过零率。但是某些单词的端点检测却存在问题,准确地检测出声音区间是很困难的。

我们采用了短时过零率短时平均能量结合进行端点检测。设分帧之后第n帧语音信号为,因为每一帧语音信号的短时能量有一个缺陷,即它对高电平非常敏感,所以采用短时平均幅度函数来进行判断,此外,设所有语音信号的平均能量为pn,则当2*>pn时将该帧语音判为语音信号的起点,当4*

时,则判断语音已经开始,将这个条件与利用短时平均幅度求起点的条件取与,得到最终求得的语音起点,这样可以达到更加精确的效果,而判断语音终点,利用短时平均幅度的条件就足够了。

下一步要提取语音的特征参数,识别参数可以选择:频谱、倒谱、线性预测系数,音长、音调、声调等超音段信息函数。对特征参数的要求是:

(1)提取的特征参数能有效地代表语音特征,具有很好的区分性。

(2)各阶参数之间有良好的独立性。

(3)用于语音识别的距离测度有多种,如欧氏距离及其变形的距离、似然比测度、加权了超音段信息的识别测度等。

特征参数要计算方便,具有高效的计算方法,以保证语音识别的实时实现。

由于语音波是一个非平稳过程,因此适用于周期、瞬变或平稳随机信号的标准傅立叶变换不能用来直接表示语音信号,所以我们采用短时傅立叶变换对语音信号的频谱进行分析,即利用了短时谱。而利用短时傅立叶变换求取的语音信号的短时谱,它是按实际频率分布的,用按实际频谱分布的频谱作为语音特征,由于它不符合人耳的听觉特性,将会降低语音信号处理系统的性能,所以我们又将实际的线性频谱转化为了临界带频谱特征矢量。

语音库就是声学参数模板。它是用训练与聚类的方法,从多次重复的语音参数,经过长时间的训练而聚类得到的。

由于语音信号具有相当大的随机性,即使是同一人在不同时刻说的同一句话、发的同一个音,也不可能具有完全相同的时间长度。语音识别中也不能简单的将输入参数和参考模板直接做比较。为此,一种简单的方法是采用对未知语音信号均匀地伸长或缩短直至它与参考模板的长度相一致。采用这种方法能达到的精度完全取决于端点检测的精度。

将特征参数进行一定的处理后,为每个词条得到一个模型,保存为模板库。在识别阶段,语音信号经过相同的通道得到语音参数,生成测试模板,与参考模板进行匹配,将匹配分数最高的参考模板作为识别结果。同时还可以在很多先验知识的帮助下,提高识别的准确率。

测度估计是语音识别的核心。求取测试语音参数与模板之间测度的方法有很多种。如动态时间规整法(DTW)、有限状态矢量量化法,隐马尔可夫模型法等。

对于输入信号计算而得的测度,判决选出可能的结果中最好的结果,由识别系统输出,这一过程就是判决。因此,选择适当的各种距离测度的门限值成了主要的问题。我们采用了动态时间规整算法(DTW)来进行测度估计。

DTWDynamic Time Warping即动态时间归整算法,为解决语音识别中语速多变的问题提供了一条有效的途径。当词汇表较小时,对提高系统的识别精度非常有效。这种方法中,未知单词的时间轴要不均匀地扭曲或弯折,以便使其特征与模板特征对正。

在归整过程中,输入的是两个时间函数,典型的有幅度,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(Dynamic Programming)来加以具体实现的。规整过程如下图所示:

通常,归整函数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)    参数提取算法流程图:

DSP语音识别实验报告

(2)判断识别阶段流程图如下:

DSP语音识别实验报告

(二)主程序

#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"

#define VOICELEN 8000    //声音的长度

#define SHIFT 160      //每帧的样本点数

#define WINDOW 256       //窗的长度

#define WEISHU 16          //维数

#define CEPBUFFERLEN 16*16      

#define MAXREAL 100000000000.0

#pragma DATA_SECTION (jf,".input")     //自定义数据段      

DATA  jf[WINDOW];

/*************************************************************************/

/* Function Prototypes   */

/************************************************************************/  

void tezheng(DATA *fan);  //提取特征向量的函数的声明                                 

void checkstart();     //断点检测的函数声明                    

void recvoice();       //语音识别的函数声明

void train();            //训练或学习的函数声明

void delay(s16 period);   //延时子程序

float dtw(DATA *cep,DATA *rcep); //dtw算法的函数声明   

u16 min(u16 a,u16 b,u16 c);

float lmin(float a,float b,float c);

/**********************************************************************/

/* Global Variables                                                      */

/**********************************************************************/           

HANDLE hHandset;                      

s16 data[VOICELEN];

DATA tempdata[WINDOW];

int begin=0;   

int end=0;     

int start=0;

int t=3;

unsigned int num_frame=0;

u16 dest=0x8000; 

int checkresult=-535;

/**************************************************************************/

/*                          MAIN                                    */

/*********************************************************************/

void main()

{

u16 i=0;

u16 j=0;

int t=3;

    float hamming[WINDOW];  

    DATA fan[CEPBUFFERLEN];   

          for(i=0;i

    {

       hamming[i]=0.54-0.46*cos(2*i*3.14159/(WINDOW-1));    //汉明窗

    } 

                              

    if (brd_init(100))    //初始化DSK板

        return;

/* Open Handset Codec */

    hHandset = codec_open(HANDSET_CODEC);   //为一个codec事件分配一个识别句柄   

 /* Set codec parameters */

    codec_dac_mode(hHandset, CODEC_DAC_15BIT);          /* DAC in 15-bit mode */

    codec_adc_mode(hHandset, CODEC_ADC_15BIT);          /* ADC in 15-bit mode */

    codec_ain_gain(hHandset, CODEC_AIN_6dB);    /* 6dB gain on analog input to ADC */

    codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB);    /* -6dB gain on analog output from DAC */

    codec_sample_rate(hHandset,SR_8000);             

    while(1)

 {                           

   

    i=0;

    printf("请读入语音数据\n");

    while (i

    {

       /* Wait for sample from handset */

       while (!MCBSP_RRDY(HANDSET_CODEC)) {};//判断A/D转换的数据是否准备好

       /* Read sample from and write back to handset codec */

      

       data[i] = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC);//读取A/D转换数据 

     *(volatile u16*)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); //延时后 重新开始接收数据

    }

  

}

/*********************************************************************/

/*****************************端点检测********************************/

void checkstart() 

{

    int i,j,m=0,k=0,z[SHIFT]={0},zero[VOICELEN/SHIFT]={0}; 

    float en=0,pn=0;

    float shorten,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;

       else num_frame=0;

       /*printf("%d\n",num_frame);*/

}

void tezheng(DATA *fan)   //特征提取函数        

{

int i,j,k,m=1;

float ff[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];//特征赋给fan

}

void train(DATA *fan)  //训练建立特标准模块

  

{

    int i;

    FILE *fp;

    char filename[3];

    ltoa(t,filename);               //将t转化为字符型,赋给filename                          

    fp=fopen(filename,"w");

    for(i=0;i

    {

    fprintf(fp,"%d",fan[i]);        //将语音的临界带特征矢量存入文件3             

    fprintf(fp,"\n");

    }

    fclose(fp);

}

/************************语音对比识别**************************************/ 

void recvoice()                

{

   

    DATA cep[CEPBUFFERLEN]={0};   

    DATA rcep0[CEPBUFFERLEN]={0};  

    DATA rcep1[CEPBUFFERLEN]={0};  

    DATA rcep2[CEPBUFFERLEN]={0};  

    int j;

    float dist[3];

    FILE *fp;

    fp=fopen("0","r");                  //打开文件0     

    for(j=1;j

       {

           fscanf(fp,"%d",&rcep0[j]);         //将"0"的语言特征赋给rcep0

          

       }

    fclose(fp);

   

    fp=fopen("1","r");                     //打开文件1

    for(j=1;j

       {

           fscanf(fp,"%d",&rcep1[j]);         //将"1"的语言特征赋给rcep1

       }

    fclose(fp);

           

    fp=fopen("2","r");                       //打开文件2

       for(j=1;j

       {

           fscanf(fp,"%d",&rcep2[j]);           //将"2"的语言特征赋给rcep2

       }

    fclose(fp);

   

    fp=fopen("3","r");                       //打开文件3

    for(j=1;j

       {

           fscanf(fp,"%d",&cep[j]);             //rcep指向输入语音特征参数

       }

    fclose(fp);

   

    printf("开始识别!!\n");

    printf("\n");

   

    dist[0]=dtw(cep,rcep0);                    //求cep与rcep0的失真度

    printf("此语音与语音1的欧氏距离=%f\n",dist[0]);

    dist[1]=dtw(cep,rcep1);                    //求cep与rcep1的失真度

     printf("此语音与语音2的欧氏距离=%f\n",dist[1]);

    dist[2]=dtw(cep,rcep2);                    //求cep与rcep2的失真度

     printf("此语音与语音3的欧氏距离=%f\n",dist[2]);

    for(checkresult=0;checkresult<3;checkresult++)

    {

       if(dist[checkresult]==lmin(dist[0],dist[1],dist[2]))//求最小的失真度即为匹配的语言

           break;

    }

    /*****************用LED显示识别的结果*****************/

    if(checkresult==0)   

        {printf("第一盏灯被点亮了.\n");

        printf("读入的语音为1.\n");

    brd_led_toggle(BRD_LED0);        //开灯LED0

       delay(5000);                            //延时

        brd_led_toggle(BRD_LED0);}      //关灯LED0

        if(checkresult==1)   

        {printf("第二盏灯被点亮了.\n");

        printf("读入的语音为2.\n");

       brd_led_toggle(BRD_LED1);       //开灯LED1

       delay(5000);                              //延时

       brd_led_toggle(BRD_LED1);}      //关灯LED1

        if(checkresult==2)   

        {printf("第三盏灯被点亮了.\n");

        printf("读入的语音为3.\n");

       brd_led_toggle(BRD_LED2);      //开灯LED2

       delay(5000);                               //延时

       brd_led_toggle(BRD_LED2);}     //关灯LED2

    printf("识别结束语!!\n");

}   

 /************************DTW算法*************************************/  

float  dtw(DATA *cep,DATA *rcep)               //计算欧式距离 动态时间规整

{

    int m=16;

    int n=16;

    float d[CEPBUFFERLEN/WEISHU][CEPBUFFERLEN/WEISHU]={0};

    float accmatrix[CEPBUFFERLEN/WEISHU][CEPBUFFERLEN/WEISHU]={0};

    int i,j,k;

    float d1,d2,d3;

    for(i=0;i

       for(j=0;j

           {  

               for(k=0;k

           d[i][j]+=abs(cep[i*WEISHU+k+1]-rcep[j*WEISHU+k+1]);  //求欧式距离   

              d[i][j]=d[i][j]/WEISHU; //求绝对平均欧氏距离

              }  

    for(i=0;i

       for(j=0;j

           accmatrix[i][j]=MAXREAL;

    accmatrix[0][0]=d[0][0];                   //起始位置为(0,0)

   

    for(i=0;i

       for(j=0;j

       {

           d1=accmatrix[i-1][j];                      //下一步只有三种搜索路径

           if(j>0) d2=accmatrix[i-1][j-1];

           else d2=MAXREAL;

           if(j>1) d3=accmatrix[i-1][j-2];

           else d3=MAXREAL;

           accmatrix[i][j]=d[i][j]+lmin(d1,d2,d3);

           }

    return accmatrix[m-1][n-1];     

}

/************************取最小值****************************/

float lmin(float a,float b,float c)   

{

    if(a>b)

       a=b;

    if(a>c)

       a=c;

    return a;

}

void delay(s16 period)      //延时

{

    int i, j;

   

    for(i=0; i

    {

        for(j=0; j>1; j++);

    }

}

语音识别的CMD文件:

MEMORY

{

   PAGE 0: VECS:     origin = 0080h, length = 0080h  /* Internal Program RAM */

           PRAM:     origin = 7600h, length = 8000h  /* Internal Program RAM */

   PAGE 1: SCRATCH:  origin = 0060h, length = 0020h  /* Scratch Pad Data RAM */

           DMARAM:   origin = 0C00h, length = 0300h  /* DMA buffer */

           DATA:     origin = 1100h, length = 0080h  /* Internal Data RAM    */

           STACK:    origin = 1180h, length = 0560h  /* Stack Memory Space   */

           INRAM:    origin = 1900h, length = 0100h  /* Internal Data RAM    */

           HPRAM0:   origin = 1A00h, length = 0002h  /* HPI memory accessible by Host and DSP */

           HPRAM1:   origin = 1A02h, length = 0280h  /* HPI memory accessible by Host and DSP */

           HPRAM2:   origin = 1C82h, length = 0280h  /* HPI memory accessible by Host and DSP */

           EXRAM:    origin = 1F10h, length = 4000h  /* External Data RAM    */

}

/*****************************************************************************/

/* DSP Memory Allocation                                                     */

/*****************************************************************************/

SECTIONS

{

   .cinit    > PRAM  PAGE 0

   .text     > PRAM  PAGE 0

   .vectors  > VECS  PAGE 0

   

   init_var  > PRAM  PAGE 0

   detect    > PRAM  PAGE 0

   vrcprg     > PRAM  PAGE 0

   matprg    > PRAM  PAGE 0

  

   .stack    > STACK PAGE 1

   .trap     > SCRATCH PAGE 1

   .const    > EXRAM PAGE 1

   .data     > EXRAM PAGE 1

   .bss      > EXRAM PAGE 1

   .cio      > EXRAM PAGE 1

   .switch   > EXRAM PAGE 1

  

   tables    > EXRAM PAGE 1

   var       > EXRAM PAGE 1

   svctab    > EXRAM PAGE 1         /* SS_V LSP table */

   vctab     > EXRAM PAGE 1         /* V LSP table */

   uvctab    > EXRAM PAGE 1         /* UV LSP table */

   cuvtab    > EXRAM PAGE 1         /* Stochastic codebook */

   cdbktab   > EXRAM PAGE 1         /* various codebook tables*/

  

   logtab    > EXRAM PAGE 1          /* table for log2 */

   powtab    > EXRAM PAGE 1          /* table for pow2 */

   hamtab    > EXRAM PAGE 1          /* table for hamming */

   lgwtab    > EXRAM PAGE 1          /* table for lag window */

   acostab   > EXRAM PAGE 1          /* table for arccos */

   sqrtab    > EXRAM PAGE 1          /* table for square root */

   acbtab    > EXRAM PAGE 1          /* table for thresholds in acb */

   pm03tab   > EXRAM PAGE 1          /* table for x^(-0.3) computation */

   costab    > EXRAM PAGE 1          /* table for cosine */

   V23       > INRAM PAGE 1

   FSK       > INRAM PAGE 1

   hpibuff0  > HPRAM0 PAGE 1

   hpibuff1  > HPRAM1 PAGE 1

   hpibuff2  > HPRAM2 PAGE 1

   dma_buff  > DMARAM PAGE 1

}

测试过程及结果分析:

1、


程序编译通过

2、本实验针对孤立字1,2,3的特定人的识别,程序运行后自动生成文件名为t的文件存于工程的debug文件内,用于存放录入的语音信号的特征参数。通过修改t值,分别生成1,2,3语音的特征参数文件。模版生成后,修改t 值,使程序进入识别方式。在识别方式时,将读入的语音信号生成特征参数文件存入debug中,通过调用识别子程序计算当前读入语音特征参数与模版所存语音特征参数的差,这种误差算法为dtw动态归整算法!与当前读入语音相差最小的模版所代表的语音就是我们要识别的语音,打印出此语音的名称!

3、由于dtw算法本身是一种较为简单的识别算法,它在孤立字的识别方面的效果还行!通过实验我们发现,针对同一个孤立字,读不同的调以及音量的高低都会影响识别效果。我们认为这是dtw算法本身结构简单造成的,不能高效的利用特征参数计算更加精确的误差,或者说欧式距离。为了使识别效果好一些,我们尽量使读入语音的方式与录制模版时一致,但这不能解决核心问题,治标不治本!

调试结果表明程序虽然能识别出所读的语音,但是欧式距离之间的差值并不明显,有时由于读入方式的差异,只能勉强识别,甚至识别出错

4、语音信号的有效时域信息图

语音“1”的有效时域图

语音“2”的有效时域图

语音“3”的有效时域图

五、设计(安装)与调试的体会

1、编程及程序运行中遇到的问题及解决办法

在建立语音识别工程前,我们先熟悉CCS5000的运行过程以及程序内的各种调试工具及方法。

我们用C语言实现本工程,对于几个核心的子程序如dtw算法,特征参数的取和语音信号断点的检测,我们是参照搜集到的资料编写。这几个重要的子函数获取后,我们的程序基本上完成大半了。然而还是遇到了不少问题,编译的时候多次出错或者警告,这主要还是对C语言生疏所致。经过反复查找,发现了不少错误,如头文件路径的设置,CMD连接程序,甚至还有关于分号和大括号的语法错误。

解决了编译问题后,程序执行的方式和效果还不令人满意。问题如下:

1)语音信号的采集问题

我们采集信号的频率为8000Hz,时间比较短,因此我们必须在程序开始运行时,就尽可能快地输入语音。否则语音信号太长,缓存区不够。我们在程序开始录入语音之前,打印出提示语句后马上读入语音,能较好的解决此问题!

2)语音信号端点检测问题

最初我们仅仅考虑用过零率来检测端点,但是经过反复试验后,仍然无法很好地提取有效语音的起点和终点。接着我们改为短时平均幅度方法,结果仍然不太满意。后来我们突发奇想,若将短时平均幅度和过零率结合起来,也许会好一些。我们就把程序改为两种方法的结合,来对有效语音的始点和终点进行检测,经过多次测试后,我们挑选出小工最好的量值确定了以下两个条件来分别检测有效信号的起点和终点,即(shortpn*2>pn)||(zero[m+1]>3*zero[m])、(begin==1)&&(shortpn*4

3)特征矢量提取问题

每帧数据的特征向量的维数的设定是一个实践的过程,有些资料设定为8维,8个数据代表这这帧数据的核心特征,这样简化了识别时误差的计算。为了得到较好的识别结果,我们取了16维,希望特征向量能更多的携带一帧数据的核心特征。结果证明识别结果有所改善!

4)识别速度问题

我们是用C语言实现工程的,在执行速度上不如汇编语言。完整识别一个语音长达一分多钟。时间主要花费在特征参数文件的形成和特征参数的提取。为了解决这个问题,我们把模版的特征参数直接写入程序,以数组形式表示,这样就不用执行生成文件和读特征参数文件的步骤了。结果表明十几秒就能识别出结果,大大提高了效率!

六、参考文献

[1] 高海林,钱满义. DSP技术及其应用,自编讲义.2005

[2] 谭浩强.C程序设计(第二版).北京:清华大学出版社,2003

 [4] TMS320C54x DSP Applications and Guide. Texas Instrument Inc,2001.

[5] 杨行俊.语音信号数字处理.北京:电子工业出版社,1995.

课程设计成绩评定

更多相关推荐:
语音报告

语音信号处理专题报告题目最佳矢量量化器码本设计学院信息工程学院专业电子信息工程学生姓名学号班级电子092班二一二年六月一摘要矢量量化技术是一种极其重要的信号压缩方法本报告主要介绍适量量化的一些基本概念以及最佳矢...

语音识别报告

启动的时域波形1语音预加重由于语音信号在高频部分衰减在进行频谱分析时频率越高所占的成分越小进行语音预加重可以提升语音高频部分使频谱变得平坦以方便进行频谱的分析和处理通常的措施是采用数字滤波器进行预加重传递函数是...

语音评测报告2

关于UCQQ火猴手机浏览器语音功能的专项测试报告语音识别功能开始颠覆以往需要手动输入触控操作的浏览模式开启人机交互体验的新时代应该要从苹果iPhone率先开创推出Siri这一语音功能开始说起随着智能手机和3G4...

语音识别报告

语音识别报告1语音识别的现状语音识别是一门交叉学科近二十年来语音识别技术取得显著进步开始从实验室走向市场语音识别技术主要包括特征提取模式匹配以及模型训练三个方面此外还涉及到语音识别单元的选取目前针对研究相对比较...

英语语音课实习报告

实习报告实习名称系别年级专业学生姓名指导老师XX4英语语音外语系大学xxxx年xx月xx日一实习时间xxxx年xx月xx日至xx月xx日二实习地点xxxx三实习内容这一星期的英语语音实训课程旨在纠正学生的发音提...

YY语音体验报告

YY语音体验报告作者李寒联系方式hansonlee7gmailcom这篇报告分为两部分第一部分是我对YY语音产品的一点理解第二部分是作为YY语音忠实用户在使用过程中提出的一些改进及建议PART1YY语音一直关注...

语音信号实验报告

内蒙古工业大学信息工程学院实验报告课程名称语音信号处理实验名称语音信号采集与处理实验类型验证性综合性设计性实验室名称信息学院机房班级电子101班学号20xx8020xx02姓名王红霞组别同组人成绩实验日期20x...

太原理工大学数字语音处理实验报告

课程名称实验项目实验地点专业班级学生姓名指导教师本科实验报告数字语音处理语音短时平均能量的实现跨越机房学号年月实验一语音短时平均能量的实现一实验目的1熟悉Matlab基本程序的运用2充分理解取不同窗长时的语音短...

基于MATLAB的语音信号分析与处理的实验报告

基于MATLAB的语音信号分析与处理的实验报告数字信号课程设计屌丝们有福了一实验目的数字信号课程设计屌丝们有福了综合计运用数字信号处理的理论知识进行频谱分析和滤波器设计通过理论推导得出相应的结论培养发现问题分析...

中国语音卡行业运行状况及投资战略研究报告20xx-20xx年

中国语音卡行业运行状况及投资战略研究报告20xx20xx年编制单位北京智博睿投资咨询有限公司内容简介第一章语音卡相关概述第一节CTI系统第二节语音卡及功能第三节语音卡应用领域第四节语音卡技术开发一单机板技术二时...

语音信号处理实验报告集锦

语音信号处理实验报告集锦实验一一实验题目Shorttimeanalysis短时间分析二实验要求WriteaMATLABprogramtoanalyzeaspeechandsimultaneouslyonasin...

20xx-20xx年中国智能语音市场需求状况分析及投资前景建议报告

20xx20xx年中国智能语音市场需求状况分析及投资前景建议报告什么是行业研究报告行业研究是通过深入研究某一行业发展动态规模结构竞争格局以及综合经济信息等为企业自身发展或行业投资者等相关客户提供重要的参考依据企...

语音报告(32篇)