打印

语音识别算法及其实现

[复制链接]
10282|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
五谷道场|  楼主 | 2012-5-7 16:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、概述
1.1. 选题意义

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

相关帖子

沙发
五谷道场|  楼主 | 2012-5-7 16:26 | 只看该作者
二、算法原理
2.1. 语音识别的基本过程
      根据实际中的应用不同,语音识别系统可以分为:特定人与非特定人的识别、独立词与连续词的识别、小词汇量与大词汇量以及无限词汇量的识别。但无论那种语音识别系统,其基本原理和处理方法都大体类似。一个典型的语音识别系统的原理图如图1所示。



      语音识别过程主要包括语音信号的预处理、特征提取、模式匹配几个部分。预处理包括预滤波、采样和量化、加窗、端点检测、预加重等过程。语音信号识别最重要的一环就是特征参数提取。提取的特征参数必须满足以下的要求:
      (1)提取的特征参数能有效地代表语音特征,具有很好的区分性; (2)各阶参数之间有良好的独立性;
      (3)特征参数要计算方便,最好有高效的算法,以保证语音识别的实时实现。
      在训练阶段,将特征参数进行一定的处理后,为每个词条建立一个模型,保存为模板库。在识别阶段,语音信号经过相同的通道得到语音特征参数,生成测试模板,与参考模板进行匹配,将匹配分数最高的参考模板作为识别结果。同时,还可以在很多先验知识的帮助下,提高识别的准确率。
2.2. 语音识别的DSP实现技术
2.21. 浮点运算的定点实现
      在语音识别的算法中,有许多的浮点运算。用定点DSP来实现浮点运算是在编写语音识别程序中需要首先解决的问题。这个问题可以通过数的定标方法来实现。数的定标就是决定小数点在定点数中的位置。Q表示法是一种常用的定标方法。其表示机制是:
      设定点数是J,浮点数是f,则Q法表示的定点数与浮点数的转换关系为: 浮点数f转换为定点数x:x= (int)y×2Q;定点数z转换为浮点数y:y      =(float)x×2-Q。
2.22. 数据精度的处理
      用16b的定点DSP实现语音识别算法时,虽然程序的运行速度提高了,但是数据精度比较低。这可能由于中间过程的累计误差而引起运算结果的不正确。为了提高数据的运算精度,在程序中采用了以下的处理方法:
      (1)扩展精度 在精度要求比较高的地方,将计算的中间变量采用32b,甚至48b来表示。这样,在指令条数增加不多的情况下却使运算精度大大提高了。
      (2)采用伪浮点法来表示浮点数
      伪浮点法即用尾数+指数的方法来表示浮点数。这时,数据块的尾数可以采用Q1.15数据格式,数据块的指数相同。这种表示数据的方法有足够大的数据范围,可以完全满足数据精度的要求,但是需要自己编写一套指数和尾数运算库,会额外增加程序的指令数和运算量,不利于实时实现。
      以上两种方法,都可以提高运算精度,但在实际操作时,要根据系统的要求和算法的复杂度,来权衡考虑。
2.23. 变量的维护
      在高级语言中,有全局变量与局部变量存储的区别,但在DSP程序中,所有声明的变量在链接时都会分给数据空间。所以如果按照高级语言那样定义局部变量,就会浪费大量的DSP存储空间,这对数据空间较为紧张的定点DSP来说,显然是不合理的。为了节省存储空间,在编写DSP程序时,最好维护好一张变量表。每进入一个DSP子模块时,不要急于分配新的局部变量,应优先使用已分配但不用的变量。只有在不够时才分配新的局部变量。
