语音识别算法及其实现.doc

上传人:scccc 文档编号:11288451 上传时间:2021-07-21 格式:DOC 页数:37 大小:265.50KB
返回 下载 相关 举报
语音识别算法及其实现.doc_第1页
第1页 / 共37页
语音识别算法及其实现.doc_第2页
第2页 / 共37页
语音识别算法及其实现.doc_第3页
第3页 / 共37页
语音识别算法及其实现.doc_第4页
第4页 / 共37页
语音识别算法及其实现.doc_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《语音识别算法及其实现.doc》由会员分享,可在线阅读,更多相关《语音识别算法及其实现.doc(37页珍藏版)》请在三一文库上搜索。

1、一、概述 1.1. 选题意义 目前,高科技发展迅速,日新月异,而因为实际需要,各种防盗技术也日趋多样化。其中智能人声防盗系统引起了我们的兴趣,因此我们选了语音识别算法及其实现这一课题,来探究一下语音识别的原理及其实现过程。语音识别研究的根本目的是研究出一种具有听觉功能的机器,能直接接受人的口呼命令,理解人的意图并做出相应的反映。语音识别系统的研究涉及微机技术、人工智能、数字信号处理、模式识别、声学、语言学和认知科学等许多学科领域,是一个多学科综合性研究领域。近年来,高性能数字信号处理芯片DSP技术的迅速发展,为语音识别的实时实现提供了可能。其中,凌阳公司的单片机以其良好的性价比和代码的可移植性

2、被广泛地应用于各个领域。因此,我们采用凌阳公司的具有DSP功能和语音特色的完全SOC技术的凌阳十六位单片机来实现语音信号的识别。1.2. 实验目的1、掌握特定人语音辨识技术。 2、可以应用于简单语音控制场合。 二、算法原理2.1. 语音识别的基本过程 根据实际中的应用不同,语音识别系统可以分为:特定人与非特定人的识别、独立词与连续词的识别、小词汇量与大词汇量以及无限词汇量的识别。但无论那种语音识别系统,其基本原理和处理方法都大体类似。一个典型的语音识别系统的原理图如图1所示。 语音识别过程主要包括语音信号的预处理、特征提取、模式匹配几个部分。预处理包括预滤波、采样和量化、加窗、端点检测、预加重

3、等过程。语音信号识别最重要的一环就是特征参数提取。提取的特征参数必须满足以下的要求: (1)提取的特征参数能有效地代表语音特征,具有很好的区分性; (2)各阶参数之间有良好的独立性; (3)特征参数要计算方便,最好有高效的算法,以保证语音识别的实时实现。 在训练阶段,将特征参数进行一定的处理后,为每个词条建立一个模型,保存为模板库。在识别阶段,语音信号经过相同的通道得到语音特征参数,生成测试模板,与参考模板进行匹配,将匹配分数最高的参考模板作为识别结果。同时,还可以在很多先验知识的帮助下,提高识别的准确率。2.2. 语音识别的DSP实现技术221. 浮点运算的定点实现 在语音识别的算法中,有许

4、多的浮点运算。用定点DSP来实现浮点运算是在编写语音识别程序中需要首先解决的问题。这个问题可以通过数的定标方法来实现。数的定标就是决定小数点在定点数中的位置。Q表示法是一种常用的定标方法。其表示机制是: 设定点数是J,浮点数是f,则Q法表示的定点数与浮点数的转换关系为: 浮点数f转换为定点数x:x= (int)y2Q;定点数z转换为浮点数y:y =(float)x2-Q。 222. 数据精度的处理 用16b的定点DSP实现语音识别算法时,虽然程序的运行速度提高了,但是数据精度比较低。这可能由于中间过程的累计误差而引起运算结果的不正确。为了提高数据的运算精度,在程序中采用了以下的处理方法: (1

5、)扩展精度 在精度要求比较高的地方,将计算的中间变量采用32b,甚至48b来表示。这样,在指令条数增加不多的情况下却使运算精度大大提高了。 (2)采用伪浮点法来表示浮点数 伪浮点法即用尾数+指数的方法来表示浮点数。这时,数据块的尾数可以采用Q115数据格式,数据块的指数相同。这种表示数据的方法有足够大的数据范围,可以完全满足数据精度的要求,但是需要自己编写一套指数和尾数运算库,会额外增加程序的指令数和运算量,不利于实时实现。 以上两种方法,都可以提高运算精度,但在实际操作时,要根据系统的要求和算法的复杂度,来权衡考虑。 223. 变量的维护 在高级语言中,有全局变量与局部变量存储的区别,但在D

