←新闻详情

Hugging Face更新于 10月30日 14:56

AnySpeechRecognizer 与 AnyDecisionModel:面向 Apple 平台的语音与决策开源模型

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

AI 导读

AnySpeechRecognizer 在 Apple SpeechAnalyzer API 之上支持切换引擎,可选用 NVIDIA Parakeet TDT 0.6B v3(支持 25 种欧洲语言)、Moondream 后训练的 Parakeet Ultra、英文版 Parakeet Unified,以及阿里 Qwen3-ASR(0.6B/1.7B,覆盖 30 种语言和 22 种中文方言)。这些模型已转为 Core ML 发布在 Hugging Face Hub,Parakeet 转写 1 小时音频约需 20–40 秒,Qwen3-ASR 更慢且需数 GB 内存。包内还新增 Apple 框架没有的说话人分离模块 SpeakerDiarizer,基于 NVIDIA Streaming Sortformer,最多跟踪 4 位说话人。

正文 · AI 翻译

AnySpeechRecognizer

计算机转写语音已有数十年历史,过去几年里,它们在这方面已经变得非常出色。Apple 平台早已为此提供了 API。macOS 26 和 iOS 26 引入了 SpeechAnalyzer,这是 Apple 新的语音转文本 API。你向分析器添加 SpeechTranscriber 和 SpeechDetector 等模块,给它一个文件或一串音频缓冲区,然后从异步序列中读取陆续到达的结果。AssetInventory 负责安装模型,因此由你的应用决定何时下载。

这是一个设计良好的 API,但背后唯一的引擎是 Apple 的。AnySpeechRecognizer 保留该 API,并让你选择引擎:

该包镜像了 SpeechAnalyzer、SpeechTranscriber、DictationTranscriber、SpeechDetector 和 AssetInventory,并以 Apple 的 Speech 框架作为默认引擎。如果你的代码使用这套共享 API,只需更改 import 即可。要改用 Parakeet,只需更改创建转写器的方式:

安装资源、运行分析器和读取结果的步骤保持不变。README 中有一个完整示例,并列出了与 Apple 框架的差异。

认识这些模型

Parakeet v3 是 NVIDIA 的 Parakeet TDT 0.6B v3。它是一个多语种模型:能识别 25 种欧洲语言,并自行判断听到的是哪一种,因此你无需传入区域设置。

Parakeet Ultra 是 Moondream 在 v3 基础上后训练得到的版本。在我们的大多数测量中,它都更准确。

Parakeet Unified 是 NVIDIA 仅支持英语的 Parakeet。

三个 Parakeet 都运行在该包自有的 Core ML 运行时上,支持文件和实时输入、易变结果、词级时间戳和词级置信度。

Qwen3-ASR 是阿里巴巴的语音模型,有 0.6B 和 1.7B 两种规模。它能识别 30 种语言和 22 种中文方言,包括普通话、粤语、日语和韩语,这些是 Parakeet 不覆盖的。它会自动检测语言,你也可以手动指定一种:

Qwen3-ASR 对每段最长 40 秒的音频给出一个最终结果,不提供易变结果、词级时间戳或置信度。它运行在 GPU 上,比 Parakeet 慢,因此更适合转写文件,而非实时输入。

Hub 上的 Core ML 模型

为了在应用中运行这些模型,我们将它们转换为 Core ML 并发布在 Hub 上:

每个仓库都记录了其源检查点以及每个文件的校验和,该包将其固定到某个固定修订版本。Parakeet 仓库额外提供了一个用于实时输入的 8 秒编码器,可将实时分析时间缩短约三分之一,代价是词错误率略有升高。该仓库还包含转换工作流,其中大部分遵循 FluidInference 的 mobius 脚本,并将每次转换结果与原始模型进行校验。

只有你的应用请求时才会发生下载:每个 Parakeet 约 600 MB,实时编码器另需约 590 MB,Qwen3-ASR 为 0.9 至 2.4 GB,Sortformer 约 250 MB。文件存放在标准的 Hugging Face 缓存中,因此沙盒之外的 Mac 应用可以与 Python 及其他 Hugging Face 工具共享它们。

说话人分离

转写对话时,你往往想知道谁说了什么。这就是说话人分离,而 Apple 的 Speech 框架没有对应模块,因此 AnySpeechRecognizer 添加了一个。SpeakerDiarizer 在同一时间轴上,与 Apple 或 Parakeet 转写器并行运行 NVIDIA 的 Streaming Sortformer(基于 Core ML):

该分离器最多跟踪四位说话人,即使他们同时说话也能处理。SpeakerTimeline 收集其结果,并将每个带时间戳的词归属到某位说话人,因此你可以按说话人轮次打印转写文本。与 AnyLanguageModel 中的图像支持一样,这超越了 Apple 的 API 目前提供的能力。

该分离器默认使用 Sortformer v2。你也可以选择 v2.1,NVIDIA 用更多会议数据训练了它,在我们的测量中,它在会议场景下也更准确。

