在这里插入图片描述
在这里插入图片描述

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(括号内为别名):

命令 说明
helph? 显示 AIWatch 命令参考
statuss 显示设备状态
talkt 开始语音对话
say <text> 向 AI 发送文本
abort 中止当前对话
detailsd 请求 OpenClaw 完整详情
playp 朗读上一条回复
quietq 切换 ESP_LOG* 输出抑制
wakew 唤醒屏幕
deepsleep 进入深睡
rebootrestart 重启设备
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 屏幕驱动

🤝 参与贡献

欢迎贡献!请遵循以下步骤:

  1. Fork 本仓库
  2. 创建特性分支(git checkout -b feature/amazing-feature
  3. 提交你的修改(git commit -m 'Add amazing feature'
  4. 推送分支(git push origin feature/amazing-feature
  5. 发起 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 用 ❤️ 构建

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