当前位置: 首页 > news >正文

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, 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播放器

注意事项

  1. 使用本次实验的语音控制模块,下载离线语音模块固件时,需要断开电源后重新通电,才能下载成功。
  2. Arduino上传上述代码时,需要拔插Arduino的 D0 引脚的线,否则上传失败。
  3. 可以使用功率更大一点的喇叭以提升音质效果,但要在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 注意:如果你的界面没有显示项目浏览器&#xff…...

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 表实现了测量准确度、速度与通用性的理想结合,适用于各种元器件测量。 无论是在低阻抗量程还是在高阻…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

JVM 内存结构 详解

内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: ​ 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...