sheRuntime 黑客松 Handoff
sheRuntime 黑客松 Handoff
更新时间:2026-08-27(Asia/Tokyo)
路演时间:2026-08-29
当前阶段:比赛已经开始,所有代码均为比赛期间从零编写的最小技术探针。
1. 项目目标
sheRuntime 是一个低负担的女性身体状态记录与解释工具。核心体验:用户通过随身 StopWatch 说一句身体感受,iPhone 自动结合 Apple Health 数据与本地女性健康 Skill/知识库,调用模型生成简短、积极、非诊断式的身体观察。
黑客松版本不做完整语音助手。StopWatch 不播放 TTS;完成记录后通过震动和屏幕形象/表情变化给予即时反馈,完整分析结果显示在 iPhone。
2. 已确定的最终最小架构
1 | StopWatch |
明确不做
- 不依赖场馆 Wi-Fi:现场网络极慢且频繁掉线。
- 不使用个人热点:场馆规则禁止。
- StopWatch 不直接调用云端 API。
- 暂不做 TypeScript 服务端、云数据库、Web App。
- 暂不做豆包 TTS、StopWatch 语音播放。
- 暂不做实时 BLE 麦克风;采用“录完再传”。
- 暂不做完整多轮对话。
网络分工
- StopWatch 与 iPhone:BLE,本地连接,不经过场馆 Wi-Fi。
- iPhone 与豆包/LLM:iPhone 自身蜂窝网络。
- 本地 Skill 与 HealthKit:留在 iPhone。
3. 为什么可以使用 BLE
M5Stack StopWatch 产品规格页只宣传 2.4GHz Wi-Fi,没有把 BLE 列为产品功能,但主控 ESP32-S3R8 芯片内置 Bluetooth LE。
已经通过本次比赛期间自己编写的最小固件,在真实设备上广播 BLE,并由 iPhone 的 nRF Connect 扫描到 sheRuntime-StopWatch。因此 BLE 通路已经实机确认可用。
参考仓库 liptoxli/M5stopwatch-vibecoding 证明了 StopWatch 可以做 BLE 实时音频,但该仓库是 macOS Bridge + 实时麦克风方案。本项目受比赛规则限制,不能复制或二次开发现成仓库,只能参考架构思想并从零实现自己的协议与代码。
4. Monorepo 结构与 Git 规则
当前采用一个 GitHub monorepo,不创建嵌套 Git 仓库:
1 | she-runtime/ |
Web、Server 等目录暂时不创建,等真正实现相应功能时再随代码加入。
根目录 .gitignore 已加入或应包含:
1 | # macOS |
PlatformIO 自动生成的 include/README、lib/README、test/README 建议不提交。固件探针应提交的核心文件:
1 | firmware/stopwatch/platformio.ini |
建议的 BLE 广播探针 commit:
1 | git commit -m "feat(firmware): verify StopWatch BLE advertising" |
5. 已完成:iOS HealthKit 探针
Xcode 项目
- Product Name:
sheRuntime - Team:Personal Team
- Bundle Identifier:类似
com.arieslx.sheRuntime - Interface:SwiftUI
- Storage:SwiftData
- CloudKit:未开启
- Target 已添加
HealthKitCapability - 未开启 Clinical Health Records
- 未开启 HealthKit Background Delivery
- Health Share Usage Description:
用于读取你的步数,帮助生成身体状态摘要。
已验证链路
1 | iPhone 真机 |
真机调试时遇到 No data available for the specified predicate,已通过确认健康 App 中 sheRuntime → 步数读取权限,以及将 HealthKit errorNoData 视为 0 处理解决。最终已成功读取数据。
当前主要文件
1 | apps/ios/sheRuntime/ |
HealthKitManager.swift 使用:
1 | import Foundation |
其职责:
- 判断 HealthKit 是否可用。
- 请求步数读取权限。
- 使用
HKStatisticsQuery查询今日累计步数。 - 更新
@Published var stepCount与statusMessage。
ContentView.swift 当前通过:
1 | private var healthKitManager = HealthKitManager() |
展示状态、今日步数和“连接 Apple Health”按钮。
建议已有/应有 commit:
1 | chore: initialize iOS app |
6. 已完成:StopWatch BLE 广播探针
PlatformIO 配置
当前 firmware/stopwatch/platformio.ini:
1 | [env:m5stack-stopwatch] |
当前 BLE 广播代码
firmware/stopwatch/src/main.cpp 当前最小实现:
1 |
|
验证结果
- PlatformIO 编译成功。
- 固件上传成功。
- 串口端口:
/dev/cu.usbmodem101。 - 串口曾出现独占锁错误,通过关闭旧 Monitor/释放端口解决。
- PlatformIO Monitor 已成功连接,115200 8-N-1。
- iPhone 使用
nRF Connect for Mobile扫描到sheRuntime-StopWatch。
这表示第一阶段 BLE 硬件探针已经完成。
7. 下一步:BLE 双向消息探针
下一阶段不要马上加入录音。先从零实现一个稳定的双向 BLE 通信闭环:
1 | StopWatch 发送 VOICE_READY |
已确定 UUID
1 | Service |
推荐实施顺序
- 固件创建 Notify Characteristic 与 Write Characteristic。
- 固件暂时定时或通过简单逻辑发送
VOICE_READY,不依赖实体按键。 - Xcode 添加蓝牙权限说明。
- 新建
BluetoothManager.swift,使用 CoreBluetooth 扫描sheRuntime-StopWatch。 - 自动连接并发现上述 Service/Characteristics。
- 订阅 Notify,收到
VOICE_READY后更新 iPhone UI。 - iPhone 写回
SUCCESS。 - 固件 Write Callback 收到后串口打印
SUCCESS。 - 完整往返连续成功三次,再接 StopWatch 按键、震动与屏幕。
8. 后续探针顺序
严格逐层验证,不要同时加入多个变量:
Probe 2:BLE 双向文字消息
成功标准:VOICE_READY → SUCCESS 连续完成三次。
Probe 3:麦克风采样到 PSRAM
- StopWatch 没有 SD 卡。
- 使用 8MB PSRAM 临时保存 PCM。
- 建议格式:16kHz、单声道、16-bit PCM。
- 5 秒约 160KB,10 秒约 320KB。
- 第一轮只验证录音字节数和音频有效性。
Probe 4:BLE 传输固定二进制
先传固定二进制缓冲区,iPhone 统计字节数并校验完整性;不要直接把麦克风、BLE、ASR一起调。
建议最小消息类型:
1 | META:录音 ID、总字节、采样率 |
Probe 5:真实 PCM → iPhone
StopWatch 录制短 PCM,BLE 分片发送;iPhone 重组后补 WAV Header,并验证能够播放或上传。
Probe 6:豆包 ASR
iPhone 使用自身蜂窝网络把 WAV/PCM 提交给豆包 ASR,获得转写文字。
Probe 7:核心产品闭环
1 | StopWatch 语音 |
9. StopWatch 状态设计
比赛版只需要少量状态:
| 状态 | 屏幕反馈 | 震动 |
|---|---|---|
| IDLE | 平静呼吸 | 无 |
| LISTENING | 认真倾听 | 开始时轻振 |
| SENDING | 流动/等待 | 无 |
| PROCESSING | 思考表情 | 无 |
| SUCCESS | 点头、放松或微笑 | 短振两次 |
| RETRY | 温和困惑 | 短振三次 |
StopWatch 不显示完整 AI 文本,不用 TTS。完整结果留在 iPhone。
10. 本地 Skill 与模型调用方向
比赛版计划将 Markdown Skill/知识卡随 iOS App 打包,本地按关键词检索相关卡片,再与 HealthKit 数据、ASR 转写一起构造 Prompt。
最小结构可以是:
1 | apps/ios/sheRuntime/ |
普通模型 API 不会自动运行 SKILL.md。App 需要自己加载相关 Markdown,将选中的知识内容放入 Prompt。
黑客松可采用 BYOK:在 App 内运行时输入 API Key,并保存到 iOS Keychain;禁止把 Key 硬编码进 Swift、ESP32 固件或 Git。
11. 路演策略
- 29 日以自己的 iPhone 真机本地运行和投屏为主。
- 当前是 Personal Team,TestFlight 分发不是主方案。
- 路演正式链路使用 StopWatch BLE + iPhone 蜂窝网络。
- 准备一段完整成功流程录屏。
- ASR/LLM 网络失败时允许使用预置转写和本地基础观察作为明确标注的降级演示。
12. 给下一会话的直接任务
请继续指导并实现 Probe 2:StopWatch 与 sheRuntime iPhone App 的 BLE 双向消息。用户第一次开发 Apple App,需要逐步说明:点击哪个文件、在哪里新建文件、粘贴什么代码、如何编译、如何真机测试。不要一次引入音频、ASR或屏幕驱动。
验收目标:
1 | StopWatch Notify:VOICE_READY |