找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 864|回复: 0
打印 上一主题 下一主题
收起左侧

stm32-speech-recognition小程序

[复制链接]
跳转到指定楼层
楼主
ID:650125 发表于 2019-11-26 17:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有需要可以下来看看

单片机源程序如下:
  1. /********* main.C **********/

  2. #include "includes.h"
  3. #include "VAD.H"
  4. #include "MFCC.H"
  5. #include "DTW.H"
  6. #include "GUI.H"
  7. #include "flash.h"
  8. #include "delay.h"

  9. #define DEBUG
  10. #ifdef DEBUG
  11. #define DBP(fmt,arg...)  USART1_printf(fmt,##arg)
  12. #define DBPLN(fmt,arg...)  USART1_printf_line(fmt,##arg)
  13. #define DBPH(src, len)  USART1_print_hex(src, len)
  14. #else
  15. #define DBP(fmt,arg...)
  16. #define DBPLN(fmt,arg...)
  17. #define DBPH(src, len)
  18. #endif

  19. u16                 VcBuf[VcBuf_Len];
  20. atap_tag        atap_arg;
  21. valid_tag        valid_voice[max_vc_con];
  22. v_ftr_tag        ftr;
  23. typedef struct
  24. {
  25.         u8 str[3];
  26. }comm_tag;

  27. comm_tag commstr[]={"0 ","1 ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 ","上","下","前","后","左","右","大","小"};

  28. #define sel_clor                BRED
  29. #define dis_sel_clor        GRED
  30. #define spk_clor                BRED
  31. #define prc_clor                GRED

  32. #define save_ok                0
  33. #define VAD_fail        1
  34. #define MFCC_fail        2
  35. #define Flash_fail        3

  36. void disp_comm(u8 comm)
  37. {
  38.         GUI_ClrArea(&(Label[comm]));
  39.         GUI_DispStr(&(Label[comm]),(u8 *)(commstr[comm-G_comm_fst].str));
  40. }

  41. void set_comm_backclor(u8 comm, u16 backclor)
  42. {
  43.         Label[comm].BackColor=backclor;
  44.         disp_comm(comm);
  45. }

  46. void set_label_backclor(GUI_Area *Label, u16 backclor)
  47. {
  48.         Label->BackColor=backclor;
  49.         GUI_ClrArea(Label);
  50. }

  51. void disp_home(void)
  52. {
  53.         GUI_ClrArea(&Screen);
  54.         GUI_ClrArea(&(Label[G_wel]));
  55.         GUI_DispStr(&(Label[G_wel]),"欢迎使用");
  56.         GUI_ClrArea(&(Label[G_neme]));
  57.         GUI_DispStr(&(Label[G_neme]),"孤立词语音识别测试系统");
  58.         GUI_ClrArea(&(Label[G_prc]));
  59.         GUI_DispStr(&(Label[G_prc]),"模板训练");
  60.         GUI_ClrArea(&(Label[G_recg]));
  61.         GUI_DispStr(&(Label[G_recg]),"语音识别");
  62.         GUI_ClrArea(&(Label[G_designer]));
  63.         GUI_DispStr(&(Label[G_designer]),"设计者:宋健");
  64.        
  65. }

  66. void record(void)
  67. {
  68.         delay_ms(atap_len_t);        //延时,避免点击屏幕发出的噪声
  69.        
  70.         TIM_Cmd(TIM1, ENABLE);         //开启定时器,开始信号采集
  71.        
  72.         GUI_ClrArea(&(Label[G_ctrl]));                                        //显示操作提示
  73.         GUI_DispStr(&(Label[G_ctrl]),"录音中");               
  74.        
  75.         //开始说话之前,录制一小段背景声音,用以实现背景噪声自适应
  76.         delay_ms(atap_len_t);               
  77.         //提示开始说话
  78.         set_label_backclor(&(Label[G_spk]), spk_clor);
  79.        
  80.         //等待缓冲区数据更新完毕
  81.         while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);
  82.        
  83.        
  84.         //数据采集结束,关闭定时器
  85.         TIM_Cmd(TIM1, DISABLE);
  86.         //清数据传输完成标志,以备下次使用
  87.         DMA_ClearFlag(DMA1_FLAG_TC1);
  88.        
  89.         //提示开始处理采集到的数据
  90.         set_label_backclor(&(Label[G_spk]), prc_clor);
  91. }

  92. void disp_mdl_prc(void)
  93. {
  94.         u16 i;
  95.        
  96.         GUI_ClrArea(&Screen);
  97.        
  98.         set_label_backclor(&(Label[G_cap]), BRED);
  99.         GUI_DispStr(&(Label[G_cap]),"开始训练");
  100.        
  101.         for(i=G_comm_fst;i<=G_comm_lst;i++)
  102.         {
  103.                 disp_comm(i);
  104.         }
  105.         GUI_ClrArea(&(Label[G_return]));
  106.         GUI_DispStr(&(Label[G_return]),"返回");
  107. }

  108. u8 save_mdl(u16 *v_dat, u32 addr)
  109. {
  110.         noise_atap(v_dat,atap_len,&atap_arg);
  111.        
  112.         VAD(v_dat, VcBuf_Len, valid_voice, &atap_arg);
  113.         if(valid_voice[0].end==((void *)0))
  114.         {
  115.                 return VAD_fail;
  116.         }
  117.        
  118.         get_mfcc(&(valid_voice[0]),&ftr,&atap_arg);
  119.         if(ftr.frm_num==0)
  120.         {
  121.                 return MFCC_fail;
  122.         }
  123.        
  124.         return save_ftr_mdl(&ftr, addr);
  125. }

  126. void prc(void)
  127. {
  128.         u32 i;
  129.         u8        prc_start=0;
  130.         u8        comm=G_comm_fst;
  131.         u8         prc_count=0;
  132.         u32 addr;
  133.         //v_ftr_tag *sav_ftr;
  134.        
  135.         disp_mdl_prc();
  136.         set_comm_backclor(comm,sel_clor);
  137.        
  138.         while(1)
  139.         {
  140.                 wait_touch();
  141.                 if(touch_area(&(Label[G_return])))
  142.                 {
  143.                         Label[G_cap].BackColor=GREEN;
  144.                         Label[comm].BackColor=dis_sel_clor;
  145.                         disp_home();
  146.                         return;
  147.                 }
  148.                 else if(touch_area(&(Label[G_cap])))
  149.                 {
  150.                         delay_ms(150);
  151.                         if(prc_start==0)
  152.                         {
  153.                                 GUI_ClrArea(&(Label[G_cap]));
  154.                                 GUI_DispStr(&(Label[G_cap]),"停止训练");
  155.                                 prc_start=1;
  156.                                 GUI_ClrArea(&(Label[G_ctrl]));
  157.                                 GUI_DispStr(&(Label[G_ctrl]),"开始");
  158.                                 GUI_ClrArea(&(Label[G_spk]));
  159.                                
  160.                                 GUI_ClrArea(&(Label[G_count]));
  161.                                 GUI_DispStr(&(Label[G_count]),"已训练0次");
  162.                         }
  163.                         else
  164.                         {
  165.                                 GUI_ClrArea(&(Label[G_cap]));
  166.                                 GUI_DispStr(&(Label[G_cap]),"开始训练");
  167.                                 prc_start=0;
  168.                                 prc_count=0;
  169.                                
  170.                                 GUI_HideArea(&(Label[G_ctrl]));
  171.                                 GUI_HideArea(&(Label[G_spk]));
  172.                                 GUI_HideArea(&(Label[G_stus]));
  173.                                 GUI_HideArea(&(Label[G_count]));
  174.                                
  175.                         }
  176.                 }
  177.                 else if((touch_area(&(Label[G_ctrl])))&&(prc_start==1))
  178.                 {
  179.                         record();
  180.                        
  181.                         GUI_ClrArea(&(Label[G_ctrl]));
  182.                         GUI_DispStr(&(Label[G_ctrl]),"提取中");
  183.                        
  184.                         addr=ftr_start_addr+(comm-G_comm_fst)*size_per_comm+prc_count*size_per_ftr;
  185.                         if(save_mdl(VcBuf, addr)==save_ok)
  186.                         {
  187.                                 prc_count++;
  188.                                 GUI_ClrArea(&(Label[G_count]));
  189.                                 GUI_printf(&(Label[G_count]),"已训练%d次",prc_count);
  190.                                 if(prc_count==ftr_per_comm)
  191.                                 {
  192.                                         prc_count=0;
  193.                                 }
  194.                                 GUI_ClrArea(&(Label[G_stus]));
  195.                                 GUI_DispStr(&(Label[G_stus]),"语音有效");
  196.                                 /*
  197.                                 sav_ftr=(v_ftr_tag *)addr;
  198.                                 USART1_printf("mask=%d ",sav_ftr->save_sign);
  199.                                 USART1_printf("frm_num=%d",sav_ftr->frm_num);
  200.                                 for(i=0;i<((sav_ftr->frm_num)*mfcc_num);i++)
  201.                                 {
  202.                                         USART1_printf("%d,",sav_ftr->mfcc_dat[i]);
  203.                                 }
  204.                                 */
  205.                         }
  206.                         else
  207.                         {
  208.                                 GUI_ClrArea(&(Label[G_stus]));
  209.                                 GUI_DispStr(&(Label[G_stus]),"语音无效");
  210.                         }

  211.                         GUI_ClrArea(&(Label[G_ctrl]));
  212.                         GUI_DispStr(&(Label[G_ctrl]),"开始");
  213.                 }
  214.                 else if(prc_start==0)
  215.                 {
  216.                         for(i=G_comm_fst;i<=G_comm_lst;i++)
  217.                         {
  218.                                 if(touch_area(&(Label[i])))
  219.                                 {
  220.                                         set_comm_backclor(comm,dis_sel_clor);
  221.                                         comm=i;
  222.                                         set_comm_backclor(comm,sel_clor);
  223.                                         break;
  224.                                 }
  225.                         }
  226.                 }
  227.                
  228.         }
  229. }




  230. u8* spch_recg(u16 *v_dat, u32 *mtch_dis)
  231. {
  232.         u16 i;
  233.         u32 ftr_addr;
  234.         u32 min_dis;
  235.         u16 min_comm;
  236.         u32 cur_dis;
  237.         v_ftr_tag *ftr_mdl;
  238.        
  239.         noise_atap(v_dat, atap_len, &atap_arg);
  240.        
  241.         VAD(v_dat, VcBuf_Len, valid_voice, &atap_arg);
  242.         if(valid_voice[0].end==((void *)0))
  243.         {
  244.                 *mtch_dis=dis_err;
  245.                 USART1_printf("VAD fail ");
  246.                 return (void *)0;
  247.         }
  248.        
  249.         get_mfcc(&(valid_voice[0]),&ftr,&atap_arg);
  250.         if(ftr.frm_num==0)
  251.         {
  252.                 *mtch_dis=dis_err;
  253.                 USART1_printf("MFCC fail ");
  254.                 return (void *)0;
  255.         }
  256.        
  257.         i=0;
  258.         min_comm=0;
  259.         min_dis=dis_max;
  260.         for(ftr_addr=ftr_start_addr; ftr_addr<ftr_end_addr; ftr_addr+=size_per_ftr)
  261.         {
  262.                 ftr_mdl=(v_ftr_tag*)ftr_addr;
  263.                 //USART1_printf("save_mask=%d ",ftr_mdl->save_sign);
  264.                 cur_dis=((ftr_mdl->save_sign)==save_mask)?dtw(&ftr,ftr_mdl):dis_err;
  265.                 //USART1_printf("cur_dis=%d ",cur_dis);
  266.                 if(cur_dis<min_dis)
  267.                 {
  268.                         min_dis=cur_dis;
  269.                         min_comm=i;
  270.                 }
  271.                 i++;
  272.         }
  273.         min_comm/=ftr_per_comm;
  274.         //USART1_printf("recg end ");
  275.         *mtch_dis=min_dis;
  276.         return (commstr[min_comm].str);
  277. }

  278. void disp_recg(void)
  279. {
  280.         GUI_ClrArea(&Screen);
  281.         GUI_ClrArea(&(Label[G_cap]));
  282.         GUI_DispStr(&(Label[G_cap]),"语音识别");
  283.        
  284.         GUI_ClrArea(&(Label[G_ctrl]));
  285.         GUI_DispStr(&(Label[G_ctrl]),"开始");
  286.         GUI_ClrArea(&(Label[G_spk]));
  287.        
  288.         GUI_ClrArea(&(Label[G_return]));
  289.         GUI_DispStr(&(Label[G_return]),"返回");
  290. }


  291. void recg(void)
  292. {
  293.         u8 *res;
  294.         u32 dis;
  295.         u32 recg_count=0;
  296.        
  297.         disp_recg();
  298.        
  299.         while(1)
  300.         {
  301.                 wait_touch();
  302.                 if(touch_area(&(Label[G_return])))
  303.                 {
  304.                         disp_home();
  305.                         return;
  306.                 }
  307.                 else if(touch_area(&(Label[G_ctrl])))
  308.                 {
  309.                         record();
  310.                        
  311.                         GUI_ClrArea(&(Label[G_ctrl]));
  312.                         GUI_DispStr(&(Label[G_ctrl]),"识别中");
  313.                        
  314.                         res=spch_recg(VcBuf, &dis);
  315.                         if(dis!=dis_err)
  316.                         {
  317.                                 recg_count++;
  318.                                 GUI_ClrArea(&(Label[G_recg_res]));
  319.                                 GUI_printf(&(Label[G_recg_res]),"识别结果:%s",(s8 *)res);
  320.                                 GUI_ClrArea(&(Label[G_mtch_dis]));
  321.                                 GUI_printf(&(Label[G_mtch_dis]),"匹配距离:%d",dis);
  322.                                 GUI_ClrArea(&(Label[G_stus]));
  323. ……………………

  324. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
stm32-speech-recognition-master.7z (1.39 MB, 下载次数: 4)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表