Omnilingual ASR
MetaのOmnilingual ASRは、32の異なる文字体系にわたる1,672言語をカバーする言語非依存の音声認識ファミリーです — Apple Silicon上のオンデバイスASRモデルの中で最も広い言語カバレッジ。SoniqoはCTCバリアントをCoreML(Neural Engine)とMLX(Metal GPU)の両方に移植し、300Mから7Bパラメーターまでの4つのモデルサイズを提供します。
Qwen3-ASRやParakeet TDTとは異なり、Omnilingual CTCは推論時に言語ヒントを取りません — すべてのサポート言語にまたがる共有10,288エントリのSentencePiece語彙を使用します。サポートされている任意の言語の音声を渡すと、モデルは自動的に正しい文字体系を生成します。
アーキテクチャ
Omnilingual CTCは、共有多言語語彙上の線形CTCヘッドを備えたMetaのwav2vec 2.0バックボーンの教師ありファインチューンです。パイプラインは並列かつ非自己回帰で — 発話あたり1つのフォワードパス、デコーダーループなし。
raw audio [1, samples]
→ wav2vec2 特徴抽出器 (7ストライドCNNレイヤー、×320ダウンサンプル)
→ 重み正規化Conv1d位置エンコーダー
→ N × プレノルムTransformerエンコーダーレイヤー
→ 最終レイヤーノルム
→ 線形CTCヘッド → logits [1, T, 10288]
16 kHz入力で、320×ダウンサンプルされたエンコーダーは50 Hzフレームレートを生成します。10秒のクリップは499フレームのロジットを生成します。グリーディCTCデコーディングは連続する重複を折りたたみ、SentencePieceトークナイザーで特殊トークンをスキップします。
モデルバリアント
HuggingFace上のaufklarer名前空間の下に10のバリアントが公開されています — 2つのCoreML窓サイズと8つのMLX量子化の組み合わせ:
| バリアント | レイヤー | 次元 | ヘッド | サイズ | ランタイム |
|---|---|---|---|---|---|
| CTC-300M-CoreML-INT8 (5秒窓) | 24 | 1024 | 16 | 312 MB | Neural Engine |
| CTC-300M-CoreML-INT8 (10秒窓) | 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秒窓(デフォルト)
.build/release/audio transcribe recording.wav --engine omnilingual
# 5秒窓(メモリ少、コールドスタート高速)
.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文字の差(量子化とランタイムの違い)を除いて、本質的に同一のトランスクリプトを生成します。デプロイメントターゲットに基づいて選択してください:
| CoreML | MLX | |
|---|---|---|
| 計算ターゲット | Neural Engine | Metal GPU |
| 入力長 | 固定窓(5秒または10秒) | 最大40秒までの任意の長さ |
| モデルサイズ | 300Mのみ | 300M / 1B / 3B / 7B |
| 量子化 | INT8 パレット化 | 4ビットまたは8ビット QuantizedLinear |
| GPU TTSと並行実行 | はい(ANEは独立) | GPU TTSと競合 |
| iOSサポート | iOS 17+ | 任意のApple Silicon iOS |
前処理の詳細
Omnilingualは、fairseq2のapply_audio_normalizationと一致する、生波形上の発話レベルのlayer-normを必要とします:
normalized = (audio - mean(audio)) / sqrt(variance(audio) + 1e-5)
Swiftポートは、CoreML固定窓にゼロパディングする前に実際の音声コンテンツを正規化するため、サブ窓入力はリファレンスパイプラインの統計と完全に一致します。これは最も一般的なポートの落とし穴です — HuggingFaceのwav2vec2実装は発話のlayer-normではなく、特徴量ごとのgroup-normを行います。
リファレンスパイプラインは、入力音声に40秒のハードキャップ(MAX_ALLOWED_AUDIO_SEC)を強制します。Swiftポートも同じ制限を強制します — より長い入力は、セグメント化処理のためにSpeechVADまたはParakeetStreamingASRを指す明確なエラーをスローします。
言語カバレッジ
Omnilingualは、32の文字体系にわたる1,672言語をサポートし、コミュニティデータ収集を通じて追加された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 | 完全なリストを参照 → |
lang_ids.pyソース内の英語名付きの完全なISO 639-3 + ISO 15924コードリスト、およびモデルカードで国のヒント付きで文字体系別にグループ化されています。
検証済み出力
FLEURSベンチマーク上のSwiftポートからのトランスクリプト、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