一个简单的语音识别程序
本帖最后由 lcw_swust 于 2012-5-19 22:57 编辑最近想做语音识别玩玩,网上查了查,找到一个用Atmega32实现的语音识别机械车
地址是:http://courses.cit.cornell.edu/ee476/FinalProjects/s2006/avh8_css34/avh8_css34/index.html
貌似是利用带通滤波取得频谱(或者叫功率谱?),看不太懂.我决定用DFT算法,因为它节约内存
DFT程序借借鉴了 hendry 单片机 DTMF 软解码算法的实现
http://www.ourdev.cn/forum.php?mod=viewthread&tid=3231035&highlight=dtmf
//--------------------------------------------------
//DFT运算
//注意,ad是有符号数,无符号的AD值需减128
//返回值为1表示已经计算了功率谱
//--------------------------------------------------
U8 dft(S8 ad)
{
U8 i;
U8 offset;//查表指针
U32 temp;
//ad-=128;//去直流分量
for(i=0;i<NFREQ;i++)//每个频点计算实部和虚部
{
offset=tabp;//取查表指针
s_dft_image += (S16)ad * sintab;//>>8;
offset+=PI2/4;//偏移1/4周期为cos表
s_dft_real += (S16)ad * sintab;//>>8;//cos表
tabp+=tabinc;//指针下移
}
s_dft_p ++;
if (s_dft_p == NSAMP) //采样点已达到设定值,计算功率
{
s_dft_p = 0; //点数清0
for (i = 0; i < NFREQ; i ++)//每个频点计算功率
{
s_dft_real/=NSAMP*6; //除以合适的值能使得功率在一字节内
s_dft_image/=NSAMP*6;
temp=s_dft_real*s_dft_real + s_dft_image*s_dft_image;
if(temp>65535)temp=65535;
s_dft_real = sqrt16(temp);
//s_dft_real = sqrt32(((s_dft_real*s_dft_real) + (s_dft_image*s_dft_image)));
}
return 1;
}
return 0;
}
本程序流程大概是这样:
定时读取ADC,计算5个频率点的实部与虚部,采集64点后计算5个频率点的功率,称之为功率谱
当功率值达到一定值后,认为是一帧语音开始,此后计算的34次功率谱分别存入数组中.
若是在训练状态,则将这34个功率谱存入模板数组,训练完毕后进入识别状态.
在识别状态下,用这34个功率谱去与模板匹配,找出误差最小的,若误差小于一定值,则识别成功.
目前程序只识别两个命令,识别率还不太理想,偶尔会有误码.
如果把模板存进EEPROM,则可以增加命令的个数.
程序量较小,占用内存也小,可以很方便的移植到AVR单片机.
电路用了AGC,就是把2SK30A当作可变电阻,GS间负电压越大,DS间电阻越大.
据说可以用发光二极管+光敏电阻来做AGC.
初步的实验也可以用电脑音频输出串联电容到ADC输入口,至少这样每次放出来的声音是一样的,便于验证
频谱计算是否正确.
附件中有一个用VB写的查看波形的程序,只需通过串口向它发送数据就行了,格式是0xAA+数据字节数+数据
识别结果.jpg里每行最后一个字节是结果,为0表示未能识别,前10行是对命令1的识别,后10行是对命令2的识别
这个厉害呀,顶帖! 语音 图像 这一块其实前景挺大的
因为用户会觉得交互越来越好了 这个得好好看看,我们现在的语音合成方案,声音不怎么好。 用光耦做AGC应该可行 wxw123321 发表于 2012-5-19 23:19 static/image/common/back.gif
这个得好好看看,我们现在的语音合成方案,声音不怎么好。
LZ的是语音识别喔 对的,是看错了,不过这个也不容错过哈,业余学习一下 有谁能把这语音识别电路详细讲解下?对AGC部分不太明了。 不是MEGA32吗,怎么又是51的 太需要了,及时雨啊 学习,这个很有用! 特来学习 will try it later. 这个东西好 这个猛料啊!怎么没置酷啊! 牛掰啊,学习了 这个资料猛啊,可以置酷了。 這太酷了,很喜歡研究這方面的東西,真的是即時雨呀! 不的不說一個贊字!! 有两位MM也是做了这个,原理好像差不多http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/s2011/wd65_yz526/wd65%20and%20yz526/index.html 这个要标记一下 smfox10 发表于 2012-5-20 18:48 static/image/common/back.gif
有两位MM也是做了这个,原理好像差不多http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects ...
这个貌似是用的"沃尔什(Walsh)变换"呀,速度应该会快些,就是没有看到源代码 核心问题是识别率有多少? 不过能有这个思路果断要赞一个... 个人觉得模版的提取是个大学问...{:lol:} 这东西要的! 这个可特别的厉害啊! 标记一下!! 不错啊!!记录一下!! smfox10 发表于 2012-5-20 18:48 static/image/common/back.gif
有两位MM也是做了这个,原理好像差不多http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects ...
那两个mm不错!!! mark!{:smile:}{:smile:}{:smile:}{:smile:} 标记,用得着 这个有意思,还可以发挥发挥。 楼主太利害了!学习学习了。 这可是一个好东西,一定要试下. 非特定人识别不好搞 用51搞出这个,实在是太厉害啦~!~~~~~~~~~~ cool ! mark
来自:amoBBS 阿莫电子论坛 Android客户端 非特定人识别咋搞的呢? armok 发表于 2012-5-24 07:44 static/image/common/back.gif
cool !
呵呵,多谢阿莫 很好的资料,马渴! 8位机做FFT太耗资源,不如搞两个324,一级前级放大,加5个带通一个高通,一个低通,然后学习这7路输出的特性。
有一广告词在我桌面摆了好久,忘了是TI还是AD的。--- 世界还是模拟的。
把模拟的事情交个模拟IC做,逻辑的交个MCU做。可能效率更高。
学习了 顶一下! http://wenku.baidu.com/view/b8ce57a00029bd64783e2c1b.html?from=rec&pos=1&weight=35&lastweight=15&count=5
http://wenku.baidu.com/view/cf7d8a72f242336c1eb95e52.html?from=rec&pos=0&weight=53&lastweight=17&count=5
http://wenku.baidu.com/view/46cbd122bcd126fff7050b41.html?from=rec&pos=3&weight=18&lastweight=17&count=5
好帖留名! gmyu 发表于 2012-5-24 09:24 static/image/common/back.gif
8位机做FFT太耗资源,不如搞两个324,一级前级放大,加5个带通一个高通,一个低通,然后学习这7路输出的特 ...
各有各的优点,模拟电路速度快,数字的方式更灵活.
其实8位机做FFT也不会消耗太多资源,比如用ATMEGA8就能实现128点FFT,如果这个用模拟电路搭出来得多少阶滤波多少个运放呀.
说的也对,有时间用STM8试试,如果后续处理太复杂就用两个MCU,哈哈,双核。关键是经验参数需要花时间提取。 语音识别。音源怎么弄的呢 tangguanglun 发表于 2012-5-24 12:48 static/image/common/back.gif
语音识别。音源怎么弄的呢
音源可以自己说话呀,或者用手机录音,或者用windows录音机 厉害阿!语音识别 好东西啊!!
不过没看懂是怎么回事!! 学习学习。很强大 MARK!非常感谢! MEGA32是avr吗 语音识别 mark 可以好好学习下 mark顶上来 这个有空得试试 精辟啊 不错,学习了 很强大啊,期待更低误码,更多命令 算法还有很多可以改进的地方 lcw_swust 发表于 2012-5-20 20:48 static/image/common/back.gif
这个貌似是用的"沃尔什(Walsh)变换"呀,速度应该会快些,就是没有看到源代码
有源码的,仔细找找 MARK.个人也觉得这方面前景不错。 标注,等有时间学习一下 在新域名下标记一下 很好的资料,特来学习 强大,顶 这个确实比较cool之前用过一款语音芯片无疑增加了硬件成本。这样既好了。 不错,mark一下日后研究 语言识别,能识别人 就难了 好东西,必须顶! 学习学习.......................... 不错,想法和效果都挺好的 好东西,学习了! 不知STM8能否搞定啊,不过即使能做出来,和台湾那些带51核的专业语音识别芯片比,效果应该还是要差很多的,而且此类芯片已经可以做到20元以下啦,就是资料太少了…… 真是好东西! 学习一下 这个好,mark下 mark 很好的东东
支持 好厉害谢谢 楼主 好好学习 不懂的太多了 算法 mark 好东西,要顶上去!!!!!!!!!!! 参考下,正准备做个语言控制系统。 谢谢分享了 xuexiyixia mark,方便学习 MARK 不错 哦~~~~~~ 菜鸟漂过~~~ 好厉害.exe 这个很牛 好东西,做一个标签! 语音识别 顶,喜欢看数学算法的帖子 学习了!!! mark cool MARK音频通信