Apple 平台开源语音识别与决策模型 Swift 包

Apple 生态的机器学习库 AnyLanguageModel 作者近期发布两个新开源包:AnySpeechRecognizer 和 AnyDecisionModel,分别把语音识别与决策模型带进 Swift,核心思路与 AnyLanguageModel 一致:用熟悉的 Swift API,背后可自由更换模型。

AnySpeechRecognizer 复刻了 Apple 在 macOS 26 / iOS 26 推出的 SpeechAnalyzer 语音转写 API,但不再锁定 Apple 自家引擎。它默认使用 Speech 框架,同时支持 NVIDIA Parakeet 系列与阿里 Qwen3-ASR,均以 Core ML 形式在本地运行。对已有使用 SpeechAnalyzer 的代码,只需把 import Speech 换成 import AnySpeechRecognizer;若要切换引擎,仅改变创建 transcriber 的方式即可,后续安装资源、运行 analyzer、读取结果的步骤不变。

模型方面,Parakeet v3 是 NVIDIA 的多语言模型,识别 25 种欧洲语言并自动判断语种,无需指定 locale。Parakeet Ultra 是 Moondream 在 v3 基础上继续训练的版本,在作者多数测试中更准。Parakeet Unified 是 NVIDIA 的纯英文版。三个 Parakeet 都跑在包自带的 Core ML runtime 上,支持文件与实时输入、volatile 结果、词级时间戳和置信度。Qwen3-ASR 来自阿里,有 0.6B 和 1.7B 两个尺寸,覆盖 30 种语言和 22 种汉语方言,包括 Parakeet 不支持的粤语、日语、韩语;它能自动检测语言,也可手动指定。但它只对最长 40 秒的片段给出最终结果,没有词级时间戳或置信度,且跑在 GPU 上,速度明显慢于 Parakeet,更适合离线转写文件。作者把转换好的 Core ML 模型发布在 Hugging Face Hub,每个仓库记录源 checkpoint、文件校验和,并固定到具体 revision。Parakeet 模型约 600 MB,实时编码器另需约 590 MB,Qwen3-ASR 约 0.9 到 2.4 GB,Sortformer 约 250 MB。下载只在应用请求时发生,且文件存放在标准 Hugging Face 缓存目录,Mac 非沙盒应用可与 Python 等工具共享。

AnySpeechRecognizer 还额外实现了说话人分离。Apple Speech 框架没有这个模块,所以包内置 SpeakerDiarizer,用 Core ML 运行 NVIDIA 的 Streaming Sortformer,与 Apple 或 Parakeet 转写器在同一时间线上工作,最多跟踪四个说话人,即使他们同时讲话也能区分。SpeakerTimeline 会把每个带时间戳的词归属到对应说话人,方便按轮次输出转写文本。默认使用 Sortformer v2,也可选 v2.1——NVIDIA 用更多会议数据训练,作者实测在会议场景也更准。

作者在 M4 Max Mac Studio、macOS 27.0.1 上用 hear 命令行工具测了 LibriSpeech 3 到 8 分钟文件的词错误率:Parakeet v3 文件模式 test-clean 1.55%、test-other 2.78%,实时模式分别为 4.73% 和 4.29%;Parakeet Unified 文件模式 1.43% / 2.19%,实时模式 1.45% / 2.42%;Apple 自带转写器文件模式 2.12% / 3.97%。Parakeet 转写一小时音频,文件模式约 20 到 40 秒,实时模式约 1.5 到 2.5 分钟,Core ML 编译后内存约 100 MB。Qwen3-ASR 明显更慢,需要数 GB 内存。在人们互相抢话的 AMI 会议数据上,所有引擎词错误率都高于 23%。作者提醒这些数字来自单一机器和少数数据集,需要用自己的硬件和音频测试。

AnyDecisionModel 解决的问题不同:应用经常让语言模型做分类或打分,比如判断消息是否紧急、票单该转给哪个团队、客户有多不满。常见做法是让模型生成文本再解析,但这样拿不到模型对各选项的概率。AnyDecisionModel 直接读取模型概率,返回类型化结果。它支持 yes/no、多选题和评分题,例如可以用 enum 定义部门,用 session.choice 拿到 Choice,其中包含选中项、每个选项的概率和置信度。DecisionSession 持有单一状态(文本或 JSON),所有问题都针对这个状态,问题之间独立,不会把某个答案作为后续问题的输入;多个问题可批量调用 decide(_:)。MLX 后端会为每个允许答案构造单 token 标签,一次前向传播读出各标签概率。

AnyDecisionModel 有六个后端:MLX 在本机 Apple 芯片跑小模型;MLX decision heads 支持带训练决策头的模型,比如 Cloudflare 的 Clef-Flash 9B(4-bit 量化后下载约 6.2 GB,建议至少 16 GB 内存);Core AI 对应 macOS 27 / iOS 27;llama.cpp 通过 llama.swift 读本地 GGUF;Jev 调用 TypeSafe 的 System One API,也兼容 Kev;Ollama 调用本地或云端 System One 决策模型,要求 Ollama 0.35.0 以上,云端模型需 0.40.5 以上。next-token 类后端用 yes/no、A-Z、0-9 作为标签,所以选择题最多 26 个选项、评分题最多 10 档;决策头没有这个限制。

包还提供概率校准和位置偏差处理。本地后端支持 Calibration,用温度调整每个答案、对 yes/no 加偏置,并建议用独立数据集拟合校准和评估效果。rotationDebiasing 会把同一道选择题按选项轮换顺序问多次并平均概率,以消除位置偏好,但每次轮换都要一次 prompt 评估。每个选择和评分都带基于概率熵的置信度,它只反映概率集中程度,不反映答案是否正确,因此使用阈值前需在自己数据上验证错误率。

作者用 Emoji Magnet 示例展示实际效果:一个 macOS 应用,输入短语后 343 个 emoji 中匹配的会浮起来。应用没有内置关键词规则,全靠模型在推理时判断。输入暂停时,它会对每个 emoji 问一个 yes/no 问题。用托管 Jev 后端时,343 个问题一次请求全部回答,约半秒内完成;没有 API key 时,用 MLX 后端跑 Qwen3 4B,M4 Max 上每 16 个问题一组约 0.45 秒,全部 343 个约 10 秒。

两个包要求 Swift 6.2 以上、macOS 26 或 iOS 26 以上;Parakeet、Sortformer runtime 和 MLX 后端都需要 Apple silicon。Swift 包使用 traits 管理依赖,无额外 trait 时零第三方依赖,只有 Jev 和 Ollama 后端(也支持 Linux)。当前 AnyDecisionModel 的 CoreAI trait 无法与 AnySpeechRecognizer 同时使用,因为 coreai-kit 0.7.3 依赖 swift-huggingface 1.0 以下版本,而 AnySpeechRecognizer 要求 1.x。AnySpeechRecognizer 还附带 hear 命令行工具,可转写本地文件、标注说话人、评估结果。两个仓库均接受 issue 和 PR。

Introducing AnySpeechRecognizer and AnyDecisionModel: Open Models for Speech and Decisions on Apple Platforms

查看原文