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模块的语音控制和显示控制信息功能。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞致云及其旗下1Panel项目进入2023年第三季度最具成长性开源初创榜单

2023年10月26日,知名风险投资机构Runa Capital发布2023年第三季度ROSS指数(Runa Open Source Startup Index)。ROSS指数按季度汇总并公布在代码托管平台GitHub上年化增长率(AGR)排名前二十位的开源初创公司和开源项目。…

Scrum of Scrums大规模敏捷管理流程

​​​​​​​Leangoo领歌​​​​​​​是一款永久免费的专业的敏捷开发管理工具,提供端到端敏捷研发管理解决方案,涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低,可帮助企业快速落地敏捷&#xff0c…

soul协议算法

逆向工程技术是指对软件或应用程序进行逆向分析以了解其内部机制和功能的过程。虽然我无法详细介绍"Soul App"的逆向工程技术,但以下是一些常见的逆向工程技术,可能与你的研究相关: 1. 反汇编(Disassembly)…

华为防火墙 配置 SSLVPN

需求: 公司域环境,大陆客户端居家办公室需要连到公司域,这里可以在上海防火墙上面开通SSLVPN,员工就可以透过SSLVPN连通上海公司的内网,但是由于公司域控有2个站点,一个在上海,一个在台北&…

Selenium安装WebDriver Chrome驱动(含 116/117/118/119/120/)

1、确认浏览器的版本 在浏览器的地址栏,输入chrome://version/,回车后即可查看到对应版本 2、找到对应的chromedriver版本 2.1 114及之前的版本可以通过点击下载chromedriver,根据版本号(只看大版本)下载对应文件 2.2 116版本…

117. 填充每个节点的下一个右侧节点指针 II : 详细图解 O(1) 空间构建过程

题目描述 这是 LeetCode 上的 「117. 填充每个节点的下一个右侧节点指针 II」 ,难度为 「中等」。 Tag : 「BFS」、「链表」 给定一个二叉树: struct Node { int val; Node *left; Node *right; Node *next;} 填充它的每个 next 指针,让这…

建设城市展厅用的多媒体互动装置有哪些作用?

随着科技的迅速进步,智慧城市这一概念已经逐渐从理论走向现实,而智慧城市展厅则成为了集中展示智慧城市理念、技术和规划的重要场所,在其中发挥着重要的作用,并且还在建设这些展厅的过程中,应用了大量的多媒体互动装置…

UDP服务端和客户端通信代码开发流程

一、UDP通信 TCP:传输控制协议,面向连接的,稳定的,可靠的,安全的数据集流传递 稳定和可靠:丢包重传 数据有序:序号和确认序号 流量控制:稳定窗口 UDP:用户数据报协议 面向无连接的,不稳定的,不可靠,不安…

在紫光同创盘古50K开发板上进行DDR读写测试

本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGL50H开发平台(盘古50K开发板) 一:软硬件平台 软件平台:PDS_…

CSS内容过多保留固定字数并显示省略号

一、业务场景&#xff1a; 详情内容过多时&#xff0c;会使布局错乱&#xff0c;需要保留固定的字数&#xff0c;鼠标划上显示出全部内容 三、具体实现步骤&#xff1a; <a-tooltip><template slot"title">{{lastChe}}</template><span class…

PDF 表单直接保存到您的文档中--TX Text Control

TX Text Control .NET Server for ASP.NET Document Viewer 32.0.2 允许用户保存包含已填写表单字段的文档&#xff0c;从而更轻松地协作和共享信息。 TX Text Control .NET Server for ASP.NET 是一个适用于 ASP.NET 和 ASP.NET Core 的综合服务器端文档处理库。功能包括 PDF …

html获取网络数据,列表展示 第二种

html获取网络数据&#xff0c;列表展示 第二种 js遍历json数组中的json对象 image.png || - 判断数据是否为空&#xff0c;为空就显示 - <!DOCTYPE html> <html><head><meta charset"utf-8"><title>网页列表</title><script …