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寸OLED | 1个 |
数据线(用于板子下载程序和供电) | 2条 |
杜邦线 | 若干 |
安装库
程序中使用到了DFRobotDFPlayerMini.h头文件,如果没有安装库编译代码时会报错,因此需要正确安装DFRobotDFPlayerMini库才能编译通过。下面是安装介绍。
接线定义
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, TXDFRobotDFPlayerMini 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播放器
注意事项
- 使用本次实验的语音控制模块,下载离线语音模块固件时,需要断开电源后重新通电,才能下载成功。
- Arduino上传上述代码时,需要拔插Arduino的 D0 引脚的线,否则上传失败。
- 可以使用功率更大一点的喇叭以提升音质效果,但要在3W以内。
总结
本次实验通过Arduino,结合语音模块和MP3模块以及oled模块,实现了对MP3模块的语音控制和显示控制信息功能。
相关文章:

AI智能语音识别模块(二)——基于Arduino的语音控制MP3播放器
文章目录 简介离线语音控制模块Mini MP3模块0.96寸 OLED模块实验准备安装库接线定义主要程序实验效果注意事项总结 简介 在前面一篇文章里我们对AI智能语音识别模块进行了介绍,并对离线语音模组下载固件的过程进行了一个简单描述,不知道大家还记不记得&…...

CentOS部署Minikube
基本介绍 Minikube是本地的Kubernetes,专注于使其易于为Kubernete学习和开发。 官方地址:https://minikube.sigs.k8s.io/docs/start/ 部署安装 # CentOS 7.6# 前置条件:安装好Docker或其他容器引擎或虚拟机 参见《CentOS一键部署Docker》…...

第5章_排序与分页
文章目录 1 排序数据1.1 排序规则1.2 单列排序1.3 多列排序排序演示代码 2 分页2.1 背景2.2 实现规则2.3 拓展分页演示代码 3 课后练习 1 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC(ascend): 升序DESC(descend):降序 …...

Elasticsearch实战:常见错误及详细解决方案
Elasticsearch实战:常见错误及详细解决方案 1.read_only_allow_delete":“true” 当我们在向某个索引添加一条数据的时候,可能(极少情况)会碰到下面的报错: {"error": {"root_cause": [{&…...

C#添加缓存,删除缓存,修改缓存
在C#中,可以使用内置的缓存功能或者使用第三方缓存库来管理缓存。下面分别介绍使用内置缓存功能和使用第三方缓存库的方法。 使用内置缓存功能: 添加缓存: 在C#中,可以使用MemoryCache类来添加缓存。以下是一个简单的示例&…...

PADS Router的操作页面及鼠标指令介绍
PADS Router的用户界面由菜单栏,工作界面,一般工具栏,状态栏,项目浏览器组,输出窗口,电子表格组成(图1): 图1 注意:如果你的界面没有显示项目浏览器ÿ…...

Android studio进入手机调试状态
首先usb插入电脑手机打开开发者模式进入点击就会在你的页面显示了...

《Pytorch新手入门》第二节-动手搭建神经网络
《Pytorch新手入门》第二节-动手搭建神经网络 一、神经网络介绍二、使用torch.nn搭建神经网络2.1 定义网络2.2 torch.autograd.Variable2.3 损失函数与反向传播2.4 优化器torch.optim 三、实战-实现图像分类(CIFAR-10数据集)3.1 CIFAR-10数据集加载与预处理3.2 定义网络结构3.3…...

C++ 模板学习笔记
C另外一种编程成为 泛型编程 ,主要利用的技术就是模板 C提供两种模板机制:函数模板和类模板 C11中,函数模板和类模板都可以设定默认参数,传送门 函数模板 一般 typename 和 class 没有区别,typename 还有个作用是使…...

1、Flink基础概念
1、基础知识 (1)、数据流上的有状态计算 (2)、框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。 (3)、事件驱动型应用,有数据流就进行处理,无数据流就不…...

分享一下怎么做小程序营销活动
小程序营销活动已经成为现代营销的必备利器,它能够帮助企业提高品牌知名度、促进产品销售,以及加强与用户的互动。然而,要想成功地策划和执行一个小程序营销活动,需要精心设计和全面规划。本文将为您介绍小程序营销活动的策划和执…...

