Kiến trúc
speech-swift được tổ chức như một gói Swift module hóa với các giao thức chung, các module mô hình độc lập và một CLI thống nhất. Tất cả suy luận chạy trên thiết bị bằng MLX (GPU Metal) hoặc CoreML (Neural Engine).
Đồ thị phụ thuộc module
┌──────────┐
│ AudioCLI │ (điểm vào)
└────┬─────┘
│
┌──────┴──────┐
│ AudioCLILib │ (các lệnh)
└──────┬──────┘
│
┌─────────┬───────┼───────┬──────────┬──────────────┐
│ │ │ │ │ │
┌────┴───┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────┐ ┌───┴────┐ ┌──────┴───────┐
│Qwen3ASR│ │Qwen3│ │Cosy │ │Perso-│ │Speech- │ │ Speech- │
│Parakeet│ │ TTS │ │Voice│ │naPlex│ │ VAD │ │Enhancement │
└────┬───┘ └──┬──┘ └──┬──┘ └──┬───┘ └───┬───┘ └──────┬───────┘
│ │ │ │ │ │
└────────┴───────┼───────┴─────────┘ │
│ │
┌──────┴──────┐ │
│ Qwen3Common │ (lớp dùng chung) │
└──────┬──────┘ │
│ │
┌──────┴──────┐ │
│ AudioCommon │ ◄──────────────────────┘
└─────────────┘ (giao thức, I/O âm thanh)Backend suy luận
| Backend | Phần cứng | Mô hình |
|---|---|---|
| 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 | Encoder của Qwen3-ASR (hybrid), Parakeet TDT, Parakeet EOU streaming, Omnilingual ASR 300M, Kokoro-82M, Qwen3.5-Chat (tùy chọn), phân tách người nói Sortformer, DeepFilterNet3, Silero VAD (tùy chọn), WeSpeaker (tùy chọn) |
| Accelerate | CPU (SIMD) | Tiền xử lý âm thanh (STFT, mel, FFT), xử lý tín hiệu |
Định dạng trọng số mô hình
Các mô hình MLX dùng định dạng safetensors với lượng tử hóa 4-bit hoặc 8-bit (kích thước nhóm 64). Các mô hình CoreML dùng định dạng đã biên dịch .mlmodelc. Các script chuyển đổi trong scripts/ chuyển đổi từ checkpoint PyTorch.
| Mô hình | Tham số | Lượng tử hóa | Kích thước trên đĩa |
|---|---|---|---|
| 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 và CoreML) |
| WeSpeaker ResNet34 | ~6.6M | float32 | ~25 MB (MLX và CoreML) |
| Sortformer (CoreML) | — | float16 | ~50 MB |
| DeepFilterNet3 (CoreML) | ~2.1M | FP16 | ~4.2 MB |
Tối ưu hóa hiệu năng
- MLX compile() — Hợp nhất kernel cho các vòng lặp tự hồi quy. Talker dùng
compile(shapeless: true), Code Predictor dùngcompile(shapeless: false)với kích thước cache cố định. - Thư viện shader Metal — metallib biên dịch sẵn tránh chi phí biên dịch JIT ~5x. Được xây dựng qua
scripts/build_mlx_metallib.sh. - Giải mã codec theo chunk — Decoder TTS xử lý giọng nói trong các chunk 25 frame với chồng lấp ngữ cảnh 10 frame để tránh timeout GPU.
- CFG nhân đôi batch — DiT của CosyVoice3 giảm một nửa số lần flow matching bằng cách gộp conditional + unconditional vào cùng batch.
- RoPE hợp nhất — Dùng
MLXNN.RoPEđược hỗ trợ bởi kernel Metal thay vì xoay thủ công. - Hợp nhất BN — Batch normalization của WeSpeaker được hợp nhất vào trọng số Conv2d tại thời điểm chuyển đổi.
Xử lý âm thanh
Tất cả I/O âm thanh dùng PCM Float32. Việc lấy mẫu lại nội bộ xử lý chuyển đổi định dạng:
| Mô hình | Tần số mong đợi | Định dạng |
|---|---|---|
| Qwen3-ASR | 16 kHz | Mono Float32 |
| Qwen3-TTS | 24 kHz đầu ra | Mono Float32 |
| CosyVoice3 | 24 kHz đầu ra | Mono Float32 |
| Kokoro-82M | 24 kHz đầu ra | 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 |
Cấu trúc mã nguồn
Sources/
AudioCommon/ Giao thức chung, I/O âm thanh, trình tải HuggingFace,
SentencePieceModel (đọc protobuf)
MLXCommon/ Tiện ích MLX: tải trọng số, helper QuantizedLinear,
helper attention đa đầu SDPA, ngân sách metal
Qwen3Common/ Thành phần mô hình dùng chung (cache KV, RoPE, lượng tử hóa)
Qwen3ASR/ Qwen3-ASR giọng nói thành văn bản
ParakeetASR/ Parakeet TDT giọng nói thành văn bản (CoreML)
ParakeetStreamingASR/ Parakeet EOU 120M chính tả streaming (CoreML)
OmnilingualASR/ Meta wav2vec2 + CTC, 1.672 ngôn ngữ
(CoreML 300M + MLX 300M / 1B / 3B / 7B)
Qwen3TTS/ Qwen3-TTS văn bản thành giọng nói
CosyVoiceTTS/ CosyVoice3 văn bản thành giọng nói
KokoroTTS/ Kokoro-82M văn bản thành giọng nói (CoreML)
Qwen3Chat/ Qwen3.5-0.8B chat LLM trên thiết bị (MLX + CoreML)
PersonaPlex/ PersonaPlex giọng nói thành giọng nói
SpeechVAD/ VAD (Silero + Pyannote), phân tách người nói, embedding người nói
SpeechEnhancement/ Khử nhiễu 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/ Cài đặt các lệnh CLI
AudioCLI/ Điểm vào CLI
scripts/ Chuyển đổi mô hình (PyTorch → MLX/CoreML), benchmarking
Tests/ Kiểm thử đơn vị và tích hợp
Examples/ Ứng dụng demo (PersonaPlexDemo, SpeechDemo)