Hugging Face 发布 AnySpeech 与 AnyDecision 开源模型库

原标题:Introducing AnySpeechRecognizer and AnyDecisionModel: Open Models for Speech and Decisions on Apple Platforms
68AI 研判分

Hugging Face 推出 AnySpeechRecognizer 和 AnyDecisionModel 两个开源 Swift 包,旨在为 Apple 平台提供比通用大语言模型更高效、低成本的语音识别与决策专用模型接口。该更新延续了 AnyLanguageModel 的设计范式,允许开发者在本地或云端灵活切换底层模型实现。

报道正文

本文目录13 个章节

返回文章列表

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

发布于 2026 年 10 月 29 日 在 GitHub 上更新 点赞 - Mattt mattt 关注

语言模型功能强大。它们可以写作、摘要、翻译以及调用工具。但它们只是机器学习所能实现的一小部分功能。

假设一位客户拨打了你的支持热线。首先,你需要知道他们说了什么(语音识别)。然后,你需要决定将他们转接给谁(决策)。你可以将这两项任务都交给语言模型处理,但针对每项任务都有专门构建的模型,它们更优、更快且成本更低。

在我们的 AnyLanguageModel 1.0 回顾中,我们探讨了 Swift 中本地和托管模型的一年发展历程。随着 AnyLanguageModel 和 swift-huggingface 发布 1.x 版本,我们将同样的方法扩展到了语音和决策领域:提供熟悉的 Swift API 并允许选择模型。

今天,我们宣布推出两个包:

  • AnySpeechRecognizer 实现了 Apple 全新的语音转文本 API,并提供多种识别引擎供选择,包括在 Core ML 上本地运行的 NVIDIA Parakeet 和阿里巴巴 Qwen3-ASR,此外还增加了说话人分离功能以追踪谁在何时发言。
  • AnyDecisionModel 通过类型化结果和概率来回答是/否、多项选择和评分量表问题。它直接从模型的概率中推导答案,而不是生成文本,使用设备上的模型(通过 MLX、Core AI 或 llama.cpp)或来自 Jev 或 Ollama 的决策模型。

这两个包都可以从 Hugging Face Hub 下载开源模型并在设备上运行。

AnySpeechRecognizer

计算机转录语音已有数十年历史,而在过去几年里,它们的性能变得非常出色。Apple 平台已经提供了相应的 API。macOS 26 和 iOS 26 引入了 SpeechAnalyzer,这是 Apple 全新的语音转文本 API。你可以向分析器添加诸如 SpeechTranscriber 和 SpeechDetector 等模块,向其提供文件或音频缓冲区流,并从异步序列中读取实时到达的结果。AssetInventory 负责安装模型,因此你的应用可以自行决定何时进行下载。

这是一个设计精良的 API,但其背后唯一的引擎是 Apple 自家的。AnySpeechRecognizer 保留了相同的 API,但允许你选择引擎:

DIFF
- import Speech
+ import AnySpeechRecognizer

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

SWIFT
let transcriber = SpeechTranscriber(
    model: ParakeetSpeechModel(variant: .v3),
    transcriptionOptions: [],
    reportingOptions: [.volatileResults],
    attributeOptions: [.audioTimeRange]
)

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

模型介绍

Parakeet v3 是 NVIDIA 的 Parakeet TDT 0.6B v3。它是一个多语言模型:能够识别 25 种欧洲语言,并自动检测正在听到的语言,因此无需传入 locale 参数。

Parakeet Ultra 是 Moondream 基于 v3 进行的后训练版本。在我们的大部分测量中,它的准确率更高。

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

所有三个 Parakeet 模型都运行在该包自带的 Core ML 运行时上,支持文件输入和实时输入、易失性结果(volatile results)、单词时间戳以及单词置信度。

Qwen3-ASR 是阿里巴巴的语音模型,提供 0.6B 和 1.7B 两种规格。它支持识别 30 种语言和 22 种中国方言,包括普通话、粤语、日语和韩语,这些是 Parakeet 未覆盖的语言。它可以自动检测语言,或者你可以手动指定:

SWIFT
let transcriber = SpeechTranscriber(
    model: QwenSpeechModel(variant: .large, language: Locale.Language(identifier: "yue")),
    transcriptionOptions: [],
    reportingOptions: [],
    attributeOptions: []
)

Qwen3-ASR 为每个最长 40 秒的语音片段提供最终结果,不包含易变结果、词级时间戳或置信度。它在 GPU 上运行,速度比 Parakeet 慢,因此更适合用于转录文件而非实时输入。

要添加另一个引擎,请为其配置实现 SpeechRecognitionModel,并为单个模块的会话实现 SpeechRecognitionExecutor。README 中包含一个小型提供方,它返回占位文本以帮助你入门。

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 工具共享这些文件。

说话人分离(Speaker Diarization)

