Journal Article

小智AI框架全景解析:从设备端语音交互到MCP协议全链路

17 min3 views

小智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/LCDemoji 表情、中日英文字体
摄像头OV2640/OV5640视觉理解输入
语音识别3D-Speaker声纹识别,区分不同说话人
联网WiFi / 4G(ML307) / 以太网 / USB RNDIS多模联网
配网热点配网 / 声波配网 / BluFi三种配网方式

支持的芯片平台

芯片版本
ESP32经典款
ESP32-S3主力平台,支持摄像头+LCD
ESP32-C3超低成本 RISC-V
ESP32-C5双频 WiFi 6
ESP32-C6BLE 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 帧最简单
v216字节头 + 时间戳 + 载荷服务端 AEC 回声消除
v34字节轻量头 + 载荷低开销
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_levelGPIO 电平
self.camera.capture拍照
self.display.show_text显示文字
self.network.get_info网络状态

两种工具类型:

类型注册方式可见性示例
普通工具AddTool()AI 可直接调用开灯、调音量
用户工具AddUserOnlyTool()需指定 withUserTools=true重启、固件升级

第四层:服务器端(三种实现)

官方服务器地址:xiaozhi.me,开源实现有:

语言仓库
Pythonxinnan-tech/xiaozhi-esp32-server
Javajoey-zhou/xiaozhi-esp32-server-java
GoAnimeAIChat/xiaozhi-server-go

服务器核心职能:

  1. 接收 hello,建立 session
  2. ASR 语音识别(云端大模型)
  3. LLM 推理(Qwen / DeepSeek)
  4. TTS 合成 → Opus 编码 → 下发播放
  5. MCP Client:根据 LLM 决定的动作调用设备工具

第五层:跨平台客户端

除了 ESP32 固件,还有多平台客户端实现:

平台实现
Pythonpy-xiaozhi(桌面测试客户端)
Androidxiaozhi-android-client
Linuxxiaozhi-linux(百问网出品)
蓝牙芯片xiaozhi-sf32(思丰)
QuecPythonsolution-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硬件平台

  1. 协议标准化:WebSocket + JSON-RPC 2.0 + MCP,所有客户端共享同一套接口
  2. 能力抽象化:MCP 工具模型让 LLM 能像调用函数一样控制物理设备
  3. 跨平台统一:6种芯片、138+板型、4种客户端,一套协议全兼容
  4. 生产级工程:10态状态机、AEC回声消除、OTA升级、多模联网
  5. 开源生态:28.4k Star,6.4k Fork,3种语言服务器,活跃社区