6、SP程序中,所有声明的变量在链接时都会分给数据空间。所以如果按照高级语言那样定义局部变量,就会浪费大量的DSP存储空间,这对数据空间较为紧张的定点DSP来说,显然是不合理的。为了节省存储空间,在编写DSP程序时,最好维护好一张变量表。每进入一个DSP子模块时,不要急于分配新的局部变量,应优先使用已分配但不用的变量。只有在不够时才分配新的局部变量。 224. 采用模块化的程序设计方法 在语音识别算法的实现中,为了便于程序的设计和调试,采用了模块化的程序设计方法。以语音识别的基本过程为依据进行模块划分,每个模块再划分为若干个子模块,然后以模块为单元进行编程和调试。在编写程序之前,首先用高级语言对每

7、个模块进行算法仿真,在此基础上再进行汇编程序的编写。在调试时,可以采用高级语言与汇编语言对比的调试方式,这样可以通过跟踪高级语言与汇编语言的中间状态,来验证汇编语言的正确性,并及时的发现和修改错误,缩短编程周期。另外,在程序的编写过程中,应在关键的部分加上必要的注释与说明,以增强程序的可读性。 在总调时,需要在各模块中设置好相应的人口参数与出口参数,维护好堆栈指针与中间变量等。三、硬件设计及功能描述3.1. 外接电路组成部分IOB1 IOB0 两个发光二极管 5V电压 此部分硬件用于显示语音控制的现象。1K电阻用于限流作用。 3.2. 凌阳单片机简介凌阳十六位单片机是台湾凌阳公司2001年推出

8、的新一代单片机,具有高速度、低价、可靠、实用、体积小、功耗低和简单易学等特点。其有多种型号,经过比较我们选择了其代表型号SPCE061A。因为该型号在存储器资源方面考虑到用户的较少资源的需求以及便于程序调试等功能,芯片只内嵌32K字的闪存(FLASH)。较高的处理速度使其能够非常容易地、快速地处理复杂的数字信号。现比较而言,SPCE061A微控制器是适用于数字语音识别应用领域产品的一种经济的选择。SPCE061A的内部结构图如下图所示,其中输出端IOA15和IOB15分别接上图的IOB1 和IOB0,组成整体电路。四、软件设计及使用说明 4.1. 主程序软件设计流程及说明 411. 语音识别函

9、数1) 【API格式】int BSR_DeleteSDGroup(0); 【功能说明】SRAM初始化。 【参 数】该参数是辨识的一个标识符,0代表选择SRAM,并初始化。 【返 回 值】当SRAM擦除成功返回0,否则,返回1。 2) 【API格式】int BSR_Train (int CommandID, int TraindMode); 【功能说明】训练函数。 【参 数】 CommandID:命令序号,范围从0x100到0FFF,并且对于每组训练语句都是唯一的。 TraindMode:训练次数,要求使用者在应用之前训练一或两遍: BSR_TRAIN_ONCE:要求训练一次。 BSR_TRAI

