开发者用AirPods重现Subvocal
Subvocal raised $1.3M. A developer recreated it with AirPods in 9 minutes
一个macOS原型测试AirPods Pro头部运动数据是否足以将无声口型转化为文字,通过小词汇量模板识别器和统计测试验证信号真实性,需macOS 14+和AirPods Pro支持头部追踪
一个 macOS 原型用于测试 AirPods Pro 头部运动数据 (CMHeadphoneMotionManager) 是否足以将无声口型转化为文字。 它不使用语言模型,而是一个小词汇量模板识别器加上一个统计测试,告诉你信号是否真实。
构建和运行: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 需要macOS 14+、AirPods Pro或其他支持头部追踪的耳机,连接为Mac的音频输出。
首次启动时,授予权限给Motion。 麦克风和语音提示仅在启动麦克风时出现。 屏幕:传感器显示用户加速度、旋转率和姿态的实时图,测量的采样率、麦克风输入选择器和电平表,以及实验会话的录音器。 训练:选择一个词,按住空格,口型发出,释放。 每次录制都存储为模板。 评估:运行留一法分类和500×标签置换测试,然后显示与机会的准确率、p值和混淆矩阵。 特征复选框(加速度/旋转/姿态)让你测试哪个通道携带信号。 解码:运动到文本的屏幕。 按住空格,或在校准噪声底部后使用自动检测。
每个片段与你的模板进行DTW匹配并添加到文本中。 实时麦克风文本与其并列进行比较。 解码工作原理:分段(CaptureController)。 空格按住,或在校准噪声底部上的能量触发,带预滚和拖尾。 特征(MotionFeatures)。 每帧:用户加速度(3)、旋转率(3)和自片段开始以来的姿态变化(3)。 每个通道居中,并修剪安静的引入和退出帧。 匹配(DTW、TemplateClassifier)。 每个通道在训练集中进行z缩放。 匹配是每个单词的1最近邻,使用Sakoe-Chiba带的动态时间规整。
如果最佳距离高于最大距离或第二名到最佳的距离低于最小置信度,则拒绝片段。 是否真实? (评估)。 留一法准确率与相同程序在打乱标签上运行的结果进行比较。 如果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