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

文章目录

  • 简介
  • 离线语音控制模块
  • Mini MP3模块
  • 0.96寸 OLED模块
  • 实验准备
  • 安装库
  • 接线定义
  • 主要程序
  • 实验效果
  • 注意事项
  • 总结

简介

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

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

Arduino驱动DFPlayer Mini MP3模块:

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

离线语音控制模块

在这里插入图片描述

Mini MP3模块

在这里插入图片描述

0.96寸 OLED模块

在这里插入图片描述

实验准备

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

安装库

程序中使用到了DFRobotDFPlayerMini.h头文件,如果没有安装库编译代码时会报错,因此需要正确安装DFRobotDFPlayerMini库才能编译通过。下面是安装介绍。
在这里插入图片描述
在这里插入图片描述

接线定义

Arduinodfplayer
5VVCC
GNDGND
D10TXD
D11RXD
ArduinoOLED
GNDGND
3.3VVCC
A5SCL
A4SDA
Arduino语音识别模块
D0B7

主要程序

/*
 功能: 通过语音控制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 引脚的线拔掉,否则程序会下载失败。另一个解决办法是使用软件串口,这样就避免了串口冲突。
在这里插入图片描述

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

实验效果

整体接线:

在这里插入图片描述
控制效果:
在这里插入图片描述

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

注意事项

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

总结

本次实验通过Arduino,结合语音模块和MP3模块以及oled模块,实现了对MP3模块的语音控制和显示控制信息功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/112639.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用前端框架Bootstrap和Django实现用户注册页面

01-新建一个名为“mall_backend”的Project 命令如下: CD E:\Python_project\P_001\myshop-test E: django-admin startproject mall_backend02-新建应用并注册应用 执行下面条命令依次创建需要的应用: CD E:\Python_project\P_001\myshop-test\mall…

uniapp如何使用mumu模拟器

模拟器安装 下载地址:MuMu模拟器 模拟器相关设置 1.在设置-显示中选中手机版,设置手机分辨率 2.设置-关于手机-版本号快速点击,将其设置为开发者模式 3.选择多开器 4.打开hbuilderx,找到adb设置 5.配置adb路径及端口号&#x…

Servlet 初始化参数(web.xml和@WebServlet)

1、通过web.xml方式 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://xmlns.jcp.org/xm…

MFC实现堆栈窗口:多个子界面可任意切换

1、效果 在Qt中可使用QStackedWidget控件直接拖动布置即可实现&#xff0c;但在MFC中并未提供类似的控件&#xff0c;因此需要自己简单实现。 2、实现原理 实现原理比较简单&#xff0c;父级对话框在显示的区域部分&#xff0c;通过切换子对话框即可实现。子对话框去掉边框后…

香港服务器不稳定的几种情况

​  近年来&#xff0c;随着互联网的迅猛发展&#xff0c;香港作为一个重要的网络枢纽地区&#xff0c;扮演着连接中国内地和国际网络的重要角色。一些用户表示在使用香港服务器时可能会遇到不稳定的情况&#xff0c;导致访问困难、加载缓慢甚至无法连接。 为什么香港服务器会…

PostGreSQL:JSON|JSONB数据类型

JSON JSON 指的是 JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;JSON 是轻量级的文本数据交换格式JSON 独立于语言&#xff1a;JSON 使用 Javascript语法来描述数据对象&#xff0c;但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许…

【Linux】Linux项目部署及更改访问端口号和jdk、tomcat、MySQL环境搭建的配置安装

目录 一、作用 二、配置 1、上传安装包 2、jdk 2.1、解压对应安装包 2.2、环境变量搭建 3、tomcat 3.1、解压对应安装包 3.2、启动 3.3、设置防火墙 3.4、设置开发端口 4、MySQL 三、后端部署 四、Linux部署项目 1、单体项目 五、修改端口访问 1、进入目录 2…

Mysql数据库 6.SQL语言 分组、分页查询

分组查询—group by 分组——就是将数据表中的记录按照指定的类进行分组 关键字——group by 语法 语法中加[]的是可有可无的&#xff0c;group by一般和having一起使用 select 分组字段/聚合函数 from 表名 [where 条件] group by 分组列名 [having 条件] [order by …

基于深度学习的口罩佩戴检测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介二、功能三、基于深度学习的口罩佩戴检测四. 总结 一项目简介 基于深度学习的口罩佩戴检测是一种利用计算机视觉技术和深度学习算法进行口罩佩戴情况检测的…

【uniapp】html和css-20231031

我想用控件和样式来表达应该会更贴切&#xff0c;html和css的基础需要看看。 关于html&#xff1a;https://www.w3school.com.cn/html/html_layout.asp 关于css&#xff1a;https://www.w3school.com.cn/css/index.asp html让我们实现自己想要的布局&#xff08;按钮&#xff0…

1深度学习李宏毅

目录 机器学习三件事&#xff1a;分类&#xff0c;预测和结构化生成 2、一般会有经常提到什么是标签label&#xff0c;label就是预测值&#xff0c;在机器学习领域的残差就是e和loss​编辑3、一些计算loss的方法&#xff1a;​编辑​编辑 4、可以设置不同的b和w从而控制loss的…

nodejs+vue+elementui+python家电销售分析系统设计与实现-计算机毕业设计

系统按照用户的实际需求开发而来&#xff0c;贴近生活。从管理员通过正确的账号的密码进入系统&#xff0c;可以使用相关的系统应用。管理员总体负责整体系统的运行维护&#xff0c;统筹协调。 我们可以利用计算机技术来取代传统的管理模式&#xff0c;实现家电销售分析系统的…

赋能制造业高质量发展,释放采购数字化新活力——企企通亮相武汉2023国际智能制造创新论坛

摘要 “为应对成本上升、供应端不稳定、供应链上下游协同困难、决策无数据依据等问题&#xff0c;利用数字化手段降本增效、降低潜在风险十分关键。在AI等先进技术发展、供应链协同效应和降本诉求等机遇的驱动下&#xff0c;采购供应链数字化、协同化成为企业激烈竞争的优先选…

坚持#第420天~阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法

阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法&#xff0c;亲测有效&#xff1a; Mobax好卡啊&#xff0c;那就直接在阿里云后台操作即可&#xff0c;阿里云后台也可以上传文件。 Navicat mysql好卡啊&#xff0c;那就直接在阿里云后台最上面帮助的右边有个数据库&…

c++装饰器模式

前言 装饰器模式&#xff0c;就是可以对一个对象无限装饰一些东西&#xff0c;而且可以没有顺序。比如一个人可能只会说出他的名字&#xff0c;但是可以让他再说哈哈&#xff0c;可以说完哈哈之后再说哇哇。如何后面又不想装饰了&#xff0c;不需要改类原来的代码&#xff0c;…

基础课15——语音标注

语音数据标注是对语音数据进行处理和分析的过程&#xff0c;目的是让人工智能系统能够理解和识别语音中的信息。这个过程包括了对语音信号的预处理、特征提取、标注等步骤。 在语音数据标注中&#xff0c;标注员需要对语音数据进行分类、切分、转写等操作&#xff0c;让人工智…

【数据库】形式化关系查询语言(一):关系代数Relational Algebra:基本运算、附加关系代数、扩展的关系代数

目录 一、关系代数Relational Algebra 1. 基本运算 a. 选择运算&#xff08;Select Operation&#xff09; b. 投影运算&#xff08;Project Operation&#xff09; 组合 c. 并运算&#xff08;Union Operation&#xff09; d. 集合差运算&#xff08;Set Difference Op…

uniapp 使用 UDP

一、搭建UDP服务端&#xff0c;nodejs const dgram require("dgram");const message Buffer.from("你好&#xff0c;这是一个UDP广播消息"); const port 3000; // 用你想要的端口替换这里// 创建一个UDP套接字 const socket dgram.createSocket("…

目标检测理论知识

目标检测 1.基本概念 目标检测&#xff08;Object Detection&#xff09;的任务是找出图像中所有感兴趣的目标&#xff08;物体&#xff09;&#xff0c;确定它们的类别和位置&#xff0c;是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态&#xff0c;…

搜索二叉树

单纯的二叉树&#xff0c;并不能体现出优秀的存储和查找能力&#xff0c;但是对二叉树附加一些规则&#xff0c; 就能让二叉树成为很高效的存储和查找的一种数据结构&#xff0c;所以今天会介绍&#xff0c;基于二 叉树和一些附加规则的树——搜索二叉树1.搜索二叉树 搜索二叉…