joeblau/subvox
硬件与物联网一个 macOS 原型,验证 AirPods Pro 的头部运动数据能否把默念的口型转成文字。
项目介绍
Subvox 是一个 macOS 原型,用来验证 CMHeadphoneMotionManager 提供的耳机头部运动数据是否包含足够信息,能把无声默念的词分类成文字。它不使用语言模型:识别是小词表模板匹配,再配一个统计检验,判断运动信号是否真的能把你的词与随机标签区分开。
界面分三页。Sensors 实时绘制用户加速度、旋转率和姿态,显示采样率,提供麦克风输入选择和电平表,并能录制实验会话。Train 里选一个词,按住空格默念再松开,每次录制存为一个模板;Evaluate 会做留一法分类和 500 次标签置换检验,给出准确率与随机水平的对比、p 值和混淆矩阵,特征勾选框还能测试加速度、旋转、姿态各自承载多少信号。Decode 负责运动到文字的实时匹配,每段用 DTW 与模板比对后写入转写结果,旁边同步显示麦克风转写作对照。
解码流程是:先对运动流分段(CaptureController),再逐帧提取特征(MotionFeatures),然后用基于 Sakoe–Chiba 带的 1-最近邻 DTW 匹配(DTW、TemplateClassifier),最后由 Evaluation 判断显著性。最优距离超过 max distance,或与次优模板的差距低于 min confidence 时,该段会被拒绝。详细说明见 解码机制。
快速使用
前提:macOS 14 以上;AirPods Pro 或其它支持头部追踪的耳机,并作为 Mac 的音频输出连接。先装一次 XcodeGen,生成工程后打开运行:
brew install xcodegen
xcodegen generate
open Subvox.xcodeproj # ⌘R
也可以走命令行构建和测试:
xcodebuild -project Subvox.xcodeproj -scheme Subvox -derivedDataPath build -allowProvisioningUpdates build
open build/Build/Products/Debug/Subvox.app
xcodebuild -project Subvox.xcodeproj -scheme Subvox -derivedDataPath build test
首次启动需要授予 Motion 权限;麦克风和语音权限只在你开始使用麦克风时弹出。完整步骤以 构建说明 为准。
实验流程
用工具栏或 Sensors 页的 Record Session 录制会话,数据写入 ~/Documents/Subvox/Sessions/<timestamp>-<condition>/:motion.csv 记录每个运动采样点(t 为距会话开始的秒数),audio.caf 是麦克风音频(若在录音),events.csv 记录每次按住空格的分段及其标签或预测,meta.json 保存条件、提示词以及用于对齐音视频的音频起始偏移。README 建议同一份 5 词脚本分别在 Normal speech、Whisper、Silent mouthing 三种条件下各录 10 次,再在 Train 页比较不同特征组合的 Evaluate 结果。训练集存放在 ~/Library/Application Support/Subvox/dataset.json,见 实验协议。
使用约束
耳机运动数据经过处理且采样率低(AirPods 约 25 Hz),检测语音的加速度计和内侧麦克风并未开放,因此信号反映下颌和头部动作,而不是声带振动。模板与用户和当次佩戴高度相关,重新戴一次 AirPods 就可能让信号偏移。把 AirPods 选为麦克风输入会使其切到蓝牙耳机(HFP)模式。以上限制见 已知局限。
HotRepo 点评
在 HotRepo 新项目榜 2026-11-01 的记录中,Subvox 为 442 stars、69 forks,统计窗口从 2026-10-31 20:45 UTC 起至 2026-11-01 09:45 UTC,期间新增 183 stars;同一窗口的逐小时采样从 259 stars 升到 442 stars。该项目没有记录到 GitHub 全部语言日榜名次。技术上最值得注意的不是识别效果,而是它的立场:这是一个可证伪的实验,而不是语音转文字产品——用置换检验判断信号真假,用特征开关让结论可以被复核。这些对采样率和佩戴敏感性的明确限制,是读者在期待可用默念输入之前应当先权衡的部分。
本文由 AI 根据项目 README 生成,更新于 ,以项目官方文档为准。