跳到正文
原文
Hacker News· Cappybara12·· 4 天前精选AI 评分80

开发者用AirPods重现Subvocal

Subvocal raised $1.3M. A developer recreated it with AirPods in 9 minutes

AI 摘要

一个macOS原型测试AirPods Pro头部运动数据是否足以将无声口型转化为文字,通过小词汇量模板识别器和统计测试验证信号真实性,需macOS 14+和AirPods Pro支持头部追踪

正文 · AI 翻译

一个 macOS 原型机,测试 AirPods Pro 头部运动数据 (CMHeadphoneMotionManager) 是否包含足够的信息来将 无声口型 转换成文字。

它不使用语言模型。它是一个小词汇量模板识别器加上一个统计测试,告诉你信号是否真实。

构建 & 运行

brew install xcodegen   # once
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

需要 macOS 14+、AirPods Pro 或另一个支持头部追踪的耳机,并将其连接为 Mac 的音频输出。首次启动时,授权 运动。麦克风和语音提示仅在启动麦克风时出现。

屏幕

屏幕 它的功能
传感器 用户加速度、旋转率和姿态的实时图表,测量的采样率,麦克风输入选择器和电平表,以及用于实验会话的录音机。
训练 选择一个词,按住 空格,口型,释放。每次尝试都存储为模板。 评估 运行执行留一分类和 500× 标签排列测试,然后显示与机会的准确率、p 值和混淆矩阵。特征复选框(加速度 / 旋转 / 姿态)让你测试哪个通道携带信号。
解码 运动转文字的屏幕。按住空格,或在校准噪声底部后使用自动检测。每个片段都与你的模板进行 DTW 匹配并添加到文本中。一个实时的麦克风文本与其并列以供比较。

解码如何工作

  1. 分段 (CaptureController)。按住空格,或在校准噪声底部以上的能量触发,带有预滚和拖尾。
  2. 特征 (MotionFeatures)。每帧:用户加速度(3)、旋转率(3)和自片段开始以来的姿态变化(3)。每个通道都进行均值居中,并修剪了安静的引入和退出帧。
  3. 匹配 (DTW, TemplateClassifier)。每个通道在训练集中进行 z 缩放。匹配是每个单词的 1-最近邻,使用 Sakoe–Chiba 带的动态时间规整。如果最佳距离高于 最大距离 或到第二名之间的边距低于 最小置信度,则拒绝片段。
  4. 它真实吗? (Evaluation)。留一准确率与相同步骤在打乱标签上运行的结果进行比较。如果 p < 0.05,则运动流比机会更好地区分你的单词。

实验协议

在工具栏或传感器屏幕中使用 记录会话。录制文件发送到 ~/Documents/Subvox/Sessions/<timestamp>-<condition>/:

  • motion.csv:每个运动样本。t 是从会话开始以来的秒数。
  • audio.caf:如果麦克风正在运行,则麦克风音频。
  • events.csv:每个按住空格的片段,及其标签或预测。
  • meta.json:条件、提示和对齐音频与运动的音频起始偏移量。

建议运行:在 正常说话、耳语 和 无声口型 下使用相同的 5 个词脚本,每个重复 10 次。然后,在训练中,比较不同特征集的评估结果。

训练集位于 ~/Library/Application Support/Subvox/dataset.json。

已知限制

  • 耳机运动被处理且低速率(AirPods 上约为 25 Hz)。语音检测加速度计和向内的麦克风没有暴露。预期下颌和头部运动,而不是声带振动。
  • 模板是用户和会话特定的。重新放置 AirPods 可能会改变信号。
  • 将 AirPods 作为麦克风输入会将它们切换到蓝牙耳机 (HFP) 配置文件。

来源:Hacker News · github.com

00