สถาปัตยกรรม
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 เสียง)แบ็กเอนด์การอนุมาน
| แบ็กเอนด์ | ฮาร์ดแวร์ | โมเดล |
|---|---|---|
| MLX | GPU Metal | Qwen3-ASR, Qwen3-TTS, CosyVoice3, Qwen3.5-Chat, PersonaPlex, Omnilingual ASR (300M / 1B / 3B / 7B), Pyannote, Silero VAD, WeSpeaker |
| CoreML | Neural Engine | เอ็นโคเดอร์ของ Qwen3-ASR (ไฮบริด), Parakeet TDT, Parakeet EOU streaming, Omnilingual ASR 300M, Kokoro-82M, Qwen3.5-Chat (ตัวเลือก), การแยกผู้พูด Sortformer, DeepFilterNet3, Silero VAD (ตัวเลือก), WeSpeaker (ตัวเลือก) |
| Accelerate | CPU (SIMD) | การประมวลผลเสียงเบื้องต้น (STFT, mel, FFT), การประมวลผลสัญญาณ |
รูปแบบน้ำหนักโมเดล
โมเดล MLX ใช้รูปแบบ safetensors พร้อมการควอนไทเซชัน 4-bit หรือ 8-bit (ขนาดกลุ่ม 64) โมเดล CoreML ใช้รูปแบบที่คอมไพล์แล้ว .mlmodelc สคริปต์การแปลงใน scripts/ แปลงจากเช็คพอยต์ PyTorch
| โมเดล | พารามิเตอร์ | การควอนไทเซชัน | ขนาดบนดิสก์ |
|---|---|---|---|
| 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 |
| 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 |
| 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 |
| 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 |
| 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) |
| Sortformer (CoreML) | — | float16 | ~50 MB |
| DeepFilterNet3 (CoreML) | ~2.1M | FP16 | ~4.2 MB |
การปรับปรุงประสิทธิภาพ
- 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 |
| 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 |
| DeepFilterNet3 | 48 kHz | Mono Float32 |
โครงสร้างซอร์สโค้ด
Sources/
AudioCommon/ โปรโตคอลใช้ร่วมกัน, I/O เสียง, ตัวดาวน์โหลด 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)
Qwen3TTS/ Qwen3-TTS การสังเคราะห์เสียงพูด
CosyVoiceTTS/ CosyVoice3 การสังเคราะห์เสียงพูด
KokoroTTS/ Kokoro-82M การสังเคราะห์เสียงพูด (CoreML)
Qwen3Chat/ Qwen3.5-0.8B LLM chat บนอุปกรณ์ (MLX + CoreML)
PersonaPlex/ PersonaPlex เสียงพูดเป็นเสียงพูด
SpeechVAD/ VAD (Silero + Pyannote), การแยกผู้พูด, เอ็มเบดดิงผู้พูด
SpeechEnhancement/ การลดเสียงรบกวน DeepFilterNet3 (CoreML)
SourceSeparation/ Open-Unmix HQ / UMX-L 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)
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)