
#第十届立创电赛# 立创开发板AI训练营 #AI故事机
简介
为孩子尝试定制个性化故事。按键可播放AI生成的简单童话,硬件(ESP32+ES8311)和最基本的代码开源(GPL3.0),功能仍在完善中,欢迎交流改进。
简介:为孩子尝试定制个性化故事。按键可播放AI生成的简单童话,硬件(ESP32+ES8311)和最基本的代码开源(GPL3.0),功能仍在完善中,欢迎交流改进。开源协议
:Public Domain
描述
1、项目功能介绍
家里小朋友喜欢听故事,有自己喜欢的人物和故事偏好,结合AI个性化定制专属的故事。
比如小朋友按一个键或者摇一摇,然后,故事机就会利用AI大模型,真的把这个独一无二的故事“编”出来,然后用听起来很自然的声音讲给他听。

2、项目属性
原创,未参与过其他比赛
3、开源协议
GPL3.0开源协议
4、硬件部分
其实类似的方案很多,我只需要一个简版,但是我手上只有普通的驻极体麦克风,就需要ADC芯片,加上麦克风也需要功放,就在某宝买了几个ES8311。
东西倒不贵,到了以后我就后悔了,太小了,之前看介绍没有实感,到货以后字都看不清楚,我感觉我没法焊接,又重新买了电子放大镜和加热台。

(用下立创商城的图,只有3mm大)
为了保险起见,先只焊接ES8311,没想到整体出乎意料的顺利,第一次焊接ES8311就成功了。
然后用电烙铁焊接的剩余元器件的时候不小心把电容焊接错了,麦克风正负极意外连上了,上电以后直接发烫,还好主控没坏。
第二块板子整体加热台焊接顺利焊好了,麦克风是之前哪次从立创商城凑单屯的货,只有线没有头,我又重新买了XH2.54的端子用镊子压了一个,接上去麦克风不响。重新买了压线钳之后终于听到声音了。
感觉如果不追求最终实物的大小,其实用模块可能更快一些。
最开始屏幕和按键都在正面,发现娃老是乱按,就把按钮拆下来反过来焊接,正面只留屏幕。再后来晚上睡前听故事,又发现娃老是要注意屏幕,屏幕还闪烁,把屏幕也下了。语音唤醒对于发音要求还蛮高的,小孩子的声音始终没法语音唤醒,最后直接搞成最简形态,背面的按钮按一下开始放故事,按一下切换和暂停。
为了检测晃动,还加上了六轴运动处理传感器(MPU-6500)和SD卡座,想着后面可以做儿歌播放,现在智能音响虽然可以播放音乐,但是每次都先插播广告,让人难受。MPU-6500也很小,焊接失败过一次,这块暂时预留硬件能力,还没有写软件部分。
外壳是第一次尝试立创的3打印,外壳大小没问题,就是这个螺丝孔确实没有明白怎么玩,没有螺纹不知道怎么装,最后热熔胶沾上的。