Laravel 后台管理 Dcat Admin 使用记录
Laravel Dcat Admin 安装配置修改配置表格操作 Ajax 结合 Pjax 更新数据状态表格 链接表单设置页面(通常修改更新在同一页面)表单 安装配置 安装文档地址 框架版本 Laravel 8.* 修改配置 修改 admin.php 文件 return [// 后台名称name > DAD后台管理,// 标题title > 后台…...

c语言基础:L1-070 吃火锅
以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。 本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1。 输入格式&#x…...

java spring boot 注解、接口和问题解决方法(持续更新)
注解 RestController 是SpringMVC框架中的一个注解,它结合了Controller和ResponseBody两个注解的功能,用于标记一个类或者方法,表示该类或方法用于处理HTTP请求,并将响应的结果直接返回给客户端,而不需要进行视图渲染…...

HMAC_SHA1加密算法和SHA1加密算法的区别
HMAC_SHA1加密算法和SHA1加密算法的区别 应用场景:SHA1目前主要用于政府部门和私营业主处理敏感信息,被视为最先进的加密技术。而HMAC_SHA1主要用于基于密钥的消息认证码(HMAC)运算,需要一个密钥作为输入。密钥需求&a…...

Ubuntu连不上WiFi 或者虽然能连上校园网,但是浏览器打不开登录页面
写在前面 自己的电脑环境: Ubuntu20.04 一、问题描述 自己的 Ubuntu 遇到连接不上 除校园网之外的其他WiFi, 或者 虽然能连上校园网,但是浏览器打不开登录页面的问题。 二、解决方法 出现这种问题的原因可能是 之前开过VPN, 导致系统的网络设置出现…...

Maven第八章:如何解决Maven的jar版本冲突
Maven第八章:如何解决Maven的jar版本冲突 前言 本文重点讲解Maven依赖冲突原因,maven依赖原则以及如何利用idea Maven Helper插件分析解决问题。 背景 开发过程中引入第三方jar遇到依赖冲突的,非常影响开发,甚至大部分时间都在调试版本兼容。 Caused by:java.lang.NoSuch…...

c# 读写内存映射文件
在C#中,可以使用System.IO.MemoryMappedFiles命名空间中的MemoryMappedFile类来操作内存映射文件。可以创建不固定大小的内存映射文件,具体步骤如下: 1. 先创建一个初始大小为0的内存映射文件,使用MemoryMappedFile.CreateNew方法…...

行业揭秘:腾讯共享wifi码推广零加盟费是真的吗?
近年来,“共享经济”概念在商业领域取得了巨大成功。共享WiFi贴码成为共享经济的一种典型案例,被越来越多的人看作是一种低风险、高回报的投资方式。而在这个市场中,腾讯WiFi码推广以“零加盟费”而备受关注。本文将探讨腾讯WiFi码推广零加盟…...

E4980A 精密型 LCR 表,20 Hz 至 2 MHz
E4980A 精密型 LCR 表 20 Hz 至 2 MHz E4980A 精密型 LCR 表实现了测量准确度、速度与通用性的理想结合,适用于各种元器件测量。 E4980A 精密型 LCR 表实现了测量准确度、速度与通用性的理想结合,适用于各种元器件测量。 无论是在低阻抗量程还是在高阻…...

【前端工作提效】关于工作提效的一点实践与思考
1、测试提的BUG是一个一个提的,如果顺着测试提供的BUG单去一个一个解决问题,那么很容易管中窥豹,就像打补丁一样,缝缝补补,没有办法从根源去解决问题。所以我们需要尽量去了解代码的业务情况,并尽可能将一些…...

Pytorch 文本情感分类案例
一共六个脚本,分别是: ①generateDictionary.py用于生成词典 ②datasets.py定义了数据集加载的方法 ③models.py定义了网络模型 ④configs.py配置一些参数 ⑤run_train.py训练模型 ⑥run_test.py测试模型 数据集https://download.csdn.net/download/Victor_Li_/88486959?spm1…...

Flutter之GetX controller tag使用详解
本文主要介绍 GetX 依赖注入中 tag 的作用和使用详解。 作用 前面几篇文章介绍了 GetX 依赖注入的使用以及通过源码剖析了依赖注入的原理: •《Flutter应用框架搭建(一)GetX集成及使用详解》•《Flutter 通过源码一步一步剖析 Getx 依赖管理的实现》•《Flutter之…...

Kubernetes群集调度
调度约束 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件,向 APIServer 发送命令,在 Node 节点上面建立 Pod 和 Container。 APIServ…...

【总结】linux centos 7 开启网络白名单访问策略
目录 linux开启网络端口白名单访问策略开启白名单步骤补充说明 linux开启网络端口白名单访问策略 安全需要,被检测各种3306、9200、9300端口没有设置访问策略。需要整改。 对于linux来说,有两种方式可以开启防火墙 开启白名单步骤 场景一:…...

2023-2024-1高级语言程序设计第1次月考
7-1-1 计算摄氏温度 给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C5(F−32)/9。题目保证输入与输出均在整型范围内。 输入格式: 输入在一行中给出一个华氏温度。 输出格式: 在一行中按照格式“Celsius C”输出对…...

目标检测:Proposal-Contrastive Pretraining for Object Detection from Fewer Data
论文作者:Quentin Bouniot,Romaric Audigier,Anglique Loesch,Amaury Habrard 作者单位:Universit Paris-Saclay; Universit Jean Monnet Saint-Etienne; Universitaire de France (IUF) 论文链接:http://arxiv.org/abs/2310.16835v1 内容…...

Cesium:CGCS2000坐标系的xyz坐标转换成WGS84坐标系的经纬高度,再转换到笛卡尔坐标系的xyz坐标
作者:CSDN @ _乐多_ 本文将介绍使用 Vue 、cesium、proj4 框架,实现将CGCS2000坐标系的xyz坐标转换成WGS84坐标系的经纬高度,再将WGS84坐标系的经纬高度转换到笛卡尔坐标系的xyz坐标的代码。并将输入和输出使用 Vue 前端框架展示了出来。代码即插即用。 网页效果如下图所示…...

【OpenCV实现图像:用Python生成图像特效,报错ValueError: too many values to unpack (expected 3)】
文章目录 概要读入图像改变单个通道黑白特效颜色反转将图像拆分成四个子部分 概要 Python是一种功能强大的编程语言,也是图像处理领域中常用的工具之一。通过使用Python的图像处理库(例如Pillow、OpenCV等),开发者可以实现各种各…...

875. 爱吃香蕉的珂珂
题目描述 珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。 珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,…...