效果如何?

我们在搭载 macOS 27.0.1 的 M4 Max Mac Studio 上,用该包的 hear 命令行工具进行了测量。以下是 3 至 8 分钟的 LibriSpeech 文件上的词错误率:

Parakeet 从文件转写一小时音频约需 20 至 40 秒,实时输入约需 1.5 至 2.5 分钟,Core ML 编译模型后内存占用约 100 MB。Qwen3-ASR 慢得多,且需要数 GB 内存。会议场景对所有人来说都很难:在人们互相抢话的 AMI 录音上,我们测试的每个引擎词错误率都高于 23%。

这些数字来自一台机器和少数几个数据集,因此请在你自己的硬件和音频上进行测量。hear evaluate 可在你自己的文件上运行,仓库中的 natural-speech-eval.py 工具可复现这些测量结果。到目前为止,我们只在 macOS 27 上测试过,尚未在 iPhone 上测试。

接下来,我们希望添加更多引擎,包括 macOS 27 和 iOS 27 上的 Core AI。

AnyDecisionModel

AnyDecisionModel 则是另一回事。没有可映射的 Apple 框架,而且决策模型严格来说也并不新鲜。

只有来自法国 Décision 地区的才算决策模型;否则,它只是闪闪发光的零样本分类。

新意在于名字、大量的宣传,以及一批经过训练、能够做出决策的模型。我们认为这就是未来的方向,因此我们希望提供一个为它们做好准备的 Swift API。

应用经常让语言模型做出决策。这条消息紧急吗?这个工单应该由哪个团队处理?这位客户有多沮丧?通常的做法是给语言模型一个提示,然后解析它生成的文本。这样你能得到一个答案,但看不到它分配给各个备选答案的概率。

在 Swift 中,一个决策是这样的:

urgent 是一个 Double。team 是一个 Choice,包含选中的选项、每个选项的概率以及一个置信度值。anger 是一个 Score,包含期望的等级、每个等级的概率以及一个置信度值。由于 Department 遵循 Choosable,team.value 是一个 Department,你可以在穷尽式 switch 中使用它。

如果你用过 Foundation Models 或 AnyLanguageModel,模型与会话的模式会看起来很熟悉。DecisionSession 持有单一状态,该状态可以是文本或 JSON,每个问题都是关于该状态的。问题之间相互独立:一个答案永远不会成为后续问题的输入。要一次提出多个问题,请将它们作为一批传给 decide(_:)。

对于每个问题,MLX 后端会构建一个提示,为每个允许的答案提供一个单 token 标签,然后从一次前向传播中读取每个标签的概率。

试一试:Emoji Magnet

Emoji Magnet 是一个 macOS 应用,在一个包含 343 个 emoji 的堆叠上方有一个文本输入框。输入一个短语,例如“things you wear”,匹配的 emoji 就会从堆叠中升起。把它细化为“things you wear in winter”,不再匹配的 emoji 就会落回去。

该应用没有内置的关键词规则;一切都由模型在推理时决定。当你停止输入时,它会针对每个 emoji 向模型提出一个是非问题,例如:

会话的状态保存着这个短语。上面的演示使用托管的 Jev 后端,它在一个请求中回答全部 343 个问题,因此每个短语的 emoji 大约在半秒内就稳定下来。如果没有 TYPESAFE_AI_API_KEY,应用会在你的 Mac 上使用 MLX 后端运行 Qwen3 4B。该后端使用前缀缓存来对状态求值一次,然后每次前向传播回答 16 个问题。在 M4 Max 上,模型加载后,一组 16 个问题大约需要 0.45 秒。对全部 343 个 emoji 完整跑一遍大约需要 10 秒,每组的结果一到达就会显示出来。

Emoji Magnet 位于 AnyDecisionModel-Examples 仓库中。

决策头与 Clef

读取下一个 token 的概率适用于通用语言模型,但这些模型并未经过训练来做出决策。Cloudflare 的 Clef 模型是更新方法的一个例子:一个带有训练好的决策头的模型,它把一个状态和一份类型化问题模式转换为决策,在一次前向传播中返回所有问题中所有允许选项的概率。Clef-Flash 是 9B 变体。

AnyDecisionModel 在 Mac 上使用 MLX 运行 Clef-Flash:

你使用相同的会话和问题,但 MLXHeadDecisionModel 从 Clef 训练好的决策头读取每个决策,而不是从下一个 token 的概率中读取。这个 4 位模型是一个 6.2 GB 的下载,其模型卡建议使用至少 16 GB 内存的 Mac。Clef 可以读取图像和视频,但此后端只接受文本和 JSON 状态。

校准与检查概率

语言模型的原始概率往往过度自信。本地后端接受一个 Calibration,它对每个答案应用温度,并对是非答案应用偏置。使用单独的数据集来拟合校准并评估结果。

