Hugging Face Blog

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

8.5内容质量

TL;DR · AI 摘要

Hugging Face 推出 AnySpeechRecognizer 和 AnyDecisionModel 工具包,支持 Apple 平台多模型本地运行,提升语音识别与决策模型的灵活性。

核心要点

  • AnySpeechRecognizer 支持 NVIDIA Parakeet 和阿里 Qwen3-ASR,覆盖 25 种欧洲语言。
  • AnyDecisionModel 可用 MLX/llama.cpp 等本地模型处理决策任务,无需生成文本。
  • 模型可从 Hugging Face Hub 下载并在设备端运行,增强隐私与性能。

结构提纲

按章节快速跳转。

  1. 介绍语言模型在语音识别和决策任务中的局限性,引出新工具包的必要性。

  2. 支持多种语音识别引擎,集成 NVIDIA 和阿里模型,提供 speaker diarization 功能。

  3. Parakeet v3 支持 25 种欧洲语言自动检测,无需指定 locale 参数。

  4. 通过概率直接输出决策结果,兼容 MLX、Core AI 等本地推理框架。

  5. 模型可从 Hugging Face Hub 下载,支持设备端运行,减少云端依赖。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • AnySpeechRecognizer & AnyDecisionModel
    • 核心功能
      • 语音识别
      • 决策模型
    • 支持模型
      • NVIDIA Parakeet
      • 阿里 Qwen3-ASR
    • 技术特性
      • 设备端运行
      • 多语言支持

金句 / Highlights

值得收藏与分享的关键句。

#Swift#Core ML#语音识别#决策模型#Hugging Face
打开原文

介绍 AnySpeechRecognizer 和 AnyDecisionModel:Apple 平台上的语音与决策开源模型

返回文章列表

[-1

]

[0

2026年10月29日发布

GitHub 上的更新

点赞

2

[

Mattt

关注

语言模型可以完成很多任务,它们能够撰写、总结、翻译和调用工具。但它们只是机器学习能力的一小部分。

假设客户拨打你的客服热线。首先,你需要知道他们说了什么(语音识别)。然后,你需要决定将他们转接至何处(决策)。虽然可以将这两项任务都交给语言模型处理,但针对每个任务都有专门的模型,这些模型在性能、速度和成本方面更具优势。

在我们对 AnyLanguageModel 1.0 的回顾中,我们探讨了 Swift 中本地和托管模型一年的发展历程。随着 AnyLanguageModel 和 swift-huggingface 进入 1.x 版本,我们正在将同样的方法扩展到语音和决策领域:熟悉的 Swift API,同时支持多种模型选择。

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

  • AnySpeechRecognizer 实现了 Apple 新的语音转文本 API,并支持多种识别引擎选择,包括 NVIDIA 的 Parakeet 和 Alibaba 的 Qwen3-ASR 通过 Core ML 在本地运行,同时新增说话人角色分配功能以追踪谁在何时发言。
  • 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,但允许你选择引擎:

code
- import Speech
+ import AnySpeechRecognizer

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

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

安装资产、运行分析器和读取结果的步骤保持不变。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 未覆盖的语言。它支持自动语言检测,也可以手动设置:

code
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 上:

| 模型名称 | Core ML 转换 | 原始检查点 | 许可证 | |-------------------------|----------------------------------|-----------------------------------|---------------| | Parakeet TDT 0.6B v3 | mattt/parakeet-tdt-0.6b-v3-coreml | nvidia/parakeet-tdt-0.6b-v3 | CC BY 4.0 | | Parakeet Ultra | mattt/parakeet-ultra-coreml | moondream/parakeet-ultra | | | Parakeet Unified EN 0.6B| mattt/parakeet-unified-en-0.6b-coreml | nvidia/parakeet-unified-en-0.6b | NVIDIA Open Model License | | Qwen3-ASR 0.6B | mattt/qwen3-asr-0.6b-coreml | Qwen/Qwen3-ASR-0.6B-hf | Apache 2.0 | | Qwen3-ASR 1.7B | mattt/qwen3-asr-1.7b-coreml | Qwen/Qwen3-ASR-1.7B-hf | | | Streaming Sortformer 4spk v2 | mattt/diar-streaming-sortformer-4spk-v2-coreml | nvidia/diar_streaming_sortformer_4spk-v2 | | | Streaming Sortformer 4spk v2.1 | mattt/diar-streaming-sortformer-4spk-v2.1-coreml | nvidia/diar_streaming_sortformer_4spk-v2.1 | |

每个仓库都会记录其原始检查点和每个文件的校验和,并将包固定到特定版本。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 会将 NVIDIA 的 Streaming Sortformer 与 Apple 或 Parakeet 转录器并行运行在 Core ML 上,使用相同的时序线:

code
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])

The diarizer tracks up to four speakers, even when they talk over each other. A SpeakerTimeline collects its results and attributes each timed word to a speaker, so you can print a transcript by speaker turn. Like image support in AnyLanguageModel, this goes beyond what Apple's API offers today.

The diarizer uses Sortformer v2 by default. You can also choose v2.1, which NVIDIA trained with more meeting data and which was more accurate on meetings in our measurements, too.

How well does it work?

We measured the package with its hear command-line tool on an M4 Max Mac Studio with macOS 27.0.1. Here are the word error rates on LibriSpeech files of 3 to 8 minutes:

Transcriber

test-clean

test-other

Parakeet v3, file

1.55%

2.78%

Parakeet v3, live

4.73%

4.29%

Parakeet Ultra, file

1.66%

2.55%

Parakeet Ultra, live

2.65%

3.28%

Parakeet Unified, file

1.43%

2.19%

Parakeet Unified, live

1.45%

2.42%

Apple's transcriber, file

2.12%

3.97%