2.24. 采用模块化的程序设计方法
      在语音识别算法的实现中,为了便于程序的设计和调试,采用了模块化的程序设计方法。以语音识别的基本过程为依据进行模块划分,每个模块再划分为若干个子模块,然后以模块为单元进行编程和调试。在编写程序之前,首先用高级语言对每个模块进行算法仿真,在此基础上再进行汇编程序的编写。在调试时,可以采用高级语言与汇编语言对比的调试方式,这样可以通过跟踪高级语言与汇编语言的中间状态,来验证汇编语言的正确性,并及时的发现和修改错误,缩短编程周期。另外,在程序的编写过程中,应在关键的部分加上必要的注释与说明,以增强程序的可读性。
      在总调时,需要在各模块中设置好相应的人口参数与出口参数,维护好堆栈指针与中间变量等。

使用特权

评论回复
板凳
五谷道场|  楼主 | 2012-5-7 16:30 | 只看该作者
三、硬件设计及功能描述
3.1. 外接电路组成部分
IOB1
IOB0
两个发光二极管
5V
电压

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

1.JPG (35.97 KB )

1.JPG

使用特权

评论回复
地板
五谷道场|  楼主 | 2012-5-7 16:31 | 只看该作者
四、软件设计及使用说明
4.1. 主程序软件设计流程及说明
4.11. 语音识别函数
1
API格式】int BSR_DeleteSDGroup(0)
【功能说明】SRAM初始化。
【参 数】该参数是辨识的一个标识符,0代表选择SRAM,并初始化。
【返 值】当SRAM擦除成功返回0,否则,返回-1
2
API格式】int BSR_Train (int CommandID, int TraindMode)
【功能说明】训练函数。
【参 数】
CommandID:命令序号,范围从0x1000FFF,并且对于每组训练语句
都是唯一的。
TraindMode:训练次数,要求使用者在应用之前训练一或两遍:
BSR_TRAIN_ONCE:要求训练一次。
BSR_TRAIN_TWICE要求训练两次。
【返 回 值】训练成功,返回0;没有声音返回-1;训练需要更多的语音数据来训练,返回-2;当环境太吵时,返回-3;当数据库满,返回-4;当两次输入命令不同,返回-5;当序号超出范围,返回-6。
【备 注】
① 在调用训练程序之前,确保识别器正确的初始化。
② 训练次数是2时,则两次一定会有差异,所以一定要保证两次训练结果接近
③ 为了增强可靠性,最好训练两次,否则辨识的命令就会倾向于噪音
④ 调用函数后,等待2秒开始训练,每条命令只有1 .3秒,也就是说,当训练命令超出1.3秒时,只有前1.3秒命令有效。
4.12. 辨识部分
1
API格式】void BSR_InitRecognizer(int AudioSource)
【功能说明】辨识器初始化。
【参 数】定义语音输入来源。通过MIC语音输入还是LINE_IN电压模拟量输入。
【返 值】无。
2
API格式】int BSR_GetResult()
【功能说明】辨识中获取数据。
【参 数】 无。
【返回值】R1
当无命令识别出来时,返回0
识别器停止未初始化或识别未激活返回-1
当识别不合格时返回-2
当识别出来时返回命令的序号。
【备 注】 该函数用于启动辨识,BSR_GetResult()
3
API格式】void BSR_StopRecognizer(void)
【功能说明】停止辨识。
【参 数】无。
【返 值】 无。
【备 注】该函数是用于停止识别,当调用此函数时,FIQ_TMA中断将关闭。
中断部分:
API格式】 _BSR_InitRecognizer
【功能说明】 在中断中调用,并通过中断将语音信号送DAC通道播放。
【参 数】 无。
【返 值】 无。
【备 注】
该函数在中断FIQ_TMA中调用
当主程序调用BSR_InitRecognizer时,辨识器便打开8K采样率的FIQ_TMA
断并开始将采样的语音数据填入辨识器的数据队列中。
应用程序需要设置一下程序段在FIQ_TMA中:
4.2.
程序变量说明

4.21.全局变量
1gActivated
【功能】该变量用于检测是否有触发命令,当有识别出语句为触发名称则该位置1
【应用】用户无法对该变量进行处理
2gTriggerRespond
【功能】该变量为一三元素数组,用于保存触发命令语音序号。
【应用】用户在自定义触发命令时,可以修改该数组元素。
3gComm2Respond
【功能】该变量为一三元素数组,用于保存命令语音序号。
【应用】用户在自定义触发命令时,可以修改该数组元素。
4PlayFlag
【功能】该变量为1时,表示播放A2000格式语音,0,播放S480格式语音。
【应用】用户使用时,注意判断是使用A2000还是S480
4.22.局部变量
1) res
【功能】该变量用于保存int BSR_Train (int CommandID, int TraindMode)
返回值:
返回0,训练成功;
返回-1,没有声音;
返回-2,训练需要更多的语音数据来训练;
返回-3,环境太吵;返回-4,当数据库满;
返回-5,当两次输入命令不同;
返回-6,当序号超出范围。
【应用】用户通过对该变量的判断了解辨识的结果
2timeCnt
【功能】用于命令定时使用,在1.5秒内,识别成功,将其清零,否则语音提示,
“没有听到任何声音”
【应用】用户使用时,只要将此值进行清零即可。
3random_no
【功能】在gTriggerRespond[3] gComm2Respond[3]中,选择两数组中的元素。
表示语音播放的序号。
【应用】用户使用时,通过设置此变量选择命令和识别的语音响应。
4.3.程序使用说明
**************************训练********************************
提示音

输入语音

---------------------------------------------------------------------------------------------
"请输入触发名称"

"
警卫"

"请输入第一条命令"
"
红灯亮"

"请输入第二条命令"

"
红灯灭"

"请输入第三条命令"
"
绿灯亮"

"请输入第四条命令"
"
绿灯灭"

"请再说一遍"(以上提示音每说完一遍出现此命令)
"没有听到任何声音" (当没有检测到声音时出现此命令)
"两次输入名称不相同"(当两次输入的名称不同时出现此命令)
"两次输入命令不相同"(当两次输入的命令有差异时出现此命令)
"准备就绪,请开始辨识"(以上五条语句全部训练成功时,进入识别)


***************************识别*******************************
发布命令


应答

---------------------------------------------------------------------------------------------


"
警卫"

"
"

"红灯亮"

IOB0
口灯被点亮

"红灯灭"



IOB0
口灯被熄灭

"绿灯亮"

IOB1
口灯被点亮

"绿灯灭"


IOB1
口灯被熄灭

注意: 在每次提示音结束后2-3秒再输入命令或当上次应答结束2-3秒后
再发布命令
4.4. 主程序流程图及说明

1.JPG (43.29 KB )

1.JPG

使用特权

评论回复
5
五谷道场|  楼主 | 2012-5-7 16:34 | 只看该作者
五、原程序清单

五、原程序清单.pdf

144.62 KB

使用特权

评论回复
6
五谷道场|  楼主 | 2012-5-7 16:34 | 只看该作者
六、总结
我首先要感谢在设计准备过程中给予我们帮助的钱老师,还要感谢给予我们帮助和指导的研究生宋坤师兄!自从听老师讲DSP开始我就对这门课怀有恐惧心理,尤其是到后来听不懂老师讲的东西的时候,我更是惴惴不安,怀疑是不是自己太笨了,老师讲的东西也听不懂了。但是在设计过程中我们没有气馁,翻阅了大量的资料,在前辈的指导下,最后终于有了一个初步的设计思路。首先我要说明一点,这里的程序并不全是我们的成果,所有的子程序都是凌阳科技大学计划里公开的源文件。我们设计的整体思路是从2003年大学生电子科技大赛的一个参赛项目中演化出来的,并受了它不少的影响。目前还没有动手去做,只是进行了理论推算和验证,目前从理论上看这是可行的,下一步我们就要开始进行单片机编程和连接了。做这个设计让我学到了很多东西,自学了很多单片机的一些知识,而且又复习了C语言的知识。而且通过做这个设计,也锻炼了我搜集、分析和处理信息的能力。
同时我还有一个小小的建议,就是希望学校能够拍一些研究生在我们进行设计的初期给一点指导和建议什么的,这样有助于我们更好地完成本次设计任务,效果也会更好的。