语言模型也可能因为某个选项在列表中的位置而偏向它。在 MLX、Core AI 和 llama.cpp 的下一个 token 后端上,开启 rotationDebiasing,对选项的每一种轮换各问一次选择题,并对概率取平均。这需要为每次轮换进行一次提示求值。

每个本地选择和分数还包含一个基于其概率熵的置信度值。它衡量的是概率有多集中,而不是答案是否正确,所以在选择阈值之前,请在你自己的数据上检查错误率。下一个 token 后端的诊断会报告模型分配给允许答案的概率有多少。数值低意味着它把大部分概率分配到了别处。

后端

AnyDecisionModel 有六个后端:

MLX 使用 mlx-swift-lm 在 Apple 芯片上运行一个小型语言模型,并从 Hub 下载它。

MLX 决策头运行一个带有自己训练好的决策头的模型,例如 Clef。

Core AI 在 macOS 27 和 iOS 27 上使用 Core AI 模型做与 MLX 相同的事。

llama.cpp 通过 llama.swift 从本地 GGUF 模型读取决策。

Jev 通过 System One API 调用 TypeSafe 的 Jev,或任何实现了它的服务器,例如 Kev。

Ollama 在本地 Ollama 服务器或 Ollama 的云中调用 System One 决策模型。它需要 Ollama 0.35.0 或更高版本,云模型则需要 0.40.5 或更高版本。

下一个 token 后端把答案标记为“yes”和“no”、A 到 Z,或 0 到 9,因此一个选择最多可以有 26 个选项,一个分数最多可以有 10 个等级。决策头没有这样的限制。

与 AnyLanguageModel 一样,该包使用 Swift 包特性(traits)。不启用任何特性时,它没有第三方依赖。你会获得核心类型以及 Jev 和 Ollama 后端,这些在 Linux 上也能构建。为本地后端启用 MLX、CoreAI 或 Llama 特性。

两个包都要求 Swift 6.2 或更高版本,以及 macOS 26 或 iOS 26 或更高版本。Parakeet 和 Sortformer 运行时以及 MLX 后端需要 Apple 芯片。AnyDecisionModel 的 MLX 构建任务使用 Xcode 的 Swift 6.4 或更高版本以及 Metal 工具链;Core AI 需要 Xcode 27 和 OS 27 运行时。

将这两个包添加到你的 Package.swift 中:

目前,AnyDecisionModel 的 CoreAI 特性无法与 AnySpeechRecognizer 组合使用,因为 coreai-kit 0.7.3 要求 swift-huggingface 低于 1.0,而 AnySpeechRecognizer 要求 1.x。

每个 README 都有更多示例以及关于要求和后端的详细信息。AnySpeechRecognizer 还包含一个命令行工具 hear,它可以转写本地文件、标注其中的说话人并评估结果。每个 hear 命令都需要 --backend apple、--backend parakeet 或 --backend qwen;在进行分析之前,请使用相同的后端和模型选项运行 hear prepare,以安装所需的资源。

在你的应用中试用它们,并告诉我们哪些功能可用、哪些不可用。欢迎在两个仓库中提交 issue 和 pull request。

链接

GitHub 上的 AnySpeechRecognizer

GitHub 上的 AnyDecisionModel

GitHub 上的 AnyDecisionModel-Examples

GitHub 上的 AnyLanguageModel

GitHub 上的 swift-huggingface

感谢 NVIDIA 提供 Parakeet、Sortformer 和 NeMo,感谢 Moondream 提供 Parakeet Ultra,感谢 FluidInference——其 FluidAudio 和 mobius 项目记录了 Parakeet 运行时和 Core ML 转换所遵循的约定,感谢 Cloudflare 提供 Clef,也感谢所有为 AnyLanguageModel 做出贡献的人,这两个包都借鉴了它的模式。

本文提到的模型 10

Qwen/Qwen3-ASR-0.6B-hf

Qwen/Qwen3-ASR-1.7B-hf

mattt/parakeet-tdt-0.6b-v3-coreml

mattt/parakeet-ultra-coreml

mattt/parakeet-unified-en-0.6b-coreml

mattt/qwen3-asr-0.6b-coreml

mattt/qwen3-asr-1.7b-coreml

moondream/parakeet-ultra

nvidia/parakeet-tdt-0.6b-v3

nvidia/parakeet-unified-en-0.6b

来自我们博客的更多文章

AnyLanguageModel 1.0:Apple 平台上本地模型的一年

本文提到的模型 10

Qwen/Qwen3-ASR-0.6B-hf

Qwen/Qwen3-ASR-1.7B-hf

mattt/parakeet-tdt-0.6b-v3-coreml

mattt/parakeet-ultra-coreml

mattt/parakeet-unified-en-0.6b-coreml

mattt/qwen3-asr-0.6b-coreml

mattt/qwen3-asr-1.7b-coreml

moondream/parakeet-ultra

nvidia/parakeet-tdt-0.6b-v3

nvidia/parakeet-unified-en-0.6b

来源

Hugging Face