
Subvox 项目概述
Subvox 是一款 macOS 原型应用,旨在验证 AirPods Pro 的头部运动数据(通过 CMHeadphoneMotionManager 获取)是否包含足够信息,以将无声默念的词语转化为文本。
该应用未使用大型语言模型,而是采用小词汇量模板识别器,并结合统计检验来判断信号的有效性。
构建与运行要求
系统要求:macOS 14 及以上版本;支持头部追踪功能的 AirPods Pro 或其他兼容耳机(需连接为 Mac 音频输出设备)。首次启动需授予运动传感器权限。麦克风及语音提示仅在录制麦克风输入时激活。
构建步骤:
brew install xcodegen # 仅需执行一次
xcodegen generate
open Subvox.xcodeproj # ⌘R 运行
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
open build/Build/Products/Debug/Subvox.app
xcodebuild -project Subvox.xcodeproj -scheme Subvox -derivedDataPath build test
界面功能说明
| 界面模块 | 功能描述 |
|---|---|
| Sensors(传感器) | 实时显示用户加速度、旋转速率和姿态变化图表;包括采样率监测、麦克风输入选择、电平表及实验会话记录功能。 |
| Train(训练) | 选择单词,按住空格键默念后释放,每次尝试存储为模板。Evaluate(评估)功能运行留一法分类和 500 次标签置换检验,显示准确率、P 值及混淆矩阵。可通过特征复选框(加速度/旋转/姿态)测试各通道的信号有效性。 |
| Decode(解码) | 将运动数据转换为文本。支持按住空格键或在校准噪声底噪后自动检测。每个片段通过动态时间规整(DTW)与模板匹配并转录,同时并行显示实时麦克风转录内容以供对比。 |
解码工作原理
- 分割(
CaptureController):通过按住空格键,或当能量触发超过校准后的噪声底噪(含预卷和后延机制)启动。 - 特征提取(
MotionFeatures):每帧数据包含用户加速度(3维)、旋转速率(3维)及自片段开始以来的姿态变化(3维)。各通道进行均值中心化,并裁剪安静的前导和后缀帧。 - 匹配(
DTW,TemplateClassifier):训练集通道进行 Z 分数标准化。采用单字最近邻算法及带有 Sakoe–Chiba 带的动态时间规整技术。若最佳距离高于最大阈值或与次优结果差距低于最小置信度,则拒绝该片段。 - 信号真实性验证(
Evaluation):比较留一法准确率与打乱标签后的结果。若 P 值小于 0.05,表明运动流区分词语的能力优于随机猜测。
实验协议与数据存储
使用工具栏或 Sensors 界面中的Record Session(记录会话)功能。录音文件保存于 ~/Documents/Subvox/Sessions/<timestamp>-<condition>/ 目录:
motion.csv:所有运动采样数据,t为会话开始后的秒数。audio.caf:麦克风音频(若麦克风运行中)。events.csv:每个按住空格键的片段,含标签或预测结果。meta.json:条件、提示语及用于对齐音频与运动数据的起始偏移量。
建议方案:在正常说话、低语和无声默念三种模式下,分别使用相同的 5 个单词脚本各重复 10 次,随后在 Train 界面比较不同特征集的评估结果。
训练数据集存储路径:~/Library/Application Support/Subvox/dataset.json。
已知局限性
- 耳机运动数据处理频率较低(AirPods 上约为 25 Hz)。由于语音检测加速度计和内向式麦克风未对外暴露,应用捕捉的是下颌和头部运动,而非声带振动。
- 模板具有用户和会话特异性。重新佩戴 AirPods 可能导致信号偏移。
- 将 AirPods 选为麦克风输入设备会使其切换至蓝牙免提(HFP)配置文件。