AWSL 语音输入是一个 macOS 菜单栏语音输入 App。按住快捷键录音,松开后用本地 SenseVoice 识别,并把文字直接输入到当前前台应用。
当前实现是原生 Swift + sherpa-onnx C API,不启动 Python 后端,不使用剪贴板,不走 AppleScript 中文输入。
- 本地识别:SenseVoice ONNX 模型在本机运行,文本不需要发到云端。
- 全局快捷键:默认右 Ctrl,可在设置里改成预设按键或自定义录入。
- 实时预览:屏幕底部非激活胶囊显示音量和实时识别结果。
- 直接输入:使用 Unicode CGEvent 注入文本,避免污染剪贴板历史。
- 模型下载:设置页可下载完整模型或 int8 小模型,并显示下载进度。
- 输出格式:支持中英文之间自动空格、句末标点处理、SenseVoice ITN 开关。
- 可选润色:可配置 OpenAI 兼容接口做保守纠错。
brew install --cask awsl-project/awsl/awsl-audio-input升级:
brew upgrade --cask awsl-project/awsl/awsl-audio-input从 GitHub Releases 下载:
| 平台 | 文件 | 说明 |
|---|---|---|
| macOS Apple Silicon | awsl-audio-input-macOS-arm64.dmg |
M1/M2/M3/M4 |
| macOS Intel | awsl-audio-input-macOS-amd64.dmg |
x86_64 Intel Mac |
打开 DMG 后,把 AwslVoiceInput.app 拖到 /Applications。
首次运行后,系统会要求授权:
- 麦克风:录音。
- 辅助功能:监听快捷键并向前台应用发送合成输入事件。
- 输入监控:监听全局快捷键。
如果没有自动弹出权限页,可以手动打开:
open "x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility"授权后建议重启 App。
当前包没有 Apple notarization。首次打开时,macOS Gatekeeper 可能提示“应用已损坏”或阻止启动。
优先执行:
xattr -rd com.apple.quarantine /Applications/AwslVoiceInput.app然后在 Finder 里右键 AwslVoiceInput.app,选择一次“打开”。
如果仍然失败,重装后再清理隔离属性:
brew uninstall --cask awsl-project/awsl/awsl-audio-input
brew install --cask awsl-project/awsl/awsl-audio-input
xattr -rd com.apple.quarantine /Applications/AwslVoiceInput.app- 启动
AWSL语音输入。 - 打开菜单栏图标,进入
设置...。 - 在
模型区域下载模型,推荐完整模型优先准确率。 - 把光标放到任意输入位置。
- 按住右 Ctrl 开始录音,松开后自动输入识别结果。
默认快捷键是右 Ctrl。设置页可以修改快捷键。
App 默认不内置模型。模型会下载到:
~/Library/Application Support/AwslVoiceInput/models/sense-voice
可选模型:
| 模型 | 文件 | 体积 | 适合场景 |
|---|---|---|---|
| 完整模型 | model.onnx |
约 894 MB | 准确率优先,常驻内存约 1GB |
| 小模型 int8 | model.int8.onnx |
约 228 MB | 更快、更省内存 |
设置页保存你选择的模型。启动识别器时会优先加载保存的模型;如果该模型不存在,会回退到另一个已下载模型。
- 快捷键:默认右 Ctrl,可选择预设或自定义录入。
- 模型:完整模型 / int8 小模型,支持后台下载和进度显示。
- SenseVoice ITN:控制数字和标点归一化。
- 中英文空格:在中文和英文/数字之间自动插入空格。
- 句末标点:保留、移除,或强制使用指定句末标点。
- LLM 润色:可选 OpenAI 兼容接口,只做保守纠错。
需要 macOS 14+、SwiftPM、uv。
仓库不提交 .backend-venv、.deps、模型或 dylib。构建时会自动下载 sherpa-onnx wheel,并使用 wheel 里的 C header 和 dylib。
./Scripts/setup-backend.sh
make build
open dist/AwslVoiceInput.app安装到 /Applications:
make install
open /Applications/AwslVoiceInput.app运行 smoke test:
swift run SenseVoiceSwiftSmokeTest --model-dir models/sense-voice发布相关 GitHub Actions 有三条,不包含 PR/push 检查:
Release:手动入口,解析版本、创建 tag 和 GitHub Release。Build macOS:分别在 Apple Silicon 和 Intel runner 上打包arm64/amd64两个 DMG,并上传 Release asset。Update Homebrew:更新awsl-project/homebrew-awsl的 Cask。
正常只需要手动运行 Release。仓库需要配置:
HOMEBREW_TAP_TOKEN
该 token 需要能写入 awsl-project/homebrew-awsl。
确认系统权限里已经允许 AWSL语音输入 的辅助功能和输入监控。然后重启 App。
查看日志:
tail -f ~/Library/Logs/AwslVoiceInput/injection.log正常启动应该看到:
startup permissions ax=true listen=true post=true
剪贴板 + Cmd+V 兼容性强,但会污染剪贴板历史。当前方案用 Unicode CGEvent 直接发送文本,目标是避免剪贴板污染,并尽量绕开中文输入法组合态。
少数应用、密码框或受保护输入区域可能会拒绝合成输入,这是 macOS 权限和目标应用策略限制。
运行时不依赖 Python。uv 只用于构建期下载 sherpa-onnx wheel,从中取出 header 和 dylib。
pkill -f "/AwslVoiceInput.app/Contents/MacOS/AwslVoiceInput" || true
rm -rf /Applications/AwslVoiceInput.app
rm -rf "$HOME/Library/Application Support/AwslVoiceInput"