Parakeet transcribes an hour of audio in about 20 to 40 seconds from a file, or about 1.5 to 2.5 minutes live, with about 100 MB of memory once Core ML has compiled the model. Qwen3-ASR is much slower and needs a few gigabytes of memory. Meetings are hard for everyone: on AMI recordings, where people talk over each other, every engine we tested had a word error rate above 23%.

These numbers come from one machine and a few datasets, so measure with your own hardware and audio. hear evaluate works on your own files, and the repository's natural-speech-eval.py tool reproduces these measurements. So far, we've tested only on macOS 27, not on an iPhone.

Next, we'd like to add more engines, including Core AI on macOS 27 and iOS 27.

AnyDecisionModel

AnyDecisionModel is a different story. There's no Apple framework to map onto, and decision models aren't new, exactly.

It's only a decision model if it comes from the Décision region of France; otherwise, it's sparkling zero-shot classification.

What's new is the name, a lot of hype, and a crop of models trained to make decisions. We think that's where things are going, so we wanted a Swift API that's ready for them.

Apps often ask language models to make decisions. Is this message urgent? Which team should handle this ticket? How frustrated is this customer? The usual approach is to prompt a language model and parse the text that it generates. That gives you one answer, but doesn't show the probabilities it assigned to the alternatives.

Here's what a decision looks like in Swift:

code
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>,包含所选案例、每个选项的概率和置信值。anger 是一个 Score,包含预期等级、每个等级的概率和置信值。由于 Department 符合 Choosable 协议,team.value 是一个可以通过穷举 switch 语句使用的 Department。

如果你使用过 Foundation Models 或 AnyLanguageModel,模型会话模式会很熟悉。DecisionSession 保存单个状态,可以是文本或 JSON,每个问题都基于该状态。问题相互独立:答案永远不会成为后续问题的输入。要同时提出多个问题,可以将它们作为批次传递给 decide(_:)。

对于每个问题,MLX 后端会构建一个提示,为每个允许的答案添加一个单令牌标签,然后通过一次前向传递读取每个标签的概率。

尝试使用:Emoji Magnet

Emoji Magnet 是 macOS 上的一款应用,界面包含一个文本框和一堆 343 个表情符号。输入短语,例如 "things you wear",匹配的表情符号会从堆中浮现。将其细化为 "things you wear in winter",不再匹配的表情符号会回落。

该应用没有内置的关键词规则;模型在推理时决定所有内容。当你暂停输入时,它会为每个表情符号提出一个是非问题,例如:

code
陈述:一件厚重的冬装符合 "things you wear" 的描述。这个陈述是否正确?

会话的状态保存短语。上述演示使用了托管的 Jev 后端,该后端在一个请求中回答所有 343 个问题,因此每个短语下表情符号大约在半秒内稳定。如果没有 TYPESAFE_AI_API_KEY,应用会在你的 Mac 上使用 MLX 后端运行 Qwen3 4B。该后端使用前缀缓存技术,仅评估一次状态,然后每次前向传递回答 16 个问题。在 M4 Max 上,一组 16 个问题在模型加载后大约需要 0.45 秒。对所有 343 个表情符号进行完整遍历大约需要 10 秒,每组结果会在到达时立即显示。

Emoji Magnet 位于 AnyDecisionModel-Examples 仓库中。

决策头和 Clef

读取下一个令牌的概率适用于通用语言模型,但这些模型并未接受过决策训练。Cloudflare 的 Clef 模型是更新方法的示例:一个带有训练决策头的模型,该决策头将状态和带类型的问答模式转换为决策,通过一次前向传递返回所有允许选项在所有问题上的概率。Clef-Flash 是 9B 参数版本。

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

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

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

概率校准和验证

语言模型的原始概率通常过于自信。本地后端接受 Calibration 参数,该参数为每个答案应用温度参数,并为是非答案应用偏置。使用独立的数据集拟合校准并评估结果。

语言模型也可能因为选项在列表中的位置而倾向于某个选项。在 MLX、Core AI 和 llama.cpp 的 next-token 后端中,开启 rotationDebiasing 功能,对每个选项旋转位置进行一次选择问题询问,并对概率进行平均。这会为每个旋转位置消耗一次提示评估。

每个本地选择和评分还会包含一个基于概率熵的置信度值。它衡量的是概率的集中程度,而非答案是否正确,因此在选择阈值前,请先在自己的数据集上检查错误率。next-token 后端的诊断报告会显示模型分配给允许答案的概率值。低值意味着模型将大部分概率分配给了其他选项。

后端

AnyDecisionModel 包含六个后端:

  • MLX 在 Apple 芯片上通过 mlx-swift-lm 运行小型语言模型,并从 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 或更高版本。

next-token 后端将答案标记为 "yes" 和 "no"、A 到 Z 或 0 到 9,因此一个选择最多只能有 26 个选项,评分最多有 10 个等级。决策头没有此类限制。

与 AnyLanguageModel 一样,该包使用 Swift 包特性。没有特性时,它没有第三方依赖。您将获得核心类型以及 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 中:

code
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 特性无法与 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 以安装所需资源。

在您的应用中尝试这些功能,并告诉我们哪些有效、哪些无效。两个仓库都欢迎问题报告和拉取请求。

链接

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

本文中提到的模型 10

更多博客文章

swift

llm

mlx

AnyLanguageModel 1.0:苹果平台本地模型一年发展回顾

6

2026 年 10 月 20 日

coreml

介绍 AnyLanguageModel:苹果平台本地和远程 LLM 的统一 API

45

2025 年 11 月 20 日

社区

编辑

预览

通过拖拽到文本输入框、粘贴或点击此处上传图片、音频和视频

.

轻点或粘贴此处上传图片

评论

· 注册或登录以发表评论