第 23 课 · 语音大脑:小智 ESP32 与 MCP
这一课解决什么问题:阶段 E 你用手柄发目标,这一课把"目标入口"再往上一层——用一句自然语言让鸭子听懂并执行;同时弄清语音指令为什么不能绕过安全检查。
前置:第 21 课;记得第 01 课的"你发目标,策略管过程"。
1. 回到第 01 课那张图:语音是更上层的目标入口
第 01 课画过这个分层:上层发目标 → 策略算出 14 个关节角度 → 关节转动 → 传感器回传。手柄已经是一层"目标入口":你推摇杆,只改速度指令。语音做的是同一件事,入口更高:
你说话 ──▶ 语音大脑(听懂 + 决策) ──▶ 动作指令 ──▶ 策略 ──▶ 关节
变的不是鸭子,是目标的表达方式。入口越往上越聪明,但听错的风险也越大,越需要下层保护(第 5 节)。
所以呢:看到任何"智能产品",先问:它的目标入口在哪一层?
2. 小智 ESP32 是什么
xiaozhi-esp32/ 是工作区里的开源项目:一套跑在 ESP32 开发板上的 AI 语音聊天固件——接上麦克风和扬声器、联网后就能跟 AI 对话。小智负责"听懂",听到之后做什么,由设备注册的能力决定。docs/microduck-30day/README.md 把它定位为"第 30 天的语音/MCP 扩展,不属于 PPO 训练核心"——训练与交互解耦。
3. MCP:给 AI 的标准插线板
MCP(Model Context Protocol)一句话:让 AI 能发现并调用外部工具的标准接口——像一块标准插线板:设备把能做的事做成标准插头,模型来了即插即用。
xiaozhi-esp32/docs/mcp-usage.md 给出的完整流程只有四步:
- 设备启动,经 WebSocket 或 MQTT 连上后端;
- 后端发
initialize,开始 MCP 会话(底层是 JSON-RPC 2.0); - 后端发
tools/list,发现设备注册了哪些工具; - 后端用
tools/call调用某个工具。
设备端用 McpServer::AddTool 注册工具:名字、自然语言描述、参数、实现。文档例子 self.dog.forward("Move the robot forward"),无参数,回调直接发前进指令;命名建议 模块.动作 风格。
"让鸭子走过来"在系统里就变成一次 tools/call:调用 self.duck.come_here(示意工具名,真实示例见 mcp-usage 文档),参数为空。
模型不需要被逐条教过这句话——读工具的描述就知道什么时候该调。"插线板"的含义:能力是插上去的,不是焊死的。
另一类 AddUserOnlyTool(仅用户可调):默认不在 tools/list 里,后端要带 withUserTools=true 才能看到。文档用它放 self.reboot(重启)、self.upgrade_firmware(固件升级)这类不该让 AI 自主触发的操作——这本身就是安全原则。
4. 给鸭子加语音的三层结构
调研报告 docs/research/physical-ai-robot-startup-research-2026-09-04.md 第 6 节建议的分层,正好和鸭子对上:
耳朵 麦克风 采集声音
大脑 ESP32 语音前端 + 后端大模型 听懂并决策(高阶 AI 可放电脑/手机/树莓派)
身体 策略 + 安全层 50 Hz 控制环、动作限幅、急停
报告的关键原则:即使高阶 AI 断网,机器人也应能完成基础动作、停止、静音和隐私关闭——云端可以增强体验,但不能成为硬件安全的单点故障。
5. 安全边界:语音不绕过安全检查
语音指令到达身体前,必须穿过和手柄相同的安全层(第 20 课的清单、限幅、急停)——语音只是换了入口,不享受特权。三条:
- 运动类工具的回调先过限幅和检查,再下发;
- 重启、升级等特权操作一律用
AddUserOnlyTool,模型碰不到; - 断网降级:听不懂、连不上时,鸭子保持站立,而不是乱动。
所以呢:给任何系统加更聪明的入口,先问:它绕过了哪些老检查?
动手练习(15 分钟)
仿照 self.dog.forward(见 xiaozhi-esp32/docs/mcp-usage.md),在纸上设计 5 个给鸭子的语音工具:工具名 + 一句英文描述 + 参数 + 对应行为;至少 1 个用 AddUserOnlyTool(哪个动作不该让 AI 自主触发?)。这就是选题日历第 29 天的素材(见 docs/microduck-30day/articles/editorial-calendar.md)。
自查清单
- [ ] 我能画出"语音 → 大脑 → 策略 → 关节"的分层,并说清语音在哪一层
- [ ] 我能说出 MCP 四步流程,以及 tools/list 和 tools/call 各做什么
- [ ] 我能解释 AddTool 和 AddUserOnlyTool 的区别,以及为什么重启不能让 AI 自己调
- [ ] 我知道断网时鸭子应该还能做什么(基础动作、停止、静音)
下一课预告
第 24 课是全课程的方法论总结:这只鸭子教会你的五件事,如何迁移到游戏 AI、IoT、原型、运营实验和数字孪生。
延伸资源
- MCP 工具注册与调用(本课主素材):
xiaozhi-esp32/docs/mcp-usage.md - MCP 线协议细节:
xiaozhi-esp32/docs/mcp-protocol.md - 源码地图第 9 行:
docs/microduck-30day/source-map.md