[i=s] 本帖最后由 bzhou830 于 2026-7-31 09:02 编辑 [/i]
【电子DIY作品】搓一个会「教字」的 AI 小老师——小安 字词宝 + WV01-32S
🔥 家人们,有没有发现:孩子一年级、二年级光语文识字表就差不多 1500 个字,靠课本后面死记硬背,今天记住明天忘?很多家长想按艾宾浩斯曲线复习,但手工排表太痛苦,孩子也没兴趣。
这次咱们玩点实用的——用安信可 WV01-32S 模组做一台会说话的「AI 字词宝」小安,再配上一套自研的 hanzi-memory-mcp 工具。孩子直接喊一声「今天学习哪些汉字」,设备就能按课文顺序、每 10 字一单元、艾宾浩斯 1/2/4/7/15 天复习规律,把当天要新学和复习的字全报出来。学完还能反问「秋字什么时候学」。全语音交互,不用盯着手机屏幕,家长省事、孩子爱玩,妥妥的桌面学习搭子~
🚀 先上成品展示!
整机是一个圆润的语音小盒子,顶部扬声器开孔,内部 PCB 集成 WV01-32S 主控、麦克风、喇叭功放和电源管理。

SolidWorks 装配总图:圆形外壳 + WV01-32S 主板 + 扬声器仓位

PCB 3D 渲染:WV01-32S 模组居中,排针、麦克风、扬声器接口一应俱全

结构爆炸图:上盖(扬声器面)+ 下壳(主板仓)两段式装配
📸 实物展示
设计图再漂亮,也得看实物能不能打。下面是已经打印、装配、通电的实机照片。

实机侧面:预留 Type-C 充电/供电口,开口精度刚好,插拔顺畅。

实机另一侧:MEMS 硅麦收音孔,孔径较小,既能拾音又能防尘。

拆开下壳:WV01-32S 圆形主板、喇叭、电池、硅麦全部塞进了这个小圆盒里,空间利用率很高。

电池特写:HJ 602528 3.7V / 380mAh / 1.406Wh 软包锂电,续航足够孩子日常识字使用。

裸板调试:安信可 Ai-WV01-32S 模组已经焊好,喇叭引线接出,先裸跑验证语音通路再上壳。
📋 项目卡片
- 核心大脑:安信可 Ai-WV01-32S 模组(BL616,RISC-V + Wi-Fi 6 + BLE 5.0)
- 交互方式:MEMS 硅麦采集语音 + 8Ω 扬声器播报
- 供电方案:5V Type-C 输入 → LDO 转 3.3V,内置 380mAh 锂电,支持边充边用
- 外壳工艺:SolidWorks 建模 + 3D 打印(PETG/PLA 均可)
- 字库来源:人教版(部编版)一年级、二年级语文识字表
- 记忆算法:艾宾浩斯遗忘曲线,学习后第 1/2/4/7/15 天复习
- AI 平台:小智(xiaozhi.me)智能体,通过 MCP 协议接入本地工具
- 上手难度:★★★☆☆(会画 PCB、会打印、会烧录就行)
🧰 硬件清单
| 部件名称 |
具体型号/规格 |
说明/来源 |
| 🧠 主控 |
Ai-WV01-32S |
安信可 Wi-Fi 6 + BLE 5.0 模组,FCC ID: 2ATPO-AIWB2 |
| 🎤 麦克风 |
MEMS 硅麦(MIC+/MIC-) |
接 WV01 音频输入 |
| 🔊 扬声器 |
8Ω 1W 小喇叭(SPK+/SPK-) |
顶部出声孔 |
| ⚡ 电源 |
AMS1117-3.3 / DC-DC + Type-C |
5V 输入降压到 3.3V |
| 🔋 电池 |
HJ 602528 3.7V 380mAh |
软包锂电,续航约 2~3 小时连续播放 |
| 🛠️ 外壳 |
Φ约 60mm 圆盒 |
SolidWorks 建模,3D 打印 |
| 📟 PCB |
双层板,1.6mm,圆形 |
嘉立创白嫖 |
| 💻 上位机 |
hanzi-memory-mcp |
FastMCP + SQLite 自研 |
| ☁️ AI 后端 |
小智智能体 |
通过 MCP 接入点调用本地工具 |
🍳 硬件设计:原理图与 PCB
主控直接用 WV01-32S,把它的音频、串口、IO 全部拉出来。

