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 รายการที่ครอบคลุมทุกภาษาที่รองรับ ส่งเสียงพูดใด ๆ ในภาษาที่รองรับใด ๆ แล้วโมเดลจะผลิตระบบการเขียนที่ถูกต้องโดยอัตโนมัติ
ช่องสัญญาณ อัตราสุ่มตัวอย่าง และรูปแบบอินพุต
ใช้อินพุต PCM แบบ Float32 mono ที่ 16 kHz CLI รับไฟล์ทั่วไปที่ AVFoundation อ่านได้ เช่น WAV, MP3, M4A และ CAF แล้ว resample เป็น 16 kHz อัตโนมัติ สำหรับไฟล์ stereo หรือหลายช่อง AudioFileLoader.load ใช้ช่องแรกแทนการผสมทุกช่อง หากเสียงพูดไม่เหมือนกันในช่อง 1 ให้ downmix เป็น mono ก่อน เมื่อส่ง buffer [Float] โดยตรง ให้ระบุ sample rate จริง แล้ว CoreML และ MLX จะ resample ภายใน
สถาปัตยกรรม
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 window (default)
.build/release/speech transcribe recording.wav --engine omnilingual
# 5 s window (lower memory, faster cold start)
.build/release/speech transcribe recording.wav --engine omnilingual --window 5
MLX (GPU Metal)
# 300M @ 4-bit (default MLX variant)
.build/release/speech transcribe recording.wav --engine omnilingual --backend mlx
# 1B @ 4-bit — higher accuracy
.build/release/speech transcribe recording.wav --engine omnilingual --backend mlx --variant 1B
# 3B @ 8-bit — approaching reference quality
.build/release/speech transcribe recording.wav --engine omnilingual --backend mlx --variant 3B --bits 8
# 7B @ 4-bit — largest CTC variant, best accuracy
.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
// Default: 300M @ 4-bit
let model = try await OmnilingualASRMLXModel.fromPretrained()
// Larger variants
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