10、N_TWICE要求训练两次。 【返 回 值】训练成功,返回0;没有声音返回1;训练需要更多的语音数据来训练,返回2;当环境太吵时,返回3;当数据库满,返回4;当两次输入命令不同,返回5;当序号超出范围,返回6。 【备 注】 在调用训练程序之前,确保识别器正确的初始化。 训练次数是2时,则两次一定会有差异,所以一定要保证两次训练结果接近 为了增强可靠性,最好训练两次,否则辨识的命令就会倾向于噪音 调用函数后,等待2秒开始训练,每条命令只有1 .3秒,也就是说,当训练命令超出1.3秒时,只有前1.3秒命令有效。 412. 辨识部分1) 【API格式】void BSR_InitRecognizer(

11、int AudioSource) 【功能说明】辨识器初始化。 【参 数】定义语音输入来源。通过MIC语音输入还是LINE_IN电压模拟量输入。 【返 回 值】无。 2) 【API格式】int BSR_GetResult(); 【功能说明】辨识中获取数据。 【参 数】 无。 【返回值】R1 当无命令识别出来时,返回0; 识别器停止未初始化或识别未激活返回1; 当识别不合格时返回2; 当识别出来时返回命令的序号。 【备 注】 该函数用于启动辨识,BSR_GetResult(); 3) 【API格式】void BSR_StopRecognizer(void); 【功能说明】停止辨识。 【参 数】无。

12、 【返 回 值】 无。 【备 注】该函数是用于停止识别,当调用此函数时,FIQ_TMA中断将关闭。 中断部分: 【API格式】 _BSR_InitRecognizer 【功能说明】 在中断中调用,并通过中断将语音信号送DAC通道播放。 【参 数】 无。 【返 回 值】 无。 【备 注】 该函数在中断FIQ_TMA中调用 当主程序调用BSR_InitRecognizer时,辨识器便打开8K采样率的FIQ_TMA中断并开始将采样的语音数据填入辨识器的数据队列中。 应用程序需要设置一下程序段在FIQ_TMA中: 42. 程序变量说明421全局变量1)gActivated 【功能】该变量用于检测是否有

13、触发命令,当有识别出语句为触发名称则该位置1 【应用】用户无法对该变量进行处理 2)gTriggerRespond 【功能】该变量为一三元素数组,用于保存触发命令语音序号。 【应用】用户在自定义触发命令时,可以修改该数组元素。 3)gComm2Respond 【功能】该变量为一三元素数组,用于保存命令语音序号。 【应用】用户在自定义触发命令时,可以修改该数组元素。 4)PlayFlag 【功能】该变量为1时,表示播放A2000格式语音,0,播放S480格式语音。 【应用】用户使用时,注意判断是使用A2000还是S480。 422局部变量 1) res 【功能】该变量用于保存int BSR_Tr

14、ain (int CommandID, int TraindMode)返回值:返回0,训练成功;返回1,没有声音;返回2,训练需要更多的语音数据来训练;返回3,环境太吵;返回4,当数据库满;返回5,当两次输入命令不同;返回6,当序号超出范围。 【应用】用户通过对该变量的判断了解辨识的结果 2)timeCnt 【功能】用于命令定时使用,在1.5秒内,识别成功,将其清零,否则语音提示,“没有听到任何声音” 【应用】用户使用时,只要将此值进行清零即可。 3)random_no 【功能】在gTriggerRespond3 与 gComm2Respond3中,选择两数组中的元素。 表示语音播放的序号。

15、【应用】用户使用时,通过设置此变量选择命令和识别的语音响应。 4.3程序使用说明 *训练* 提示音 输入语音 - 请输入触发名称 警卫 请输入第一条命令 红灯亮 请输入第二条命令 红灯灭 请输入第三条命令 绿灯亮请输入第四条命令 绿灯灭 请再说一遍(以上提示音每说完一遍出现此命令) 没有听到任何声音 (当没有检测到声音时出现此命令) 两次输入名称不相同(当两次输入的名称不同时出现此命令) 两次输入命令不相同(当两次输入的命令有差异时出现此命令) 准备就绪,请开始辨识(以上五条语句全部训练成功时,进入识别) *识别* 发布命令 应答 - 警卫 在 红灯亮 IOB0口灯被点亮 红灯灭 IOB0口灯

