开源了一个 macOS 语音输入工具,用多模态大模型替代传统 ASR,按住说话文字就出来

3 月 17 日
 Maxwin
周末花了两天写的,解决自己的痒点,顺手开源了。

## 背景

之前一直用 Typeless 做 macOS 上的语音输入,体验确实好——按住快捷键说话,文字直接出现在光标处。但 $8/月(约 ¥60 )让我觉得有点贵,本质上就是个 API 调用的壳。于是自己动手写了一个。

## SpeakMore 是什么

菜单栏常驻的语音输入工具。按住 Fn (或自定义热键)说话,松开后文字流式插入到当前光标位置。任何 App 都能用——VS Code 、Slack 、浏览器、终端、微信,都行。

## 跟 Whisper 方案的区别

大多数语音输入走的是:`录音 → Whisper 转文字 → 后处理清理`

SpeakMore 不走 ASR ,直接把音频丢给多模态大模型( Gemini Flash 、通义千问等),一次 API 调用同时完成识别和优化。关键是连带发送的上下文:

**三层上下文系统:**

1. **实时上下文** — 通过 macOS Accessibility API 读取当前 App 名称、窗口标题、文档路径。在 VS Code 里编辑 `deployment.yaml` 时说 "Kubernetes",不会被识别成"库伯内提斯"
2. **短期记忆** — 每 10 次输入分析最近 1 小时的转录,提取话题和高频词。聊了半小时数据库迁移,不会把 "Postgres" 听成 "post grass"
3. **长期画像** — 每天从 7 天数据中构建用户画像(职业、领域、语言习惯),PII 自动脱敏

效果就是:专业术语不需要手动加词典,用着用着就准了。

## 踩坑最多的地方:文本插入

在 macOS 上往别人的文本框里塞字,比想象中难多了。最后做了三级回退:

1. **Accessibility API** — 直接设 AXValue ,最快最干净,但不是所有 App 都支持
2. **CGEvent 键盘模拟** — 逐字符模拟按键,兼容性好但长文本慢
3. **剪贴板粘贴** — 保存剪贴板 → 写入文字 → Cmd+V → 恢复剪贴板,万能但不优雅

几个坑:
- iTerm2/Terminal.app 用 Accessibility 插入会字符重复,得检测终端 Bundle ID 直接跳到 CGEvent
- 中文输入法激活时 CGEvent 会被 IME 拦截,要先发 Escape 关掉候选框
- SSE 流式传输在弱网下会截断 JSON ,做了行级缓冲+容错

老实说文本插入的调试时间比其他所有功能加起来都多。

## 技术细节

- 纯 Swift 5.9 ,SwiftUI + AppKit ,零外部依赖
- 音频:AVAudioEngine → 16kHz 单声道 PCM → 手动构建 WAV 头 → Base64 → HTTPS
- SSE 流式响应,30ms 缓冲刷新,文字边生成边出现
- 状态机架构:空闲 → 录音 → 转录 → 插入
- 安装包 ~2MB ,没有 Electron ,没有捆绑模型

## 支持的服务商

| 服务商 | 说明 |
|--------|------|
| Google Gemini | gemini-2.5-flash ,速度快 |
| 通义千问 (DashScope) | qwen-omni-turbo ,国内访问友好 |
| OpenRouter | 一个 Key 用多家模型 |
| 自定义 | 任意 OpenAI 兼容接口 |

自带 API Key ,单次转录成本大约 ¥0.01 以内。

## 链接

GitHub: https://github.com/Maxwin-z/SpeakMore-macOS

MIT 协议,macOS 14+ 。

有问题随时问,尤其是文本插入那块,可以聊很久(苦笑
1559 次点击
所在节点    分享创造
11 条回复
andforce
3 月 17 日
“付费输入”代价还是有点高的奥,先收藏再说
minminzi
3 月 17 日
上传的文件是不是漏了 SpeakMoreLite.xcodeproj ?
xream
3 月 17 日
希望能直接支持本地模型
Maxwin
3 月 17 日
@minminzi 有 scheme 可以生成哈,让 vibe coding 做一下
Maxwin
3 月 17 日
@andforce 成本还好,再说阿里云现在 token 也有免费额度。
Maxwin
3 月 17 日
@xream 这个叫 lite ,实际我有个 full 版本,的用的是 openai-whisper ,效果不行,识别出来还要大量编辑。
runking
3 月 17 日
看了不下于 5 个这样的 APP 了

等两天看看我的
Maxwin
3 月 17 日
@runking 那说明 Typeless 这一类的产品真的技术壁垒太低了呀。
runking
3 月 20 日
@Maxwin #8 我的也上线了

https://aether.7caifei.com/
Maxwin
3 月 24 日
@runking 兄弟,下载了,完全不知道怎么用啊。
runking
3 月 24 日

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1198951

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX