lcw_swust 发表于 2012-5-19 22:53:33

一个简单的语音识别程序

本帖最后由 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的识别

downtoearth 发表于 2012-5-19 22:58:20

这个厉害呀,顶帖!

Rick123 发表于 2012-5-19 23:16:58

语音 图像 这一块其实前景挺大的
因为用户会觉得交互越来越好了

wxw123321 发表于 2012-5-19 23:19:56

这个得好好看看,我们现在的语音合成方案,声音不怎么好。

xsh2005105326 发表于 2012-5-19 23:24:11

用光耦做AGC应该可行

xsh2005105326 发表于 2012-5-19 23:34:04

wxw123321 发表于 2012-5-19 23:19 static/image/common/back.gif
这个得好好看看,我们现在的语音合成方案,声音不怎么好。

LZ的是语音识别喔

wxw123321 发表于 2012-5-19 23:43:22

对的,是看错了,不过这个也不容错过哈,业余学习一下

无级电工 发表于 2012-5-19 23:46:48

有谁能把这语音识别电路详细讲解下?对AGC部分不太明了。

SNOOKER 发表于 2012-5-19 23:49:56

不是MEGA32吗,怎么又是51的

PCA 发表于 2012-5-20 01:52:48

太需要了,及时雨啊

weiwei4 发表于 2012-5-20 08:58:12

学习,这个很有用!

淋湿的鸡毛 发表于 2012-5-20 09:12:12

特来学习

gmyu 发表于 2012-5-20 09:50:42

will try it later.

hsztc 发表于 2012-5-20 09:55:26

这个东西好

cc6868 发表于 2012-5-20 10:11:57

这个猛料啊!怎么没置酷啊!

331086846 发表于 2012-5-20 10:19:57

牛掰啊,学习了

airfex 发表于 2012-5-20 11:04:17

这个资料猛啊,可以置酷了。

xyz543 发表于 2012-5-20 11:15:14

這太酷了,很喜歡研究這方面的東西,真的是即時雨呀! 不的不說一個贊字!!

smfox10 发表于 2012-5-20 18:48:01

有两位MM也是做了这个,原理好像差不多http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/s2011/wd65_yz526/wd65%20and%20yz526/index.html

sunkey 发表于 2012-5-20 18:55:36

这个要标记一下

lcw_swust 发表于 2012-5-20 20:48:33

smfox10 发表于 2012-5-20 18:48 static/image/common/back.gif
有两位MM也是做了这个,原理好像差不多http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects ...

这个貌似是用的"沃尔什(Walsh)变换"呀,速度应该会快些,就是没有看到源代码

xiaoya1945 发表于 2012-5-20 21:03:11

核心问题是识别率有多少? 不过能有这个思路果断要赞一个... 个人觉得模版的提取是个大学问...{:lol:}

wochai 发表于 2012-5-20 21:21:43

这东西要的!

mayou 发表于 2012-5-20 23:02:56

这个可特别的厉害啊!

li780713 发表于 2012-5-20 23:08:00

标记一下!!

shi_90 发表于 2012-5-21 11:37:46

不错啊!!记录一下!!

shi_90 发表于 2012-5-21 11:39:42

smfox10 发表于 2012-5-20 18:48 static/image/common/back.gif
有两位MM也是做了这个,原理好像差不多http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects ...

那两个mm不错!!!

heibaogame 发表于 2012-5-23 10:23:19

mark!{:smile:}{:smile:}{:smile:}{:smile:}

sync765 发表于 2012-5-23 10:35:03

标记,用得着

wgjwgj 发表于 2012-5-23 10:55:43

这个有意思,还可以发挥发挥。

lijinen 发表于 2012-5-23 19:13:49

楼主太利害了!学习学习了。

xyr 发表于 2012-5-23 19:54:05

这可是一个好东西,一定要试下.

szxszx 发表于 2012-5-23 20:05:47

非特定人识别不好搞

lxa0 发表于 2012-5-23 21:22:55

用51搞出这个,实在是太厉害啦~!~~~~~~~~~~

armok 发表于 2012-5-24 07:44:12

cool !

baoqi 发表于 2012-5-24 08:31:37

mark
来自:amoBBS 阿莫电子论坛 Android客户端

terencechang 发表于 2012-5-24 08:48:30

非特定人识别咋搞的呢?

lcw_swust 发表于 2012-5-24 08:57:21

armok 发表于 2012-5-24 07:44 static/image/common/back.gif
cool !

呵呵,多谢阿莫

keshipt 发表于 2012-5-24 09:22:21

很好的资料,马渴!

gmyu 发表于 2012-5-24 09:24:36

8位机做FFT太耗资源,不如搞两个324,一级前级放大,加5个带通一个高通,一个低通,然后学习这7路输出的特性。

有一广告词在我桌面摆了好久,忘了是TI还是AD的。--- 世界还是模拟的。

把模拟的事情交个模拟IC做,逻辑的交个MCU做。可能效率更高。

liycobl 发表于 2012-5-24 09:26:59

学习了      

hamipeter 发表于 2012-5-24 09:31:48

顶一下!

gmyu 发表于 2012-5-24 09:42:45

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

bmagui 发表于 2012-5-24 09:46:12

好帖留名!

lcw_swust 发表于 2012-5-24 11:40:56

gmyu 发表于 2012-5-24 09:24 static/image/common/back.gif
8位机做FFT太耗资源,不如搞两个324,一级前级放大,加5个带通一个高通,一个低通,然后学习这7路输出的特 ...

