返回博客2026年8月13日2 分钟阅读

我把 Typeless 删啦!开源产品 Airtype 终于支持本地模型,本地优先的语音输入真香!

摘要

Airtype v0.13.0 接入 Qwen3-ASR 与 Apple MLX,不再要求 API Key,也不必把录音上传到云端,语音转文字可以完整地在 Mac 本地完成。

我做的开源 macOS 语音输入工具 AirType,刚刚发布了 v0.13.0,完整代码可以在 GitHub 开源仓库查看。这个版本只增加了一项主要功能,却改变了整个产品最基础的一条路径:语音转文字现在可以完全在 Mac 本地运行。从此本地优先,隐私优先的语音输入,让你我他她它,用着更安心!

不需要注册账户,不需要填写 API Key,录音也不必上传到云端。第一次下载好模型后,按住快捷键说话,Qwen3-ASR 会直接在 Apple Silicon 上完成识别,再把文字放到当前光标所在的位置。

我把新版首页的主标题改成了:

Your voice. Your Mac. Nothing else.

Airtype v0.13.0 官网首页

这篇我想利用 Airtype v0.13.0 的实现,讲清楚“完全本地”具体改变了什么,以及一个开源语音模型要真正进入原生 macOS 应用,中间还需要补齐哪些部分。期望对大家有所帮助。

为什么要把识别搬回 Mac

Airtype 原来的工作方式很常见:录制声音,(可选地)把音频交给 OpenAI、ElevenLabs、Mistral 或豆包等服务完成转写,再将结果插入当前应用。

这条路径能够使用不同服务商的模型,也方便快速接入新的能力,但用户需要自己准备 API Key。每次说话产生的录音还要经过网络发送出去,转写是否可用也会受到网络和外部服务状态的影响。

对于一个长期待在菜单栏、随时可能被唤起的语音输入工具,这些摩擦很难忽略。用户说出的内容可能是一封尚未发出的邮件、一段代码、会议笔记,也可能只是一个还没有整理成形的想法。即使云端服务提供完善的隐私政策,本地完成仍然是一条更短、更容易理解的数据路径。

此外,数据隐私性也是许多用户非常关心的。用第三方的语音服务,个人的语音数据会交付出去,这让大量用户降低了使用的信心。本地模型恰好完美解决了这个问题。你再也不用担心自己说的话泄露出去咯!

v0.13.0 没有移除原有云端服务,而是增加了 MLX Local。选择它之后,Airtype 的基本过程变成:

麦克风录音
    ↓
Mac 本地音频文件
    ↓
Qwen3-ASR
    ↓
MLX 在 Apple Silicon 上推理
    ↓
文字出现在当前光标位置

除了第一次安装模型需要联网,识别过程不需要连接转写 API。API Key、按分钟计费和音频上传也就不再是使用语音输入的前提。

本地模型不是下拉框里的一个名字

开始研究 Qwen3-ASR 时,一个很自然的误解是:Airtype 已经支持很多语音模型,再向模型列表里添加两个名字是否就够了?

答案是不够。云端模型背后已经有服务商负责模型文件、GPU、推理服务和版本更新,应用只需要组织一次网络请求。本地模型把这些责任带回了客户端。

要让普通用户在 Airtype 里选择一个模型并开始说话,至少需要三层能力:

  • 模型选择 - 告诉应用运行 0.6B 还是 1.7B。
  • 模型管理 - 完成首次下载、缓存检查、安装状态显示和删除。
  • 本地推理 - 读取录音,用对应模型生成文字,并把结果接回 Airtype 原有的输入流程。

因此,这次改动最后涉及 13 个文件,新增和调整了约 840 行代码。项目里加入了独立的本地 ASR 接口、模型管理器、MLX 转写服务和 Qwen3-ASR 适配层;设置页与首次启动流程也必须理解一种“不需要 API Key 的 Provider”。

这部分界面应该尽量简单。用户不需要知道权重文件存在哪个缓存目录,也不需要理解模型转换参数。他只需要选择 MLX Local,选择一个模型,点击安装。

Qwen3-ASR、MLX 和 4-bit

Qwen3-ASR 官方发布了 0.6B 和 1.7B 两个主要尺寸,支持自动语言识别、30 种语言和 22 种中文方言。官方常见的运行方式是 Python、Transformers 或 vLLM,这些方案适合服务器和 Python 环境,却不是原生 Swift 菜单栏应用最自然的依赖方式。

Airtype 使用的是 MLX Community 转换的两个版本:

