Skip to content

awsl-project/awsl-audio-input

Repository files navigation

AWSL 语音输入

Latest Release Release macOS 14+ Swift 6

AWSL 语音输入是一个 macOS 菜单栏语音输入 App。按住快捷键录音,松开后用本地 SenseVoice 识别,并把文字直接输入到当前前台应用。

当前实现是原生 Swift + sherpa-onnx C API,不启动 Python 后端,不使用剪贴板,不走 AppleScript 中文输入。

功能

  • 本地识别:SenseVoice ONNX 模型在本机运行,文本不需要发到云端。
  • 全局快捷键:默认右 Ctrl,可在设置里改成预设按键或自定义录入。
  • 实时预览:屏幕底部非激活胶囊显示音量和实时识别结果。
  • 直接输入:使用 Unicode CGEvent 注入文本,避免污染剪贴板历史。
  • 模型下载:设置页可下载完整模型或 int8 小模型,并显示下载进度。
  • 输出格式:支持中英文之间自动空格、句末标点处理、SenseVoice ITN 开关。
  • 可选润色:可配置 OpenAI 兼容接口做保守纠错。

安装

Homebrew

brew install --cask awsl-project/awsl/awsl-audio-input

升级:

brew upgrade --cask awsl-project/awsl/awsl-audio-input

GitHub Releases

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

使用

  1. 启动 AWSL语音输入
  2. 打开菜单栏图标,进入 设置...
  3. 模型 区域下载模型,推荐完整模型优先准确率。
  4. 把光标放到任意输入位置。
  5. 按住右 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 权限和目标应用策略限制。

为什么构建时还需要 uv?

运行时不依赖 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"

About

macOS local voice input app powered by SenseVoice

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors