Show HN:Yap – 一款适用于 macOS 的开源本地语音听写工具,无需下载模型

Hacker News Top 产品

摘要

Yap 是一款开源的 macOS 应用,利用 Apple 的 Speech 框架实现极速本地语音听写,无需下载模型、API 密钥或互联网连接。

嘿,HN!我想分享我正在做的这个开源项目。<p>它叫做 Yap,是一款 macOS 上的小型菜单栏应用,可以将任何输入内容从语音转成文本。你设置一个热键,按下后说话,再按一下,文本就会粘贴到你所在的任何输入框中。所有操作都在本地运行,数据绝不会离开你的电脑。完全开源,采用 MIT 许可证。<p>随着 macOS 26 的发布,Apple 最近新增了两个 API:SpeechAnalyzer 和 SpeechTranscriber,它们利用操作系统自带和管理的模型,实现流式本地语音转文字。因此,该应用本身不附带任何模型,在说出第一个词之前无需加载任何内容。最近的一项基准测试显示,Apple 的模型在准确性上略优于 Whisper Small,速度则快约 3 倍(参见:<a href="https://news.ycombinator.com/item?id=48894752">https://news.ycombinator.com/item?id=48894752</a>)。在 Mac 上,真的不再需要下载模型或支付昂贵的 API 费用了。<p>很多现有的听写工具都存在一些我想通过这个开源项目避免的问题。它们要么:<p>- 收费(对于本来就是操作系统内置的功能)<p>- 捆绑占用大量内存的模型(例如 Whisper 或 Parakeet)<p>- 封装在 Electron 中的网页应用<p>- 英特尔 Mac 根本无法使用<p>- 闭源<p>- 使用会访问你所有转录内容的第三方 API<p>它大约有 3000 行原生 Swift 代码,应用大小 4 MB,空闲时内存占用约 60 MB。音频通过 AVAudioEngine 进入 SpeechAnalyzer,并启用了不稳定结果以提供实时预览,历史记录存储在 SwiftData 中。其中完全没有网络代码。<p>仓库和演示在此获取:<a href="https://github.com/FrigadeHQ/yap" rel="nofollow">https://github.com/FrigadeHQ/yap</a><p>很高兴回答任何问题,也非常欢迎提出功能需求!
查看原文
查看缓存全文

缓存时间: 2026/07/28 06:28

FrigadeHQ/yap 源: https://github.com/FrigadeHQ/yap # Yap 极速语音听写,可在任意可输入文本的地方使用。 许可协议: MIT macOS 26+ (https://www.apple.com/macos/) Swift 6 (https://swift.org) 按下快捷键,说话,再按一次。你的话就会出现在你正在使用的任何文本框中。无需账户,无需 API 密钥,音频不会离开你的设备。由 Frigade (https://frigade.com) 构建。 https://github.com/user-attachments/assets/9bd8dae6-49d6-4c06-98b9-878e24dd401f — ## 功能 Yap 常驻菜单栏,等待快捷键。触发后,屏幕底部附近会出现一个小窗口,显示实时波形和当前所说内容的实时预览。再次按下快捷键,文本就会粘贴到你正在使用的应用中。每次转录都会本地保存,方便你之后回来重新复制内容。 默认快捷键为 ⌘⇧D。你可以重新绑定,或设置为单个修饰键。如果你有空闲的拇指,单独敲击右 Shift 键也很好用。 ## 安装 ### Homebrew bash brew install --cask frigadehq/tap/yap 后续更新: bash brew upgrade --cask yap ### 直接下载 从 Releases (https://github.com/FrigadeHQ/yap/releases) 获取最新的 .dmg 文件,然后将 Yap 拖入应用程序文件夹。发布的版本已签名并公证,macOS 会直接打开而不会报错。 ## 为什么我们构建它 macOS 上不乏语音转文字工具,其中一些开源工具也相当不错。但大多数仍然存在以下一些问题: - 有些需要付费,而对于操作系统已免费内置的功能来说,这个要求有点高。 - 大多数需要下载一个庞大的模型。Whisper 权重多达数百 MB,占用内存,并且只有在较新的高端 Mac 上才能感觉流畅。在 Intel Mac 上尤其糟糕,Whisper 和 Parakeet 等模型经常崩溃或根本无法运行,即使能运行,一个段落可能需要 30 秒到一分钟才能返回结果。 - 很多是 Electron 或 Web 技术栈应用,因此整个浏览器引擎会闲置在内存中,仅仅为了运行一个菜单栏图标和一个设置窗口。 - 许多应用充斥着你可能永远不会使用的设置和模式。 - 有些是闭源的,因此你只能相信你的音频和转录内容会保留在你的设备上,而无法进行验证。 最近的变化是 macOS 26。它新增了两个 API:SpeechAnalyzerSpeechTranscriber,它们使用操作系统自带和管理的模型,在设备端进行流式语音转文字。该应用不携带任何模型,在说出第一个单词之前不会加载任何内容到内存,也无需 API 密钥或按分钟计费。文字会随着你的说话实时返回。 Apple 的模型真的好吗?事实证明,它比它替换的模型更好。最近的基准测试 (https://get-inscribe.com/blog/apple-speech-api-benchmark.html) 显示,在清晰音频上其词错误率为 2.12%,在嘈杂音频上为 4.56%,而 Whisper Small 分别为 3.74% 和 7.95%,并且其运行速度大约快三倍(基于 5,559 个 LibriSpeech 片段)。 因此,Yap 完全不携带任何模型。它大约有三千行原生 Swift 代码,应用体积 4 MB,全部开源,并且没有任何浏览器引擎。空闲时内存占用约 60 MB,且从不联网。我们在 Frigade (https://frigade.com) 全天使用它,主要用于提示编码代理、撰写电子邮件和发送 Slack 消息——基本上任何说话比打字更快的事情都用它。 ## 特性 - 通过 Apple 的 Speech 框架进行设备端转录 - 全局快捷键,完全可重新绑定,支持单修饰键触发(如右 Shift) - 直接粘贴到你当时正在使用的任何应用的焦点字段中 - 本地转录历史记录,支持搜索、复制和删除 - 说话时显示实时波形和部分转录内容 - 按两次 Esc 键可放弃正在进行的听写 - 跟随系统默认麦克风,包括在会话中切换时 - 可选登录时启动,默认关闭 - 无需账户,无网络调用,无遥测 ## 要求 macOS 26 (Tahoe) 或更高版本。Yap 依赖于 Apple 随 macOS 26 提供的语音模型,因此早期版本无法使用。从源代码构建还需要 Xcode 26。 ## 权限 首次启动时,Yap 会请求四项权限,并解释每一项: | 权限 | 原因 | | — | — | | 麦克风 | 为了听到你的声音 | | 语音识别 | 为了在设备上进行转录 | | 辅助功能 | 为了查看你在哪个应用中输入 | | 自动化 | 为了将结果粘贴到该应用中 | 辅助功能需要在系统设置中手动开启。macOS 要求任何代表你输入的应用都必须开启此权限,并且无法以编程方式授予。 ## 工作原理 音频通过 AVAudioEngine 从默认输入获取,并转换为分析器要求的任何格式。捕获在语音堆栈完成初始化之前开始,在此期间缓冲的音频会在转录器连接后被冲洗掉,因此句子中的第一个单词永远不会被截断。转录通过启用易失性结果的 SpeechAnalyzer 运行,这提供了实时预览。SFSpeechRecognizer 作为后备机制,用于较新的 API 未覆盖的语言区域。 文本插入是棘手部分。Yap 将文本写入剪贴板,通过系统事件驱动 ⌘V,然后恢复你之前的剪贴板内容。它会等待一段时间再恢复,因为基于 Chromium 的应用会异步且多次读取粘贴板,过早恢复会导致渲染器获取到过时数据。这一个细节决定了应用是能在所有地方工作,还是只能工作在原生应用中。 状态集中管理。RecordingCoordinator 是一个小型状态机,其依赖项都是协议,因此逻辑可以在无需麦克风的情况下通过单元测试覆盖。 ## 为何未沙盒化 向其他应用输入内容需要驱动系统事件并读取焦点 UI 元素,这两项都是 macOS 应用沙盒所禁止的。因此,Yap 以未沙盒化形式分发,并绕过 Mac App Store。macOS 上的任何文本扩展器、剪贴板管理器和听写工具都出于同样的原因也采用这种方式。 ## 路线图 并没有太多路线图,这是有意为之。Yap 只做一件事,保持小巧到让你无需考虑它的存在,这是主要设计原则。大多数功能想法会让这类应用变得更糟。不过我们对此并不固执。如果缺少了你每天都会使用的功能,请提交问题或发送拉取请求,我们会认真考虑。语言选择器很可能是下一个添加的功能,因为目前 Yap 遵循你的系统语言环境。 ## 开发 一键从源代码构建并安装。它会克隆、构建、将 Yap 放入 /Applications 并启动: bash git clone https://github.com/FrigadeHQ/yap.git && cd yap && ./install.sh 此脚本会在你没有 XcodeGen 时安装它,退出任何正在运行的 Yap 副本,并用新构建的版本替换。任意时候重新运行 ./install.sh 以在更改后重新构建。 如果你更愿意在 Xcode 中工作: bash xcodegen generate # 从 project.yml 生成 Yap.xcodeproj open Yap.xcodeproj # 然后用 ⌘R 运行 Xcode 项目是生成的而不是提交的,因此配置更改在 diff 中保持可读。 运行测试: bash xcodebuild -project Yap.xcodeproj -scheme Yap -destination 'platform=macOS' test 关于本地构建需要注意一点。它们是以临时签名方式签名的,这没有稳定的身份,因此 macOS 会将每次重建视为全新的应用程序,并忘记之前授予的权限。症状令人困惑:系统设置中的复选框仍然显示已开启,但粘贴功能悄悄失效。设置中有一个“重置并重新授权”按钮专门用于此情况。发布的构建是正确签名的,不会出现此问题。 应用图标也是生成的,如果你想更改它: bash swift Tools/GenerateIcon.swift /tmp/Yap.iconset iconutil -c icns /tmp/Yap.iconset -o Sources/Yap.icns ## 贡献 欢迎提交问题和拉取请求。如果你修复了某个特定应用中的粘贴失败问题,请说明是哪个应用和哪个 macOS 版本,因为这类错误几乎总是与应用特定相关。 ## 许可协议 MIT。参见 LICENSE。 — 由 Frigade (https://frigade.com) 构建,这是一个 AI 助手,它存在于你的产品中,端到端地学习它,并代表你的用户执行操作。

相似文章

Yap

Product Hunt

Yap 是一款开源的 Mac 语音听写工具,完全在设备上运行,确保隐私。

Phantom Voice

Product Hunt

Phantom Voice 是一款适用于 Mac 的本地按键通话式听写应用,无需联网即可实现免提文本输入。

Megaphone

Product Hunt

Megaphone 是一款开源的 Mac 听写应用,完全在设备上运行,保护隐私。

Show HN: 仅CPU转录YouTube、TikTok、X、Instagram视频

Hacker News Top

yapsnap 是一个命令行工具,用于将来自各种来源(YouTube、TikTok 等)的视频/音频转录为纯文本,仅使用 CPU,无需 GPU 或云。它利用 sherpa-onnx 和 yt-dlp 实现离线快速转录。