使用特权

评论回复
7
agopie| | 2013-9-16 12:17 | 只看该作者
:victory:

使用特权

评论回复
8
飞得更高254| | 2014-5-3 23:04 | 只看该作者
你好,我刚看了你的关于“【DSP+ARM】语音识别算法及其实现”的 帖子,想向你要控制红绿灯的程序的文件夹(用IDE可打开的),我的邮箱是13079364030@163.com,请一定发一下,不胜感谢,打扰了。

使用特权

评论回复
9
gbsemilychen| | 2015-7-28 15:21 | 只看该作者
美国富迪语音唤醒/控制IC iM401 资料,应用于手持式产品及需要语音控制产品,可支持5句话,每句话4个字.

现在*为量产手机-P8 已经采用,主要用于找手机(如说"手机在哪"手机即会发出提醒音乐)及待机控制,其工作功耗大约300uA.
联系人:EMILY13008852348

使用特权

评论回复
10
tongbu2015| | 2015-7-29 22:17 | 只看该作者
根据实际中的应用不同,语音识别系统可以分为:特定人与非特定人的识别、独立词与连续词的识别、小词汇量与大词汇量以及无限词汇量的识别。

使用特权

评论回复
11
tongbu2015| | 2015-7-29 22:17 | 只看该作者
凌阳十六位单片机是台湾凌阳公司2001年推出的新一代单片机,具有高速度、低价、可靠、实用、体积小、功耗低和简单易学等特点。其有多种型号,经过比较我们选择了其代表型号SPCE061A。因为该型号在存储器资源方面考虑到用户的较少资源的需求以及便于程序调试等功能,芯片只内嵌32K字的闪存(FLASH)。

使用特权

评论回复
12
tongbu2015| | 2015-7-29 22:18 | 只看该作者
语音识别系统的研究涉及微机技术、人工智能、数字信号处理、模式识别、声学、语言学和认知科学等许多学科领域,是一个多学科综合性研究领域。近年来,高性能数字信号处理芯片DSP技术的迅速发展,为语音识别的实时实现提供了可能。

使用特权

评论回复
13
tongbu2015| | 2015-7-29 22:18 | 只看该作者
扩展精度 在精度要求比较高的地方,将计算的中间变量采用32b,甚至48b来表示。这样,在指令条数增加不多的情况下却使运算精度大大提高了。
这个是很重要的。

使用特权

评论回复
14
tongbu2015| | 2015-7-29 22:19 | 只看该作者
伪浮点法即用尾数+指数的方法来表示浮点数。这时,数据块的尾数可以采用Q1.15数据格式,数据块的指数相同。这种表示数据的方法有足够大的数据范围,可以完全满足数据精度的要求,但是需要自己编写一套指数和尾数运算库,会额外增加程序的指令数和运算量,不利于实时实现。   这个是有利有弊的。。。

使用特权

评论回复
15
hryyyu| | 2015-7-30 13:31 | 只看该作者
作为参考设计不错

使用特权

评论回复
16
janetsingsound| | 2017-2-28 11:45 | 只看该作者
有正在找语音算法相关工作的吗?求推荐!苏州公司正在招聘语音算法工程师,有感兴趣的可以发送简历到jiangy@singsound.com

使用特权

评论回复
17
zhangbo1985| | 2017-2-28 20:59 | 只看该作者
语音识别系统可以分为:特定人与非特定人的识别、独立词与连续词的识别、小词汇量与大词汇量以及无限词汇量的识别。

使用特权

评论回复
18
zhangbo1985| | 2017-2-28 21:00 | 只看该作者
这个还是比较新颖的技术发展方向的。

使用特权

评论回复
19
sdlls| | 2017-3-1 22:07 | 只看该作者
凌阳公司?

使用特权

评论回复
20
sdlls| | 2017-3-1 22:15 | 只看该作者
怎么不使用DSP做语音识别。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7647

主题

9805

帖子

11

粉丝