找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5146|回复: 4
收起左侧

STM32F1+LD3320的语音助手源程序+原理图

[复制链接]
ID:428407 发表于 2020-5-13 08:15 | 显示全部楼层 |阅读模式
STM32的语音助手
功能:播放音乐,讲故事,简单对话,和控制家用电器
主要使用了LD3320这款非特定语音识别芯片,他可以通过拼音设置要识别的语音,因此大 大减低了开发的困难度。 具体工作过程为LD3320识别出语音后,通过中断引脚通知STM32,而后主 函数循环,读取寄存器的值,得到最优的识别结果。而后移植FAT32文件系统,将MP3文件放到sd卡 中交由STM32读取。将读取的数据填充到LD3320语音播放的FIFO中进行语音播放。因此人机对话只 能是预先设计的对话内容。

具体视频如下,复制网址粘贴到浏览器即可观看  https://v.qq.com/x/page/a0957xwa ... e=0&share_from=copy

qq_pic_merged_1589328578503.jpg

电路原理图如下:
0.jpg

单片机源程序如下:
  1. #include "main.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "sd.h"
  5. #include "ff.h"   
  6. #include "ld3320.h"
  7. #include "mp3.h"
  8. #include "led.h"
  9. #include "asr.h"
  10. #include "timer3.h"
  11. #include "stm32f10x_tim.h"
  12. #include "stm32f10x.h"
  13. #include "sys.h"
  14. #include "SG90.h"

  15. u8 trigger_flag=0;    //0 表示没有识别触发口令  1 表示识别了触发口令

  16. FATFS fs[_VOLUMES];     //逻辑磁盘工作区.文件系统默认支持3个磁盘,我们只用了一个 SD编号0

  17. int main(void)
  18. {                                          
  19.         u8 nAsrRes=0;                      //记录识别码
  20.         
  21.         delay_init();                               //延时初始化
  22.         RCC_Configuration();       //系统时钟初始化
  23.         SG90_Init();              //SG90舵机初始化
  24.         SG90_angle(0);           //舵机初步为0(最小值)
  25.         Usart1_init(115200);                   //串口初始化波特率为115200
  26.         LED_Init();                            //LED初始化
  27.         
  28.         
  29.         while(SD_Init())                   //SD卡初始化
  30.                 TIM3_Init();
  31.         {
  32.                 printf("SD卡初始化错误\r\n");  //串口提示SD卡初始化错误
  33.                 delay_ms(2000);                //延时2s
  34.         }
  35.         f_mount(&fs[0],"0:",1);                //挂载SD卡        
  36.         LD3320_Init();                           //初始化LD3320
  37.         
  38.         printf(" 触发口令:小布\r\n ");
  39.         printf(" 口令1:重启系统\r\n ");
  40.         printf(" 口令2:讲个笑话\r\n ");
  41.         printf(" 口令3:打开卧室灯\r\n ");
  42.         printf(" 口令4:关闭卧室灯\r\n ");
  43.         printf(" 口令5:我想听音乐\r\n ");
  44.         printf(" 口令6:打开风扇\r\n ");
  45.         printf(" 口令7:关闭风扇\r\n ");
  46.         printf(" 口令8:打开厨房灯\r\n ");
  47.         printf(" 口令9:关闭厨房灯\r\n ");
  48.         printf(" 口令10:关闭所有用电器\r\n ");
  49.         printf(" 口令11:换个笑话\r\n ");
  50.         printf(" 口令12:打开窗户\r\n ");
  51.         printf(" 口令13:关闭窗户\r\n ");
  52.         printf(" 口令14:离家模式\r\n ");
  53.         printf(" 口令15:我回来了\r\n ");
  54.         printf(" 口令16:打开客厅灯\r\n ");
  55.         printf(" 口令17:关闭客厅灯\r\n ");
  56.         printf(" 口令18:你叫什么名字\r\n ");
  57.         printf(" 口令19:你多大了\r\n ");
  58.         printf(" 口令20:我饿了\r\n ");
  59.         printf(" 口令221:你会唱歌吗\r\n ");
  60.         
  61.         nAsrStatus = LD_ASR_NONE;                     //初始状态:没有在作ASR
  62.         
  63.         PlayDemoSound_mp3("系统准备.mp3");   //播放文件

  64.         while(1)
  65.         {
  66.              switch(nAsrStatus)
  67.                 {
  68.                         case LD_ASR_RUNING:            
  69.                                                                                         break;
  70.                         
  71.                         case LD_ASR_ERROR:                        
  72.                                                                                         break;
  73.                         
  74.                         case LD_ASR_NONE:                                nAsrStatus=LD_ASR_RUNING;              //启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算
  75.                                                                                         if (RunASR()==0)                  
  76.                                                                                         {                        
  77.                                                                                                 printf("ASR_ERROR\r\n");
  78.                                                                                                 nAsrStatus = LD_ASR_ERROR;
  79.                                                                                         }
  80.                                                                                         break;

  81.                         case LD_ASR_FOUNDOK:                        nAsrRes = LD_ReadReg(0xc5);                    //一次ASR识别成功结束,取ASR识别结果                                                                                                                                                                                                
  82.                                                                                         switch(nAsrRes)                  
  83.                                                                                         {
  84.                                                                                                 case CODE_CF:   printf("识别到触发口令,可以发送普通口令\r\n");
  85.                                                                                                          PlayDemoSound_mp3("我在.mp3");   //播放文件
  86.                                                                                                                                 trigger_flag=1;                        //trigger_flag=1,表示识别了触发口令,接下来要识别普通口令
  87.                                                                                                                                 TIM_SetCounter(TIM3, 0);               //清零定时器3计数器
  88.                                                                                                                                 TIM_Cmd(TIM3, ENABLE);                 //开启定时器3                                
  89.                                                                                                                                 break;
  90.                                                                                                 case CODE_CQXT: printf("接收到口令:重启系统\r\n");
  91.                                                                                                                                 PlayDemoSound_mp3("重启.mp3");   //播放文件
  92.                                                                                                                                 NVIC_SystemReset();              //重启
  93.                                                                                                                                 break;
  94.                                                                                                 case CODE_JGXH:        printf("接收到口令:讲个笑话\r\n");
  95.                                                                                                                                 PlayDemoSound_mp3("笑话.mp3");   //播放文件
  96.                                                                                                                                 trigger_flag=0;
  97.                                                                                                         break;        
  98.                                                                                                         case CODE_HGXH:        printf("接收到口令:换个笑话\r\n");
  99.                                                                                                                                 PlayDemoSound_mp3("笑话1.mp3");   //播放文件
  100.                                                                                                                                 break;        
  101.                                                                                                 case CODE_DK:        //if(trigger_flag)
  102.                                                                                                               printf("接收到口令:打开卧室灯\r\n");
  103.                                                                                                               PlayDemoSound_mp3("开卧室灯.mp3");       //播放文件
  104.                                                                                                                         //        delay_ms(100);                      //语音中提示是0.1s延时后,打开LED_D4
  105.                                                                                                                                 LED_D4=0;
  106.                                                                                                               trigger_flag=0;
  107.                                                                                                                                 break;        
  108.                                                                                                 case CODE_GB://if(trigger_flag)
  109.                                                                                                         printf("接收到口令:关闭卧室灯\r\n");
  110.                                                                                                                                 PlayDemoSound_mp3("关卧室灯.mp3");       //播放文件
  111.                                                                                                                                 delay_ms(100);                      //语音中提示是0.1s延时后,关闭LED_D4
  112.                                                                                                                                 LED_D4=1;
  113.                                                                                                                                 break;        
  114.                                                                                                 case CODE_CDK://if(trigger_flag)
  115.                                                                                                         printf("接收到口令:打开厨房灯\r\n");
  116.                                                                                                               PlayDemoSound_mp3("开厨房灯.mp3");       //播放文件
  117.                                                                                                                                 delay_ms(100);                      //语音中提示是0.1s延时后,打开LED_D3
  118.                                                                                                                                 LED_D3=0;
  119.                                                                                                         trigger_flag=0;
  120.                                                                                                                                 break;        
  121.                                                                                                 case CODE_CGB://if(trigger_flag)
  122.                                                                                                         printf("接收到口令:关闭厨房灯\r\n");
  123.                                                                                                                                 PlayDemoSound_mp3("关厨房灯.mp3");       //播放文件
  124.                                                                                                                                 delay_ms(100);                      //语音中提示是0.1s延时后,关闭LED_D3
  125.                                                                                                                                 LED_D3=1;
  126.                                                                                                         trigger_flag=0;
  127.                                                                                                                                 break;
  128.                                                                                                 case CODE_KKTD:        //if(trigger_flag)
  129.                                                                                                               printf("接收到口令:打开客厅灯\r\n");
  130.                                                                                                               PlayDemoSound_mp3("开客厅灯.mp3");       //播放文件
  131.                                                                                                                         //        delay_ms(100);                      //语音中提示是0.1s延时后,打开LED_D4
  132.                                                                                                                                 LED_D5=0;
  133.                                                                                                               trigger_flag=0;
  134.                                                                                                                                 break;        
  135.                                                                                                 case CODE_GKTD:        //if(trigger_flag)
  136.                                                                                                               printf("接收到口令:关闭客厅灯\r\n");
  137.                                                                                                               PlayDemoSound_mp3("关客厅灯.mp3");       //播放文件
  138.                                                                                                                         //        delay_ms(100);                      //语音中提示是0.1s延时后,打开LED_D4
  139.                                                                                                                                 LED_D5=1;
  140.                                                                                                               trigger_flag=0;
  141.                                                                                                                                 break;        
  142.                          case CODE_KFS:        printf("接收到口令:打开风扇\r\n");
  143.                                                                                                                                 PlayDemoSound_mp3("开风扇.mp3");       //播放文件
  144.                                                                                                                                 delay_ms(100);                      //语音中提示是0.1s延时后,打开风扇
  145.                                                                                                                                 FS=0;
  146.                                                                                                        trigger_flag=0;
  147.                                                                                                                                 break;        
  148.                                                                                                         case CODE_GFS:        printf("接收到口令:关闭风扇\r\n");
  149.                                                                                                                                 PlayDemoSound_mp3("关风扇.mp3");       //播放文件
  150.                                                                                                                                 delay_ms(100);                      //语音中提示是0.1s延时后,关闭风扇
  151.                                                                                                                           FS=1;
  152.                                                                                                                                 break;               
  153.                           case CODE_KC:        printf("接收到口令:打开窗户\r\n");
  154.                                                                                                                                 PlayDemoSound_mp3("开窗.mp3");       //播放文件
  155.                                                                                                                         //        delay_ms(100);                      //语音中提示是0.1s延时后,关闭风扇
  156.                                                                                                                           SG90_angle(90);
  157.                                                                                                                         //        delay_ms(100);  
  158.                                                                                                                                 break;                                                        
  159.                           case CODE_GC:        printf("接收到口令:关闭窗户\r\n");
  160.                                                                                                                                 PlayDemoSound_mp3("关窗.mp3");       //播放文件
  161.                                                                                                                 //                delay_ms(100);                      //语音中提示是0.1s延时后,关闭风扇
  162.                                                                                                                           SG90_angle(0);
  163.                                                                                                         case CODE_LJ:        printf("接收到口令:离家模式\r\n");
  164.                                                                                                                                 PlayDemoSound_mp3("检查.mp3");       //播放文件
  165.                                                                                                                           delay_ms(100);                      //语音中提示是0.1s延时后,关闭风扇
  166.                                                                                                                           SG90_angle(0);
  167.                                                                                                                                 FS=1;
  168.                                                                                                                                 LED_D3=1;
  169.                                                                                                                                 LED_D4=1;
  170.                                                                                                                                 LED_D5=1;
  171.                                                                                                                                 PlayDemoSound_mp3("离家.mp3");       //播放文件
  172.                                                                                                                                 break;                                                                                                
  173.                           case CODE_HJ:        printf("接收到口令:回家模式\r\n");
  174.                                                                                                                                 PlayDemoSound_mp3("回家.mp3");       //播放文件
  175.                                                                                                                           delay_ms(100);                      //语音中提示是0.1s延时后,关闭风扇
  176.                                                                                                                           LED_D5=0;
  177.                                                                                                 //        trigger_flag=0;        
  178.                                  break;                                                                                                                                
  179.                                                                                                         case CODE_GBSY:        printf("接收到口令:关闭所有用电器\r\n");
  180.                                                                                                                                 PlayDemoSound_mp3("用电器.mp3");       //播放文件
  181.                                                                                                                                 delay_ms(100);                      //语音中提示是1s延时后,关闭所有设备
  182.                                                                                                                           FS=1;
  183.                                                                                                                                 LED_D3=1;
  184.                                                                                                                                 LED_D4=1;
  185.                                                                                                                                 LED_D5=1;
  186.                                                                                                                                 break;                                                                                                                                                
  187.                                                                                                 case CODE_YY:        printf("接收到口令:听音乐\r\n");
  188.                                                                                                                                 PlayDemoSound_mp3("音乐1.mp3");   //播放文件        
  189.                                trigger_flag=0;
  190.                                                                                                                          break;                                                                        
  191.                         case CODE_ZWJS:        printf("接收到口令:自我介绍\r\n");
  192.                                                                                                                                 PlayDemoSound_mp3("自我介绍.mp3");   //播放文件        
  193.                                trigger_flag=0;
  194.                                                                                                                          break;                        
  195.                         case CODE_NL:        printf("接收到口令:年龄\r\n");
  196.                                                                                                                                 PlayDemoSound_mp3("年龄.mp3");   //播放文件        
  197.                                trigger_flag=0;
  198.                                                                                                                          break;               
  199.                         case CODE_EL:        printf("接收到口令:我饿了\r\n");
  200.                                                                                                                                 PlayDemoSound_mp3("饿了.mp3");   //播放文件        
  201.                                trigger_flag=0;
  202.                                                                                                                          break;                                                        
  203.                         case CODE_CG:        printf("接收到口令:唱歌\r\n");
  204.                                                                                                                                 PlayDemoSound_mp3("我不会.mp3");   //播放文件
  205.                                 PlayDemoSound_mp3("音乐2.mp3");   //播放文件  
  206.                                PlayDemoSound_mp3("怎么样.mp3");   //播放文件                                                                                                                                 
  207.                                trigger_flag=0;
  208.                                                                                                                          break;                                                                                                                                 
  209.                                                                                                 default:        printf("不在口令集之内\r\n");
  210.                                                                                                                                 
  211.                                                                                         }        
  212.                                                                                         nAsrStatus = LD_ASR_NONE;
  213.                                                                                         break;
  214.                                                                                        
  215.                         case LD_ASR_FOUNDZERO:          printf("未知口令\r\n");
  216.                                                                                         nAsrStatus = LD_ASR_NONE;
  217.                                                                                         break;
  218.                                                                                        
  219.                         default:                                                nAsrStatus = LD_ASR_NONE;
  220.                                                                                         break;
  221.                         }
  222.         }               
  223. }
复制代码

所有资料51hei提供下载:
语音助手源码.7z (1.65 MB, 下载次数: 136)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:897789 发表于 2021-5-1 20:18 | 显示全部楼层
LD3320自己就能实现语音播报吗?不用加喇叭或其他语音播报模块吗?看原理图里没有呀。
回复

使用道具 举报

ID:897789 发表于 2021-5-1 21:10 | 显示全部楼层
LD3320自己就能实现语音播报吗?不用加喇叭或其他语音播报模块吗?看原理图里没有呀。
回复

使用道具 举报

ID:23303 发表于 2021-6-7 16:10 | 显示全部楼层
谢谢楼主分享!下载学习一下
回复

使用道具 举报

ID:969092 发表于 2023-2-14 11:17 | 显示全部楼层
你好,你的语音模块的连接能否发一个
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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