Jev Voice macOS 菜单栏语音控制封面,包含麦克风图标、类型化决策流程和语音命令示例。

Jev Voice:让 Mac 听懂你的话,但不把执行权交给模型

Jev Voice 把语音转换为有边界的 macOS 操作:设备端语音识别、类型化的 Jev 决策、确定性的参数提取,以及面向 Accessibility 操作的验证循环。

要点摘要
  • Jev Voice 是一个 Swift 菜单栏应用,会把语音映射为打开应用、输入、搜索、滚动和调节音量等有边界的 macOS 操作。
  • 语音在设备端转写;Jev 接收语句和应用上下文,返回类型化决策,而不是自由形式的 shell 命令或文章内容。
  • 它把本地解析、快速路径、Accessibility 树、OCR、Chrome DevTools Protocol,以及可选的 DeepSeek fallback 组合起来处理复杂 UI。
  • 当前 v0.9.1 通过 GitHub Releases 或 Homebrew 分发 ad-hoc 签名 ZIP;没有找到 App Store 版本。

macOS 语音助手如果不假装自己是万能 shell,反而更有意思。Jev Voice 选择了一条更窄的路径:你说出命令,本地代码负责转写并提取参数,Jev 从类型化操作中做选择,最后由 macOS 执行具体动作。它是一个用于打开应用、输入、搜索、滚动和控制系统功能的菜单栏工具,不把执行权交给自由形式的生成文本。

项目仓库是 chris-wozniczek/jev-voice-control,使用 Swift 编写,采用 MIT License。本文核对到的最新版本是 Jev Voice 0.9.1。项目包以 macOS 14 或更高版本为目标;SpeechAnalyzer 流式识别需要 macOS 26、Swift 6.2+ 和 Xcode 26。

一个有明确边界的菜单栏应用

按住 ⌥Space 说话,松开快捷键后发送命令。README 给出的例子包括“打开 Chrome 并访问 google.com”“退出 Spotify”“输入 hello world”“把音量设为 30”“搜索 Swift concurrency”“最大化 Chrome”和“恢复 Chrome”。应用还支持 chrome、code、cmux、settings 等常见别名,让口语化的应用名称更容易匹配。

应用可以使用你选择的 macOS 语音播报简短的执行结果。在设置中打开 Ask before running commands 后,语音流程会在执行前要求确认。如果你不喜欢按住说话,也可以使用按下开始、再次按下停止的 Toggle 模式。

Jev Voice 也支持复合命令。“打开 Devin 并开始一个新会话”可以拆成先本地打开应用,再由 Jev 引导点击。刚打开的应用会继续作为 UI 任务目标;听起来难以撤销的操作,则可能在继续前要求确认。

从语音到类型化操作

第一层是本地逻辑。命令解析器识别确定性的操作,语句切分器拆分多个动词,SlotExtractor 提取 URL、搜索词、输入文本、百分比等参数。Jev 不负责发明这些值,只负责从类型化操作中选择动作和参数槽位。

每个语句会连同完整转写文本、当前前台应用、已安装应用名称和别名等状态,一起发送到 TypeSafe Jev 的 System One endpoint。返回结果也是类型化决策:动作、目标应用、系统动作、是否提到 URL、是否指向前台应用、是否要生成文字,以及是否具有破坏性。

这一区分很重要。Jev 可以返回 openApp 或 uiTask,但不会返回一个交给执行器盲目信任的 shell 命令。低置信度或有歧义的请求可以进入确认流程;真正的 NSWorkspace、CGEvent、AppleScript、pmset 和 Accessibility 调用由本地执行器掌控。

两条路径:快速操作与 Computer Use

如果前置条件满足,已知的应用、URL、媒体、音量和键盘操作可以走快速路径。这样简单命令可以留在本地,避免所有语音都经过更大的规划器。应用注册表也支持别名和设置中的用户自定义别名。

