Omnilingual ASR
Omnilingual ASR ของ Meta เป็นตระกูลโมเดลจดจำเสียงพูดที่ไม่จำกัดภาษา ครอบคลุม 1,672 ภาษา ทั่วทั้ง 32 ระบบการเขียนที่แตกต่างกัน — การครอบคลุมภาษาที่กว้างที่สุดของโมเดล ASR บนอุปกรณ์บน Apple Silicon Soniqo พอร์ตตัวแปร CTC ไปยังทั้ง CoreML (Neural Engine) และ MLX (GPU Metal) พร้อมขนาดโมเดลสี่ขนาดตั้งแต่ 300M ถึง 7B พารามิเตอร์
ต่างจาก Qwen3-ASR หรือ Parakeet TDT, Omnilingual CTC ไม่รับคำใบ้ของภาษาในตอนอินเฟอเรนซ์ — มันใช้คำศัพท์ SentencePiece ร่วม 10,288 รายการที่ครอบคลุมทุกภาษาที่รองรับ ส่งเสียงพูดใด ๆ ในภาษาที่รองรับใด ๆ แล้วโมเดลจะผลิตระบบการเขียนที่ถูกต้องโดยอัตโนมัติ
สถาปัตยกรรม
Omnilingual CTC เป็น supervised fine-tune ของ backbone wav2vec 2.0 ของ Meta พร้อม head CTC เชิงเส้นบนคำศัพท์หลายภาษาที่ใช้ร่วมกัน Pipeline เป็นแบบขนานและไม่ใช่ autoregressive — forward pass หนึ่งครั้งต่อหนึ่งประโยค ไม่มีลูป decoder
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, encoder ที่ downsample ×320 สร้างอัตราเฟรม 50 Hz คลิป 10 วินาทีผลิต logits 499 เฟรม การถอดรหัส CTC แบบ greedy ยุบสำเนาที่ติดกันและข้ามโทเค็นพิเศษผ่าน tokenizer ของ SentencePiece
ตัวแปรของโมเดล
มีการเผยแพร่สิบตัวแปรภายใต้ namespace aufklarer บน HuggingFace — สองขนาดหน้าต่าง CoreML บวกกับแปดชุดผสมการควอนไทซ์ MLX:
| ตัวแปร | ชั้น | Dim | Head | ขนาด | Runtime |
|---|---|---|---|---|---|
| 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 | GPU Metal |
| CTC-300M-MLX-8bit | 24 | 1024 | 16 | 342 MB | GPU Metal |
| CTC-1B-MLX-4bit | 48 | 1280 | 20 | 549 MB | GPU Metal |
| CTC-1B-MLX-8bit | 48 | 1280 | 20 | 1006 MB | GPU Metal |
| CTC-3B-MLX-4bit | 60 | 2048 | 32 | 1.71 GB | GPU Metal |
| CTC-3B-MLX-8bit | 60 | 2048 | 32 | 3.16 GB | GPU Metal |
| CTC-7B-MLX-4bit | 128 | 2048 | 32 | 3.55 GB | GPU Metal |
| CTC-7B-MLX-8bit | 128 | 2048 | 32 | 6.63 GB | GPU Metal |
การใช้งาน CLI
CoreML (Neural Engine)
# หน้าต่าง 10 s (ดีฟอลต์)
.build/release/speech transcribe recording.wav --engine omnilingual
# หน้าต่าง 5 s (หน่วยความจำต่ำกว่า เริ่มต้นเย็นเร็วกว่า)
.build/release/speech transcribe recording.wav --engine omnilingual --window 5
MLX (GPU Metal)
# 300M @ 4-bit (ตัวแปร MLX ดีฟอลต์)
.build/release/speech transcribe recording.wav --engine omnilingual --backend mlx
# 1B @ 4-bit — ความแม่นยำสูงขึ้น
.build/release/speech transcribe recording.wav --engine omnilingual --backend mlx --variant 1B
# 3B @ 8-bit — เข้าใกล้คุณภาพอ้างอิง
.build/release/speech transcribe recording.wav --engine omnilingual --backend mlx --variant 3B --bits 8
# 7B @ 4-bit — ตัวแปร CTC ที่ใหญ่ที่สุด ความแม่นยำดีที่สุด
.build/release/speech transcribe recording.wav --engine omnilingual --backend mlx --variant 7B
Swift API
Backend 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)
Backend 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 เทียบกับ MLX
Backend ทั้งสองตัวผลิตข้อความถอดเสียงที่เหมือนกันเป็นหลัก โดยต่างกัน 1-2 ตัวอักษร (จากการควอนไทซ์และความแตกต่างของ runtime) เลือกตามเป้าหมายการดีพลอยของคุณ:
| CoreML | MLX | |
|---|---|---|
| เป้าหมายการประมวลผล | Neural Engine | GPU Metal |
| ความยาวอินพุต | หน้าต่างคงที่ (5 s หรือ 10 s) | ความยาวใดก็ได้สูงสุด 40 s |
| ขนาดโมเดล | เฉพาะ 300M | 300M / 1B / 3B / 7B |
| การควอนไทซ์ | Palettization INT8 | 4-bit หรือ 8-bit QuantizedLinear |
| รันพร้อมกับ TTS บน GPU | ได้ (ANE เป็นอิสระ) | แข่งทรัพยากรกับ TTS บน GPU |
| การรองรับ iOS | iOS 18+ | iOS Apple Silicon ใด ๆ |
รายละเอียดการประมวลผลล่วงหน้า
Omnilingual ต้องการ layer-norm ระดับประโยคบนรูปคลื่นดิบ ตรงกับ apply_audio_normalization ของ fairseq2:
normalized = (audio - mean(audio)) / sqrt(variance(audio) + 1e-5)
การพอร์ตเป็น Swift ทำการ normalize เนื้อหาเสียงจริง ก่อน การเติม zero-padding ไปยังหน้าต่างคงที่ของ CoreML ดังนั้นอินพุตที่เล็กกว่าหน้าต่างจึงตรงกับสถิติของ pipeline อ้างอิงอย่างแม่นยำ นี่เป็นข้อผิดพลาดในการพอร์ตที่พบบ่อยที่สุด — การ implement wav2vec2 ของ HuggingFace ใช้ group-norm ต่อ feature ไม่ใช่ layer-norm ระดับประโยค
Pipeline อ้างอิงบังคับขีดจำกัดแบบแข็ง 40 วินาที (MAX_ALLOWED_AUDIO_SEC) บนเสียงอินพุต การพอร์ตเป็น Swift บังคับขีดจำกัดเดียวกัน — อินพุตที่ยาวกว่าจะโยน error ที่ชัดเจน ชี้ไปยัง SpeechVAD หรือ ParakeetStreamingASR สำหรับการประมวลผลแบบแบ่งเซกเมนต์
การครอบคลุมภาษา
Omnilingual รองรับ 1,672 ภาษา ทั่วทั้ง 32 ระบบการเขียน รวมถึงภาษาทรัพยากรต่ำกว่า 500 ภาษาที่เพิ่มมาผ่านการเก็บข้อมูลของชุมชน ตัวอย่างการครอบคลุม:
| ระบบการเขียน | ภาษา | รหัสตัวอย่าง |
|---|---|---|
| Latin | 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, … |
| Devanagari | 65 | hin_Deva, mar_Deva, nep_Deva, bho_Deva, mai_Deva, awa_Deva, brx_Deva, … |
| Cyrillic | 51 | rus_Cyrl, ukr_Cyrl, bel_Cyrl, bul_Cyrl, srp_Cyrl, mkd_Cyrl, kaz_Cyrl, … |
| Ethiopic | 10 | amh_Ethi, tir_Ethi, wal_Ethi, sgw_Ethi, … |
| Bengali | 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 |
| อาร์เมเนีย จอร์เจีย ฮีบรู กรีก คุชราต กุรมุขี กันนาดา มลยาฬัม โอริยา สิงหล ทมิฬ เตลูกู Tifinagh Thaana บวกอีก 4 ระบบ | 48 | ดูรายการเต็ม → |
รายการรหัส ISO 639-3 + ISO 15924 ฉบับเต็มพร้อมชื่อภาษาอังกฤษอยู่ในซอร์ส lang_ids.py และจัดกลุ่มตามระบบการเขียนพร้อมคำใบ้ของประเทศใน การ์ดโมเดล
เอาต์พุตที่ตรวจสอบแล้ว
ข้อความถอดเสียงจากการพอร์ต Swift บน benchmark 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) จะลดข้อผิดพลาดที่เหลืออย่างค่อย ๆ ลง
อ้างอิง
- Paper: Omnilingual ASR (arXiv 2511.09690)
- การ implement upstream: facebookresearch/omnilingual-asr (Apache 2.0)
- ซอร์สการพอร์ต Swift: speech-swift/Sources/OmnilingualASR
- การ์ดโมเดล: docs/models/omnilingual-asr.md