这个项目能做什么
## 项目概览
AirPods Voice 输入法是一个原生 macOS 菜单栏 App,用 AirPods 的单击手势控制语音输入:单击一次开始录音,再单击一次停止、确认文字并自动发送,全程不需要触碰键盘。当前正式版本为 1.0。
## 主要功能
- 单击 AirPods 开始语音输入,再次单击停止并自动发送。
- 支持连续多轮使用,每轮结束后回到可再次启动的空闲状态。
- 兼容内置麦克风与 AirPods 麦克风,无需修改 App 设置。
- 默认模拟长按 `Fn`,也可配置为 Control、Option、Command、Shift 或 F1–F12。
- 菜单栏与控制窗口提供运行状态、启动、停止、使用说明和退出。
- 每次打开 App 显示控制窗口,关闭后继续在菜单栏运行。
- 实体键盘输入会自动中止未结束的语音按键,避免修饰键影响终端或待办软件。
- 不占用 Dock,不依赖 BetterTouchTool 等第三方自动化软件。
- 支持 Apple Silicon 与 Intel Mac,最低要求 macOS 13。
## 使用前提
需要在自己的语音输入法里把语音输入快捷键设为「长按 Fn」。README 说明 1.0 已使用豆包输入法完成实体 AirPods 多轮验收,其他输入法需支持「按住快捷键录音、松开结束」的行为。
App 运行期间会接管 AirPods 的播放/暂停单击,因此此时无法用单击控制音乐;停止或退出 App 后媒体控制恢复。
## 安装与权限
从 GitHub Releases 下载 PKG 安装包,安装到 `/Applications/AirPods Voice 输入法.app`。安装器会自动停止并移除旧测试版,避免两个版本同时接管 AirPods。当前安装包使用 ad-hoc 签名,若被 macOS 拦截可在 Finder 中右键选择「打开」。
App 必须获得 macOS「辅助功能」权限,才能模拟长按语音键并发送回车。授权对象是 App 本身,不需要给终端或开发工具授权,也不需要完全磁盘访问;App 本身不采集麦克风,麦克风权限由用户选择的语音输入法管理。
## 工作原理(README 描述)
App 通过 `MPRemoteCommandCenter` 持有 Now Playing 会话接收 AirPods 单击,只接受来源为 `com.apple.bluetoothd` 或 `com.apple.cloudpaird` 的媒体事件,键盘播放键等其他来源不会启动语音。AirPods 麦克风进入通话音频模式后,第二次单击由 `bluetoothd` 报告为 Software Mute,App 仅在自己已启动的语音会话中将其作为停止并发送信号。IOHID 监听作为备用通道,同一次实体操作通过 350ms 窗口去重。
第一次单击通过 `IOHIDPostEvent` 发送一次 Fn 激活;第二次单击结束录音会话并依次发送两次回车,第一次确认输入法组合文字,第二次发送消息。
为避免全局修饰键影响快捷键敏感应用,1.0 加入三层保护:启动时清理历史残留 Fn;语音期间检测到实体键盘输入时先移除语音修饰键并立即结束语音;App 异常退出时由独立守护进程释放 Fn。正常停止、切换前台应用、5 分钟安全超时或退出 App 时只释放按键,不会误发送。
## 配置与日志
默认配置文件为 `config/voice-key`,内容为 `fn`,可改为 control、option、command、shift 或 f1–f12,修改后需重启脚本。也可在源码运行时通过环境变量临时指定。
日志位于 `/tmp/airpods-voice-input-method/` 下的 app.log、app.stdout.log 与 app.stderr.log,可用 `pgrep -fl airpods-voice-input-method` 确认进程,用 `./scripts/stop.sh` 安全停止并释放语音键。
## 构建与测试
提供 `scripts/build.sh` 构建通用 App、`scripts/package-release.sh` 生成 PKG,并支持指定 Developer ID 证书。测试脚本覆盖四轮语音交互、Fn 消费、键盘安全、崩溃恢复等回归场景,另有 `tests/hitl-two-cycle.sh` 用于实体 AirPods 人工验收。
## 许可
源码使用 PolyForm Noncommercial 1.0.0 许可,属于 source-available 而非 OSI 定义的开源许可证;个人学习、研究与非商业使用允许,商业使用需另行取得授权。
评论
0 评分人数达到10人后显示
登录后参与讨论。