5、软件部分
软件部分使用ESP IDF 和 C++开发。
AI部分主要考虑速度和成本,综合一圈下来,某度的ERNIE-Speed模型免费且速度快,适合生成故事。TTS先尝试用了ESP-SR自带的,声音稍微有点声音,最后换成百度的短文本生成,可选音色很多,效果不错,合成一次几厘钱。
折腾硬件焊接用了太多时间,目前软件实现比较简单,按键后播放预设的主题和故事,硬件预留了麦克风和三个按键后面有时间再添加其他功能。
当前项目结构和说明
-
main/main.cc:- 程序的入口点,包含
app_main函数。它初始化了App类的单例实例,并调用其Start()和MainLoop()方法。这是整个应用程序启动的地方。
- 程序的入口点,包含
-
main/app.h/main/app.cc:- 核心应用逻辑 (
App类):App是一个单例类,管理整个应用程序的生命周期。Start()方法是初始化和执行流程的核心:- 初始化 NVS (非易失性存储)。
- 启动 WiFi 连接。
- 初始化 I2C 总线。
- 初始化
AudioService。 - 初始化
AI模块。 - 初始化
TTS模块。 - 调用
AI模块生成一个关于“小熊布鲁喜欢刷牙”的故事。 - 调用
TTS模块将生成的故事文本转换为 PCM 音频数据。 - 调用
AudioService播放生成的音频。
MainLoop()方法进入一个无限循环,等待并处理事件(目前只处理错误事件)。
- 核心应用逻辑 (
-
main/board/board.h/main/board/board.cc:- 硬件抽象和初始化 (
Board类):Board也是一个单例类,负责与底层硬件(特别是网络和 I2C)交互。initNvs(): 初始化 NVS 闪存。startWifi(): 配置并启动 WiFi 连接,使用config.h中定义的 SSID 和密码。initI2C(): 配置并初始化 I2C 主总线,用于与音频编解码器通信。GetI2CBusHandle(): 提供对已初始化的 I2C 总线句柄的访问,供其他模块(如AudioService)使用。
- 硬件抽象和初始化 (
-
main/ai/ai.h/main/ai/ai.cc:- AI 故事生成 (
AI类):- 封装了与 OpenAI 兼容的 API(如文心一言)的交互。
ai_init(): 使用config.h中的 API 密钥和基础 URL 初始化 OpenAI 客户端库,设置模型和参数。ai_get_story_content(): 向 AI API 发送一个带有特定提示(要求创作儿童故事)的请求,获取生成的文本故事内容。
- AI 故事生成 (
-
main/tts/tts.h/main/tts/tts.cc:- 文本转语音 (
TTS类):- 使用百度 AI 平台的 TTS 服务。
tts_init(): 通过百度 API 获取访问令牌 (access_token),这是调用 TTS 服务所必需的。tts_generate(): 使用获取到的令牌和故事文本,向百度 TTS API 发送请求,将文本转换为 PCM 格式的音频数据,并存储在pcm_audio_buffer成员变量中。
- 文本转语音 (
-
main/audio/audio.h/main/audio/audio.cc:- 音频播放 (
AudioService类):- 负责配置和控制音频硬件(I2S 接口和 ES8311 编解码器)。
Initialize(): 初始化 I2S 通道和 ES8311 音频编解码器,设置采样率、位宽等参数,打开音频设备。Play(): 接收 PCM 音频数据(来自TTS模块),并通过配置好的编解码器和 I2S 接口播放出来。
- 音频播放 (
-
main/config.h:- 配置文件: 包含所有需要配置的敏感信息和设置,如 WiFi 凭据、OpenAI API 密钥和端点、百度 AI API 密钥和 TTS 相关参数。这是项目中需要根据实际环境进行修改的关键文件。
6、BOM清单
| 类别 | 名称 | 封装 | 数量 |
|---|---|---|---|
| 芯片 | LCKFB-ESP32S3R8N8 | DIP-40_L20.32-W51.66-P2.54-LS15.24 | 1 |
| ES8311 | WQFN-20_L3.0-W3.0-P0.40-BL-EP1.7 | 1 | |
| NS4150B | MSOP-8_L3.0-W3.0-P0.65-LS5.0-BL | 1 | |
| MPU-6500 | QFN-24_L3.0-W3.0-P0.40-BL-EP | 1 | |
| 电阻 | 5.1kΩ | R1206 | 2 |
| 10kΩ | R1206 | 1 | |
| 2.2kΩ | R1206 | 2 | |
| 220Ω | R1206 | 2 | |
| 4.7kΩ | R1206 | 3 | |
| 0Ω | R1206 | 2 | |
| 电容 | 1uF | C1206 | 11 |
| 100nF | C1206 | 6 | |
| 22uF | CAP-TH_BD6.3-P2.50-D0.6-FD-1 | 1 | |
| 连接器 | TYPE-C 6P(073) | TYPE-C-SMD_TYPE-C-6P-073 | 1 |
| 2.54-1*8P母环保 | HDR-TH_8P-P2.54-V-F-1 | 1 | |
| ZX-XH2.54-2PZZ | CONN-TH_2P-P2.50_HX25003-2A | 1 | |
| 开关/按键 | SK-12E12-G5 | SW-TH_SK-12E12-G5 | 1 |
| ZX-QC66-8.5CJ | SW-TH_4P-L6.0-W6.0-P4.50-LS6.3 | 3 | |
| 卡座 | TF PUSH | TF-SMD_TF-PUSH | 1 |
| 发光二极管 | XL-3216UGC-FB | LED1206-FD_GREEN-EH | 1 |
| 麦克风 | GMI9745P-56DB | MIC-TH_BD9.7-P2.54-D0.8-L-FD | 1 |
| 结构件 | M3螺丝 | M3螺丝 | 4 |
7、大赛LOGO验证

设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










