Omnilingual ASR

Meta 的 Omnilingual ASR 是一个语种无关的语音识别系列,覆盖 1,672 种语言、32 种文字系统——是 Apple Silicon 上端侧 ASR 模型中语种覆盖最广的。Soniqo 将其 CTC 变体同时移植到 CoreML(Neural Engine)和 MLX(Metal GPU),提供从 300M 到 7B 参数共四种规模。

语种无关的 CTC

不同于 Qwen3-ASR 或 Parakeet TDT,Omnilingual CTC 在推理时不接受语言提示——它使用一个覆盖所有支持语言的共享 SentencePiece 词表(10,288 条)。传入任意支持语言的音频,模型会自动产出正确文字系统的结果。

架构

Omnilingual CTC 是 Meta wav2vec 2.0 主干的有监督微调,顶部接一个线性 CTC 头,词表在所有语言间共享。整个流水线是并行且非自回归的——每段话一次前向传播,没有解码器循环。

raw audio [1, samples]
  → wav2vec2 feature extractor (7 strided CNN layers, ×320 downsample)
  → weight-normalised Conv1d positional encoder
  → N × pre-norm Transformer encoder layers
  → final layer norm
  → linear CTC head → logits [1, T, 10288]

在 16 kHz 输入下,320 倍下采样的编码器产生 50 Hz 帧率。10 秒片段产生 499 帧 logits。贪心 CTC 解码合并连续重复并通过 SentencePiece tokenizer 跳过特殊 token。

模型变体

HuggingFace aufklarer 命名空间下共发布十个变体——两种 CoreML 窗口大小以及八种 MLX 量化组合:

变体层数DimHeads大小运行时
CTC-300M-CoreML-INT8(5 s 窗口)24102416312 MBNeural Engine
CTC-300M-CoreML-INT8(10 s 窗口)24102416312 MBNeural Engine
CTC-300M-MLX-4bit24102416193 MBMetal GPU
CTC-300M-MLX-8bit24102416342 MBMetal GPU
CTC-1B-MLX-4bit48128020549 MBMetal GPU
CTC-1B-MLX-8bit481280201006 MBMetal GPU
CTC-3B-MLX-4bit602048321.71 GBMetal GPU
CTC-3B-MLX-8bit602048323.16 GBMetal GPU
CTC-7B-MLX-4bit1282048323.55 GBMetal GPU
CTC-7B-MLX-8bit1282048326.63 GBMetal GPU

CLI 使用

CoreML(Neural Engine)

# 10 s 窗口(默认)
.build/release/audio transcribe recording.wav --engine omnilingual

# 5 s 窗口(更低内存,冷启动更快)
.build/release/audio transcribe recording.wav --engine omnilingual --window 5

MLX(Metal GPU)

# 300M @ 4-bit(默认 MLX 变体)
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx

# 1B @ 4-bit — 更高精度
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 1B

# 3B @ 8-bit — 接近参考质量
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 3B --bits 8

# 7B @ 4-bit — 最大的 CTC 变体,精度最好
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 7B

Swift API

CoreML 后端

import OmnilingualASR
import AudioCommon

let model = try await OmnilingualASRModel.fromPretrained()
let audio = try AudioFileLoader.load(url: url, targetSampleRate: 16000)
let text = try model.transcribeAudio(audio, sampleRate: 16000)
print(text)

MLX 后端

import OmnilingualASR

// 默认:300M @ 4-bit
let model = try await OmnilingualASRMLXModel.fromPretrained()

// 更大的变体
let big = try await OmnilingualASRMLXModel.fromPretrained(variant: .b1, bits: 4)
let huge = try await OmnilingualASRMLXModel.fromPretrained(variant: .b3, bits: 8)
let max = try await OmnilingualASRMLXModel.fromPretrained(variant: .b7, bits: 4)

let text = try model.transcribeAudio(audio, sampleRate: 16000)

CoreML vs MLX

两个后端产生的转写本质相同,仅差 1-2 个字符(来自量化和 runtime 差异)。请根据部署目标选择:

CoreMLMLX
计算目标Neural EngineMetal GPU
输入长度固定窗口(5 s 或 10 s)最长至 40 s 的任意长度
模型尺寸仅 300M300M / 1B / 3B / 7B
量化INT8 palettization4-bit 或 8-bit QuantizedLinear
与 GPU TTS 并行可以(ANE 独立)与 GPU TTS 竞争
iOS 支持iOS 17+任意 Apple Silicon iOS

预处理细节

Omnilingual 需要对原始波形做 utterance 级 layer-norm,与 fairseq2 的 apply_audio_normalization 保持一致:

normalized = (audio - mean(audio)) / sqrt(variance(audio) + 1e-5)

Swift 移植会对真实音频内容进行归一化,然后再零填充到 CoreML 固定窗口,这样不足窗口的输入能精确匹配参考流水线的统计量。这是移植时最常见的坑——HuggingFace 的 wav2vec2 实现做的是逐特征 group-norm,而不是 utterance layer-norm。

参考流水线对输入音频施加 40 秒硬上限(MAX_ALLOWED_AUDIO_SEC)。Swift 移植也强制同样的限制——更长的输入会抛出明确的错误,并指向 SpeechVADParakeetStreamingASR 进行分段处理。

语言覆盖

Omnilingual 支持 1,672 种语言,覆盖 32 种文字系统,其中 500+ 种低资源语言通过社区数据收集加入。部分覆盖示例:

文字系统语言数示例代码
拉丁文1,398eng_Latnfra_Latnspa_Latnpcm_Latnswh_Latnzul_Latn、…
阿拉伯文70arb_Arabarz_Arabary_Arabarq_Arabfas_Araburd_Arabckb_Arabuig_Arab、…
天城文65hin_Devamar_Devanep_Devabho_Devamai_Devaawa_Devabrx_Deva、…
西里尔文51rus_Cyrlukr_Cyrlbel_Cyrlbul_Cyrlsrp_Cyrlmkd_Cyrlkaz_Cyrl、…
埃塞俄比亚文10amh_Ethitir_Ethiwal_Ethisgw_Ethi、…
孟加拉文8ben_Bengasm_Bengmni_Beng、…
泰文 / 老挝文 / 缅甸文 / 藏文9 / 1 / 3 / 6tha_Thailao_Laoomya_Mymrbod_Tibtdzo_Tibt、…
汉字(简体 / 繁体)6cmn_Hanscmn_Hantyue_Hansyue_Hantcdo_Hans、…
日文 / 韩文1 / 1jpn_Jpankor_Hang
亚美尼亚文、格鲁吉亚文、希伯来文、希腊文、古吉拉特文、果鲁穆奇文、卡纳达文、马拉雅拉姆文、奥里亚文、僧伽罗文、泰米尔文、泰卢固文、提非纳文、他那文等共 4 种以上48完整列表 →

完整的 ISO 639-3 + ISO 15924 代码列表(含英文名称)见 lang_ids.py 源码,按文字系统分组并附带国家提示的版本见模型卡

已验证输出

Swift 移植在 FLEURS 基准上的转写结果(CoreML 300M):

语言参考输出
英语Fellow wrestlers also paid tribute to Luna.fellow wrestlers also paid tribute to luna
阿拉伯语كما أثنى الزملاء المصارعون على لوناكما أثنى الزملاء المصارعون على لونا
印地语लूना को साथी पहलवानों ने भी श्रद्धांजलि दीलूना को साथी पहलवानों ने भी सरधांजलीदी
法语Pensez à l'itinéraire de ski comme à un itinéraire de randonnée similaire.pense à létineraire desqui comme un étineraire de rent donner similaire

MLX 300M-4bit 变体产生的输出本质相同,仅差 1-2 个字符。更大的变体(1B、3B、7B)会逐步减少剩余错误。

参考