原理图:WV01-32S 外围电路,包含麦克风/扬声器接口、UART、BOOT、复位以及 3.3V LDO
关键信号说明:
- SPK+/SPK-:喇叭差分输出,功放由 WV01 内部音频链路驱动;
- MIC+/MIC-:麦克风差分输入,用于语音唤醒和对话;
- TX/RX:调试串口,烧录固件和查看运行日志;
- IO2/IO5/IO11/IO12/IO17:预留 GPIO,可接按键/指示灯;
- DP/DN:USB 差分,Type-C 口用于供电和程序下载;
- LDO 部分:5V 输入降压到 3.3V,给 WV01 和外设供电;电池通过保护板直接接到 5V 母线,实现移动使用。
PCB 布局同样做成圆形,和外壳同形,螺丝孔位对应外壳立柱。

PCB 顶层布线图:圆形板,丝印标出了 IO、MIC、SPK、UART、螺丝孔位置
板子尺寸不大,元件也不多,焊接难度主要集中在 WV01-32S 模组的邮票孔或排针,以及 0402/0603 的阻容。建议先用低温锡膏 + 热风枪吹主控,再手焊大器件。
🎨 结构设计:3D 外壳与装配
外壳用 SolidWorks 画的上下分体式圆盒:
- 上盖:正面开扬声器出声孔阵列,边缘做倒角;
- 下壳:内部有 PCB 卡位、螺丝柱、麦克风/按键预留孔;
- 装配方式:上盖和下壳通过卡扣 + M2 螺丝固定。

另一视角爆炸图:可以清晰看到主板仓深度和定位柱

SolidWorks 装配树:3D_PCB1、外壳零件、配合关系一目了然
建议用 PETG 打印,韧性更好,摔地上不容易裂。如果追求质感,可以像楼主一样简单喷个色🟣,成品立马高级起来。
🔧 组装
- 焊板子:先把 WV01-32S、LDO、阻容、排针焊好,检查 3.3V 输出;
- 装麦克风/喇叭:把硅麦和喇叭焊到对应焊盘,注意正负极;
- 接电池:把 602528 锂电接到电源输入,注意极性和保护板;
- 装 PCB 进下壳:对准螺丝孔和定位柱,用 M2 螺丝固定;
- 合上盖:卡扣压紧,螺丝从底部拧紧;
- 烧录固件:用博流 Bouffalo Lab 烧录工具把 WV01 固件烧进去,复位后连 Wi-Fi 进小智平台。

