最近买了块 M5Stack StickS3,一百多块钱。
它很小,带屏幕、按钮、Wi-Fi、麦克风、扬声器和电池。
单看参数,它是一个全能的可以塞进口袋里的 ESP32的开发板。

但如果把它和桌面端 Codex 连起来,它就可以变成一个很有意思的“AI 工作状态控制器”。
我最后做出来的效果是:
屏幕上能显示 Codex 当前状态:待命、运行中、已完成、离线等。
能显示 Codex 5 小时和 7 天额度。
Codex完成任务之后,会有提示音告知。

长按设备上的蓝色按钮,可以语音输入。
松开按钮后,语音会被识别成文字,自动填入桌面端 Codex。
支持自动按 Enter,语音说完后直接让 Codex 执行。
已关注关注重播 分享 赞设备上还有一个 Result 页面,可以翻页查看最近一次 Codex 回复。

这篇文章就记录一下这个小产品从想法到实现的过程。
为什么要做一个实体 Codex 控制器
第一,尝试做嵌入式开发的小起点。
这点是最原始的动力。毕竟这个codex的小助手做出来也算是点脱裤子放屁的美丽的小废物。但是这给了我用AI做嵌入式开发的信心,也算是为以后做些其他的小东西打下基础吧。
第二,额度可见。
Codex 的 5 小时和 7 天额度对重度使用很重要。把额度显示在小屏上,小玩意放到桌面,随时可以查看,比每次自己去电脑端点账号、点剩余用量等操作找状态更方便。
第三,快速语音输入。
很多时候我脑子里已经想好了要让 Codex 做什么,但有其他事情忙,懒得切窗口、点输入框、打字。按住一个实体按钮说话,松手后直接识别并提交,这个交互非常自然。
第四,结果回看。
Codex 的回答有时很长,但我不一定一直盯着电脑。让小屏幕显示最近一次回答摘要,哪怕只是几页短文本,也很适合做“低打扰”的结果提示。
整体架构
这个方案里,StickS3 不直接访问 Codex,也不直接访问云端 AI 服务。
它只和电脑上的本地 bridge 通信。

这样的好处是:
设备端逻辑简单
API key、token、桌面输入权限都留在电脑上
以后换 ASR、换输入方式、换状态来源,不需要大改固件
StickS3 只需要稳定连上电脑 bridg
电脑端 bridge 做了什么
bridge 是整个系统的中枢。
它主要负责四件事。
第一,提供 HTTP API。
StickS3 会轮询:
GET /state也会在按钮、录音等事件发生时调用:
POST /eventPOST /recording/startPOST /recording/audioPOST /recording/stop
第二,观察 Codex 状态和额度。
bridge 会读取本机 Codex 的活动状态和会话信息,同时通过 Codex app-server 获取额度。现在设备上显示的 5H、7D 额度就是这么来的。
第三,处理语音识别。
StickS3 上传音频后,bridge 负责调用 ASR,把音频变成文字。
第四,把文字输入到桌面端 Codex。
这里没有用慢速逐字输入,而是用 Windows 原生剪贴板 API,先把文字写入剪贴板,再触发粘贴。这样速度明显更快,也更接近正常用户输入。
固件端做了什么
StickS3 固件主要负责硬件交互。
它做的事情包括:
现在固件里还加了中文字体,否则中文会显示成方块。
Result 页用的是 GB2312 字体,覆盖大部分常用中文。它不是完整 Unicode 字库,所以遇到极少数字符仍然可能显示不出来。考虑到 StickS3 的固件体积和屏幕大小,这个折中目前够用。
开源项目与作者
这个项目基于开源方案继续改造和适配。
原始开源项目:
https://github.com/GaryGaryyy/VibeStick作者 GitHub:
https://github.com/GaryGaryyy如果你也想复现或继续改造,可以从这个仓库开始看。
另外这个小设备淘宝上搜索M5stack StickS3即可,149块不加运费。
源方案的功能没有这个那么多,而且是基于MacOS进行的适配。本文里的 Windows 适配、语音自动提交、Result 页翻页、中文字体和稳定性修复,是在这个开源方案基础上继续扩展出来的。
夜雨聆风