[转载] 人工智能技术之语音识别机器人——傻强(下)
1525 查看
9 回复
 楼主 | 发布于 2018-06-12 | 只看楼主
分享到:
识别模块函数,识别模块的图见下


 


  1. #include "main.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "usart3.h"
  5. #include "ld3320.h"
  6. #include "asr.h"
  7. #include "led.h"
  8. #include "my169012p.h"
  9. u8 trigger_flag=0;    //0 表示没有识别触发口令  1 表示识别了触发口令
  10. uint8_t Tx_Buffer[2] = {0x00,0xa1};
  11. uint8_t j;
  12. uint8_t i;

  13. int main(void)
  14. {     
  15. u8 nAsrRes=0;            //记录识别码
  16. u8 flag1=0;
  17. u8 flag2=0; 


  18. delay_init();           //延时函数初始化   
  19. Usart1_init(9600);      //串口1初始化为9600   
  20. Usart3_init(9600);      //串口1初始化为9600 

  21. // MY169012P_Init();        //初始化MP3 模块MY1690 播放开机音乐
  22. LD3320_Init();          //初始化LD3320
  23.   LED_Init();              //初始化LED
  24. // send_3dat_cmd(0x11);     //播放
  25. // delay_ms(10000); 
  26. //  while(BUSY);
  27. // diver_Init();            //初始化电机驱动

  28. printf("实验开始\r\n");
  29. delay_ms(1);
  30. printf("触发口令01:傻强\r\n");
  31.   delay_ms(1); 
  32. printf("一级口令02:在吗\r\n");
  33.   delay_ms(1); 
  34.   printf("一级口令03:退下吧\r\n");
  35.   delay_ms(1); 

  36.   printf("二级口令04:死哪去啦\r\n");
  37. delay_ms(1);
  38.   printf("二级口令05:有贵宾当然先问贵宾啊\r\n");
  39. delay_ms(1);
  40.   printf("二级口令06:叫小马哥\r\n");
  41. delay_ms(1);
  42.   printf("二级口令07:这是我的管家傻强\r\n");
  43. delay_ms(1);
  44.   printf("二级口令08:咖啡\r\n");
  45. delay_ms(1);
  46.   printf("二级口令09:你在干嘛\r\n");
  47. delay_ms(1);
  48.   printf("二级口令10:机器人还会冷啊\r\n");
  49. delay_ms(1);
  50.   printf("二级口令11:唱首歌吧\r\n");
  51. delay_ms(1);
  52.   printf("二级口令12:上一曲\r\n");
  53. delay_ms(1);
  54.   printf("二级口令13:下一首\r\n");
  55. delay_ms(1);
  56.   printf("二级口令14:跳个舞吧\r\n");
  57. delay_ms(1);
  58.   printf("二级口令15:说个笑话\r\n");
  59. delay_ms(1);
  60.   printf("二级口令16:安静\r\n");
  61.   delay_ms(1);


  62. nAsrStatus = LD_ASR_NONE;  // 初始状态:没有在作ASR

  63. while(1)
  64. {
  65.   Tx_Buffer[1]=0xa1;  //每次进入语音识别后都修改Tx_Buffer[1]等待串口收发数据0xaa(本体语音播放或者动作完成)
  66.     switch(nAsrStatus)
  67.    {
  68.    case LD_ASR_RUNING:             
  69.            break;
  70.    
  71.    case LD_ASR_ERROR:          printf("ASR_ERROR\r\n");
  72.            break;
  73.    
  74.    case LD_ASR_NONE:    nAsrStatus=LD_ASR_RUNING;              //启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算
  75.            if(RunASR()==0)            
  76.            {               
  77.             nAsrStatus = LD_ASR_ERROR;
  78.            }        
  79.                                             
  80.            break;
  81.    case LD_ASR_FOUNDOK:   nAsrRes = LD_ReadReg(0xc5);             //一次ASR识别成功结束,取ASR识别结果                         
  82.            switch(nAsrRes)    
  83.            {
  84.             case CODE_SQ:   
  85.                                         printf("触发口令01:傻强\r\n"); 
  86.                         trigger_flag=1;     //trigger_flag=1,表示识别了触发口令,接下来要识别普通口令
  87.                         LED_D1=0;
  88.                                         USART_SendData( USART3, 0x01);
  89.                             while(Tx_Buffer[1]!=0xaa);       //语音指令发出去后等待完成标志0xaa
  90.                             printf("发送口令01完毕^_^ \r\n"); 
  91.                  break;
  92.             
  93.             case CODE_ZM:             //打开进入第一级命令   在吗?
  94.               if(trigger_flag)
  95.                        {
  96.                                     printf("一级口令02:在吗\r\n");
  97.                     LED_D2=0;
  98.                     LED_D1=1;
  99.                                      flag1 =1;
  100.                                      USART_SendData( USART3, 0x02);
  101.                          while(Tx_Buffer[1]!=0xaa); 
  102.                    printf("发送口令02完毕^_^ \r\n"); 
  103.                    }
  104.                    break;
  105.                   
  106. /***********************************************进入第二级命令 *************************************************/
  107.                   
  108.              case CODE_SQNL:        //进入第二级命令    死去哪里了  04
  109.                 if(flag1==1)
  110.                  {
  111.                    flag2=1;
  112.                                     printf("二级口令04:死哪去啦\r\n");
  113.                                     USART_SendData( USART3, 0x04);
  114.                         while(Tx_Buffer[1]!=0xaa);
  115. //                                Specific_Player (0x41,0x00,0x04);
  116.                    printf("发送口令04完毕^_^ \r\n");
  117.                  }
  118.                 break;
  119.               
  120.              case CODE_WGB:        //进入第二级命令    有贵宾当然先问贵宾啊  05
  121.                 if(flag1==1)
  122.                  {
  123.                    flag2=1;
  124.                                     printf("二级口令05:有贵宾当然先问贵宾啊\r\n");
  125.                    USART_SendData( USART3, 0x05);
  126.                         while(Tx_Buffer[1]!=0xaa);
  127. //                                  Specific_Player (0x41,0x00,0x05); 
  128.                    printf("发送口令05完毕^_^ \r\n");
  129.                  }
  130.                 break;
  131.              case CODE_JXMG:        //进入第二级命令    叫小马哥  06
  132.                 if(flag1==1)
  133.                  {
  134.                    flag2=1;
  135.                                     printf("二级口令06:叫小马哥\r\n");
  136.                    USART_SendData( USART3, 0x06);
  137.                         while(Tx_Buffer[1]!=0xaa);
  138. //                                 Specific_Player (0x41,0x00,0x06); 
  139.                                     printf("发送口令06完毕^_^ \r\n");                
  140.                  }
  141.                 break;
  142.              case CODE_GJSQ:        //进入第二级命令    这是我的管家傻强  07
  143.                 if(flag1==1)
  144.                  {
  145.                    flag2=1;
  146.                                     printf("二级口令07:这是我的管家傻强\r\n");
  147.                    USART_SendData( USART3, 0x07);
  148.                         while(Tx_Buffer[1]!=0xaa);
  149. //                                Specific_Player (0x41,0x00,0x05);   
  150.                    printf("发送口令07完毕^_^ \r\n");                
  151.                  }
  152.                 break;

(0 ) (1 )
回复 举报

楼主 | 回复于 2018-06-12 沙发

  1.   case CODE_KF:        //进入第二级命令    咖啡  08
  2.         if(flag1==1)
  3.          {
  4.            nAsrRes=0xfa;
  5.            flag2=1;
  6. //                   printf("二级口令08:咖啡\r\n");
  7.            Specific_Player(0x41,0x00,0x08);
  8.            while(BUSY)
  9.             {
  10.              emoticon4();           //     ^    ^
  11.              LedAllDelight();
  12.             }
  13.              send_3dat_cmd(0x1E); //停止  
  14.              switch_flag=1;  
  15.              USART_SendData( USART2, 0xaa);           
  16.          }
  17.         break;
  18.      case CODE_GM:        //进入第二级命令    你在干嘛  09
  19.         if(flag1==1)
  20.          {
  21.            nAsrRes=0xfa;
  22.            flag2=1;
  23. //                    printf("二级口令09:你在干嘛\r\n");
  24.             Specific_Player(0x41,0x00,0x09);
  25.             while(BUSY)
  26.              {
  27.               emoticon4();           //     ^    ^
  28.               LedAllDelight();
  29.              }
  30.               send_3dat_cmd(0x1E); //停止 
  31.               switch_flag=1; 
  32.               USART_SendData( USART2, 0xaa);            
  33.          }
  34.         break;
  35.      case CODE_HL:        //进入第二级命令    机器人还会冷啊  10
  36.         if(flag1==1)
  37.          {
  38.            nAsrRes=0xfa;
  39.            flag2=1;
  40. //                   printf("二级口令10:机器人还会冷啊\r\n");
  41.             Specific_Player(0x41,0x00,0x0a);
  42.             while(BUSY)
  43.              {
  44.               emoticon4();           //     ^    ^
  45.               LedAllDelight();
  46.              }
  47.               send_3dat_cmd(0x1E); //停止
  48.               switch_flag=1;   
  49.               USART_SendData( USART2, 0xaa);            
  50.          }
  51.        break;
  52.      case CODE_CSG:        //进入第二级命令    唱首歌吧  11
  53.        if(flag1==1)
  54.         {
  55.           nAsrRes=0xfa;
  56.           flag2=1;
  57. //                 printf("二级口令11:唱首歌吧\r\n");
  58.          Specific_Player(0x41,0x00,0x56);  //指定曲目为86 
  59.          while(BUSY)
  60.          {
  61.           emoticon4();           //     ^    ^
  62.            LedAllDelight();
  63.          }
  64.            send_3dat_cmd(0x1E); //停止 
  65.            switch_flag=1;  
  66.            USART_SendData( USART2, 0xaa);          
  67.         }
  68.        break;
  69.      case CODE_SYQ:        //进入第二级命令    上一曲  12
  70.        if(flag1==1)
  71.         {
  72.           nAsrRes=0xfa;
  73.           flag2=1;
  74. //                  printf("二级口令12:上一曲\r\n");
  75.           send_3dat_cmd(0x14); //上一首
  76.           delay_ms(50); 
  77.           while(BUSY)
  78.                                         emoticon4();           //     ^    ^
  79.           switch_flag=1; 
  80.           USART_SendData( USART2, 0xaa); 
  81.          }
  82.         break;
  83.      case CODE_XYS:        //进入第二级命令    下一首  13
  84.         if(flag1==1)
  85.          {
  86.            nAsrRes=0xfa;
  87.            flag2=1;
(0 )
评论 (0) 举报

楼主 | 回复于 2018-06-12 2#

  1.          printf("二级口令13:下一首\r\n");
  2. //                   send_3dat_cmd(0x13); //下一首
  3. //                                  delay_ms(50); 
  4. //                                 while(BUSY);
  5.                    USART_SendData( USART3, 0x0d);
  6.                         while(Tx_Buffer[1]!=0xaa);
  7.                    printf("发送口令13完毕^_^ \r\n");
  8.                  }
  9.                 break;
  10.              case CODE_TGW:        //进入第二级命令    跳个舞吧  14
  11.                 if(flag1==1)
  12.                  {
  13.                    flag2=1;
  14.                                     printf("二级口令14:跳个舞吧\r\n");
  15.                    USART_SendData( USART3, 0x0e);
  16.                         while(Tx_Buffer[1]!=0xaa);
  17. //                                  Specific_Player (0x41,0x00,0x63);  //指定曲目为99
  18.                    printf("发送口令14完毕^_^ \r\n");
  19.                  }
  20.                 break;
  21.              case CODE_SXH:        //进入第二级命令    说个笑话  15
  22.                 if(flag1==1)
  23.                  {
  24.                    flag2=1;
  25.                                     printf("二级口令15:说个笑话\r\n"); 
  26.                    USART_SendData( USART3, 0x0f);
  27.                         while(Tx_Buffer[1]!=0xaa);
  28. //                                  Specific_Player (0x41,0x00,0x0f);                 //指定曲目为15 
  29.                    printf("发送口令15完毕^_^ \r\n");            
  30.                  }
  31.                 break;
  32.              case CODE_AJ:        //进入第二级命令    安静  16
  33.                 if(flag1==1)
  34.                  {
  35.                    flag2=1;
  36.                                     printf("二级口令16:安静\r\n");
  37.                    USART_SendData( USART3, 0x10);
  38.                         while(Tx_Buffer[1]!=0xaa);
  39. //                   send_3dat_cmd(0x1E);                           //停止  
  40.                    printf("发送口令16完毕^_^ \r\n");
  41.                  }
  42.                 break;         


编辑于 2018-06-12

(0 )
评论 (0) 举报

楼主 | 回复于 2018-06-12 3#

  1. /***********************************************退出第二级命令 *************************************************/
  2.                  
  3.             case CODE_TX:             //打开进入第一级命令   退下吧    03
  4.               if(trigger_flag)
  5.                   {
  6.                                 printf("一级口令03:退下吧\r\n");
  7. //                                  Specific_Player (0x41,0x00,0x03);                 //指定曲目为15                  
  8.                 LED_D2=1;
  9.                 trigger_flag=0;
  10.                 flag1=0; 
  11.                 flag2=0; 
  12.                 LED_D1=1;
  13.                 USART_SendData( USART3, 0x03);
  14.                     while(Tx_Buffer[1]!=0xaa);
  15.                 printf("发送口令03完毕^_^ \r\n");
  16.                 }
  17.                break;
  18.            } 
  19.            nAsrStatus = LD_ASR_NONE;
  20.            break;
  21.            
  22.    case LD_ASR_FOUNDZERO:         
  23.                   printf("未知口令\r\n");
  24.                       if(i<2) 
  25.               i++;
  26.              else
  27.               i=0x00;
  28. //           USART_SendData( USART1, 0XAA);                
  29.            trigger_flag=0;
  30.            LED_D1=1;
  31.            nAsrStatus = LD_ASR_NONE;
  32.            break;
  33.            
  34.    default:      nAsrStatus = LD_ASR_NONE;
  35.            break;
  36.    }

  37. }

  38. /*-------------------------------------------------*/
  39. /*函数名:串口3中断服务函数                        */
  40. /*参  数:无                                       */
  41. /*返回值:无                                       */
  42. /*-------------------------------------------------*/
  43. void USART3_IRQHandler(void)
  44.   {
  45.   uint8_t getdata;
  46.   uint8_t statu;  
  47.   
  48.   statu=USART_GetITStatus(USART3,USART_IT_RXNE);
  49.   if(statu== SET)
  50.     {
  51.       USART_ClearFlag(USART3,USART_IT_RXNE);
  52.       Tx_Buffer[1]=USART_ReceiveData(USART3);
  53.     }
  54.   }
(0 )
评论 (0) 举报

回复于 2018-06-12 4#

多谢分享!!!
(0 )
评论 (0) 举报

回复于 2018-06-12 5#

源代码都贴出来了,谢谢分享
(0 )
评论 (0) 举报

回复于 2018-06-13 6#

感谢分享;
(0 )
评论 (0) 举报

回复于 2018-06-15 7#

感谢分享;
(0 )
评论 (0) 举报

回复于 2018-06-26 8#

多谢分享!!!
(0 )
评论 (0) 举报

回复于 2018-06-27 9#

感谢分享,欢迎关注我,资料持续更新中。有需要机械臂,电源,硬件电路设计,软件编程,开发板等各种定制的可以私聊我哦,相互学习,共同进步。
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部