当请求需要点击可见控件时,Computer Use 路径会读取目标应用的 Accessibility 树,让 Jev 选择下一个元素,执行操作,再次观察并验证结果。如果树结构过于稀疏,可以在聚焦或滚动后重新遍历;如果界面几乎没有暴露控件,则使用本地 Apple Vision OCR 读取可见标签。

Chromium 和 Electron 窗口还有专门的 fallback。打开 Chrome 远程调试后,Jev Voice 可以通过 Chrome DevTools Protocol 读取可见 Web 控件并输入文字。对于没有可访问控件的界面或更开放的任务,可以选择 DeepSeek;其思考级别以及 fallback 的步骤数和时间预算都可以配置。

整个循环是可观察的:观察、选择、执行、验证。输入文字前,它会先激活目标应用;输入后再读回焦点字段。如果看不到预期文字,就回退到进程内的 Unicode 键盘输入路径。

安全性也是产品的一部分

内置的 Resources/policy.json 会阻止 shell、支付、凭据和不可逆文件操作相关的表达。默认确认列表包括 delete、remove、empty trash、publish、pay;浏览器路径还包括 send、submit、post、tweet、reply。用户可以用自己的 policy 覆盖规则,并在 Settings › Safety 中查看当前加载的 policy。

未知的脚本化请求可以变成 learned tools,但必须经过门控。生成的 AppleScript 或 JXA 工具要先通过编译、policy scanner 和 Jev review,才能确认并执行。成功的工具会缓存到 ~/Library/Application Support/Jev Voice/tools/,可以逐个启用或删除。

这对语音应用来说是一个有价值的边界:自然语言只负责在有限操作中做选择,代码负责检查前置条件、权限和操作后的状态。它不能让桌面自动化变成零风险,但能把确认与验证应该出现的位置讲清楚。

如何安装

目前没有找到 Jev Voice 的 App Store 页面,因此普通用户优先使用官方的 GitHub Releases 页面。当前资产是 Jev-Voice-0.9.1.zip。仓库和 cask 都说明应用使用 ad-hoc 签名,而不是 Developer ID 签名,因此 macOS 首次启动可能提示风险,需要移除隔离属性。

# 打开最新 Release 页面:
open https://github.com/chris-wozniczek/jev-voice-control/releases/latest

# 或直接下载 v0.9.1 ZIP:
open https://github.com/chris-wozniczek/jev-voice-control/releases/download/v0.9.1/Jev-Voice-0.9.1.zip

解压 ZIP 后,把 Jev Voice.app 移到 /Applications,从菜单栏启动,并在齿轮菜单的 Settings 中填写 TypeSafe API key。如果 macOS 仍因 ad-hoc 签名提示无法打开,官方 cask 给出的可选处理方式是执行 xattr -dr com.apple.quarantine "/Applications/Jev Voice.app"。

Homebrew 也是官方安装路径:仓库里的 cask 使用同一个 v0.9.1 ZIP,通过 postflight 移除隔离属性,并安装 Jev Voice.app。Homebrew 7+ 使用第三方 tap 前,可能需要先运行 brew trust chris-wozniczek/jev-voice。

应用按功能请求权限:Microphone 用于收音,Speech Recognition 用于转写,Accessibility 用于读取控件和输入文字,Screen Recording 用于本地 OCR 与截图,Automation 用于执行 System Events 的 AppleScript 操作。没有授予全部权限时仍可开始检测,但实际桌面控制取决于所用路径。

哪些内容会发送给 Jev

如果选用的引擎支持,语音识别会在设备端运行。为了让 Jev 做路由,发送到 api.typesafe.ai 的是转写文本,以及选择动作所需的少量应用上下文,包括前台应用、已安装应用候选和配置的别名。API key 保存在本地 UserDefaults 中;不过,服务商使用仍可能需要账号或产生费用。

在这个设计里,Jev 只负责决策。对于听写或网页搜索,本地代码从转写文本中提取输入内容或查询词。需要生成一段回复时,可选的生成模型负责组织文字,默认会在输入前预览;这与 Jev 的类型化动作路由是两条不同路径。