16、被熄灭 绿灯亮 IOB1口灯被点亮 绿灯灭 IOB1口灯被熄灭 注意: 在每次提示音结束后2-3秒再输入命令或当上次应答结束2-3秒后再发布命令 4.4 主程序流程图及说明 五、原程序清单5.1. 主程序/工程名称: Guard_SD.spj/ 功能描述: 该程序是特定人辨识的一个范例:/在程序中我们通过三条语句的训练演示特定人连续音识别,其中/第一条语句为触发命令。/在程序一开始为训练名称,即触发命令,然后提示训练两条命令,/训练完毕开始辨识当识别出触发名称后,发布命令则会听到应答,具体命令如/下:/*训练* / 提示音 输入语音/- /请输入触发名称 警卫/请输入第一条命令 红灯亮/请输入

17、第二条命令 红灯灭/请输入第三条命令 绿灯亮/请输入第四条命令 绿灯灭/请再说一遍(以上提示音每说完一遍出现此命令)/没有听到任何声音 (当没有检测到声音时出现此命令)/两次输入名称不相同(当两次输入的名称不同时出现此命令)/两次输入命令不相同(当两次输入的命令有差异时出现此命令)/准备就绪,请开始辨识(以上五条语句全部训练成功时,进入识别)/*识别* / 发布命令 应答/- /警卫 在/红灯亮 IOB0口灯被点亮/红灯灭 IOB0口灯被熄灭/绿灯亮 IOB1口灯被点亮/绿灯灭 IOB1口灯被熄灭/注意: 在每次提示音结束后2-3秒再输入命令或当上次应答结束2-3秒后/再发布命令/ / IDE

18、环境: SUNPLUS unSPTM IDE 1.8.0(or later)/ 涉及的库:CMacro.lib/sacmv25.lib/bsrv222SDL.lib/ 组成文件:main.c/ FIQ.asm/hardware.asm/key.asm/InitIO.asm/ hardware.inc/ /=#include bsrsd.h#define NAME_ID 0x100#define COMMAND_ONE_ID 0x101#define COMMAND_TWO_ID 0x102#define COMMAND_THREE_ID 0x103#define COMMAND_FOUR_ID

19、 0x104#define RSP_INTR0#define RSP_NAME 0#define RSP_FIRE 1#define RSP_GUARD2#define RSP_AGAIN 3#define RSP_NOVOICE4#define RSP_NAMEDIFF 5#define RSP_CMDDIFF6#define RSP_STAR 7#define RSP_MASTER8#define RSP_HERE 9#define RSP_GUNSHOT0#define RSP_PATROL11#define RSP_READY12#define RSP_COPY 13#define B

20、SR_MIC 14#define BSR_TRAIN_TWICE 15#define RSP_NOISY 16/.全程变量.int gActivated = 0;/该变量用于检测是否有触发命令,当有识别出语句/为触发名称则该位置1 int gTriggerRespond = RSP_MASTER, RSP_HERE, RSP_MASTER;int gComm2Respond = RSP_PATROL, RSP_READY, RSP_COPY;extern void ClearWatchDog();int PlayFlag = 0;void PlayRespond(int Result)BSR_

21、StopRecognizer();SACM_S480_Initial(1);SACM_S480_Play(Result, 3, 3);while(SACM_S480_Status()&0x0001) != 0)SACM_S480_ServiceLoop();ClearWatchDog();SACM_S480_Stop();BSR_InitRecognizer(BSR_MIC);BSR_EnableCPUIndicator();int TrainWord(int WordID, int RespondID)int res;PlayRespond(RespondID);while(1)res =

22、BSR_Train(WordID,BSR_TRAIN_TWICE);if(res = 0) break;switch(res)case -1: /没有检测出声音PlayRespond(RSP_NOVOICE);return -1;case -2: /需要重新训练一遍PlayRespond(RSP_AGAIN);break;case -3: /环境太吵PlayRespond(RSP_NOISY);return -1;case -4: /数据库满 return -1;case -5: /检测出声音不同if(WordID = NAME_ID)PlayRespond(RSP_NAMEDIFF); /两

23、次输入名称不同elsePlayRespond(RSP_CMDDIFF); /两次输入命令不同return -1;case -6: /序号错误return -1;return 0;int main()int res, timeCnt = 0, random_no = 0;InitIO();BSR_DeleteSDGroup(0);/ 初始化存储器RAMPlayRespond(RSP_INTR); / 播放开始训练的提示音请输入触发名称/.训练名称.while(TrainWord(NAME_ID,0) != 0) ; /.训练第一条命令.while(TrainWord(COMMAND_ONE_ID

24、,1) != 0) ;/.训练第二条命令.while(TrainWord(COMMAND_TWO_ID,2) != 0) ;/.训练第三条命令.while(TrainWord(COMMAND_THREE_ID,12) != 0) ;/.训练第四条命令.while(TrainWord(COMMAND_FOUR_ID,13) != 0) ;/.开始识别命令.BSR_InitRecognizer(BSR_MIC); /辨识器初始化BSR_EnableCPUIndicator(); /启动实时监控PlayRespond(RSP_STAR); /播放开始辨识的提示音while(1)random_no +

25、;if(random_no = 3) random_no = 0;res = BSR_GetResult();if(res 0) /识别出命令if(gActivated)timeCnt = 0;switch(res)case NAME_ID: /触发命令响应PlayRespond(gTriggerRespondrandom_no);break;case COMMAND_ONE_ID: /识别第一个命令PlayFlag = 1;LED_RED_ON();PlayFlag = 0;gActivated = 0;break;case COMMAND_TWO_ID: /识别到第二条命令LED_RED_

26、OFF(); /响应第二条命令“我在巡逻”gActivated = 0;break;case COMMAND_THREE_ID: /识别第三条命令 LED_GRE_ON(); gActivated = 0; break; case COMMAND_FOUR_ID: /识别第四条命令 LED_GRE_OFF(); gActivated = 0; break; elseif(res = NAME_ID)PlayRespond(gTriggerRespondrandom_no);gActivated = 1;timeCnt = 0;else if (gActivated)if (+timeCnt 4

27、50)/超出定时PlayRespond(RSP_NOVOICE); /在设定时间内没有检测出声音gActivated = 0;timeCnt = 0;5.2. 子程序5.21. hardware.asm.PUBLICF_SP_RampUpDAC1.PUBLICF_SP_RampDnDAC1.PUBLICF_SP_RampUpDAC2.PUBLICF_SP_RampDnDAC2.PUBLIC_SP_RampUpDAC1 .PUBLIC_SP_RampDnDAC1 .PUBLIC_SP_RampUpDAC2 .PUBLIC_SP_RampDnDAC2 .PUBLIC_SP_InitQueue.PU

28、BLIC_SP_InitQueue_A2000.PUBLIC_SP_InitQueue_S480.PUBLIC_SP_InitQueue_S240.PUBLIC_SP_InitQueue_MS01.PUBLIC_SP_InitQueue_DVR.PUBLICF_SP_InitQueue.PUBLICF_SP_InitQueue_A2000.PUBLICF_SP_InitQueue_S480.PUBLICF_SP_InitQueue_S240.PUBLICF_SP_InitQueue_MS01.PUBLICF_SP_InitQueue_DVR.PUBLICF_SP_ReadQueue.PUBLI

29、C F_SP_ReadQueue_A2000.PUBLIC F_SP_ReadQueue_S480.PUBLIC F_SP_ReadQueue_S240.PUBLIC F_SP_ReadQueue_MS01.PUBLIC F_SP_ReadQueue_DVR.PUBLICF_SP_ReadQueue_NIC/ Read Queue with no index change.PUBLICF_SP_ReadQueue_NIC_A2000.PUBLICF_SP_ReadQueue_NIC_S480.PUBLICF_SP_ReadQueue_NIC_S240.PUBLICF_SP_ReadQueue_

30、NIC_MS01.PUBLICF_SP_ReadQueue_NIC_DVR.PUBLICF_SP_WriteQueue.PUBLIC F_SP_WriteQueue_A2000.PUBLIC F_SP_WriteQueue_S480.PUBLIC F_SP_WriteQueue_S240.PUBLIC F_SP_WriteQueue_MS01.PUBLIC F_SP_WriteQueue_DVR.PUBLIC F_SP_TestQueue.PUBLIC F_SP_TestQueue_A2000.PUBLIC F_SP_TestQueue_S480.PUBLIC F_SP_TestQueue_S

31、240.PUBLIC F_SP_TestQueue_MS01.PUBLIC F_SP_TestQueue_DVR.PUBLIC _SP_Export .PUBLIC_SP_Import .PUBLIC _SP_Init_IOB .PUBLIC _SP_Init_IOA .PUBLIC_SP_GetResource.PUBLIC F_SP_GetResource.PUBLIC F_SP_SACM_A2000_Init_.PUBLIC F_SP_SACM_S480_Init_.PUBLIC F_SP_SACM_S240_Init_.PUBLIC F_SP_SACM_MS01_Init_.PUBLI

32、C F_SP_PlayMode0_.PUBLIC F_SP_PlayMode1_ .PUBLIC F_SP_PlayMode2_ .PUBLIC F_SP_PlayMode3_ .PUBLIC F_SP_SACM_DVR_Init_.PUBLIC F_SP_SACM_DVR_Rec_Init_.PUBLIC F_SP_SACM_DVR_Play_Init_.PUBLICR_InterruptStatus .PUBLICF_RampUpDAC1 .PUBLICF_RampDnDAC1 .PUBLICF_RampUpDAC2 .PUBLICF_RampDnDAC2 .PUBLIC_STD_Ramp

33、UpDAC1 .PUBLIC_STD_RampDnDAC1 .PUBLIC_STD_RampUpDAC2 .PUBLIC_STD_RampDnDAC2 / Definitions for I/O Port.DEFINEP_IOA_Data 0x7000 .DEFINE P_IOA_Buffer 0x7001 .DEFINE P_IOA_Dir 0x7002 / Direction vector for IOA.DEFINE P_IOA_Attrib 0x7003 / Attribute vector for IOA.DEFINE P_IOA_Latch 0x7004 .DEFINE P_IOB

34、_Data 0x7005 .DEFINE P_IOB_Buffer 0x7006 .DEFINE P_IOB_Dir 0x7007 / Direction vector for IOB.DEFINE P_IOB_Attrib 0x7008 / Attribute vector for IOB.DEFINE P_FeedBack 0x7009 / Clock form external R,C.DEFINE P_TimerA_Data 0x700A / Data port for TimerA .DEFINE P_TimerA_Ctrl 0x700B / Control Port for Tim

35、erA.DEFINE P_TimerB_Data 0x700C / Data port for TimerB.DEFINE P_TimerB_Ctrl 0x700D / Control Port for TimerB.DEFINE P_TimeBase_Setup 0x700E / TimerBase Freq. Set.DEFINE P_TimeBase_Clear0x700F / Reset Timerbase counter.DEFINE P_INT_Ctrl 0x7010 .DEFINE P_INT_Clear 0x7011 / Clear interrupt source.DEFIN

36、E P_Watchdog_Clear 0x7012 / Watchdog Reset.DEFINE P_SystemClock 0x7013 /. PA6442 New version MC52A (For EC-03).DEFINE P_ADC 0x7014 / Data Port for AD.DEFINE P_ADC_Ctrl 0x7015 .DEFINE P_ADC_Status 0x7015 / AD Port Status.DEFINE P_DAC2 0x7016 / Data Port for DAC2.DEFINE P_PWM 0x7016 / Data Port for PWM.DEFINE P_DAC1 0x7017 / Data Port for DAC1.DEFINE P_DAC_Ctrl0x702A .DEFINE P_IR_Ctrl0x7018 / Control Port for IR.DEFINE P_LVD_Ctrl 0x7019 / Contr

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1