Omnilingual ASR
Metas Omnilingual ASR ist eine sprachagnostische Spracherkennungsfamilie, die 1.672 Sprachen in 32 verschiedenen Schriften abdeckt — die breiteste Sprachabdeckung aller ASR-Modelle auf dem Gerät auf Apple Silicon. Soniqo portiert die CTC-Variante sowohl nach CoreML (Neural Engine) als auch MLX (Metal-GPU), mit vier Modellgrößen von 300M bis 7B Parametern.
Anders als Qwen3-ASR oder Parakeet TDT nimmt Omnilingual CTC zur Inferenzzeit keinen Sprachhinweis entgegen — es verwendet ein gemeinsames SentencePiece-Vokabular mit 10.288 Einträgen, das jede unterstützte Sprache abdeckt. Gib beliebiges Audio in einer beliebigen unterstützten Sprache ein, und das Modell erzeugt automatisch die korrekte Schrift.
Architektur
Omnilingual CTC ist ein überwachtes Fine-Tuning von Metas wav2vec-2.0-Backbone mit einem linearen CTC-Head über einem gemeinsamen mehrsprachigen Vokabular. Die Pipeline ist parallel und nicht-autoregressiv — ein Forward-Pass pro Äußerung, keine Decoder-Schleife.
Rohaudio [1, samples]
→ wav2vec2-Feature-Extraktor (7 Strided-CNN-Schichten, ×320 Downsample)
→ gewichtsnormalisierter Conv1d-Positionsencoder
→ N × Pre-Norm-Transformer-Encoder-Schichten
→ finale Schicht-Normalisierung
→ linearer CTC-Head → Logits [1, T, 10288]
Bei 16-kHz-Eingabe erzeugt der 320× heruntergetastete Encoder eine Frame-Rate von 50 Hz. Ein 10-Sekunden-Clip erzeugt 499 Frames an Logits. Greedy-CTC-Dekodierung kollabiert aufeinanderfolgende Duplikate und überspringt Spezial-Tokens über den SentencePiece-Tokenizer.
Modellvarianten
Zehn Varianten werden unter dem Namespace aufklarer auf HuggingFace veröffentlicht — zwei CoreML-Fenstergrößen plus acht MLX-Quantisierungs-Kombinationen:
| Variante | Schichten | Dim | Heads | Größe | Laufzeit |
|---|---|---|---|---|---|
| CTC-300M-CoreML-INT8 (5-s-Fenster) | 24 | 1024 | 16 | 312 MB | Neural Engine |
| CTC-300M-CoreML-INT8 (10-s-Fenster) | 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-Verwendung
CoreML (Neural Engine)
# 10-s-Fenster (Standard)
.build/release/audio transcribe recording.wav --engine omnilingual
# 5-s-Fenster (weniger Speicher, schnellerer Kaltstart)
.build/release/audio transcribe recording.wav --engine omnilingual --window 5
MLX (Metal-GPU)
# 300M @ 4-Bit (Standard-MLX-Variante)
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx
# 1B @ 4-Bit — höhere Genauigkeit
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 1B
# 3B @ 8-Bit — nähert sich der Referenzqualität
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 3B --bits 8
# 7B @ 4-Bit — größte CTC-Variante, beste Genauigkeit
.build/release/audio transcribe recording.wav --engine omnilingual --backend mlx --variant 7B
Swift-API
CoreML-Backend
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-Backend
import OmnilingualASR
// Standard: 300M @ 4-Bit
let model = try await OmnilingualASRMLXModel.fromPretrained()
// Größere Varianten
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
Beide Backends erzeugen im Wesentlichen identische Transkripte bis auf 1–2 Zeichen (Quantisierung und Laufzeitunterschiede). Wähle je nach deinem Deployment-Ziel:
| CoreML | MLX | |
|---|---|---|
| Compute-Ziel | Neural Engine | Metal-GPU |
| Eingabelänge | Festes Fenster (5 s oder 10 s) | Beliebige Länge bis 40 s |
| Modellgrößen | Nur 300M | 300M / 1B / 3B / 7B |
| Quantisierung | INT8-Palettization | 4-Bit oder 8-Bit QuantizedLinear |
| Läuft parallel zu GPU-TTS | Ja (ANE ist unabhängig) | Konkurriert mit GPU-TTS |
| iOS-Unterstützung | iOS 17+ | Jedes Apple-Silicon-iOS |
Vorverarbeitungsdetails
Omnilingual erfordert eine Layer-Norm auf Äußerungsebene auf der Rohwellenform, entsprechend fairseq2's apply_audio_normalization:
normalized = (audio - mean(audio)) / sqrt(variance(audio) + 1e-5)
Die Swift-Portierung normalisiert den tatsächlichen Audio-Inhalt vor dem Nullpadding auf das CoreML-Festfenster, sodass Eingaben unterhalb der Fenstergröße exakt den Statistiken der Referenz-Pipeline entsprechen. Das ist die häufigste Port-Falle — die wav2vec2-Implementierung von HuggingFace macht Group-Norm pro Feature, keine Utterance-Layer-Norm.
Die Referenz-Pipeline erzwingt eine harte 40-Sekunden-Obergrenze (MAX_ALLOWED_AUDIO_SEC) für Eingabe-Audio. Die Swift-Portierung erzwingt dieselbe Grenze — längere Eingaben werfen einen klaren Fehler und verweisen auf SpeechVAD oder ParakeetStreamingASR für segmentierte Verarbeitung.
Sprachabdeckung
Omnilingual unterstützt 1.672 Sprachen in 32 Schriften, einschließlich über 500 ressourcenarmer Sprachen, die über Community-Datensammlung hinzugefügt wurden. Beispielabdeckung:
| Schrift | Sprachen | Beispielcodes |
|---|---|---|
| Lateinisch | 1.398 | eng_Latn, fra_Latn, spa_Latn, pcm_Latn, swh_Latn, zul_Latn, … |
| Arabisch | 70 | arb_Arab, arz_Arab, ary_Arab, arq_Arab, fas_Arab, urd_Arab, ckb_Arab, uig_Arab, … |
| Devanagari | 65 | hin_Deva, mar_Deva, nep_Deva, bho_Deva, mai_Deva, awa_Deva, brx_Deva, … |
| Kyrillisch | 51 | rus_Cyrl, ukr_Cyrl, bel_Cyrl, bul_Cyrl, srp_Cyrl, mkd_Cyrl, kaz_Cyrl, … |
| Äthiopisch | 10 | amh_Ethi, tir_Ethi, wal_Ethi, sgw_Ethi, … |
| Bengalisch | 8 | ben_Beng, asm_Beng, mni_Beng, … |
| Thai / Lao / Myanmar / Tibetisch | 9 / 1 / 3 / 6 | tha_Thai, lao_Laoo, mya_Mymr, bod_Tibt, dzo_Tibt, … |
| Han (vereinfacht / traditionell) | 6 | cmn_Hans, cmn_Hant, yue_Hans, yue_Hant, cdo_Hans, … |
| Japanisch / Koreanisch | 1 / 1 | jpn_Jpan, kor_Hang |
| Armenisch, Georgisch, Hebräisch, Griechisch, Gujarati, Gurmukhi, Kannada, Malayalam, Oriya, Singhalesisch, Tamil, Telugu, Tifinagh, Thaana, plus 4 weitere | 48 | Siehe vollständige Liste → |
Vollständige ISO-639-3- + ISO-15924-Codeliste mit englischen Namen im Quelltext von lang_ids.py und nach Schrift gruppiert mit Länderhinweisen in der Modellkarte.
Verifizierte Ausgabe
Transkripte aus der Swift-Portierung auf dem FLEURS-Benchmark, CoreML 300M:
| Sprache | Referenz | Ausgabe |
|---|---|---|
| Englisch | Fellow wrestlers also paid tribute to Luna. | fellow wrestlers also paid tribute to luna |
| Arabisch | كما أثنى الزملاء المصارعون على لونا | كما أثنى الزملاء المصارعون على لونا |
| Hindi | लूना को साथी पहलवानों ने भी श्रद्धांजलि दी | लूना को साथी पहलवानों ने भी सरधांजलीदी |
| Französisch | 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 |
Die MLX-300M-4bit-Variante erzeugt im Wesentlichen identische Ausgaben bis auf 1–2 Zeichen. Größere Varianten (1B, 3B, 7B) reduzieren Restfehler progressiv.
Referenz
- Paper: Omnilingual ASR (arXiv 2511.09690)
- Upstream-Implementierung: facebookresearch/omnilingual-asr (Apache 2.0)
- Quellcode der Swift-Portierung: speech-swift/Sources/OmnilingualASR
- Modellkarte: docs/models/omnilingual-asr.md