按住 Option 说话,VIME 实时将你的语音转成文字,松手即注入任意应用的光标处——支持本地/云端 ASR 自由切换,润色、翻译等后处理模块可任意拼接(对标 Wispr Flow / Typeless)。
- 全局 push-to-talk:按住 Option 说话,悬浮窗实时显示转写,松手自动注入光标处(辅助功能注入,失败回退剪贴板)
- 插件化管线:ASR 适配器 + 后处理插件链任意拼接替换,如
ASR → 润色 → 翻译 - 本地优先:sherpa-onnx(Paraformer-zh-small + Silero VAD 静音分段)离线识别,不依赖网络
- 云端可选:OpenAI 兼容端点(一个适配器覆盖 DeepSeek / 阿里云 / OpenAI 等)
- 设置即生效:菜单栏设置窗口——热键预设、ASR 引擎、润色/翻译开关、模型一键下载
- 权限引导:麦克风/辅助功能缺失时明确提示并跳转系统设置
- 私密:录音与转写默认全本地,音频不落盘;仅启用云端插件时才上传
双进程:Swift 壳负责系统集成,Python 引擎负责插件化 AI 管线,本地 WebSocket 通信。
┌─ Swift App(壳)──────────────────────────┐
│ 热键 · 音频捕获 · 悬浮窗 · 文本注入 · 引擎守护 │
└──────────────┬───────────────────────────┘
WebSocket(16kHz PCM 音频流 ↑ · 事件 ↓)
┌──────────────▼───────────────────────────┐
│ Python 引擎(uv) │
│ 音频流 → ASR 适配器 → 后处理插件链 → 结果 │
└──────────────────────────────────────────┘
管线由 engine/config.toml 驱动:chain = ["post_polish", "post_translate"] 一行即拼装"润色→翻译"。
前置:macOS 14+。
方式一:直接运行打包版(引擎已内嵌,无需仓库)
- 下载 最新 Release 的
VIME.app - 首次打开若提示「无法验证开发者」:右键点击 VIME.app → 打开(ad-hoc 签名应用的标准步骤)
- 首次启动会自动把引擎暂存到
~/Library/Application Support/VIME/engine并从暂存副本运行(绕开下载隔离标记),随后按状态栏菜单引导授权麦克风与辅助功能 - 需要本地 ASR:状态栏「设置…」→「下载本地模型」(约 80MB)
方式二:源码构建(开发)
前置:macOS 14+、uv、Swift 6(Command Line Tools 即可,无需完整 Xcode)。
# 引擎依赖 + 本地模型(约 80MB)
cd engine && uv sync --extra dev --extra asr-local && uv run vime model download
# 壳(默认打包引擎;--no-bundle-engine 跳过打包)
cd ../app && ./Scripts/build-app.sh && open build/VIME.app打开 TextEdit,按住 Option(可在「设置…」中录制自定义快捷键,支持纯修饰键与组合键如 ⇧⌘D)说话,松手即注入。
设置 → 两个独立配置区(编辑即保存,ASR 与 LLM 分开填写):
- 云端 ASR 配置:转写端点 Base URL / API Key / Model(OpenAI 兼容转写,如
https://api.openai.com/v1,模型whisper-1)——仅当 ASR 引擎选「asr_openai(云端)」时使用 - LLM 配置(润色 / 翻译):OpenAI 兼容 Chat Completions(如 DeepSeek:
https://api.deepseek.com/v1,模型deepseek-chat) - 配置保存在本机(API Key 明文存 UserDefaults,仅本地使用;Keychain 安全存储为后续改进项),随每次语音会话发送给引擎;未填云端 ASR 配置时自动回退使用 LLM 配置
cd engine
uv run vime list-plugins # 查看已发现插件
uv run vime run <16kHz单声道wav> --asr asr_sherpa # 本地识别
uv run vime run-text "呃 你好" --chain post_polish # 文本润色
uv run vime serve --port 8765 # 启动 WebSocket 服务(壳的引擎)| 插件 | 类型 | 说明 |
|---|---|---|
asr_sherpa |
ASR | 本地 Paraformer + Silero VAD 流式分段(默认) |
asr_openai |
ASR | OpenAI 兼容云端转写 |
post_polish |
后处理 | 去口头语、补标点、保守润色 |
post_translate |
后处理 | 中英互译(目标语言可配) |
新增插件 = 在 engine/plugins/ 放一个模块(导出 PLUGIN 元数据 + Plugin 类),配置里引用即可,无需改核心代码。
VIME/
├── engine/ # Python 引擎(uv)
│ ├── vime/ # 插件协议 · 配置 · 注册表 · 管线 · CLI · WS 服务 · 模型下载
│ ├── plugins/ # asr_sherpa / asr_openai / post_polish / post_translate
│ └── tests/ # pytest(72 用例)
├── app/ # Swift 壳(SwiftPM 三目标)
│ ├── Sources/VIMELib/ # 全部逻辑(热键/音频/悬浮窗/注入/引擎守护/配置/权限)
│ ├── Tests/VIMETests/ # 迷你测试运行器(96 断言)
│ └── Scripts/ # build-app.sh / Info.plist
└── docs/plans/ # 设计文档与各里程碑实施计划
- ✅ M1 引擎骨架与插件链(插件协议/注册表/管线/CLI)
- ✅ M2 本地 ASR 流式(VAD 分段 partial/final + 模型下载 + WebSocket 服务)
- ✅ M3 Swift 壳(热键/音频捕获/悬浮窗/AX 注入/引擎守护)
- ✅ M4 联调收口(权限引导/设置窗口/失败路径)
打开「设置…」最下方「诊断」区(默认关闭,勾选「诊断模式」开启实时刷新;点击诊断区可复制完整诊断文本),逐项对照:
- 热键监听:若「最近任意按键」始终为
-,说明系统未向 VIME 投递按键事件——检查「隐私与安全性 → 输入监控 / 辅助功能」权限;若该时间在走但「press」不变,说明按键组合未匹配绑定(重新录制快捷键) - 麦克风:按住说话时「累计字节」应持续增长;若不涨,检查麦克风权限(菜单「授权麦克风…」)或系统输入设备
- 事件尾部:出现
partial说明识别在进行;若只有error,按内容处理(模型未下载 → 设置里下载本地模型)
cd engine && uv run pytest -q # 引擎测试
cd app && swift build && .build/debug/VIMETests # 壳测试- 语音修改指令(说"把 XX 改成 YY"操作已注入文本)
- 正式签名与公证(Developer ID + notarization,当前 ad-hoc)
- 系统音频捕获(识别会议/视频语音)
- 个人词典 / 语音快捷片段 / 按应用切换语气风格
ASR 能力基于 sherpa-onnx(Paraformer + Silero VAD)与 OpenAI 兼容语音识别协议。