在转录对话时,你通常希望知道“谁说了什么”。这就是说话人分离功能,而 Apple 的 Speech 框架并未提供相关模块,因此 AnySpeechRecognizer 对此进行了补充。SpeakerDiarizer 在 Core ML 上运行 NVIDIA 的 Streaming Sortformer,并与 Apple 或 Parakeet 转录器在同一时间轴上协同工作:

SWIFT
let diarizer = SpeakerDiarizer(model: SortformerDiarizationModel())
if let request = try await AssetInventory.assetInstallationRequest(
    supporting: [transcriber, diarizer]
) {
    try await request.downloadAndInstall()
}
let analyzer = SpeechAnalyzer(modules: [transcriber, diarizer])

该分离器最多可追踪四位说话人,即使他们同时讲话也能准确区分。SpeakerTimeline 会收集其结果,并将每个带时间戳的词归属到对应的说话人,从而让你能够按说话人轮次打印转录文本。与 AnyLanguageModel 中的图像支持类似,这一功能超越了 Apple 当前 API 所能提供的能力。

分离器默认使用 Sortformer v2。你也可以选择 v2.1,NVIDIA 使用更多会议数据对其进行了训练,在我们的测试中,它在处理会议场景时也表现出更高的准确性。

效果如何?

我们在搭载 macOS 27.0.1 的 M4 Max Mac Studio 上,使用该包的 hear 命令行工具对性能进行了测量。以下是针对时长为 3 到 8 分钟的 LibriSpeech 文件的词错误率(Word Error Rate):

转录器test-cleantest-other
Parakeet v3,文件模式1.55%2.78%
Parakeet v3,实时模式4.73%4.29%
Parakeet Ultra,文件模式1.66%2.55%
Parakeet Ultra,实时模式2.65%3.28%
Parakeet Unified,文件模式1.43%2.19%
Parakeet Unified,实时模式1.45%2.42%
Apple 转录器,文件模式2.12%3.97%

Parakeet 处理一小时的音频文件大约需要 20 到 40 秒,实时转录则需约 1.5 到 2.5 分钟;一旦 Core ML 完成模型编译,内存占用约为 100 MB。相比之下,Qwen3-ASR 的速度要慢得多,且需要数 GB 的内存。会议场景对所有引擎来说都是挑战:在人们相互插话的 AMI 录音数据集上,我们测试的所有引擎的词错误率(Word Error Rate)均超过 23%。

这些数据仅基于一台机器和少量数据集得出,因此请务必使用你自己的硬件和音频进行测量。hear evaluate 支持在你的本地文件上运行,而代码仓库中的 natural-speech-eval.py 工具 可复现这些测量结果。目前,我们仅在 macOS 27 上进行了测试,尚未在 iPhone 上进行验证。

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

AnyDecisionModel

AnyDecisionModel 则是另一回事。它没有对应的 Apple 框架可以映射,而且决策模型本身也并非全新概念。

只有源自法国 Décision 地区的模型才叫“决策模型”;否则,那不过是带气泡的零样本分类罢了。

真正新颖的是它的名称、大量的炒作,以及一批专门训练用于做出决策的模型。我们认为这是未来的发展方向,因此希望提供一个为它们做好准备的 Swift API。

应用程序经常要求语言模型做出决策。这条消息紧急吗? 这个工单应该由哪个团队处理? 这位客户有多沮丧? 通常的做法是向语言模型发送提示词并解析其生成的文本。这虽然能给出一个答案,但无法展示模型分配给其他选项的概率。

以下是 Swift 中决策操作的示例:

SWIFT
import AnyDecisionModel

enum Department: String, Choosable {
    case billing, technical, sales
}

let ticket = "I was charged twice for my order, and now the app logs me out when I try to ask for a refund."

let model = MLXDecisionModel(modelID: "mlx-community/Qwen3-4B-Instruct-2507-4bit")
let session = DecisionSession(model: model, state: .text(ticket))

let urgent = try await session.probability(of: "Does this convey urgency?")
let team = try await session.choice("Which team?", from: Department.self)
let anger = try await session.score(
    "How frustrated?",
    levels: ["Calm", "Frustrated", "Very angry"]
)

urgent 是一个 Double。team 是一个 Choice<Department>,包含选中的 case、每个选项的概率以及一个置信度值。anger 是一个 Score,包含预期等级、每个等级的概率以及一个置信度值。由于 Department 遵循 Choosable 协议,因此 team.value 是一个 Department,你可以将其用于穷尽的 switch 语句中。

如果你使用过 Foundation Models 或 AnyLanguageModel,那么“模型与会话”(model-and-session)的模式对你来说应该很熟悉。DecisionSession 持有一个单一状态,该状态可以是文本或 JSON,而所有问题都是针对这个状态的。问题是相互独立的:某个问题的答案绝不会成为后续问题的输入。若要同时提出多个问题,请将它们作为批次传递给 decide(_:)。

对于每个问题,MLX 后端会构建一个提示词(prompt),其中为每个允许的答案分配一个单 token 标签,然后通过一次前向传播读取每个标签的概率。

试一试:Emoji Magnet

Emoji Magnet 是一款 macOS 应用,其界面在一个由 343 个 emoji 组成的堆叠上方设有一个文本字段。输入一个短语,例如 "things you wear"(穿戴物品),匹配的 emoji 会从堆叠中升起。将短语细化为 "things you wear in winter"(冬季穿戴物品),不再匹配的 emoji 则会落回堆叠中。

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

文本
Statement: a heavy winter coat fits the description "things you wear". Is this statement true?

会话的状态保存着该短语。上述演示使用了托管的 Jev 后端,该后端在一次请求中回答全部 343 个问题,因此每个短语对应的 emoji 会在大约半秒内稳定下来。如果没有设置 TYPESAFE_AI_API_KEY,应用将在你的 Mac 上使用 MLX 后端运行 Qwen3 4B。该后端利用前缀缓存(prefix caching)对状态进行一次评估,然后在每次前向传播中回答 16 个问题。在 M4 Max 芯片上,模型加载后处理一组 16 个问题大约需要 0.45 秒。遍历所有 343 个 emoji 的完整过程大约需要 10 秒,且每组结果一旦到达便会立即显示。

Emoji Magnet 位于 AnyDecisionModel-Examples 仓库中。

Decision heads 和 Clef

阅读下一个 token 的概率适用于通用语言模型,但这些模型并非为做出决策而训练。Cloudflare 的 Clef 模型代表了一种较新的方法:该模型配备了一个经过训练的决策头(decision head),能够将状态和类型化问题的模式(schema)转化为决策,并在单次前向传播中返回所有允许选项的概率。Clef-Flash 是其中的 9B 参数变体。

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

SWIFT
let model = MLXHeadDecisionModel(
    modelID: "mlx-community/clef-flash-4bit",
    head: .jointSchema
)

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

校准与检查概率

语言模型输出的原始概率往往过于自信。本地后端支持 Calibration(校准),它会对每个答案应用温度参数,并对是否类答案应用偏置。请使用独立的数据集来拟合校准并评估结果。

语言模型也可能因为选项在列表中的位置而偏向某个选项。在 MLX、Core AI 和 llama.cpp 的下一个 token 后端上,启用 rotationDebiasing(旋转去偏),即对每个选项排列组合分别提问一次选择题,然后平均概率。这会导致每次旋转都需要进行一次提示词评估。

每个本地选择的评分还包含一个基于概率熵的置信度值。它衡量的是概率分布的集中程度,而非答案的正确性,因此在设定阈值之前,请先在你自己的数据上检查错误率。下一个 token 后端的诊断报告会显示模型分配给允许答案的概率总和。如果该值较低,说明模型将大部分概率分配给了其他选项。

后端

AnyDecisionModel 有六个后端:

  • MLX 使用 mlx-swift-lm 在 Apple Silicon 上运行小型语言模型,并从 Hub 下载该模型。
  • MLX decision heads 运行带有其自身训练好的决策头(decision head)的模型,例如 Clef。
  • Core AI 在 macOS 27 和 iOS 27 上使用 Core AI 模型执行与 MLX 相同的操作。
  • llama.cpp 通过 llama.swift 从本地 GGUF 模型读取决策结果。
  • Jev 通过 System One API 调用 TypeSafe 的 Jev,或任何实现了该 API 的服务器,例如 Kev。
  • Ollama 调用本地 Ollama 服务器或 Ollama 云端中的 System One 决策模型。这需要 Ollama 0.35.0 或更高版本;若使用云端模型,则需要 0.40.5 或更高版本。

Next-token 后端将答案标记为 "yes" 和 "no"、A 到 Z 或 0 到 9,因此一个选项最多包含 26 个选择项,评分最多包含 10 个等级。Decision heads 没有此类限制。

与 AnyLanguageModel 类似,该包使用了 Swift package traits。如果不启用 traits,它没有任何第三方依赖。你将获得核心类型以及 Jev 和 Ollama 后端,这些后端也可以在 Linux 上构建。若要启用本地后端,请开启 MLX、CoreAI 或 Llama trait。

入门指南

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

将以下包添加到你的 Package.swift 中:

SWIFT
dependencies: [
    .package(url: "https://github.com/mattt/AnySpeechRecognizer", from: "0.1.0"),
    .package(
        url: "https://github.com/mattt/AnyDecisionModel",
        from: "0.6.0",
        traits: ["MLX"]
    ),
]

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

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

在你的应用中使用它们,并告诉我们哪些有效、哪些无效。我们欢迎在这两个代码仓库中提交 Issue 和 Pull Request。

链接

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

Hugging Face 发布 AnySpeech 与 AnyDecision 开源模型库 | Today for AI