สถาปัตยกรรม
speech-swift จัดเป็นแพ็กเกจ Swift แบบโมดูลาร์ พร้อมโปรโตคอลที่ใช้ร่วมกัน โมดูลโมเดลที่เป็นอิสระ และ CLI แบบรวม การอนุมานทั้งหมดทำงานบนอุปกรณ์โดยใช้ MLX (GPU Metal) หรือ CoreML (Neural Engine)
กราฟการพึ่งพาของโมดูล
┌──────────┐
│ AudioCLI │ (จุดเข้า)
└────┬─────┘
│
┌──────┴──────┐
│ AudioCLILib │ (คำสั่ง)
└──────┬──────┘
│
┌─────────┬───────┼───────┬──────────┬──────────────┐
│ │ │ │ │ │
┌────┴───┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────┐ ┌───┴────┐ ┌──────┴───────┐
│Qwen3ASR│ │Qwen3│ │Cosy │ │Perso-│ │Speech- │ │ Speech- │
│Parakeet│ │ TTS │ │Voice│ │naPlex│ │ VAD │ │Enhancement │
└────┬───┘ └──┬──┘ └──┬──┘ └──┬───┘ └───┬───┘ └──────┬───────┘
│ │ │ │ │ │
└────────┴───────┼───────┴─────────┘ │
│ │
┌──────┴──────┐ │
│ Qwen3Common │ (เลเยอร์ใช้ร่วมกัน) │
└──────┬──────┘ │
│ │
┌──────┴──────┐ │
│ AudioCommon │ ◄──────────────────────┘
└─────────────┘ (โปรโตคอล, I/O เสียง)MOSS Transcribe Diarize
MossTranscribe ส่งคืนช่วงเวลาที่ระบุผู้พูดผ่าน backend CoreML และ MLX แบบเนทีฟ CoreML ใช้สถานะคงที่ 1,024 token สำหรับไฟล์สั้น ส่วน MLX ใช้ context แบบไดนามิก 131,072 token, น้ำหนัก decoder affine INT5/INT8 และ KV cache FP16/INT8 ที่เลือกได้ ทั้งสองเป็น runtime แบบ autoregressive ออฟไลน์ ไม่ใช่ streaming
VoiceChat 11B
งานและเอกสารอ้างอิง: duplex speech-to-speech; SALM-Duplex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model (Interspeech 2025) ซึ่ง model card VoiceChat ต้นทางของ NVIDIA อ้างอิง
runtime ครบถ้วน, M5 Pro 48 GB, Release, จังหวะ live 80 ms: INT5 แบบ protected-head มี RSS สูงสุดประมาณ 8.69 GB; ผล whole-pipeline RTF แบบควบคุมสามครั้งคือ 0.96, 0.96 และ 0.99 ยังไม่ได้วัด performance ของ INT8 หลัง optimize ซ้ำ
VoiceChat ใช้เส้นทางเสียงสู่เสียงแบบ native MLX อย่างครบถ้วน: การรับรู้ FastConformer แบบ causal, ช่องข้อความ/ฟังก์ชัน duplex ของ Nemotron-H, EAR-TTS decoder แบบกำหนดเงื่อนไขด้วยข้อความที่แยกอิสระพร้อม MaskGIT แปดรอบ และ neural codec 22.05 kHz Streaming เก็บ cache ของ attention และ causal convolution แบบจำกัดต่อ layer ขณะที่หน้าต่าง live codec แปด frame แบบ steady ใช้ graph ที่ compile แล้ว ทุก input frame 80 ms จะสร้างการตัดสินใจภาษา รหัส RVQ 31 รหัส และ output sample 1,764 ตัวอย่างพอดี Loader ต้องใช้ bundle ที่มี encoder/ + llm/ + tts/ ครบ และปฏิเสธ export รุ่นเก่าที่มีเฉพาะความเข้าใจ INT5 รักษา average RTF ต่ำกว่า 1 บน M5 Pro ที่ทดสอบได้แล้ว แม้ per-frame p95 headroom ยังแคบ
แบ็กเอนด์การอนุมาน
| แบ็กเอนด์ | ฮาร์ดแวร์ | โมเดล |
|---|---|---|
| MLX | GPU Metal | Qwen3-ASR, Qwen3-TTS, CosyVoice3, IndexTTS2, Qwen3.5-Chat, PersonaPlex, VoiceChat 11B, Omnilingual ASR (300M / 1B / 3B / 7B), Cohere Transcribe 2B, Voxtral Mini 3B, Pyannote, Silero VAD, WeSpeaker, MOSS Transcribe Diarize, SpeechBrain ECAPA LID |
| CoreML | Neural Engine | เอ็นโคเดอร์ของ Qwen3-ASR (ไฮบริด), Parakeet TDT, Parakeet EOU streaming, Omnilingual ASR 300M, Kokoro-82M, Qwen3.5-Chat (ตัวเลือก), การแยกผู้พูด Sortformer, DeepFilterNet3, Silero VAD (ตัวเลือก), WeSpeaker (ตัวเลือก), MOSS Transcribe Diarize, SpeechBrain ECAPA LID |
| Accelerate | CPU (SIMD) | การประมวลผลเสียงเบื้องต้น (STFT, mel, FFT), การประมวลผลสัญญาณ |
รูปแบบน้ำหนักโมเดล
โมเดล MLX ใช้รูปแบบ safetensors พร้อมการควอนไทเซชัน 4-bit หรือ 8-bit (ขนาดกลุ่ม 64) โมเดล CoreML ใช้รูปแบบที่คอมไพล์แล้ว .mlmodelc สคริปต์การแปลงใน scripts/ แปลงจากเช็คพอยต์ PyTorch
Cohere และ Voxtral มีบันเดิล MLX affine INT5 ด้วย MLX ไม่รองรับ affine INT7 โดย INT8 คือตัวเลือกคุณภาพสูงกว่าที่รองรับ
| โมเดล | พารามิเตอร์ | การควอนไทเซชัน | ขนาดบนดิสก์ |
|---|---|---|---|
| Qwen3-ASR 0.6B (MLX) | ~600M | 4-bit / 8-bit | 680 MB / 1.0 GB |
| Qwen3-ASR 0.6B (CoreML) | ~186M (encoder) | INT8 | ~180 MB |
| Qwen3-ASR 1.7B (MLX) | ~1.7B | 4-bit / 8-bit | 2.1 GB / 3.2 GB |
| Parakeet-TDT 0.6B (CoreML) | ~600M | INT8 | 500 MB |
| Whisper Large-v3 Turbo (CoreML) | 809M | FP16 | 1.6 GB |
| MOSS Transcribe Diarize 0.9B (MLX) | 908.5M | FP16 audio + INT5 / INT8 decoder | 987.0 MiB / 1,200.1 MiB |
| MOSS Transcribe Diarize 0.9B (CoreML) | ~900M | FP16 / INT8 block-32 | 1.7 GB / 1.2 GB |
| Parakeet-EOU 120M (CoreML) | ~120M | INT8 | ~120 MB |
| Omnilingual-ASR-CTC 300M (CoreML) | 326M | INT8 | 312 MB |
| Omnilingual-ASR-CTC 300M (MLX) | 326M | 4-bit / 8-bit | 193 MB / 342 MB |
| Omnilingual-ASR-CTC 1B (MLX) | 1.01B | 4-bit / 8-bit | 549 MB / 1006 MB |
| Omnilingual-ASR-CTC 3B (MLX) | ~3B | 4-bit / 8-bit | 1.71 GB / 3.16 GB |
| Omnilingual-ASR-CTC 7B (MLX) | ~7B | 4-bit / 8-bit | 3.55 GB / 6.63 GB |
| Cohere Transcribe 2B (MLX) | 2B | FP16 / INT5 / INT8 | 3.85 / 1.62 / 2.25 GiB |
| Voxtral Mini 3B 2507 (MLX) | 3B | FP16 / INT5 / INT8 | 8.71 / 3.77 / 5.18 GiB |
| Qwen3-ForcedAligner 0.6B (MLX) | ~600M | 4-bit / 8-bit | 979 MB / 1.4 GB |
| Qwen3-ForcedAligner 0.6B (CoreML) | ~600M | INT4 / INT8 | 630 MB / 1.0 GB |
| Qwen3-TTS 0.6B (MLX) | ~600M | 4-bit / 8-bit | 1.7 GB / 2.4 GB |
| Qwen3-TTS 1.7B (MLX) | ~1.7B | 4-bit / 8-bit | 3.2 GB / 4.8 GB |
| CosyVoice3 0.5B (MLX) | ~500M | LLM 4-bit | ~1.2 GB |
| IndexTTS2 expanded bundle (MLX) | 1.5B-class | FP16 + auxiliary models | ~4.8 GB |
| Kokoro-82M (CoreML) | 82M | INT8 (1 bucket) | ~89 MB |
| Qwen3.5-Chat 0.8B (MLX) | ~800M | INT4 | 418 MB |
| Qwen3.5-Chat 0.8B (CoreML) | ~800M | INT8 | 981 MB |
| PersonaPlex 7B (MLX) | ~7B | 4-bit / 8-bit | 4.9 GB / 9.1 GB |
| VoiceChat 11B (MLX) | ~11B | INT5 / INT8 | 8.56 GB / 12.11 GB |
| Pyannote VAD (MLX) | ~1.49M | float32 | ~5.7 MB |
| Silero VAD v5 | ~309K | float32 | ~1.2 MB (MLX และ CoreML) |
| WeSpeaker ResNet34 | ~6.6M | float32 | ~25 MB (MLX และ CoreML) |
| SpeechBrain ECAPA VoxLingua107 | 21.25M | FP16 | ~40.6 MiB (MLX) / ~40.8 MiB (CoreML) |
| ReDimNet2-B6 | 12.3M | float16 | ~25 MiB (CoreML) |
| Pyannote Community-1 (CoreML) | 8.35M | float32 + native VBx | ~32 MB |
| Sortformer (CoreML) | — | float16 | ~50 MB |
| DeepFilterNet3 (CoreML) | ~2.1M | FP16 | ~4.2 MB |
| LocalVQE v1.4-AEC (CoreML + C++) | 200K + 2,742 | FP16 + FP32 | ~732 KB |
การปรับปรุงประสิทธิภาพ
- MLX compile() — การหลอมรวมเคอร์เนลสำหรับลูปออโตเรเกรสซีฟ Talker ใช้
compile(shapeless: true), Code Predictor ใช้compile(shapeless: false)พร้อมขนาดแคชคงที่ - ไลบรารีเชดเดอร์ Metal — metallib ที่คอมไพล์ล่วงหน้าหลีกเลี่ยงค่าใช้จ่ายในการคอมไพล์ JIT ~5 เท่า บิลด์ผ่าน
scripts/build_mlx_metallib.sh - การถอดรหัสโคเด็กแบบแบ่งชังก์ — เดโคเดอร์ TTS ประมวลผลเสียงพูดในชังก์ 25 เฟรมพร้อมการซ้อนทับบริบท 10 เฟรมเพื่อหลีกเลี่ยง GPU timeout
- CFG แบบเพิ่มแบตช์เป็นสองเท่า — DiT ของ CosyVoice3 ลดจำนวนการ flow matching ลงครึ่งหนึ่งโดยรวม conditional + unconditional เข้าในแบตช์เดียวกัน
- RoPE ที่หลอมรวมแล้ว — ใช้
MLXNN.RoPEที่รองรับโดยเคอร์เนล Metal แทนการหมุนด้วยมือ - การหลอมรวม BN — Batch normalization ของ WeSpeaker ถูกหลอมรวมเข้ากับน้ำหนัก Conv2d ในเวลาที่แปลง
การประมวลผลเสียง
I/O เสียงทั้งหมดใช้ PCM Float32 การสุ่มซ้ำภายในจัดการการแปลงรูปแบบ:
| โมเดล | อัตราที่คาดหวัง | รูปแบบ |
|---|---|---|
| Qwen3-ASR | 16 kHz | Mono Float32 |
| Cohere Transcribe 2B | 16 kHz | Mono Float32 |
| Voxtral Mini 3B | 16 kHz | Mono Float32 |
| Qwen3-TTS | เอาต์พุต 24 kHz | Mono Float32 |
| CosyVoice3 | เอาต์พุต 24 kHz | Mono Float32 |
| Kokoro-82M | เอาต์พุต 24 kHz | Mono Float32 |
| PersonaPlex | 24 kHz I/O | Mono Float32 |
| Pyannote VAD | 16 kHz | Mono Float32 |
| Silero VAD | 16 kHz | Mono Float32 |
| WeSpeaker | 16 kHz | Mono Float32 |
| SpeechBrain ECAPA LID | 16 kHz | Mono Float32 |
| ReDimNet2-B6 | 16 kHz | Mono Float32 |
| DeepFilterNet3 | 48 kHz | Mono Float32 |
โครงสร้างซอร์สโค้ด
Sources/
AudioCommon/ โปรโตคอลที่ใช้ร่วมกัน, ออดิโอ I/O,
การจับเอาต์พุตของระบบ (SystemAudioTap),
ตัวดาวน์โหลด HuggingFace, SentencePieceModel
(ตัวอ่าน protobuf)
MLXCommon/ ยูทิลิตี MLX: การโหลดน้ำหนัก, ตัวช่วย QuantizedLinear,
ตัวช่วย attention หลายหัว SDPA, งบประมาณ metal
Qwen3Common/ องค์ประกอบโมเดลที่ใช้ร่วมกัน (แคช KV, RoPE, การควอนไทเซชัน)
Qwen3ASR/ Qwen3-ASR การถอดเสียงเป็นข้อความ
ParakeetASR/ Parakeet TDT การถอดเสียงเป็นข้อความ (CoreML)
ParakeetStreamingASR/ Parakeet EOU 120M การพิมพ์ตามคำบอก streaming (CoreML)
OmnilingualASR/ Meta wav2vec2 + CTC, 1,672 ภาษา
(CoreML 300M + MLX 300M / 1B / 3B / 7B)
CohereTranscribeASR/ Cohere Transcribe 2B speech-to-text (MLX)
VoxtralASR/ Voxtral Mini 3B speech-to-text (MLX)
Qwen3TTS/ Qwen3-TTS การสังเคราะห์เสียงพูด
CosyVoiceTTS/ CosyVoice3 การสังเคราะห์เสียงพูด
KokoroTTS/ Kokoro-82M การสังเคราะห์เสียงพูด (CoreML)
Qwen3Chat/ Qwen3.5-0.8B LLM chat บนอุปกรณ์ (MLX + CoreML)
PersonaPlex/ PersonaPlex เสียงพูดเป็นเสียงพูด
SpeechVAD/ VAD (Silero + Pyannote), การแยกผู้พูด, เอ็มเบดดิงผู้พูด
SpeechLanguageID/ การระบุภาษาพูด (SpeechBrain ECAPA, MLX + CoreML, 107 ป้าย)
SpeechEnhancement/ การลดเสียงรบกวน DeepFilterNet3 (CoreML)
SourceSeparation/ Open-Unmix HQ / UMX-L + HTDemucs (Demucs v4) music source separation (MLX, 4 stems)
MAGNeTMusicGen/ MAGNeT text-to-music generation (MLX, 30 s @ 32 kHz, INT4/INT8)
VoxCPM2TTS/ VoxCPM2 text-to-speech (MLX, 48 kHz, voice cloning + voice design)
IndexTTS2TTS/ IndexTTS2 voice cloning (MLX, semantic GPT + emotion/tempo/pause control + S2Mel + BigVGAN)
VibeVoiceTTS/ VibeVoice long-form / multi-speaker TTS (MLX, EN/ZH)
MagpieTTS/ NVIDIA Magpie-TTS Multilingual 357M (MLX INT4/INT8,
9 languages, 5 baked speakers, streaming)
MagpieTTSCoreML/ Magpie CoreML backend (4 .mlmodelc + Swift-side
FSQ inverse; 8 languages, batch-only; hybrid
with MagpieTTS for LocalTransformer + audio
embeddings)
MADLADTranslation/ MADLAD-400 many-to-many translation (MLX, 400+ languages)
AudioCLILib/ การติดตั้งคำสั่ง CLI
AudioCLI/ จุดเข้า CLI
scripts/ การแปลงโมเดล (PyTorch → MLX/CoreML), การทำเบนช์มาร์ก
Tests/ การทดสอบหน่วยและการทดสอบรวม
Examples/ แอปเดโม (PersonaPlexDemo, SpeechDemo)