AI智能语音识别模块(二)——基于Arduino的语音控制MP3播放器

这篇具有很好参考价值的文章主要介绍了AI智能语音识别模块(二)——基于Arduino的语音控制MP3播放器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

在前面一篇文章里我们对AI智能语音识别模块进行了介绍,并对离线语音模组下载固件的过程进行了一个简单描述,不知道大家还记不记得,这篇文章也是鸽了好久,,本文将用这个语音控制模块结合前面介绍的DFPlayer Mini MP3模块来做一个有趣的应用,在上一期文章中,我们只是简单的做了一个只用语音控制模块点亮LED的应用,本期将结合Arduino开发板、DFPlayer Mini MP3模块来实现对音乐的控制,并在OLED屏幕显示基本的控制信息。本期是基于前面两篇文章进行的实验,因此就不对语音模块下载固件的过程和MP3模块的引脚定义进行介绍了。
还没看过这两篇文章的可以点击下面两个链接跳转:

添加AI智能语音识别模块(一)——离线模组介绍:

Arduino驱动DFPlayer Mini MP3模块:

本次实验用到的主要器件包含下面三个模块:

离线语音控制模块

语音识别模块,语音识别,单片机,Arduino,嵌入式硬件,模块测试,mcu

Mini MP3模块

语音识别模块,语音识别,单片机,Arduino,嵌入式硬件,模块测试,mcu

0.96寸 OLED模块

语音识别模块,语音识别,单片机,Arduino,嵌入式硬件,模块测试,mcu

实验准备

Arduino开发板 1个
Mini MP3模块 1个
离线语音模块 1个
TF卡 1个
8欧1W喇叭 1个
0.96寸OLED 1个
数据线(用于板子下载程序和供电) 2条
杜邦线 若干

安装库

程序中使用到了DFRobotDFPlayerMini.h头文件,如果没有安装库编译代码时会报错,因此需要正确安装DFRobotDFPlayerMini库才能编译通过。下面是安装介绍。
语音识别模块,语音识别,单片机,Arduino,嵌入式硬件,模块测试,mcu
语音识别模块,语音识别,单片机,Arduino,嵌入式硬件,模块测试,mcu

接线定义

Arduino dfplayer
5V VCC
GND GND
D10 TXD
D11 RXD
Arduino OLED
GND GND
3.3V VCC
A5 SCL
A4 SDA
Arduino 语音识别模块
D0 B7

主要程序

/*
 功能: 通过语音控制MP3模块的播放、暂停、上一曲、下一曲、增大音量、减小音量等,并在OLED屏幕显示控制信息。   
*/

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include "config.h"

char uart_rx_buf = 0; 
SoftwareSerial  mySoftwareSerial(10, 11); // RX, TX

DFRobotDFPlayerMini myDFPlayer;

void setup()
{   
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  uint8_t t=' ';
  OLED_Init();
  OLED_ColorTurn(0);//0正常显示 1反色显示
  OLED_DisplayTurn(0);//0正常显示 1翻转180度显示
  
  OLED_ShowChar(24,0,'M',16);
  OLED_ShowChar(42,0,'U',16);
  OLED_ShowChar(60,0,'S',16);
  OLED_ShowChar(78,0,'I',16);
  OLED_ShowChar(96,0,'C',16);
  myDFPlayer.begin(mySoftwareSerial);
  
  myDFPlayer.volume(20);   //音量设定为20 
  
  myDFPlayer.enableLoopAll() ;   
 
}