语音引擎仍在持续进化

在 macOS 26 上,如果构建包含 Apple SpeechAnalyzer 流式引擎,它可以作为默认引擎。Whisper 和传统 Apple 语音识别仍可在 Settings › Hearing 中选择。项目会在启动时预加载可用的 SpeechAnalyzer 资源和 Whisper,让第一次按键说话时不用等待模型加载。

Whisper 的语言代码留空时可以自动检测。它使用音频能量判断说话结束;Smart end of speech 可以询问 Jev 短暂停顿是否意味着命令结束,但仍以配置的静音超时作为硬上限。构建好的二进制可以通过 --engine-info 报告支持的引擎。

只有需要改代码时才从源码构建

普通用户从上面的 Release ZIP 开始即可。开发者可以构建可执行 target、运行纯逻辑测试,或从仓库生成分发 ZIP。项目使用 Swift Package Manager,把决策和解析逻辑放在 JevVoiceCore target,把菜单栏应用放在 JevVoice executable target。

git clone https://github.com/chris-wozniczek/jev-voice-control.git
cd jev-voice-control

make app     # 构建 build/Jev Voice.app
make test    # 运行单元测试
make dist    # 生成 build/Jev-Voice-<version>.zip 并输出 SHA-256

API key 可以在 Settings 中填写,也可以使用 defaults write com.chriswozniczek.jevvoice typesafeAPIKey <key> 设置。README 还记录了从 shell 启动时使用 TYPESAFE_API_KEY=... 的方式。请妥善保管 key;源码构建不能绕过 TypeSafe 账号,也不能绕过应用需要的 macOS 权限。

可选的应用快捷方式位于 ~/Library/Application Support/Jev Voice/app-actions.json。它可以加速打开新会话或新标签页等短语,但没有这个文件时,通用的“观察 → Jev → 执行 → 验证”循环仍然可用。

这些限制需要提前知道

Jev Voice 不是自由编程式的语音助手。Jev 不会生成 URL、查询词、听写文本或 shell 命令;这些值来自对转写文本的确定性启发式提取。系统操作基于 AppleScript 和 pmset,所以亮度键码可能因硬件而不同。应用启动会扫描标准 macOS 应用目录和正在运行的普通应用,再叠加别名。

桌面自动化还有一些现实边界:第三方应用可能只暴露很少的 Accessibility 控件,权限可能未授予,界面可能需要 OCR,破坏性操作可能要求确认。项目提供 fallback 和验证,但不能保证所有第三方 UI 都能自动化。

许可证

Jev Voice 使用 MIT License。保留版权和许可证声明后,你可以查看、修改,并在商业项目中复用代码。WhisperKit、TypeSafe 服务、Apple 框架和被控制的应用都有各自的许可证或服务条款。

值得使用吗

如果你希望免手操作 Mac,并且更看重类型化决策、本地解析、明确权限和验证循环,而不是让模型输出任意命令,Jev Voice 是一个边界讲得很清楚的开源实验。建议从 v0.9.1 Release ZIP 开始,接受 ad-hoc 签名带来的首次启动提示,并把 Accessibility 自动化当成需要监督的能力,而不是键盘和鼠标的魔法替代品。

项目概况

许可证
MIT
平台
macOS 14+ / SpeechAnalyzer 流式识别需要 macOS 26 和 Swift 6.2+
开发语言
Swift、SwiftUI、AppKit、WhisperKit、Swift Package Manager
查看版本
v0.9.1(GitHub Release,2026-09-22 核对)

安装

# 打开最新的 GitHub Release:
open https://github.com/chris-wozniczek/jev-voice-control/releases/latest

# 直接下载 v0.9.1 ZIP:
open https://github.com/chris-wozniczek/jev-voice-control/releases/download/v0.9.1/Jev-Voice-0.9.1.zip

许可说明

仓库使用 MIT License。再分发时需要保留版权和许可证声明;TypeSafe、WhisperKit、Apple 框架和第三方服务仍有各自条款。