Omnilingual ASR
Meta 的 Omnilingual ASR 是一个语种无关的语音识别系列,覆盖 1,672 种语言、32 种文字系统——是 Apple Silicon 上端侧 ASR 模型中语种覆盖最广的。Soniqo 将其 CTC 变体同时移植到 CoreML(Neural Engine)和 MLX(Metal GPU),提供从 300M 到 7B 参数共四种规模。
不同于 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 量化组合:
| 变体 | 层数 | Dim | Heads | 大小 | 运行时 |
|---|---|---|---|---|---|
| CTC-300M-CoreML-INT8(5 s 窗口) | 24 | 1024 | 16 | 312 MB | Neural Engine |
| CTC-300M-CoreML-INT8(10 s 窗口) | 24 | 1024 | 16 | 312 MB | Neural Engine |
| CTC-300M-MLX-4bit | 24 | 1024 | 16 | 193 MB | Metal GPU |
| CTC-300M-MLX-8bit | 24 | 1024 | 16 | 342 MB | Metal GPU |
| CTC-1B-MLX-4bit | 48 | 1280 | 20 | 549 MB | Metal GPU |
| CTC-1B-MLX-8bit | 48 | 1280 | 20 | 1006 MB | Metal GPU |
| CTC-3B-MLX-4bit | 60 | 2048 | 32 | 1.71 GB | Metal GPU |
| CTC-3B-MLX-8bit | 60 | 2048 | 32 | 3.16 GB | Metal GPU |
| CTC-7B-MLX-4bit | 128 | 2048 | 32 | 3.55 GB | Metal GPU |
| CTC-7B-MLX-8bit | 128 | 2048 | 32 | 6.63 GB | Metal 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 差异)。请根据部署目标选择:
| CoreML | MLX | |
|---|---|---|
| 计算目标 | Neural Engine | Metal GPU |
| 输入长度 | 固定窗口(5 s 或 10 s) | 最长至 40 s 的任意长度 |
| 模型尺寸 | 仅 300M | 300M / 1B / 3B / 7B |
| 量化 | INT8 palettization | 4-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 移植也强制同样的限制——更长的输入会抛出明确的错误,并指向 SpeechVAD 或 ParakeetStreamingASR 进行分段处理。
语言覆盖
Omnilingual 支持 1,672 种语言,覆盖 32 种文字系统,其中 500+ 种低资源语言通过社区数据收集加入。部分覆盖示例:
| 文字系统 | 语言数 | 示例代码 |
|---|---|---|
| 拉丁文 | 1,398 | eng_Latn、fra_Latn、spa_Latn、pcm_Latn、swh_Latn、zul_Latn、… |
| 阿拉伯文 | 70 | arb_Arab、arz_Arab、ary_Arab、arq_Arab、fas_Arab、urd_Arab、ckb_Arab、uig_Arab、… |
| 天城文 | 65 | hin_Deva、mar_Deva、nep_Deva、bho_Deva、mai_Deva、awa_Deva、brx_Deva、… |
| 西里尔文 | 51 | rus_Cyrl、ukr_Cyrl、bel_Cyrl、bul_Cyrl、srp_Cyrl、mkd_Cyrl、kaz_Cyrl、… |
| 埃塞俄比亚文 | 10 | amh_Ethi、tir_Ethi、wal_Ethi、sgw_Ethi、… |
| 孟加拉文 | 8 | ben_Beng、asm_Beng、mni_Beng、… |
| 泰文 / 老挝文 / 缅甸文 / 藏文 | 9 / 1 / 3 / 6 | tha_Thai、lao_Laoo、mya_Mymr、bod_Tibt、dzo_Tibt、… |
| 汉字(简体 / 繁体) | 6 | cmn_Hans、cmn_Hant、yue_Hans、yue_Hant、cdo_Hans、… |
| 日文 / 韩文 | 1 / 1 | jpn_Jpan、kor_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)会逐步减少剩余错误。
参考
- 论文:Omnilingual ASR (arXiv 2511.09690)
- 上游实现:facebookresearch/omnilingual-asr(Apache 2.0)
- Swift 移植源码:speech-swift/Sources/OmnilingualASR
- 模型卡:docs/models/omnilingual-asr.md