void loop()
{
     if(Serial.available()>0) {  //如果串口有数据
            
        uart_rx_buf = char(Serial.read());//Serial.read()读缓冲区字符,每次只能读一个字节
        if((uart_rx_buf&0xf0) >>4 == 2) {
         switch(uart_rx_buf & 0x0f){
         
           case 0:
                    myDFPlayer.start();
                    delay (500);
                    Serial.println("start");   
                    
                    OLED_ShowChinese(0,3,4,16);
                    OLED_ShowChinese(18,3,5,16);
                    OLED_ShowChinese(36,3,6,16);
                    OLED_ShowChinese(54,3,7,16); 
            break;

            case 1:
                   myDFPlayer.pause();
                   delay (500);
                   Serial.println("pause"); 
                   
                   OLED_ShowChinese(0,3,8,16);
                   OLED_ShowChinese(18,3,9,16);
                   OLED_ShowChinese(36,3,4,16);
                   OLED_ShowChinese(54,3,5,16); 
            break;                
          }
        } 
       if((uart_rx_buf&0xf0) >>4 == 3) {
         switch(uart_rx_buf & 0x0f){         
           case 0:
                     myDFPlayer.previous() ;
                    delay (500);
                    Serial.println("previous"); 
           
                    OLED_ShowChinese(0,3,0,16);
                    OLED_ShowChinese(18,3,1,16);
                    OLED_ShowChinese(36,3,2,16);
                    OLED_ShowChinese(54,3,10,16);
            break;

            case 1:
             myDFPlayer.next() ;
                  delay (500);
                  Serial.println("next"); 
          
               OLED_ShowChinese(0,3,3,16);
               OLED_ShowChinese(18,3,1,16);
               OLED_ShowChinese(36,3,2,16);
               OLED_ShowChinese(54,3,10,16);
            break;                
          }
        }             

          if((uart_rx_buf&0xf0) >>4 == 4) {
         switch(uart_rx_buf & 0x0f){         
           case 0:
                     myDFPlayer.volumeUp();
                     delay (500);
                     Serial.println("volumeUp"); 
                     
                     OLED_ShowChinese(0,3,11,16);
                     OLED_ShowChinese(18,3,12,16);
                     OLED_ShowChinese(36,3,6,16);
                     OLED_ShowChinese(54,3,13,16);
            break;

            case 1:
                     myDFPlayer.volumeDown()  ;
                     delay (500);
                     Serial.println("volumeDown");
                      
                     OLED_ShowChinese(0,3,14,16);
                     OLED_ShowChinese(18,3,15,16);
                     OLED_ShowChinese(36,3,6,16);
                     OLED_ShowChinese(54,3,13,16);
            break;                
          }
        }           
        if((uart_rx_buf&0xf0) >>4 == 5) {
         switch(uart_rx_buf & 0x0f){         
           case 0:
                     myDFPlayer.volume(30) ;
                     delay (500);
                     Serial.println("MaxVolume"); 
                     OLED_ShowChinese(0,3,16,16);
                     OLED_ShowChinese(18,3,12,16);
                     OLED_ShowChinese(36,3,6,16);
                     OLED_ShowChinese(54,3,13,16);
            break;

            case 1:
                     myDFPlayer.volume(20) ;
                     delay (500);
                     Serial.println("MidVolume"); 
                     OLED_ShowChinese(0,3,17,16);
                     OLED_ShowChinese(18,3,18,16);
                     OLED_ShowChinese(36,3,6,16);
                     OLED_ShowChinese(54,3,13,16);
            break;   

            case 2:
                     myDFPlayer.volume(15) ;
                     delay (500);
                     Serial.println("MinVolume"); 
                     OLED_ShowChinese(0,3,16,16);
                     OLED_ShowChinese(18,3,15,16);
                     OLED_ShowChinese(36,3,6,16);
                     OLED_ShowChinese(54,3,13,16);
            break;   
          }
        }           
       
    uart_rx_buf = 0;            //清除接收到的字符
   }
}

查看上面代码,主要是对串口接收到的数据进行处理,下面贴出了离线语音模块的控制详情。对串口发送的数据是可以自定义的,因此对上述代码稍加修改就可以只用一个Switch语句或者多个if语句实现串口控制,这里采用先判断串口高4位数据,然后再判断低4位数据的方法来实现控制。这个其实和前面一期Arduino驱动DFPlayer Mini MP3模块的文章一样,只不过对串口输出的判断,从判断高低电平变为判断接收到的串口数据。这样只用一个端口就可以实现控制,节省了IO口数目。除了对接收到的数据进行判断处理的代码,还有oled显示控制信息的代码,这个就没什么好介绍的了,大家也可以自己丰富关于显示这部分的功能。

上述代码使用了两个串口,D10,D11是Arduino和MP3播放器通信使用的,另一个是和语音模块通信用的,使用到了Arduino的硬件串口,因此这里要注意在下载程序时把接到 D0 引脚的线拔掉,否则程序会下载失败。另一个解决办法是使用软件串口,这样就避免了串口冲突。
语音识别模块,语音识别,单片机,Arduino,嵌入式硬件,模块测试,mcu

语音识别模块,语音识别,单片机,Arduino,嵌入式硬件,模块测试,mcu
前面我们已经讲过AI智能语音模块下载固件的过程了,这里就不再重复了,烧录好固件后,可以说以下命令词实现控制。通过下面三种唤醒词唤醒模块。
语音识别模块,语音识别,单片机,Arduino,嵌入式硬件,模块测试,mcu
通过下面几个命令词实现控制MP3音乐模块:
语音识别模块,语音识别,单片机,Arduino,嵌入式硬件,模块测试,mcu
在说命令词的时候可能会受到周围环境干扰或者喇叭播放音乐时自身太吵的影响,导致识别不到或者识别错误指令,这个没关系多试几遍就好了,一般不是很吵的情况下说第二遍就能识别正确了,这个语音模块识别正确率还是很高的。本次实验在固件生成的时候用到的是快速测试版本,可以快速生成SDK进行测试,该版本识别的效果相对发布版本语音识别效果差一些,因为本次实验只是为了验证功能的实现,如果想要更稳定的版本,大家可以自行生成测试一下。

实验效果

整体接线:

语音识别模块,语音识别,单片机,Arduino,嵌入式硬件,模块测试,mcu
控制效果:
语音识别模块,语音识别,单片机,Arduino,嵌入式硬件,模块测试,mcu

基于Arduino的语音控制MP3播放器

注意事项

  1. 使用本次实验的语音控制模块,下载离线语音模块固件时,需要断开电源后重新通电,才能下载成功。
  2. Arduino上传上述代码时,需要拔插Arduino的 D0 引脚的线,否则上传失败。
  3. 可以使用功率更大一点的喇叭以提升音质效果,但要在3W以内。

总结

本次实验通过Arduino,结合语音模块和MP3模块以及oled模块,实现了对MP3模块的语音控制和显示控制信息功能。文章来源地址https://www.toymoban.com/news/detail-779716.html

到了这里,关于AI智能语音识别模块(二)——基于Arduino的语音控制MP3播放器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包