小智AI框架全景解析:从设备端语音交互到MCP协议全链路
项目地址:GitHub - xiaozhi-esp32 | 28.4k Stars | 6.4k Forks
小智AI(xiaozhi-esp32)是一个开源的 AI 语音交互机器人框架,由社区开发者 78 主导,基于 ESP32 系列芯片构建。它将大语言模型的语音能力搬到了嵌入式设备上,并通过 MCP 协议实现了对物理世界的设备控制。
系统全景
code
┌─────────────────────────────────────────────────────────┐
│ 用户 │
│ "小智小智,把灯打开" │
└──────────────────────┬──────────────────────────────────┘
│ 语音输入
▼
┌─────────────────────────────────────────────────────────┐
│ ESP32 设备端 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │
│ │ ESP-SR │ │ Opus编码 │ │ LVGL │ │ MCP │ │
│ │ 唤醒词检测│ │ 音频压缩 │ │ UI表情 │ │ Server │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬────┘ │
│ │ │ │ │ │
│ │ ┌──────┴──────┐ │ │ │
│ │ │ WebSocket / │ │ │ │
│ │ │ MQTT+UDP │ │ │ │
│ │ └──────┬──────┘ │ │ │
└───────┼─────────────┼─────────────┼─────────────┼───────┘
│ │ │ │
│ ▼ ▼ │
│ ┌────────────────────────────┐ │
│ │ 后端服务器 │ │
│ │ ┌──────┐ ┌────┐ ┌─────┐ │ │
│ │ │ ASR │→│LLM│→│ TTS │ │ │
│ │ └──────┘ └────┘ └─────┘ │ │
│ │ ┌──────────────────────┐ │ │
│ │ │ MCP Client │◄─┤──────┤
│ │ │ tools/list、call │ │ │
│ │ └──────────────────────┘ │ │
│ └────────────────────────────┘ │
│ │
▼ ▼
┌──────────────┐ ┌──────────────────┐
│ OTA 升级 │ │ IoT 设备控制 │
│ LCD 表情显示 │ │ 灯光/LED/舵机 │
│ 声音播放 │ │ 传感器/GPIO │
└──────────────┘ └──────────────────┘
第一层:ESP32 设备端
硬件能力
| 功能 | 技术方案 | 说明 |
|---|---|---|
| 唤醒词 | ESP-SR | 离线运行,可自定义唤醒词 |
| 音频输入 | I2S 麦克风 | 16kHz 单声道,可扩展双麦 AEC |
| 音频输出 | I2S 扬声器 | Opus 解码后播放 |
| 音频编码 | Opus 16kHz/60ms帧 | 低带宽、低延迟 |
| 屏幕 | LVGL OLED/LCD | emoji 表情、中日英文字体 |
| 摄像头 | OV2640/OV5640 | 视觉理解输入 |
| 语音识别 | 3D-Speaker | 声纹识别,区分不同说话人 |
| 联网 | WiFi / 4G(ML307) / 以太网 / USB RNDIS | 多模联网 |
| 配网 | 热点配网 / 声波配网 / BluFi | 三种配网方式 |
支持的芯片平台
| 芯片 | 版本 |
|---|---|
| ESP32 | 经典款 |
| ESP32-S3 | 主力平台,支持摄像头+LCD |
| ESP32-C3 | 超低成本 RISC-V |
| ESP32-C5 | 双频 WiFi 6 |
| ESP32-C6 | BLE 5.3 |
| ESP32-P4 | 新一代高性能 |
支持 138+ 种板型,172 个发布变体。
设备状态机(10 种状态)
正在渲染图表...
代码定义在 main/device_state.h:
cpp
enum DeviceState {
kDeviceStateUnknown,
kDeviceStateStarting,
kDeviceStateWifiConfiguring,
kDeviceStateIdle,
kDeviceStateConnecting,
kDeviceStateListening,
kDeviceStateSpeaking,
kDeviceStateUpgrading,
kDeviceStateActivating,
kDeviceStateAudioTesting,
kDeviceStateFatalError,
};
第二层:WebSocket 通信协议
完整交互流程
code
1. 设备 → 服务器: hello(握手,声明能力)
{ type:"hello", version:1, features:{mcp:true}, audio_params:{...} }
2. 服务器 → 设备: hello_ack(确认连接)
{ type:"hello", session_id:"xxx", audio_params:{...} }
3. 设备 → 服务器: listen start(开始麦克风捕获)
{ type:"listen", state:"start", mode:"auto" }
随后持续发送二进制 Opus 音频帧
4. 服务器 → 设备: stt(语音识别结果)
{ type:"stt", text:"用户说的话" }
5. 服务器 → 设备: tts start/stop(TTS 播放控制)
{ type:"tts", state:"start" }
服务器发送 Opus 音频帧(下行)
{ type:"tts", state:"stop" }
6. 服务器 → 设备: llm(表情/情绪)
{ type:"llm", emotion:"happy", text:"😀" }
三种二进制协议
| 版本 | 结构 | 用途 |
|---|---|---|
| v1 | 裸 Opus 帧 | 最简单 |
| v2 | 16字节头 + 时间戳 + 载荷 | 服务端 AEC 回声消除 |
| v3 | 4字节轻量头 + 载荷 | 低开销 |
cpp
// v2 带时间戳(服务端 AEC)
struct BinaryProtocol2 {
uint16_t version; // 协议版本
uint16_t type; // 0=Opus, 1=JSON
uint32_t reserved;
uint32_t timestamp; // ms 时间戳
uint32_t payload_size;
uint8_t payload[];
} __attribute__((packed));
第三层:MCP 设备控制协议
协议架构
小智 AI 使用 MCP(Model Context Protocol) 实现 LLM 对设备能力的发现和调用。设备作为 MCP Server,后端作为 MCP Client。
code
后端(MCP Client) 设备(MCP Server)
│ │
│ tools/list ────────────────────→│ 发现所有可用工具
│ ←───────────────────── 工具列表 │
│ │
│ tools/call("灯.开") ────────────→│ AI 决定执行动作
│ ←──────────────────── 执行结果 │
│ │
│ ←──── notifications/state ─────│ 设备主动通知状态变化
JSON-RPC 2.0 消息格式
MCP 消息用 type:"mcp" 包裹,内层是标准 JSON-RPC 2.0:
json
{
"session_id": "abc123",
"type": "mcp",
"payload": {
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "self.light.set_rgb",
"arguments": { "r": 255, "g": 0, "b": 0 }
},
"id": 1
}
}
设备暴露的工具(30+种)
| 工具命名空间 | 示例方法 |
|---|---|
self.get_device_status | 获取设备状态 |
self.audio_speaker.set_volume | 设置音量 |
self.light.set_rgb | 控制 RGB 灯 |
self.servo.set_angle | 舵机角度 |
self.gpio.set_level | GPIO 电平 |
self.camera.capture | 拍照 |
self.display.show_text | 显示文字 |
self.network.get_info | 网络状态 |
两种工具类型:
| 类型 | 注册方式 | 可见性 | 示例 |
|---|---|---|---|
| 普通工具 | AddTool() | AI 可直接调用 | 开灯、调音量 |
| 用户工具 | AddUserOnlyTool() | 需指定 withUserTools=true | 重启、固件升级 |
第四层:服务器端(三种实现)
官方服务器地址:xiaozhi.me,开源实现有:
| 语言 | 仓库 |
|---|---|
| Python | xinnan-tech/xiaozhi-esp32-server |
| Java | joey-zhou/xiaozhi-esp32-server-java |
| Go | AnimeAIChat/xiaozhi-server-go |
服务器核心职能:
- 接收 hello,建立 session
- ASR 语音识别(云端大模型)
- LLM 推理(Qwen / DeepSeek)
- TTS 合成 → Opus 编码 → 下发播放
- MCP Client:根据 LLM 决定的动作调用设备工具
第五层:跨平台客户端
除了 ESP32 固件,还有多平台客户端实现:
| 平台 | 实现 |
|---|---|
| Python | py-xiaozhi(桌面测试客户端) |
| Android | xiaozhi-android-client |
| Linux | xiaozhi-linux(百问网出品) |
| 蓝牙芯片 | xiaozhi-sf32(思丰) |
| QuecPython | solution-xiaozhiAI(移远) |
所有客户端使用同一套 WebSocket 协议,可与任意服务器互通。
完整对话数据流
code
用户说 "小智小智"
│
▼
ESP32 ESP-SR 离线唤醒检测
│
├─ 唤醒词命中 → ① 设备状态: Idle → Connecting
│
▼
WebSocket 连接 + hello 握手
│
├─ Device → Server: { type:"hello", features:{mcp:true}, audio_params:{...} }
├─ Server → Device: { type:"hello", session_id:"xxx" }
│
▼
② 设备状态: Connecting → Listening
│
├─ Device → Server: { type:"listen", state:"start" }
├─ Device ⇢ Server: [Opus 音频帧持续上传]
│
▼
服务器 ASR 识别
│
├─ Server → Device: { type:"stt", text:"把灯打开" }
│
▼
LLM 推理决策
│
├─ 理解意图 → 调用 MCP 工具: self.light.set_rgb
├─ Server → Device: { type:"mcp", method:"tools/call", ... }
├─ Device → Server: { type:"mcp", result:{ isError:false } }
│
▼
③ 设备状态: Listening → Speaking
│
├─ Server → Device: { type:"tts", state:"start" }
├─ Server ⇢ Device: [Opus TTS 音频下行]
├─ Server → Device: { type:"tts", state:"stop" }
│
▼
④ 设备状态: Speaking → Idle
│
├─ LVGL 显示 😀 表情
└─ 等待下一次唤醒
核心特性总结
| 维度 | 实现 |
|---|---|
| 唤醒 | ESP-SR 离线,可自定义唤醒词 |
| 传输 | WebSocket / MQTT+UDP |
| 音频 | Opus 16kHz/60ms, AEC 回声消除 |
| 视觉 | 摄像头 + LVGL LCD emoji |
| 控制 | MCP 协议 (JSON-RPC 2.0) |
| 识别 | 3D-Speaker 声纹识别 |
| 芯片 | 6 款 ESP32 系列 |
| 板型 | 138+ 官方适配 |
| 配网 | 热点/声波/BluFi |
| 语言 | 38 种界面语言 |
| 服务器 | Python / Java / Go 三种实现 |
| 客户端 | ESP32 / Python / Android / Linux |
| 许可 | MIT 开源,可商用 |
总结
小智AI不是一个简单的语音助手demo,而是一个完整的端到端AI硬件平台:
- 协议标准化:WebSocket + JSON-RPC 2.0 + MCP,所有客户端共享同一套接口
- 能力抽象化:MCP 工具模型让 LLM 能像调用函数一样控制物理设备
- 跨平台统一:6种芯片、138+板型、4种客户端,一套协议全兼容
- 生产级工程:10态状态机、AEC回声消除、OTA升级、多模联网
- 开源生态:28.4k Star,6.4k Fork,3种语言服务器,活跃社区
评论 (0)