组装完成后的内部结构,电池贴在下壳侧壁,主板居中,喇叭正对出声孔。
💻 核心代码:hanzi-memory-mcp
AI 平台只负责「听」和「说」,真正决定「今天学什么字」的是一个本地 MCP 工具服务——hanzi-memory-mcp。它用 FastMCP 框架 + SQLite 数据库实现,不依赖大模型幻觉,数据精确到人教版教材的每一课。
字库与记忆排期
数据库从人教版一年级、二年级四册《识字表》按课文顺序整理,去重后共 1407 个生字。每 10 个字 为一个学习小单元,共 141 个单元。新学内容平均分配到 30 天(从 2026-07-20 起),每天约 45 个单元、4050 个新字。每个单元在学完后第 1、2、4、7、15 天自动复习,完整周期延伸到 2026-09-02。
# build_database.py(节选)
START_DATE = date(2026, 7, 20) # 学习计划开始日期
TOTAL_DAYS = 30 # 新学内容分成 30 天
UNIT_SIZE = 10 # 每个小单元 10 个字
EBBINGHAUS_INTERVALS = [1, 2, 4, 7, 15] # 艾宾浩斯复习间隔(天)
MCP 工具注册
hanzi-memory-mcp 对外暴露 4 个工具,小智平台可以直接调用:
# hanzi_mcp.py(节选)
from fastmcp import FastMCP
import hanzi_query
mcp = FastMCP("HanziMemory")
@mcp.tool()
def get_today_words(date_str: str = "") -> dict:
"""今天要熟悉哪些字/词?返回当日新学 + 复习生字。"""
return hanzi_query.get_daily_words(date_str)
@mcp.tool()
def get_study_plan() -> dict:
"""查看整个学习计划概况。"""
return hanzi_query.get_plan_overview()
@mcp.tool()
def lookup_char(char: str) -> dict:
"""查询某个生字:出自哪一课、属于第几单元、哪几天学习和复习。"""
return hanzi_query.lookup_char(char)
@mcp.tool()
def get_unit_detail(unit_id: int) -> dict:
"""查询某个小单元的生字明细及安排。"""
return hanzi_query.get_unit_detail(unit_id)
if __name__ == "__main__":
mcp.run(transport="stdio")
与 AI 平台的桥接
hanzi_mcp.py 以 stdio 方式运行,本地再通过 mcp_pipe.py 把它桥接到小智的 WebSocket MCP 接入点(wss://api.xiaozhi.me/mcp/...)。这样云端智能体就能像调用普通工具一样调用本地的字库服务,而数据始终存在本地 SQLite,不上传。
🌐 小智平台接入与配置后台
登录小智智能体后台,在「扩展能力 → 自定义服务 → MCP 接入点」里填入本地桥接出来的 WebSocket 地址,就能看到 get_today_words 等 4 个工具已启用。

小智后台:接入点状态「在线」,已启用 get_today_words、get_study_plan、lookup_char、get_unit_detail
配置好后,孩子对设备说「今天学习哪些汉字」,小智会判断意图并调用 get_today_words(),拿到结果后 TTS 播报;孩子问「秋字什么时候学」,则调用 lookup_char('秋')。
🎬 实测效果
本地启动 MCP 服务器并跑了一遍工具调用测试,结果如下:
- 4 个工具全部正常注册;
- 2026-07-30(第 11 天):新学 5 个单元 50 字 + 复习 20 个单元 200 字;
lookup_char('秋'):正确返回「1年级上册·课文1 秋天」、单元 8,以及 2026-07-21 新学、后续 5 次复习日期。

MCP 服务器启动日志与工具调用结果
实际语音体验:孩子放学回家喊一声「今天学习哪些汉字」,设备会先把今天要新学的字读一遍,再提示复习的字。家长不用翻书、不用做表,AI 按艾浩斯曲线自动排好。
🎬 演示视频
🚩 踩坑总结
坑1:MCP 服务器不能直接接收中文提问
stdio MCP 服务器只认 JSON-RPC 消息。如果你直接在终端里 python -m hanzi_mcp 然后敲「今天学习哪些汉字」,服务器会报 json_invalid。正确做法是:用 fastmcp.Client 或真实的小智平台去调用工具。
坑2:SQLite 在 \\wsl$ 网络桥上会 database is locked
如果你在 Windows 侧通过 \\wsl$ 读写 WSL 里的 hanzi.db,SQLite 文件锁会异常。正确做法:在 WSL 内部或本地原生目录构建/运行,不要跨 \\wsl$ 直接访问。
坑3:fastmcp 3.4.5 的 Client 写法有讲究
不能直接 Client([python, script]),必须显式构造 StdioTransport(command=..., args=[...], cwd=...) 再传给 Client。
坑4:WV01 音频走线要短
麦克风模拟信号如果线太长容易引入底噪,PCB 上 MIC+/MIC- 尽量短且包地,喇叭线也远离数字高速线。
坑5:3D 打印外壳公差要留够
第一次打印我卡扣做得太紧,合盖时费了老大劲;后来把卡扣间隙放大 0.2mm,装配手感明显变好。建议 PETG 打印,螺丝柱内径也要比螺丝小 0.1mm 左右,保证自攻锁紧。
🔭 升级思路|玩出更多花样
- 电子墨水屏版:加一块 1.54/2.13 寸 E-Ink,把当天要学的字显示出来,孩子边看边听边写;
- 拼音与组词扩展:数据库里再加拼音、例词字段,让孩子不仅识字,还能听读音、造句子;
- 学习打卡记录:把每天的完成情况写回 SQLite,家长后台看学习时长和正确率;
- 多用户切换:支持哥哥、妹妹各自的学习计划,按声纹或按键切换;
- 离线语音唤醒:把「今天学习哪些汉字」做成本地唤醒词,减少云端依赖,响应更快。
💬 最后说两句
小安 最爽的点在于:它不是买了一个智能音箱回家吃灰,而是从「画 PCB」到「写 MCP 工具」再到「孩子真正用起来」全链路可控。每一块板子、每一个生字、每一次复习节奏,都是自己设计的。当孩子突然说出「秋字是 7 月 21 号新学的」时,那种成就感比刷一百个短视频都强。
如果你也在为家里小学生识字发愁,或者想亲手做一个有温度的 AI 小硬件,欢迎参考这个项目。有任何问题评论区留言,一起交流~