语音识别算法及其实现_第1页
语音识别算法及其实现_第2页
语音识别算法及其实现_第3页
语音识别算法及其实现_第4页
语音识别算法及其实现_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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)y×2q;定点数z转换为浮点数y:y =(float)x×2-q。 222. 数据精度的处理 用16b的定点dsp实现语音识别算法时,虽然程序的运行速度提高了,但是数据精度比较低。这可能由于中间过程的累计误差而引起运算结果的不正确。为了提高数据的运算精度,在程序中采用

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

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

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

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

9、明 411. 语音识别函数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:要求训练

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

11、trecognizer(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 【功能】该变量用于

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

15、 表示语音播放的序号。 【应用】用户使用时,通过设置此变量选择命令和识别的语音响应。 4.3程序使用说明 *训练* 提示音 输入语音 - "请输入触发名称" "警卫" "请输入第一条命令" "红灯亮" "请输入第二条命令" "红灯灭" "请输入第三条命令" "绿灯亮""请输入第四条命令" "绿灯灭" "请再说一遍"(以上提示音每说完一遍出现此命令) "没有听到任何声音

16、" (当没有检测到声音时出现此命令) "两次输入名称不相同"(当两次输入的名称不同时出现此命令) "两次输入命令不相同"(当两次输入的命令有差异时出现此命令) "准备就绪,请开始辨识"(以上五条语句全部训练成功时,进入识别) *识别* 发布命令 应答 - "警卫" "在" "红灯亮" iob0口灯被点亮 "红灯灭" iob0口灯被熄灭 "绿灯亮" iob1口灯被点亮 "绿灯灭" iob1口灯被熄灭 注意:

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

18、灯亮"/"请输入第二条命令" "红灯灭"/"请输入第三条命令" "绿灯亮"/"请输入第四条命令" "绿灯灭"/"请再说一遍"(以上提示音每说完一遍出现此命令)/"没有听到任何声音" (当没有检测到声音时出现此命令)/"两次输入名称不相同"(当两次输入的名称不同时出现此命令)/"两次输入命令不相同"(当两次输入的命令有差异时出现此命令)/"准备就绪,请开始辨识"(以上五

19、条语句全部训练成功时,进入识别)/*识别* / 发布命令 应答/- /"警卫" "在"/"红灯亮" iob0口灯被点亮/"红灯灭" iob0口灯被熄灭/"绿灯亮" iob1口灯被点亮/"绿灯灭" iob1口灯被熄灭/注意: 在每次提示音结束后2-3秒再输入命令或当上次应答结束2-3秒后/再发布命令/ / ide环境: sunplus u'nsptm ide 1.8.0(or later)/ 涉及的库:cmacro.lib/sacmv25.lib/bsrv222sdl.

20、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 0x104#define rsp_intr0#define rsp_name 0#define rsp_fire 1#define

21、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 bsr_mic 14#define bsr_train_twice 15#define rsp_noisy 16/.全程变量.int g

22、activated = 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_stoprecognizer();sacm_s480_initial(1);sacm_s480_play(result, 3, 3);

23、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 = bsr_train(wordid,bsr_train_twice);if(res = 0) break;switch(res)

24、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); /两次输入名称不同elseplayrespond(rsp_cmddiff); /两次输入命令不同return -1;case -6

25、: /序号错误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,1) != 0) ;/.训练第二条命令.while(trainword(command_two_id

26、,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 +;if(random_no >= 3) random_no = 0;res = bsr_getr

27、esult();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_off(); /响应第二条命令“我在巡逻”gactivated = 0;break;

28、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 > 450)/超出定时playrespond(rsp_novoice); /在设

29、定时间内没有检测出声音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.public_sp_initqueue_a2000.public_sp_ini

30、tqueue_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.public f_sp_readqueue_a2000.public f_sp_re

31、adqueue_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_nic_ms01.publicf_sp_readqueue_nic_dvr

32、.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_s240.public f_sp_testqueue_ms01.public

33、 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_.public f_sp_playmode0_.public f_sp_playmod

34、e1_ .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_rampupdac1 .public_std_rampdndac1 .public

35、_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_data 0x7005 .define p_iob_buffer 0x7

36、006 .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 timera.define p_timerb_data 0x700c / dat

37、a 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.define p_watchdog_clear 0x7012 / watchdog

38、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 fo

39、r dac1.define p_dac_ctrl0x702a .define p_ir_ctrl0x7018 / control port for ir.define p_lvd_ctrl 0x7019 / control port for lvd.define p_sio_data0x701a / data port for serial io.define p_sio_addr_low0x701b / address port low.define p_sio_addr_mid0x701c / address port middle.define p_sio_addr_high 0x701

40、d / address port high.define p_sio_ctrl0x701e / control port.define p_sio_start0x701f .define p_sio_stop0x7020 .define p_uart_command1 0x7021 / command1 port for uart.define p_uart_command2 0x7022 / command2 port for uart.define p_uart_data 0x7023 / data port for uart.definep_uart_baudscalarlow 0x70

41、24 / set baud rate scalar low.definep_uart_baudscalarhigh 0x7025 / set baud rate scalar high/. definitions for p_int_ctrl .define c_irq6_tmb2 0x0001 / timer b irq6.define c_irq6_tmb1 0x0002 / timer a irq6.define c_irq5_2hz 0x0004 / 2hz irq5.define c_irq5_4hz 0x0008 / 4hz irq5.define c_irq4_1khz 0x00

42、10 / 1024hz irq4.define c_irq4_2khz 0x0020 / 2048hz irq4.define c_irq4_4khz 0x0040 / 4096hz irq4.define c_irq3_key 0x0080 / key change irq3.define c_irq3_ext1 0x0100 / ext1 irq3.define c_irq3_ext2 0x0200 / ext2 irq3.define c_irq2_tmb 0x0400 / timer b irq2.define c_fiq_tmb 0x0800 / timer b fiq.define

43、 c_irq1_tma 0x1000 / timer a irq1.define c_fiq_tma 0x2000 / timer a fiq.define c_irq0_pwm 0x4000 / pwm irq0.define c_fiq_pwm 0x8000 / pwm fiq/ definitions for p_timera/b_ctrl . .definec_fosc_20x0000 .definec_fosc_256 0x0001 .definec_32768hz0x0002 .definec_8192hz0x0003 .definec_4096hz0x0004 .definec_

44、a10x0005 .define c_a0 0x0006 .define c_ext10x0007 .definec_2048hz0x0000 .definec_1024hz0x0008 .definec_256hz0x0010 .definec_tmb1hz0x0018 .definec_4hz0x0020 .definec_2hz0x0028 .definec_b10x0030 .definec_ext20x0038 .definec_off0x0000 .define c_d10x0040 .define c_d20x0080 .define c_d30x00c0 .define c_d

45、40x0100 .define c_d50x0140 .define c_d60x0180 .define c_d70x01c0 .define c_d80x0200 .define c_d90x0240 .define c_d100x0280 .define c_d110x02c0 .define c_d120x0300 .define c_d130x0340 .define c_d140x0380 .define c_ta_div_20x03c0 / timer a.define c_tb_div_20x03c0 / timer b/. definition for p_systemclock .define c_fosc0x0000 / b3.b0.define c_fosc_div_20x0001 .define c_fosc_div_40x0002 .define c_fosc_div_80x0003 / (default

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论