各有各的优点,模拟电路速度快,数字的方式更灵活.
其实8位机做FFT也不会消耗太多资源,比如用ATMEGA8就能实现128点FFT,如果这个用模拟电路搭出来得多少阶滤波多少个运放呀.

gmyu 发表于 2012-5-24 11:47:04

说的也对,有时间用STM8试试,如果后续处理太复杂就用两个MCU,哈哈,双核。关键是经验参数需要花时间提取。

tangguanglun 发表于 2012-5-24 12:48:14

语音识别。音源怎么弄的呢

lcw_swust 发表于 2012-5-24 12:56:50

tangguanglun 发表于 2012-5-24 12:48 static/image/common/back.gif
语音识别。音源怎么弄的呢

音源可以自己说话呀,或者用手机录音,或者用windows录音机

leifeng 发表于 2012-5-24 14:22:06

厉害阿!语音识别

twuking 发表于 2012-5-24 15:02:07

好东西啊!!

不过没看懂是怎么回事!!

lovelywwei 发表于 2012-5-24 15:10:02

学习学习。很强大

rpg_9527 发表于 2012-5-24 15:57:07

MARK!非常感谢!

kxm2008 发表于 2012-5-24 16:04:06

MEGA32是avr吗

ky51 发表于 2012-5-25 15:20:18

语音识别 mark

lvjun1013 发表于 2012-5-25 23:11:27

可以好好学习下

liuchangkui 发表于 2012-5-25 23:30:03

mark顶上来

LM1876 发表于 2012-5-25 23:35:53

这个有空得试试

ym7205 发表于 2012-6-5 09:07:45

精辟啊   

ym7205 发表于 2012-6-13 07:28:32

不错,学习了

usingavr 发表于 2012-6-13 08:08:30

很强大啊,期待更低误码,更多命令

minier 发表于 2012-6-13 09:08:52

算法还有很多可以改进的地方

zengdz 发表于 2012-6-13 14:46:54

lcw_swust 发表于 2012-5-20 20:48 static/image/common/back.gif
这个貌似是用的"沃尔什(Walsh)变换"呀,速度应该会快些,就是没有看到源代码

有源码的,仔细找找

lovelywwei 发表于 2012-6-13 14:56:02

MARK.个人也觉得这方面前景不错。

avrwoo 发表于 2012-6-13 15:17:35

标注,等有时间学习一下

if_else 发表于 2012-6-13 23:21:32

在新域名下标记一下

cos 发表于 2012-6-14 12:32:45

很好的资料,特来学习

dadalijun 发表于 2012-6-14 15:39:04

强大,顶

richards 发表于 2012-6-14 15:44:45

这个确实比较cool之前用过一款语音芯片无疑增加了硬件成本。这样既好了。

cddx 发表于 2012-6-17 00:33:32

不错,mark一下日后研究

shotstar 发表于 2012-6-17 08:25:30

语言识别,能识别人 就难了

ieee911 发表于 2012-6-17 09:33:22

好东西,必须顶!

国强 发表于 2012-6-17 11:27:45

学习学习..........................

bangbangji 发表于 2012-6-17 11:56:57

不错,想法和效果都挺好的

wtiechen1969 发表于 2012-6-17 22:14:05

好东西,学习了!

wood.wang.wl 发表于 2012-6-18 16:23:19

不知STM8能否搞定啊,不过即使能做出来,和台湾那些带51核的专业语音识别芯片比,效果应该还是要差很多的,而且此类芯片已经可以做到20元以下啦,就是资料太少了……

freshuman 发表于 2012-6-20 16:55:49

真是好东西!

ZhrDiscovery 发表于 2012-6-20 21:48:06

学习一下

john_8 发表于 2012-6-21 09:58:23

这个好,mark下

mcuprogram 发表于 2012-6-21 10:01:24

mark                           

sync765 发表于 2012-6-21 11:17:29

很好的东东
支持

fengtianzhifeng 发表于 2012-6-21 15:27:45

好厉害谢谢         楼主

creep 发表于 2012-6-21 21:34:11

好好学习 不懂的太多了 算法

yzlisheng111 发表于 2012-8-11 19:53:27

   mark               

llysc 发表于 2012-8-11 20:53:59

好东西,要顶上去!!!!!!!!!!!

hlgps 发表于 2012-9-7 21:18:16

参考下,正准备做个语言控制系统。

chenfzg 发表于 2012-9-8 08:02:49

谢谢分享了         

gdjsfy_86 发表于 2012-9-8 08:16:39

xuexiyixia

cumtguojp 发表于 2012-9-25 23:44:29

mark,方便学习

想不到 发表于 2012-9-25 23:52:10

MARK               

dhy13 发表于 2012-9-26 00:01:09

不错 哦~~~~~~

lihebb 发表于 2012-9-26 10:26:50

菜鸟漂过~~~

z903057128 发表于 2012-9-26 10:28:17

好厉害.exe

weahdeng 发表于 2012-9-26 11:51:33

这个很牛

qiu452555846 发表于 2012-9-26 11:54:24

好东西,做一个标签!

zyw19987 发表于 2012-9-26 21:26:31

语音识别

naclo 发表于 2012-10-5 19:37:50

顶,喜欢看数学算法的帖子

along 发表于 2012-10-23 06:28:51

学习了!!!

metalmadman 发表于 2012-10-23 08:43:08

      mark

eryueniao 发表于 2012-10-23 09:00:26

cool                                                                  

wwxxcc 发表于 2012-11-27 16:41:14

MARK音频通信
页: [1] 2 3
查看完整版本: 一个简单的语音识别程序