Airtype 中的模型下载大小适合的选择
Qwen3-ASR-0.6B-4bit约 708 MB默认选择,占用更低
Qwen3-ASR-1.7B-4bit约 1.6 GB更看重识别质量

它们不是 MLX Community 重新训练的另一套模型,而是从 Qwen 官方权重转换并量化而来。这里的 4-bit 指主要模型权重经过低比特量化,模型文件和内存占用随之降低,更适合在个人电脑上运行;代价是与官方 BF16 权重相比,理论上可能存在少量精度损失。

MLX 则是 Apple 面向 Apple Silicon 推出的机器学习框架。Airtype 通过 Swift 依赖直接加载模型,利用 Mac 的统一内存和 GPU 完成推理,不需要在后台再启动一个 Python 服务。模型文件来自 Hugging Face 的 mlx-community 仓库;Apple 提供运行框架和 Metal 加速,但并不托管这两个 Qwen 模型。

换句话说,这条本地链路由几部分共同组成:Qwen 提供模型,MLX Community 完成适合 Apple Silicon 的转换与量化,Hugging Face 托管权重,MLX 在 Mac 上执行推理,Airtype 负责把这一切变成一个安装按钮和一组快捷键。

从能够编译到能够发布

这次开发还有一个很实际的过程:代码可以编译,不等于功能已经能够公开发布。

最初的实现已经接通了模型选择、下载和转写,但发布审计仍然发现了一些问题。例如 MLX Audio 依赖跟踪的是不断变化的 main 分支;设置里出现了尚未真正影响推理的计算模式;改动中还夹带了与本次版本无关的 GLM-ASR 实验。

最终发布时,我把范围收敛到两个 Qwen3-ASR 4-bit 模型,并将 MLX Audio 固定在经过构建验证的提交上。由于这套依赖需要更新的 Swift 与 Metal 工具链,GitHub Actions 的发布环境也从原来的 Xcode 16.2 调整到了 Xcode 26.2。

随后才是原生 macOS 应用公开分发必须经过的部分:Release Archive、Developer ID 签名、Apple 公证、stapling、DMG 打包和 GitHub Release。第一次 CI 在公证阶段遇到 Apple 开发者协议过期,接受协议后重新运行,v0.13.0 才完整发布。

这也解释了为什么“支持一个本地模型”最终不是增加两个枚举值。模型能够返回文字只是中间一步;用户能下载、能安装、能离线使用,并且可以拿到签名和公证过的应用,才是一个完成的功能。

现在怎样使用

Airtype 是一个原生 SwiftUI 菜单栏应用,需要 macOS 14 或更高版本。安装 v0.13.0 后,可以这样启用本地识别:

  1. 打开 Airtype 设置,在 Voice Input 中选择 MLX Local
  2. 先选择 Qwen3-ASR-0.6B-4bit,点击 Install 下载模型。
  3. 下载完成后,按住默认快捷键 Option + Space 说话。
  4. 松开快捷键,识别出的文字会插入当前应用的光标位置。

0.6B 更适合作为第一次使用的选择。如果机器内存充足,并且更看重识别质量,可以再安装 1.7B 比较自己的真实使用场景。模型安装完成后,日常转写不需要 API Key,也不会把录音交给云端语音服务。

云端 Provider 仍然保留。它们适合需要特定模型或服务能力的用户;MLX Local 则让最基础的语音输入不再依赖任何外部账户。对 Airtype 来说,这不是多了一个 Provider,而是终于让“Your voice. Your Mac.”成为了产品实际运行的方式。


相关文章

最近一封 · Sample

跑个 Docker 容器,就是 Agent 沙箱了吗?还差关键一层

把 Coding Agent 放进 Docker,保护的首先是宿主机,不等于限制它能把读到的数据带到哪里。Vercel 与 Docker Sandboxes 的新做法,都把网络访问边界和凭据控制放进了 Agent Sandbox。

—— william

Letters

来信

里面装的是

  • 新文章 — 写完一篇就寄一封,不攒货
  • 这周读到的、看到的、好用的工具
  • 正在折腾的实验,附带翻车记录

约莫 1–2 周一封 · 随时退订

合作伙伴

CompeteMap — 英国及爱尔兰学生竞赛一站式搜索

数学、编程、科学、写作等各类竞赛信息汇总,支持按年龄和科目筛选,再也不错过报名截止日。

准备开始了吗?

先简单说明目标,我会给出最合适的沟通方式。