基于ESP32的儿童睡前故事机
简介
使用乐鑫科技的ESP32MCU作为主控设计的一款儿童睡前故事机。能够实现在线语音交互和离线播放,并具有睡眠提醒和闹钟提醒功能。
简介:使用乐鑫科技的ESP32MCU作为主控设计的一款儿童睡前故事机。能够实现在线语音交互和离线播放,并具有睡眠提醒和闹钟提醒功能。开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
项目说明
使用乐鑫科技的ESP32MCU作为主控设计的一款能够智能交互的儿童睡前故事机。
开源协议
GPL3.0
项目相关功能
- 支持在线语音讲故事,讲诗词,讲笑话,播放音乐
- 支持语音交互,能够在互联网中搜索找到答案并播报出来。
- 支持TF卡保存资源包,离线能够使用
- 支持睡眠提醒、闹钟提醒
- 支持充放电,充一次电使用时长不低于7小时。
项目属性
本项目为首次公开,为本人原创项目。项目未曾在别的比赛中获奖。
项目进度
- 接到项目,对项目整体框架进行设计,并规划进度安排 2023/8/14
- 首先在开发板上进行代码的验证。完成了设备端语音唤醒,语音检测部分代码的撰写 2023/8/21
- 完成百度文心一言和语音识别API的调试 2023/8/30
- 添加离线模式,能够离线播放内存卡资源 2023/9/5
- 设备端添加睡眠提醒和闹钟提醒功能,设计设置睡眠提醒和闹钟提醒的app 2023/9/11
- 完成PCB设计并打样 2023/9/20
- PCB测试 2023/9/29
- 设计外壳,并准备撰写文档 2023/10/7
- 完成最终设备调试以及文档撰写工作 2023/10/17
- 问题修改与完善 2023/11/28
项目介绍
本项目的开发主要分为三部分:
- 设备端:采用ESP32作为主控芯片,并以此为中心搭建外围电路,实现命令词唤醒、语音活动检测、语音合成、播放内存卡音频等功能
- 云端:主要是为设备端的在线功能提供API接口,如百度文心一言API,百度语音识别API(付费)和网易云音乐API service
- 移动APP端:设计一个简单的APP,从而能够实现设备的Smartconfig配网,设备校时,闹钟、睡眠提醒设置等
开发工具
本项目分为三部分:
1.设备端:采用ESP-IDF和ESP-ADF进行esp32设备端的开发
2.云端:需要使用百度文心一言API和百度语音识别API(付费)来实现语音交互,并且需要在本地电脑或云端服务器搭建网易云音乐API service来获取在线音乐的url
3.移动APP端:使用JAVA语言采用Android studio工具进行手机App的开发
1. ESP32设备端
1.1 系统框架
1.2 硬件说明
- 主控芯片采用ESP32-WROVER-E,是一款通用型 Wi-Fi + Bluetooth + Bluetooth LE MCU 模组,功能强大,用途广泛,可以用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和 MP3 解码等。ESP32-WROVER-E-N8R8具有8M的SRAM和8M的Flash,能够满足语音识别所需要的运行资源。
- 在电源供电部分,可分别使用USB供电或电池供电,使用AP5056进行电池充放电管理。并分别使用两个电源稳压芯片对ESP32和音频芯片进行供电。
供电电路
- 音频编解码芯片采用的是ES8311。ES8311是顺芯广泛推广的CODEC芯片,具备高性价比优势,其主要应用场景包括:便携式音频设备、网络摄像头、无线音频等。ES8311可以支持免I2C 配置(MCLK/BCLK=64Fs)进行I2S通信,支持+-1Vrms的满眶输入,并且具有较低的功耗。
- 使用ADC芯片ES7243E将麦克风采集到的信号传递给esp32。ES7243E是顺芯广泛推广的高性能先进多位Delta-sigma音频ADC芯片,具有高达 -90dB THD+N的失真度,24-bit,8~48 KHz的采样率,并且具有自动电平控制(ALC)和噪声门,极具高性价比优势。
- 音频放大部分采用NS4150B芯片。NS4150B是一款超低EMI、无需滤波器的3W单声道D类音频功率放大器。NS4150B采用先进的技术,在全带宽范围内极大地降低了 EMI 干扰,最大限度地减少对其他部件的影响。NS4150B 内置过流保护、过热保护及欠压保护功能,有效地保护芯片在异常工作状况下不被损坏。并且利用扩频技术充分优化全新电路设计,高达90%的效率更加适合于便携式音频产品。NS4150B 无需滤波器的 PWM 调制结构及增益内置方式减少了外部元件、PCB 面积和系统成本。
PCB版采用双层板,顶部分别对GND、DGND、AGND进行铺铜。
1.3 代码流程图
1.4 软件代码说明
在硬件设备端,充分利用ESP32的性能,唤醒词检测、语音活动检测均使用ESP32实现,仅语音识别和文本转语音部分是调用百度API实现。
1.4.1 配网方式
ESP-IDF提供的Smartconfig组件能够通过混杂模式传输AP的SSID和密码,然后使用获取到的SSID和密码去连接AP。由于设备使用的WIFI频段为2.4G,故在进行配网时,手机不能够以5GHz的频段连接到路由器,否则会造成设备接收不到数据。
1.4.2 在线播放音乐
ESP-ADF通过将元素组合到一个管道中来进行音频应用程序的开发。
该部分程序中使用到的音频管道如下:
[http_server] ---> http_stream ---> mp3_decoder ---> i2s_stream ---> [codec_chip]
通过网易云音乐获取到音乐的URL,并进行播放
1.4.3 语音唤醒与VAD
语音唤醒和VAD的音频流如下:
mic ---> codec_chip ---> i2s_driver ---> afe
检测到语音唤醒词后,开启VAD,若检测到人声,则将麦克风采集到的数据存储到buffer缓存中。
1.4.4 在线语音交互
在该部分中,将buffer缓存中的数据上传至百度语音识别,获取语音信息,之后将其上传至百度千帆,获取文心一言返回的对话文本,并通过百度TTS,将其转换成http音频流进行播放。
1.4.5 离线模式
离线模式的音频流如下:
[sdcard] ---> fatfs_stream ---> mp3_decoder ---> resample ---> i2s_stream ---> [codec_chip]
在离线模式中,esp32的wifi工作在AP模式下,,并且基于FreeRTOS,esp32主要运行三个任务。
- 一是音频播放任务。初始化并读取SD卡中的音频文件,并能够通过外部的按钮控制播放的状态和音量大小。
- 二是ESP32不停监听特定端口的特定信息并能够作出回应,从而使其IP地址能够被接入网络的智能手机识别。
- 三是ESP32作为http server,能够接收并处理智能手机发送的包含控制信息的post请求,从而实现设备的本地控制。
1.4.6 睡眠提醒与闹钟提醒
在设定的提醒时间到达后,并开启对应的提醒开关后,设备能够分别发出“时间到了”或“该睡觉了”两种提醒。
2. 移动APP端
2.1 软件框图
2.2 软件功能
2.2.1 配网
配网部分代码参EspressifApp / EsptouchForAndroid的开源代码,并在其基础上进行修改
2.2.2 闹钟、睡眠提醒设置
- 寻找设备采用的是局域网UDP广播的方式,通过向子网的广播地址发送特定的数据并监听接收到的数据,来识别并获取目标设备的IP地址。这种方式不需要组管理,能够大大简化复杂度,但也可能会加重局域网带宽的负担。
- 同步时间是获取Android手机的时间戳并将其发送给ESP32设备端,从而实现设备端的时间同步
- 此外,由于ESP32设备端启用了多个http server功能,使用POST或GET方式向不同的http接口发送对应的数据和请求,就能够实现对不同功能的设置和当前状态的读取。
3. 云端
3.1 百度语音识别API调用
语音数据上传 POST 方式有 2 种:
- JSON 格式 POST 上传本地音频文件
- RAW 格式 POST 上传本地音频文件
由于第一种方式需要对采集到的音频数据进行base64 编码,会增加代码复杂度和传输数据量,因此这里采用的是第二种方式,将麦克风采集到的数据直接上传至百度云端进行识别,语音数据直接放在 HTTP BODY 中,控制参数以及相关统计信息通过 header 和 url 里参数传递。
如下是对RAW 格式POST上传本地音频文件的参数介绍。
Header 参数说明
字段名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
format | string(格式见下面示例) | 必填 | 语音格式,pcm/wav/amr/(m4a仅支持极速版)。不区分大小写,推荐使用pcm文件 |
rate | int(格式见下面示例) | 必填 |
采样率 16000、8000, 固定值 |
语音数据的采样率和压缩格式在 HTTP-HEADER 里的 Content-Type 表明,例:
Content-Type: audio/pcm;rate=16000
url 参数说明
字段名 | 可需 | 描述 |
---|---|---|
cuid | 必填 | 用户唯一标识,用来区分用户,计算 UV 值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为 60 字符以内。 |
token | 必填 | 开放平台获取到的开发者 [access_token] 获取 Access Token "access_token") |
dev_pid | 选填 | 不填写 lan 参数生效,都不填写,默认 1537(普通话 输入法模型),dev_pid 参数见本节开头的表格 |
lm_id | int | 选填 |
lan | 选填,废弃参数 | 历史兼容参数,已不再使用。 |
详细参考文档:短语音识别API
3.2 文心一言API调用
百度智能云千帆大模型平台是一站式企业级大模型平台,提供先进的生成式AI生产及应用全流程开发工具链,目前百度智能云千帆大模型平台现已正式面向企业和个人开放使用,能够在该平台申请并使用文心一言大语言模型。
我们在得到百度云语音识别服务返回的语音文字后,使用POST请求调用文心一言API将识别到的文字发送给文心一言,并得到相应的回答,从而实现智能交互。
请求的JSON数据示例如下:
{
"messages": [
{
"role": "user",
"content": "介绍一下你自己"
}
]
}
并且支持单轮、多轮、流式请求,详细文档如下:
参考文档:文心一言API
3.3 网易云音乐API service搭建
这部分需要有一个自己的服务器或者可以使用个人电脑搭建一个服务,需要使用到Node.js,具体可参考下方文档
参考文档:网易云音乐API服务器搭建参考手册
3.4 服务器端API service搭建
在服务器端使用flask搭建api处理设备端的请求,解析设备端识别到的文字,并分为“播放音乐”命令和“语音交互”命令,并分别执行相应操作,返回设备播放的音频流。具体代码如附件中server.py所示。
4. 外壳设计
外壳使用 Fusion360绘制,该软件能够很好地进行版本管理,便于进行模型的修改和回溯,并且为在校大学生提供的有教育版免费试用,虽然它与Inventor有些相像,但个人感觉没有Inventor用着顺手,可能是之前Inventor用顺手了的缘故。
3D模型打印使用的是嘉立创旗下的三维猴,打印质量比我自己的3D打印机更细腻,并且价格便宜。
并且在该项目中还设计了简单的面板如下:
在立创EDA中能够直接设计面板并打印,这一点十分方便友好。
5. 实物展示
6. app界面
设计注意事项
- idf可使用esp-adf内置的idf,版本为4.4,高版本在使用语音唤醒和VAD时可能会出现莫名其妙的错误
- 板子上未设计USB转串口芯片,需要外接ch340模块进行程序下载和调试
- 文心一言需要使用ERNIE-Bot,不能使用ERNIE-Bot-turbo,否则不能保证返回数据的时效性
- 调用百度文心一言和语音识别的API时需要首先获取对应的token,两个API接口的token是不同的
- 由于程序使用到的资源较多,切记需要使用WROVER(带有SRAM,不要买成WROOM!!!),并且需要在menuconfig中开启使用外部RAM
- 本地播放只支持MP3音频格式
- SD卡目录结构为:
sdcard
|---play
| |--a.mp3
| |--b.mp3
|---alarm
| |--0.mp3
| |--1.mp3
遇到的问题及解决方案
- tts方案分别尝试过ESP32自带的tts和python中的zhtts库,虽然能够满足基本要求,但其语音效果较差,并且长文本表现效果欠佳,故改用百度TTS方案。
- 注意ADC芯片为ES7243,不是ES7243E。若芯片购买错误,则需要从ES7243修改为ES7243E,具体修改文件为bord.c和bord_def.h
- 由于网易云音乐接口返回的音乐为双声道,并且码率较高,会造成音乐播放卡顿以及音乐播放完成后设备无法语音唤醒的问题,故在服务器端编写了简单的程序将接口返回的音乐转换成单声道、码率16000,之后再传给设备。
其他
- 这是我第一次进行开源项目,非常感谢嘉立创提供的这个平台,给我了这次机会能够锻炼自己。此文档写的稍微匆忙,可能还有很多表述不清和不妥的地方,还请各位批评指正!如有问题也可以一起交流学习呀!
- 由于ESP touch不能够传输手机自身热点的密码,若只有一部手机且附近无可用wifi,需要先使用电脑创建一个同SSID名称和密码的WIFI,并使手机连接此网络,之后再进行smart config。最后关闭电脑热点,打开手机热点,复位硬件,即可将其连接至手机热点
- 板子采用手工焊接,封装主要采用0805,使得板子尺寸略微比较大,之后能够使用更小的封装并使用嘉立创SMT贴片。其中ES8311和ES7243为QFN封装,并且这是我首次焊接QFN封装芯片(最开始开始尝试用电烙铁焊接,结果报废了两个板子),建议使用热风枪,我使用的是低温无铅焊锡和小型DIY热风枪。
- 可以在menuconfig中修改其它内置唤醒词,该项目采用的是“你好,小智”
- 可以使用lyrat-mini的Hal库进行代码开发
- APP可能存在问题,DETECT按键需要按两下才能够准确识别到设备,并且若参数设置得太快,有概率出现崩溃情况。
- 部分元件为冗余,不需要焊接,具体如下:
R13 R17 R19 R20 R22
C9 C50 C51 D1 D2 D3
演示视频:
睡前故事机功能演示:https://www.bilibili.com/video/BV18e41197Lv/
工程代码都已上传至github,链接如下:
评论