AIWatch — ESP32-S3 AI 语音可穿戴终端
·


AIWatch 是一款基于 ESP32-S3 微控制器的开源 AI 可穿戴设备固件。它通过 WebSocket 连接 OpenClaw AI 网关,以自然语音交互实现端到端语音对话、MP3 音乐播放和远程设备控制。
📌 当前阶段: DVT(设计验证测试)— v0.1.0-beta
📷 概述
AIWatch 将 ESP32-S3 开发板变成以语音为先的 AI 伴侣。用唤醒词(例如"你好小智")唤醒它,自然说话,即可通过 TTS 获得 AI 语音回复。它是 Rabbit R1 和 Humane AI Pin 等封闭平台的开源替代品——低成本、隐私可控、完全可自由修改。
┌───────────────────────────────────────────────────────┐
│ AIWatch Device │
│ ┌─────────┐ ┌──────────┐ ┌────────────────────┐ │
│ │ Wake │ │ STT │ │ OpenClaw Client │ │
│ │ Word │─▶│ (MiMo) │─▶│ (WebSocket JSON) │──┼──▶ OpenClaw
│ │ (ESP-SR)│ │ │ │ │ │ Gateway
│ └─────────┘ └──────────┘ └────────────────────┘ │
│ ▲ │ │
│ │ ▼ │
│ ┌────┴──────┐ ┌──────────┐ │
│ │ I2S Mic │ │ TTS │ │
│ │ (ES7210) │ │ (MiMo) │ │
│ └───────────┘ └────┬─────┘ │
│ │ │
│ ▼ │
│ ┌──────────┐ │
│ │ I2S Spkr │ │
│ │ (ES8311) │ │
│ └──────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ LVGL UI │ │ MP3 │ │ Web Server │ │
│ │ (AMOLED) │ │ Player │ │ (Config & API) │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
└───────────────────────────────────────────────────────┘
🎯 功能特性
语音 AI 对话
- 离线唤醒词:ESP-SR WakeNet 引擎(如"你好小智")或 MultiNet 自定义短语——引擎与短语均可通过 menuconfig 选择,无需云端依赖
- 语音转文字(STT):小米 MiMo-V2.5-ASR,HTTP REST API(兼容 OpenAI 格式)
- 文字转语音(TTS):小米 MiMo-V2.5-TTS,HTTP SSE 流式输出——支持多音色
- 智能 VAD:自适应噪声校准、静音检测(默认 1.5s,连续对话模式延长至 15s)、最大 25s 录音缓冲
- 设备命令:AI 可控制设备——
[DEVICE:volume=80]、[DEVICE:brightness=70]、[DEVICE:mp3=play:song.mp3]等
用户界面
- AMOLED 屏幕:410×502 AMOLED 面板,LVGL 9.x 深色主题 UI(iOS / HarmonyOS 风格,纯黑背景)
- 灵动岛(Dynamic Island):顶部胶囊(250×44,圆角胶囊)显示当前状态文字,带状态色辉光边框;WiFi 图标与 OpenClaw 连接光点与胶囊同一行左右排列(距边缘 50px,与胶囊垂直中心对齐,避开圆角裁剪区域)
- 每状态内容:15 个状态每个最多显示 3 个元素——主标题 + 中文副标题 + 一条滚动文本(状态互斥,不重叠)
- 待机时钟:120px 特粗体时钟 + 下方中文日期(如
2025年8月13日 星期三) - 波形动画:LISTENING(录音中)状态渲染 16 条动态音频波形
- 滚动字幕:统一单行左滚文本(10 px/s),由 LLM 回复(白色)、STT 转写(黄色
#FF9F0A)、TTS 字幕(蓝色#0A84FF)共用 - MP3 播放器 UI:全屏覆盖层——珊瑚红光环、渐变专辑封面、选曲模式(滑动浏览 · 双击确认)
- 触摸交互:点击 MP3 覆盖层切换播放/暂停;滑动 + 双击选曲
音频播放
- MP3 播放器:播放 microSD 卡中的 MP3 文件(
/sdcard/mp3/),支持播放列表 - I2S 音频:共享 I2S 总线——ES8311 DAC(扬声器)与 ES7210 ADC(双麦克风)
- 优先级仲裁:录音 > MP3 > TTS > 通知——保证音频切换干净无冲突
网络
- WiFi:Station 模式自动重连 + AP 模式配合强制门户(captive portal)配网
- Web 服务器:80 端口的 HTTP 配置界面与 REST API
- SNTP:自动时间同步
系统
- 设置:通过 NVS(非易失存储)持久化配置
- 错误日志:带严重级别的结构化错误追踪
- 内存监控:周期性 DRAM/PSRAM 健康检查
- 电源管理:CPU 频率缩放(80–240MHz)、可配置休眠超时(
[DEVICE:sleep=N]分钟)、CLI 深睡 - 串口 CLI:通过 USB-C 的交互式命令行
🛠️ 支持的硬件
主目标板:Waveshare ESP32-S3-Touch-AMOLED-2.06
| 组件 | 规格 |
|---|---|
| MCU | ESP32-S3R8(双核 Xtensa LX7 @ 240MHz) |
| Flash | 32MB(QSPI) |
| PSRAM | 8MB(Octal SPI) |
| 屏幕 | 410×502 QSPI AMOLED(CO5300 / SH8601 驱动) |
| 触摸 | FT3168 电容触摸(I2C) |
| 音频 DAC | ES8311(扬声器输出,I2S) |
| 音频 ADC | ES7210(4 通道麦克风输入,I2S) |
| IMU | QMI8658 六轴(加速度计 + 陀螺仪) |
| PMU | AXP2101 电源管理 |
| RTC | PCF85063 |
| SD 卡 | microSD(SPI 模式) |
| 按键 | BOOT(GPIO0)+ PWR(AXP2101 管理) |
其他支持板卡
- Waveshare ESP32-S3-AUDIO-Board:1.47" IPS LCD(172×320)、7× WS2812 RGB 灯环、OV2640 摄像头硬件(当前固件无摄像头驱动)、TCA9555 IO 扩展
- Seeed Studio SenseCAP Watcher:ESP32-S3、SPD2010 屏幕(遗留支持)
- M5StickC Plus2:ESP32-PICO-V3-02(遗留支持)
📋 准备工作
硬件
- Waveshare ESP32-S3-Touch-AMOLED-2.06(或其他受支持板卡)
- USB-C 数据线(烧录与串口控制台)
- microSD 卡(用于 MP3 文件与聊天记录)
- 可选:外接扬声器(音频输出)
软件
- ESP-IDF v5.5+ 与 ESP32-S3 工具链
git clone -b v5.5 --recursive https://github.com/espressif/esp-idf.git cd esp-idf && ./install.sh esp32s3 && . ./export.sh
外部服务(需要 API 密钥)
- OpenClaw 网关:自托管 AI 网关(WebSocket 服务器)
- 小米 MiMo API:STT(ASR)与 TTS 服务——到 platform.xiaomimimo.com 获取 API 密钥
🚀 快速开始
1. 克隆仓库
git clone <repo-url> AIWatch
cd AIWatch
2. 配置构建目标
# 确保使用 ESP32-S3 目标
idf.py set-target esp32s3
3. 通过 Menuconfig 配置
idf.py menuconfig
进入 AIWatch Application Configuration:
- 选择
Waveshare ESP32-S3-Touch-AMOLED-2.06作为目标板卡 - 选择唤醒词引擎(推荐 WakeNet)
- 设置 OpenClaw 网关主机与端口
4. 配置 API 密钥
从示例创建 main/include/secrets.h:
cp main/include/secrets.h.example main/include/secrets.h
编辑 secrets.h 设置:
- WiFi SSID 与密码
- STT / TTS 的 MiMo API 密钥
- OpenClaw 设备凭据(ED25519 密钥)
5. 准备 SD 卡
将 microSD 卡格式化为 FAT32 并创建如下目录结构:
/sdcard/
├── mp3/ # MP3 音乐文件
└── notes/ # 每日聊天记录(自动创建)
6. 编译与烧录
idf.py build
idf.py -p /dev/ttyACM0 flash monitor
或使用便捷编译脚本:
./build_audio_board.sh
🧭 状态机
应用以 15 态有限状态机运行:
| # | 状态 | 说明 |
|---|---|---|
| 0 | SLEEP |
屏幕关闭 / 深睡(低功耗) |
| 1 | ARMED |
系统初始化完成,等待中 |
| 2 | BOOT |
系统启动 / 初始化 |
| 3 | CONNECTING |
连接 OpenClaw |
| 4 | IDLE |
就绪,等待唤醒词 |
| 5 | LISTENING |
录制用户语音 |
| 6 | SENDING |
上传音频至 STT |
| 7 | THINKING |
等待 AI 回复 |
| 8 | STREAMING |
接收流式回复 |
| 9 | RESPONSE |
收到完整回复 |
| 10 | TTS_LOADING |
准备 TTS 音频 |
| 11 | TTS_PLAYING |
播放 TTS 音频 |
| 12 | PLAYING_MP3 |
MP3 音乐播放 |
| 13 | NOTIFYING |
网关通知 |
| 14 | ERROR |
错误状态 |
正常流程:BOOT → CONNECTING → IDLE → (唤醒词) → LISTENING → SENDING → THINKING → STREAMING → RESPONSE → TTS_LOADING → TTS_PLAYING → IDLE
⌨️ 串口 CLI 命令
通过 USB-C 串口(115200 波特率)连接,输入 help(括号内为别名):
| 命令 | 说明 |
|---|---|
help(h、?) |
显示 AIWatch 命令参考 |
status(s) |
显示设备状态 |
talk(t) |
开始语音对话 |
say <text> |
向 AI 发送文本 |
abort |
中止当前对话 |
details(d) |
请求 OpenClaw 完整详情 |
play(p) |
朗读上一条回复 |
quiet(q) |
切换 ESP_LOG* 输出抑制 |
wake(w) |
唤醒屏幕 |
deepsleep |
进入深睡 |
reboot(restart) |
重启设备 |
wifi <ssid> <pass> |
设置 WiFi 凭据 |
web |
切换 Web 管理服务器 |
tasks |
打开任务界面 |
cron-add-test |
添加测试定时任务 |
cron-remove <id> |
删除定时任务 |
mp3 |
打开 MP3 播放器界面 |
mp3list |
列出 SD 卡上的 MP3 文件 |
mp3play <file> |
播放 MP3 文件 |
mp3stop |
停止 MP3 播放 |
mp3pause |
暂停 MP3 播放 |
mp3resume |
恢复 MP3 播放 |
🎮 设备命令(AI 控制)
AI 可以发送格式为 [DEVICE:command] 的设备命令:
| 命令 | 说明 |
|---|---|
volume=N |
设置扬声器音量(0-100) |
brightness=N |
设置屏幕亮度(0-100) |
rgb=off/on/rainbow/aurora/starfield/fire/ocean/R,G,B |
控制 RGB 灯环(仅音频板) |
sleep=N |
设置休眠超时为 N 分钟(0 = 永不休眠) |
reboot |
重启设备 |
webserver=on/off |
切换 Web 管理服务器 |
auto_read=on/off |
切换 AI 回复自动朗读 |
mp3=play:<file> |
按文件名播放 MP3 |
mp3=stop |
停止 MP3 播放 |
mp3=pause / mp3=resume |
暂停 / 恢复播放 |
mp3=show |
显示当前播放列表 |
mp3=scan(或 mp3=list) |
重新扫描 SD 卡中的 MP3 |
chatlog=query:date |
读取某日期(YYYY-MM-DD)的聊天记录并请 AI 总结 |
widget=<json> / card=<json> |
保留命令——当前固件忽略 |
🏗️ 项目结构
AIWatch/
├── main/ # 应用入口与核心逻辑
│ ├── app_main.c # 系统初始化与主事件循环
│ ├── app_state.c # 全局状态、设备命令解析、MP3 管理
│ ├── app_state_machine.c # FSM 与资源仲裁
│ ├── app_tasks.c # 后台任务(旋钮、TTS、状态、休眠)
│ ├── voice_chat.c # 录音 → STT → VAD 流水线
│ ├── serial_cmd.c # 串口 CLI REPL
│ ├── mem_monitor.c # 内存监控
│ └── include/ # 应用配置、密钥、全局变量
│
├── components/ # 可复用 ESP-IDF 组件库
│ ├── board/ # 硬件抽象(多板支持)
│ ├── wifi_manager/ # WiFi + 强制门户
│ ├── openclaw/ # OpenClaw WebSocket 客户端(ED25519 认证)
│ ├── stt/ # 语音转文字(MiMo ASR)
│ ├── tts/ # 文字转语音(MiMo TTS)
│ ├── wake_word/ # ESP-SR 唤醒词检测
│ ├── ui/ # LVGL 用户界面
│ ├── mp3_player/ # SD 卡 MP3 播放器
│ ├── notes_manager/ # SD 卡聊天记录
│ ├── settings/ # NVS 持久化设置
│ ├── error_log/ # 结构化错误日志
│ ├── webserver/ # HTTP 配置服务器
│ ├── ed25519_lib/ # ED25519 加密库
│ ├── esp_audio_codec/ # 音频编解码(MP3、AAC、FLAC 等)
│ ├── esp_audio_simple_player/ # 基于 GMF 的音频播放流水线
│ ├── gmf_core/ # 通用媒体框架核心
│ ├── gmf_audio/ # GMF 音频处理单元
│ ├── gmf_io/ # GMF I/O 模块
│ └── sscma_client/ # SSCMA / TensorFlow Micro 客户端
│
├── partitions.csv # Flash 分区表(32MB 布局)
├── sdkconfig.defaults # ESP-IDF SDK 配置默认值
├── CMakeLists.txt # 根 CMake(ESP-IDF v5.5+)
└── build_audio_board.sh # 便捷编译脚本
📄 Flash 分区布局(32MB)
| 分区 | 类型 | 大小 | 用途 |
|---|---|---|---|
| nvs | data | 24KB | 非易失设置存储 |
| phy_init | data | 4KB | PHY 校准数据 |
| factory | app | 8MB | 应用固件 |
| model | spiffs | 960KB | 唤醒词模型文件 |
| storage | spiffs | 2MB | 应用数据与日志 |
🔧 关键依赖
| 组件 | 版本 | 用途 |
|---|---|---|
| ESP-IDF | v5.5.3 | RTOS 与外设框架 |
| LVGL | v9.5.0 | 嵌入式 GUI 库 |
| esp-sr | v1.9.5 | 语音识别(WakeNet) |
| esp_lvgl_port | v2.8.0 | LVGL-ESP 集成 |
| esp_codec_dev | v1.5.10 | 音频编解码设备驱动 |
| esp_websocket_client | v1.1.0 | WebSocket 客户端 |
| led_strip | v2.5.5 | WS2812 LED 控制 |
| esp32_s3_touch_amoled_2_06 | v1.0.7 | Waveshare AMOLED BSP |
| esp_lcd_sh8601 | v2.0.0 | SH8601 AMOLED 屏幕驱动 |
🤝 参与贡献
欢迎贡献!请遵循以下步骤:
- Fork 本仓库
- 创建特性分支(
git checkout -b feature/amazing-feature) - 提交你的修改(
git commit -m 'Add amazing feature') - 推送分支(
git push origin feature/amazing-feature) - 发起 Pull Request
📝 许可证
本项目基于 MIT 许可证开源。详见 LICENSE 文件。
SPDX-FileCopyrightText: 2024-2026 AIWatch Contributors
SPDX-License-Identifier: MIT
🙏 致谢
- Waveshare — 优秀的 ESP32-S3 开发板与 BSP
- Espressif — ESP-IDF 框架与 ESP-SR 语音识别
- LVGL — 轻量而强大的嵌入式图形库
- OpenClaw — 支持多模态 LLM 交互的 AI 网关协议
- 小米 MiMo — 语音转文字与文字转语音 API 服务
由 AIWatch Contributors 用 ❤️ 构建
更多推荐




所有评论(0)