โมเดล AI สำหรับเสียงพูดบน Apple Silicon ขับเคลื่อนด้วย MLX Swift และ CoreML
📖 Read in: English · 中文 · 日本語 · 한국어 · Español · Deutsch · Français · हिन्दी · Português · Русский · العربية · Tiếng Việt · Türkçe · ไทย
การรู้จำเสียงพูด การสังเคราะห์เสียง และการทำความเข้าใจเสียงพูดบนอุปกรณ์สำหรับ Mac และ iOS ทำงานบนเครื่องด้วย Apple Silicon — ไม่ใช้คลาวด์ ไม่ต้องใช้คีย์ API และไม่มีข้อมูลใดออกจากอุปกรณ์ของคุณ
📚 เอกสารฉบับเต็ม → · 🤗 โมเดลบน HuggingFace · 📝 Blog · 💬 Discord
Speech AI ที่ทำงานในเครื่องบน MacBook — ชมทัวร์ไลบรารีโอเพนซอร์สความยาว 4 นาทีบน YouTube
กรณีการใช้งาน: Voice Agents · การถอดเสียง · การสังเคราะห์เสียงพูด
รีโพสาธารณะ 16 แห่งที่ตรวจสอบการอ้างอิงแพ็กเกจ Speech Swift ได้
AnythingLLM · Palmier Pro · Anarlog · ClawdHome · Jabber · Ora · VoxFlow · LokalBot · Voicey · HushType · DexDictate macOS · Watchtower · Wishper App · FriSpeak · Scribe · VoicePen
กลุ่มความสามารถ: STT / ASR · การจัดแนว · TTS · LLM และการแปล · Speech-to-Speech · การปรับปรุง / การฟื้นฟู · การแยกแหล่งเสียง · การสร้างดนตรี / เสียง · Wake word, VAD, diarization และอัตลักษณ์ผู้พูด
STT / ASR
- Qwen3-ASR — แปลงเสียงพูดเป็นข้อความ (การรู้จำเสียงพูดอัตโนมัติ รองรับ 52 ภาษา MLX + CoreML)
- WhisperASR — Whisper Large-v3 Turbo speech-to-text via native CoreML runtime (ANE, multilingual)
- MOSS Transcribe Diarize — การถอดเสียงออฟไลน์ด้วย CoreML/MLX แบบเนทีฟ พร้อมป้ายผู้พูดและเวลาโดยโมเดล (บริบท MLX 128K; INT5/INT8)
- Parakeet TDT — แปลงเสียงพูดเป็นข้อความผ่าน CoreML (Neural Engine, NVIDIA FastConformer + ตัวถอดรหัส TDT รองรับ 25 ภาษา)
- Omnilingual ASR — แปลงเสียงพูดเป็นข้อความ (Meta wav2vec2 + CTC รองรับ 1,672 ภาษา ครอบคลุม 32 ระบบอักษร, CoreML 300M + MLX 300M/1B/3B/7B)
- Cohere Transcribe 2B — แปลงเสียงพูดเป็นข้อความด้วย MLX แบบเนทีฟ (14 ภาษา, FP16/INT5/INT8)
- Voxtral Mini 3B — แปลงเสียงพูดเป็นข้อความด้วย MLX แบบเนทีฟ (8 ภาษา, FP16/INT5/INT8) — RTF 0.074 บน M5 Pro
- Streaming Dictation — การเขียนตามคำบอกแบบเรียลไทม์พร้อมผลลัพธ์บางส่วนและการตรวจจับจุดจบของประโยค (Parakeet-EOU-120M)
- Nemotron Streaming (หลายภาษา) — ASR แบบสตรีมมิ่งที่มีความหน่วงต่ำ พร้อมเครื่องหมายวรรคตอนและตัวพิมพ์ใหญ่ในตัว (NVIDIA Nemotron-3.5-ASR-Streaming-0.6B, CoreML + MLX, 40 ภาษา-ตำแหน่ง)
- Nemotron Streaming (อังกฤษ) — ASR แบบสตรีมมิ่งที่มีความหน่วงต่ำ พร้อมเครื่องหมายวรรคตอนและตัวพิมพ์ใหญ่ในตัว (NVIDIA Nemotron-Speech-Streaming-0.6B, CoreML, ภาษาอังกฤษเท่านั้น เล็กและเร็วกว่ารุ่นหลายภาษา)
การจัดแนว
- Qwen3-ForcedAligner — การจัดเรียงเครื่องหมายเวลาในระดับคำ (เสียง + ข้อความ → เครื่องหมายเวลา)
TTS / การสังเคราะห์เสียงพูด
- Qwen3-TTS — การสังเคราะห์เสียงพูด (คุณภาพสูงสุด สตรีมมิ่ง ผู้พูดที่กำหนดเอง 10 ภาษา)
- CosyVoice TTS — TTS แบบสตรีมมิ่งพร้อมการโคลนเสียง บทสนทนาหลายผู้พูด และแท็กอารมณ์ (9 ภาษา)
- VoxCPM2 — TTS คุณภาพระดับสตูดิโอที่ 48 kHz พร้อมการโคลนเสียง + การออกแบบเสียงผ่านคำสั่ง (2B, MLX bf16/int8, 30 ภาษา)
- IndexTTS2 — Native MLX voice cloning from a reference voice (IndexTeam IndexTTS-2, 1.5B-class fp16 bundle, speaker/emotion/pause controls)
- F5-TTS — Zero-shot voice cloning from a short reference clip + transcript (SWivid F5-TTS v1 Base, DiT flow matching + Vocos, MLX fp16, 24 kHz, English + Mandarin; non-commercial license)
- Higgs TTS 3 — Conversational TTS with zero-shot voice cloning and inline emotion/style/SFX/prosody tags (Boson Higgs TTS 3, Qwen3-4B backbone, MLX bf16, 24 kHz, 100+ languages; research/non-commercial license)
- Kokoro TTS — TTS บนอุปกรณ์ (82M, CoreML/Neural Engine, 54 เสียง พร้อมใช้งานบน iOS, 10 ภาษา)
- VibeVoice TTS — TTS แบบยาว / หลายผู้พูด (Microsoft VibeVoice Realtime-0.5B + 1.5B, MLX สังเคราะห์พอดแคสต์/หนังสือเสียงได้นานสูงสุด 90 นาที, EN/ZH)
- Magpie TTS — TTS หลายภาษา (NVIDIA Magpie-TTS Multilingual 357M, MLX INT8 411 MB หรือ CoreML INT8 342 MB, 9 ภาษา, 5 ผู้พูดสำเร็จรูป สตรีมมิ่งบน MLX)
- Supertonic TTS — TTS แบบ flow-matching บนอุปกรณ์ (Supertone Supertonic-3 99M, CoreML/Neural Engine, 31 ภาษา, 10 เสียง, G2P-free, 44.1 kHz)
- Chatterbox TTS — TTS หลายภาษาพร้อมการโคลนเสียงแบบ zero-shot (Resemble AI Chatterbox Multilingual, MLX fp16 ~1.3 GB, 23 ภาษาที่รันไทม์; ภาษาฮีบรูต้องมี niqqud, MIT)
- OmniVoice TTS — TTS แบบ diffusion non-autoregressive พร้อมการโคลนเสียงแบบ zero-shot (k2-fsa OmniVoice, backbone Qwen3, MLX fp16 เป็นค่าเริ่มต้น / มี int8, 600+ ภาษา, Apache-2.0)
- Indic-Mio — Hindi/Indic TTS with inline emotion markers and optional reference-voice cloning (MLX, 24 kHz)
- CSM (Conversational Speech Model) — TTS เชิงสนทนาพร้อมการโคลนเสียงแบบ zero-shot จากคลิปเสียงอ้างอิง + ทรานสคริปต์ (Sesame CSM-1B, backbone Llama-1B + โคเดก Mimi, MLX int8/fp16, 24 kHz, ภาษาอังกฤษ; Apache-2.0)
LLM และการแปล
- Qwen3Chat — แชท LLM บนอุปกรณ์ (Qwen3.5-0.8B MLX/CoreML พร้อมแบ็กเอนด์ MLX ของ dense Qwen3 4B และ Gemma 4 E2B/E4B, สตรีมมิ่งโทเค็น)
- FunctionGemma — LLM บนอุปกรณ์สำหรับการเรียกฟังก์ชัน / เครื่องมือแบบมีโครงสร้าง (Gemma 3 270M, CoreML 8-bit palettize, Neural Engine, ~252 tok/s)
- MADLAD-400 — การแปลแบบหลายต่อหลายระหว่างกว่า 400 ภาษา (3B, MLX INT4 + INT8, T5 v1.1, Apache 2.0)
Speech-to-Speech และ voice agents
- Hibiki Zero-3B — การแปลเสียงพูดสู่เสียงพูดแบบสตรีมมิ่ง (FR/ES/PT/DE → EN, MLX INT4 + INT8, สแต็ก Kyutai Moshi/Mimi, CC-BY-4.0)
- PersonaPlex — เสียงพูดสู่เสียงพูดแบบ full-duplex (7B, เสียงเข้า → เสียงออก, 18 พรีเซ็ตเสียง)
- VoiceChat 11B — speech-to-speech แบบ duplex บน MLX ที่รับเสียงพูดต่อเนื่อง ใช้ช่องข้อความ/ฟังก์ชัน และส่งเสียงพูดโดยตรงผ่าน EAR-TTS กับ neural codec (INT5/INT8)
- Audio2Face-3D — แอนิเมชันใบหน้าอวาตาร์ขับเคลื่อนด้วยเสียงพูด (NVIDIA Audio2Face-3D v2.3 Mark, ค่าสัมประสิทธิ์ใบหน้า 301 ค่า, MLX)
การปรับปรุง การแยก และการสร้างเสียง
- DeepFilterNet3 — การลดเสียงรบกวนแบบเรียลไทม์ (2.1M พารามิเตอร์, 48 kHz)
- LocalVQE v1.4-AEC — การตัดเสียงสะท้อนอะคูสติกแบบสตรีมจากสตรีมไมโครโฟนและสัญญาณอ้างอิงการเล่นที่แยกกันและซิงโครไนซ์กัน (Core ML + ฟิลเตอร์ปรับตัวแบบเนทีฟ, 16 kHz, เวลาแฝงเชิงอัลกอริทึม 16 ms)
- Source Separation — การแยกแหล่งกำเนิดดนตรีด้วย HTDemucs (Demucs v4) + Open-Unmix (UMX-HQ / UMX-L, 4 stems: เสียงร้อง/กลอง/เบส/อื่นๆ, 44.1 kHz สเตอริโอ)
- MAGNeT — การสร้างดนตรีจากข้อความ (Meta MAGNeT Small 300M / Medium 1.5B, MLX INT8, คลิป 30 วินาทีที่ 32 kHz โมโน, การถอดรหัสแบบขนานที่มีการมาสก์)
- Stable Audio 3 — Text-to-audio/music generation (Stable Audio 3 Medium, MLX INT8/INT4, 44.1 kHz stereo, variable length)
- FlashSR — การเพิ่มความละเอียดเสียง (FlashSR ICASSP 2025, MLX, 48 kHz โมโน, diffusion แบบกลั่นใน 1 ขั้น, INT4 363 MB / INT8 720 MB)
การตรวจจับเทิร์น, diarization และอัตลักษณ์ผู้พูด
- Wake-word — การตรวจจับคำสั่งปลุกบนอุปกรณ์ (KWS Zipformer 3M, CoreML, เร็วกว่าเรียลไทม์ 26 เท่า, รายการคำสั่งปลุกปรับแต่งได้)
- VAD — การตรวจจับเสียงพูด (Silero streaming, Pyannote offline, FireRedVAD รองรับกว่า 100 ภาษา)
- Speaker Diarization — ใครพูดเมื่อใด (pipeline Pyannote, Sortformer แบบ end-to-end บน Neural Engine) — ตอนนี้มีเซสชันสตรีมมิงแบบเพิ่มทีละส่วน (ID ผู้พูดคงที่ อัปเดตทุก 480 ms)
- Speaker Embeddings — WeSpeaker ResNet34 (256 มิติ), ReDimNet2-B6 สำหรับการระบุตัวตนเสียงแบบตั้งชื่อ (192 มิติ), CAM++ (192 มิติ)
Papers: Qwen3-ASR (Alibaba) · Qwen3-TTS (Alibaba) · Omnilingual ASR (Meta) · Parakeet TDT (NVIDIA) · CosyVoice 3 (Alibaba) · Kokoro (StyleTTS 2) · PersonaPlex (NVIDIA) · Mimi (Kyutai) · Hibiki (Kyutai) · Sortformer (NVIDIA)
- 19 เม.ย. 2026 — MLX vs CoreML on Apple Silicon — A Practical Guide to Picking the Right Backend
- 20 มี.ค. 2026 — We Beat Whisper Large v3 with a 600M Model Running Entirely on Your Mac
- 26 ก.พ. 2026 — Speaker Diarization and Voice Activity Detection on Apple Silicon — Native Swift with MLX
- 23 ก.พ. 2026 — NVIDIA PersonaPlex 7B on Apple Silicon — Full-Duplex Speech-to-Speech in Native Swift with MLX
- 12 ก.พ. 2026 — Qwen3-ASR Swift: On-Device ASR + TTS for Apple Silicon — Architecture and Benchmarks
เพิ่มแพ็กเกจลงใน Package.swift ของคุณ:
.package(url: "https://github.com/soniqo/speech-swift", branch: "main")นำเข้าเฉพาะโมดูลที่คุณต้องการ — ทุกโมเดลเป็นไลบรารี SPM ของตัวเอง คุณจึงไม่ต้องจ่ายให้กับสิ่งที่ไม่ได้ใช้:
.product(name: "ParakeetStreamingASR", package: "speech-swift"),
.product(name: "SpeechUI", package: "speech-swift"), // มุมมอง SwiftUI เสริมถอดเสียงจากบัฟเฟอร์เสียงในสามบรรทัด:
import ParakeetStreamingASR
let model = try await ParakeetStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)สตรีมมิ่งสดพร้อมผลลัพธ์บางส่วน:
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000) {
print(partial.isFinal ? "FINAL: \(partial.text)" : "... \(partial.text)")
}มุมมองการเขียนตามคำบอกด้วย SwiftUI ในประมาณ 10 บรรทัด:
import SwiftUI
import ParakeetStreamingASR
import SpeechUI
@MainActor
struct DictateView: View {
@State private var store = TranscriptionStore()
var body: some View {
TranscriptionView(finals: store.finalLines, currentPartial: store.currentPartial)
.task {
let model = try? await ParakeetStreamingASRModel.fromPretrained()
guard let model else { return }
for await p in model.transcribeStream(audio: samples, sampleRate: 16000) {
store.apply(text: p.text, isFinal: p.isFinal)
}
}
}
}SpeechUI มาพร้อมเพียง TranscriptionView (ผลลัพธ์สุดท้าย + บางส่วน) และ TranscriptionStore (อะแดปเตอร์สำหรับ ASR แบบสตรีมมิ่ง) ใช้ AVFoundation สำหรับการแสดงผลภาพเสียงและการเล่นเสียง
ผลิตภัณฑ์ SPM ที่มีให้: Qwen3ASR, WhisperASR, MossTranscribe, Qwen3TTS, Qwen3TTSCoreML, ParakeetASR, ParakeetStreamingASR, NemotronStreamingASR, OmnilingualASR, CohereTranscribeASR, VoxtralASR, KokoroTTS, SupertonicTTS, VibeVoiceTTS, CosyVoiceTTS, VoxCPM2TTS, IndexTTS2TTS, F5TTS, HiggsTTS, ChatterboxTTS, OmniVoiceTTS, IndicMioTTS, FishAudioTTS, MagpieTTS, MagpieTTSCoreML, MAGNeTMusicGen, StableAudio3MusicGen, FlashSR, PersonaPlex, VoiceChat, CSM, Audio2Face3D, HibikiTranslate, MADLADTranslation, SpeechVAD, SpeechLanguageID, SpeechWakeWord, SpeechEnhancement, SpeechRestoration, SourceSeparation, Qwen3Chat, FunctionGemma, SpeechCore, SpeechUI, AudioCommon
มุมมองแบบย่อด้านล่าง แคตตาล็อกโมเดลฉบับเต็มพร้อมขนาด การควอนไทซ์ URL ดาวน์โหลด และตารางหน่วยความจำ → soniqo.audio/architecture
| โมเดล | งาน | Backends | ขนาด | ภาษา |
|---|---|---|---|---|
| Qwen3-ASR | เสียงพูด → ข้อความ | MLX, CoreML (ไฮบริด) | 0.6B, 1.7B | 52 |
| WhisperASR | Speech → Text | CoreML (ANE) | Large-v3 Turbo | Multi |
| MOSS Transcribe Diarize | เสียง → ข้อความ + เวลาผู้พูด | CoreML / MLX | 0.9B (MLX INT5/INT8; CoreML INT8/FP16) | หลายภาษา |
| Parakeet TDT | เสียงพูด → ข้อความ | CoreML (ANE) | 0.6B | 25 ยุโรป |
| Parakeet EOU | เสียงพูด → ข้อความ (สตรีมมิ่ง) | CoreML (ANE) | 120M | 25 ยุโรป |
| Nemotron Streaming (หลายภาษา) | เสียงพูด → ข้อความ (สตรีมมิ่ง มีเครื่องหมายวรรคตอน) | CoreML (ANE), MLX | 0.6B | 40 |
| Nemotron Streaming (อังกฤษ) | เสียงพูด → ข้อความ (สตรีมมิ่ง มีเครื่องหมายวรรคตอน) | CoreML (ANE) | 0.6B | EN |
| Omnilingual ASR | เสียงพูด → ข้อความ | CoreML (ANE), MLX | 300M / 1B / 3B / 7B | 1,672 |
| Cohere Transcribe 2B | เสียงพูด → ข้อความ | MLX | 2B (FP16 / INT5 / INT8) | 14 |
| Voxtral Mini 3B | เสียงพูด → ข้อความ | MLX | 3B (FP16 / INT5 / INT8) | 8 |
| Qwen3-ForcedAligner | เสียง + ข้อความ → เครื่องหมายเวลา | MLX, CoreML | 0.6B | หลายภาษา |
| Qwen3-TTS | ข้อความ → เสียงพูด | MLX, CoreML | 0.6B, 1.7B | 10 |
| CosyVoice3 | ข้อความ → เสียงพูด | MLX | 0.5B | 9 |
| VoxCPM2 | ข้อความ → เสียงพูด (48 kHz, ออกแบบเสียง + โคลนเสียง) | MLX | 2B (bf16/int8) | 30 |
| IndexTTS2 | Text → Speech (zero-shot voice cloning) | MLX | 1.5B-class (fp16) | EN/ZH |
| F5-TTS | Text → Speech (zero-shot voice cloning) | MLX | 336M (fp16) | EN/ZH |
| Higgs TTS 3 | Text → Speech (conversational, zero-shot voice cloning) | MLX | 4B (bf16) | 100+ |
| Kokoro-82M | ข้อความ → เสียงพูด | CoreML (ANE) | 82M | 10 |
| Supertonic-3 | ข้อความ → เสียงพูด (44.1 kHz, flow-matching, G2P-free) | CoreML (ANE) | 99M | 31 |
| VibeVoice Realtime-0.5B | ข้อความ → เสียงพูด (รูปแบบยาว หลายผู้พูด) | MLX | 0.5B | EN/ZH |
| VibeVoice 1.5B | ข้อความ → เสียงพูด (พอดแคสต์ยาวสุด 90 นาที) | MLX | 1.5B | EN/ZH |
| Magpie-TTS Multilingual | ข้อความ → เสียงพูด (5 ผู้พูดสำเร็จรูป สตรีมมิ่ง) | MLX / CoreML | 357M (MLX INT8, CoreML INT8) | 9 (CoreML ไม่รวม JA) |
| Chatterbox Multilingual | ข้อความ → เสียงพูด (โคลนแบบ zero-shot) | MLX | 0.8B (fp16) | 23 (HE ต้องมี niqqud) |
| OmniVoice | ข้อความ → เสียงพูด (diffusion NAR, การโคลนแบบ zero-shot) | MLX | 0.8B (fp16 ค่าเริ่มต้น / int8) | 600+ |
| Indic-Mio | Text → Speech (Hindi/Indic, emotion tags, voice cloning) | MLX | fp16 | Hindi / Indic |
| Fish Audio S2 Pro | ข้อความ → เสียงพูด (การโคลนแบบ zero-shot, marker สไตล์แบบชัดเจน) | MLX | 0.5B-class (fp16) | หลายภาษา |
| CSM | ข้อความ → เสียงพูด (เชิงสนทนา, การโคลนแบบ zero-shot) | MLX | 1B (int8 / fp16) | EN |
| Qwen3.5 Chat | Text → Text (LLM) | MLX, CoreML | 0.8B | Multi |
| Qwen3 Dense Chat | Text → Text (LLM) | MLX | 4B | Multi |
| Gemma 4 Chat | Text → Text (LLM) | MLX | E2B / E4B (4-bit) | Multi |
| FunctionGemma | ข้อความ → การเรียกเครื่องมือ (LLM) | CoreML | 270M | EN |
| MADLAD-400 | ข้อความ → ข้อความ (การแปล) | MLX | 3B | 400+ |
| Hibiki Zero-3B | เสียงพูด → เสียงพูด (การแปล) | MLX | 3B | FR/ES/PT/DE → EN |
| PersonaPlex | เสียงพูด → เสียงพูด | MLX | 7B | EN |
| VoiceChat 11B | เสียงพูด → เสียงพูด + ข้อความ | MLX | 11B (INT5 / INT8) | EN |
| Audio2Face-3D | เสียงพูด → แอนิเมชันใบหน้า | MLX | v2.3 Mark | ไม่จำกัดภาษา |
| Silero VAD | การตรวจจับเสียงพูด | MLX, CoreML | 309K | ไม่จำกัดภาษา |
| KWS Zipformer | Audio → Wake word | CoreML (ANE) | 3M | EN/custom keywords |
| Pyannote | VAD + การแยกผู้พูด | MLX | 1.5M | ไม่จำกัดภาษา |
| Pyannote Community-1 | การแยกผู้พูด + เอ็มเบดดิงผู้พูด | CoreML (ANE) + Swift VBx | 8.35M | ไม่จำกัดภาษา |
| Sortformer | การแยกผู้พูด (E2E), สตรีมมิงแบบเพิ่มทีละส่วน | CoreML (ANE) | 117M | ไม่จำกัดภาษา |
| DeepFilterNet3 | การปรับปรุงเสียงพูด | CoreML | 2.1M | ไม่จำกัดภาษา |
| LocalVQE v1.4-AEC | การตัดเสียงสะท้อนอะคูสติก | CoreML + C++ | 200K + 2,742 | ไม่จำกัดภาษา |
| Sidon | การฟื้นฟูเสียงพูด (ลดเสียงรบกวน + ลดเสียงก้อง, 48 kHz) | CoreML | w2v-BERT 2.0 + DAC (fp16/int8) | ไม่จำกัดภาษา |
| HTDemucs (Demucs v4) | การแยกแหล่งกำเนิด | MLX | 168M | ไม่จำกัดภาษา |
| Open-Unmix | การแยกแหล่งกำเนิด | MLX | 8.6M | ไม่จำกัดภาษา |
| MAGNeT | ข้อความ → ดนตรี (30 วินาที @ 32 kHz) | MLX | 300M / 1.5B (int4/int8) | พรอมต์ EN |
| Stable Audio 3 | Text → Music/audio (44.1 kHz stereo) | MLX | Medium 1.4B (int4/int8) | EN prompts |
| FlashSR | การเพิ่มความละเอียดเสียง (48 kHz) | MLX | 363 MB / 720 MB (int4/int8) | ไม่จำกัดภาษา |
| WeSpeaker | Embedding ของผู้พูด | MLX, CoreML | 6.6M | ไม่จำกัดภาษา |
| SpeechBrain ECAPA VoxLingua107 | การระบุภาษา | MLX, CoreML | 21.25M | 107 ภาษา |
| ReDimNet2-B6 | การระบุตัวตนเสียงแบบตั้งชื่อ | CoreML | 12.3M | ไม่จำกัดภาษา |
ต้องใช้ Homebrew ARM แบบเนทีฟ (/opt/homebrew) ไม่รองรับ Homebrew แบบ Rosetta/x86_64
brew install speechจากนั้น:
speech transcribe recording.wav
speech transcribe recording.wav --engine cohere
speech transcribe recording.wav --engine voxtral
speech transcribe recording.wav --engine moss
speech transcribe meeting.wav --engine moss --backend mlx
speech speak "Hello world"
speech csm "Nice to meet you" --ref-audio voice.wav --ref-text "reference transcript"
speech translate "Hello, how are you?" --to es
speech respond --input question.wav --transcript
speech voice-chat
speech-server --port 8080 # เซิร์ฟเวอร์ HTTP / WebSocket ท้องถิ่น (รองรับ /v1/realtime + /v1/audio/transcriptions ของ OpenAI)dependencies: [
.package(url: "https://github.com/soniqo/speech-swift", branch: "main")
]นำเข้าเฉพาะสิ่งที่คุณต้องการ — ทุกโมเดลเป็น target SPM ของตัวเอง:
import Qwen3ASR // การรู้จำเสียงพูด (MLX)
import WhisperASR // Whisper Large-v3 Turbo (CoreML)
import MossTranscribe // MOSS transcription with timestamps + speaker labels (CoreML + MLX)
import ParakeetASR // การรู้จำเสียงพูด (CoreML, batch)
import ParakeetStreamingASR // การเขียนตามคำบอกแบบสตรีมมิ่งพร้อม partials + EOU
import NemotronStreamingASR // ASR สตรีมมิ่งหลายภาษาพร้อมเครื่องหมายวรรคตอนในตัว (0.6B, 40 ภาษา)
import OmnilingualASR // 1,672 ภาษา (CoreML + MLX)
import CohereTranscribeASR // Cohere Transcribe 2B (MLX, 14 ภาษา)
import VoxtralASR // Voxtral Mini 3B (MLX, 8 ภาษา)
import Qwen3TTS // การสังเคราะห์เสียงพูด
import CosyVoiceTTS // การสังเคราะห์เสียงพูดพร้อมการโคลนเสียง
import VoxCPM2TTS // TTS 48 kHz พร้อมการโคลนเสียง + การออกแบบเสียง (2B)
import IndexTTS2TTS // Native MLX voice cloning from reference audio
import F5TTS // Zero-shot voice cloning (DiT flow matching + Vocos)
import HiggsTTS // Conversational TTS + cloning (Qwen3 backbone, control tags)
import CSM // Conversational Speech Model — text→audio + voice cloning (Sesame CSM-1B, MLX)
import KokoroTTS // การสังเคราะห์เสียงพูด (พร้อมใช้งานบน iOS)
import VibeVoiceTTS // TTS รูปแบบยาว / หลายผู้พูด (EN/ZH)
import MagpieTTS // TTS หลายภาษา (NVIDIA Magpie 357M, MLX, 9 ภาษา)
import MagpieTTSCoreML // Backend CoreML ของ Magpie (ไฮบริด CoreML + MLX, 8 ภาษา)
import FishAudioTTS // runtime Fish Audio S2 Pro แบบทดลองพร้อมการโคลนเสียง
import Qwen3Chat // แชท LLM บนอุปกรณ์
import FunctionGemma // LLM บนอุปกรณ์สำหรับการเรียกเครื่องมือ
import MADLADTranslation // การแปลแบบหลายต่อหลายระหว่างกว่า 400 ภาษา
import HibikiTranslate // การแปลเสียงพูดสู่เสียงพูดแบบสตรีมมิ่ง (FR/ES/PT/DE → EN)
import PersonaPlex // เสียงพูดสู่เสียงพูดแบบ full-duplex
import SpeechVAD // VAD + การแยกผู้พูด + embeddings
import SpeechEnhancement // การลดเสียงรบกวน
import SpeechRestoration // การฟื้นฟูเสียงพูด — ลดเสียงรบกวน + ลดเสียงก้อง (Sidon, CoreML, 48 kHz)
import SourceSeparation // การแยกแหล่งกำเนิดดนตรี (Open-Unmix, 4 stems)
import SpeechUI // คอมโพเนนต์ SwiftUI สำหรับการถอดเสียงแบบสตรีมมิ่ง
import AudioCommon // โปรโตคอลและยูทิลิตี้ที่ใช้ร่วมกัน- Swift 6+, Xcode 16+ (พร้อม Metal Toolchain)
- macOS 15+ (Sequoia) หรือ iOS 18+, Apple Silicon (M1/M2/M3/M4)
ข้อกำหนดขั้นต่ำ macOS 15 / iOS 18 มาจาก MLState — API สถานะถาวรของ ANE จาก Apple ที่ pipelines CoreML (Qwen3-ASR, Qwen3-Chat, Qwen3-TTS) ใช้เพื่อเก็บ KV caches ให้อยู่ใน Neural Engine ตลอดขั้นตอนของโทเค็น
git clone https://github.com/soniqo/speech-swift
cd speech-swift
make buildmake build คอมไพล์แพ็กเกจ Swift และ ไลบรารี shader MLX Metal ไลบรารี Metal จำเป็นสำหรับการอนุมานบน GPU — หากไม่มีคุณจะเห็น Failed to load the default metallib ในระหว่างการทำงาน ใช้ make debug สำหรับ build แบบดีบัก และ make test สำหรับชุดทดสอบ
คู่มือคอมไพล์และติดตั้งฉบับเต็ม →
- DictateDemo (เอกสาร) — การเขียนตามคำบอกแบบสตรีมมิ่งบนเมนูบาร์ของ macOS พร้อมผลลัพธ์บางส่วนแบบสด การตรวจจับจุดจบของประโยคโดย VAD และการคัดลอกในคลิกเดียว ทำงานเป็น background agent (Parakeet-EOU-120M + Silero VAD)
- iOSEchoDemo — เดโม echo สำหรับ iOS (Parakeet ASR + Kokoro TTS) ใช้งานได้บนอุปกรณ์จริงและซิมูเลเตอร์
- PersonaPlexDemo — ผู้ช่วยเสียงสนทนาพร้อมอินพุตจากไมโครโฟน VAD และบริบทหลายเทิร์น บน macOS RTF ~0.94 บน M2 Max (เร็วกว่าเรียลไทม์)
- Soniqo VoiceChat CLI (คู่มือ) — ผู้ช่วยเทอร์มินัล Nemotron 11B แบบ full-duplex ที่มีคำบรรยาย RNN-T แบบสด การจัดคิวสนทนาโดยโมเดล รายละเอียด EAR-TTS แบบปรับตัว และเครื่องมือ MCP ที่เลือกใช้ได้ การตั้งค่า Apple Reminders ที่ให้มาจะเปิดเฉพาะการสร้าง แสดงรายการ และอัปเดต
- SpeechDemo — การเขียนตามคำบอกและการสังเคราะห์ TTS ในอินเทอร์เฟซแบบแท็บ บน macOS
เรียกใช้เดโมเตือนความจำ VoiceChat หลัง build แบบ release:
./.build/release/speech voice-chat \
--model /path/to/voicechat-mlx-int5 \
--mcp-config Examples/VoiceChatMCP/apple-reminders.jsonเพิ่ม --debug-timeline เพื่อดูเวลาของวลี จุดสิ้นสุดการออกเสียงที่สร้างขึ้น และวงจรชีวิตเครื่องมือที่โมเดลถอดรหัส โหมดนี้อาจเปิดเผยอาร์กิวเมนต์ของเครื่องมือ จึงไม่ควรใช้ใน log ที่แชร์ ดูรายละเอียด build และ runtime ใน README ของแต่ละแอปหรือคู่มือด้านบน
โค้ดด้านล่างแสดงเส้นทางที่สั้นที่สุดสำหรับแต่ละโดเมน ทุกหัวข้อมีลิงก์ไปยังคู่มือฉบับเต็มบน soniqo.audio พร้อมตัวเลือกการตั้งค่า backends หลายแบบ รูปแบบสตรีมมิ่ง และสูตร CLI
การรู้จำเสียงพูด — คู่มือฉบับเต็ม →
import Qwen3ASR
let model = try await Qwen3ASRModel.fromPretrained()
let text = model.transcribe(audio: audioSamples, sampleRate: 16000)Backends ทางเลือก: WhisperASR (Whisper Large-v3 Turbo, native CoreML), Parakeet TDT (CoreML เร็วกว่าเรียลไทม์ 32 เท่า), Omnilingual ASR (1,672 ภาษา, CoreML หรือ MLX), Streaming dictation (ผลลัพธ์บางส่วนแบบสด)
Forced Alignment — คู่มือฉบับเต็ม →
import Qwen3ASR
let aligner = try await Qwen3ForcedAligner.fromPretrained()
let aligned = aligner.align(
audio: audioSamples,
text: "Can you guarantee that the replacement part will be shipped tomorrow?",
sampleRate: 24000
)
for word in aligned {
print("[\(word.startTime)s - \(word.endTime)s] \(word.text)")
}การสังเคราะห์เสียงพูด — คู่มือฉบับเต็ม →
import Qwen3TTS
import AudioCommon
let model = try await Qwen3TTSModel.fromPretrained()
let audio = model.synthesize(text: "Hello world", language: "english")
try WAVWriter.write(samples: audio, sampleRate: 24000, to: outputURL)เอนจิน TTS ทางเลือก: CosyVoice3 (สตรีมมิ่ง + การโคลนเสียง + แท็กอารมณ์), Kokoro-82M (พร้อมใช้งานบน iOS, 54 เสียง), VibeVoice (พอดแคสต์รูปแบบยาว / หลายผู้พูด EN/ZH), Fish Audio S2 Pro (การโคลน zero-shot แบบทดลอง + marker สไตล์ในวงเล็บเหลี่ยม), การโคลนเสียง
เสียงพูดสู่เสียงพูด — คู่มือฉบับเต็ม →
import PersonaPlex
let model = try await PersonaPlexModel.fromPretrained()
let responseAudio = model.respond(userAudio: userSamples)
// เอาต์พุต Float32 โมโน 24 kHz พร้อมเล่นแชท LLM — คู่มือฉบับเต็ม →
import Qwen3Chat
import FunctionGemma
let chat = try await Qwen35MLXChat.fromPretrained()
chat.chat(messages: [(.user, "Explain MLX in one sentence")]) { token, isFinal in
print(token, terminator: "")
}การแปล — คู่มือฉบับเต็ม →
import MADLADTranslation
let translator = try await MADLADTranslator.fromPretrained()
let es = try translator.translate("Hello, how are you?", to: "es")
// → "Hola, ¿cómo estás?"การแปลเสียงพูด — คู่มือฉบับเต็ม →
import HibikiTranslate
import AudioCommon
let model = try await HibikiTranslateModel.fromPretrained()
let pcm = try AudioFileLoader.load(url: input, targetSampleRate: 24000)
let (englishAudio, textTokens) = model.translate(
sourceAudio: pcm, sourceLanguage: .fr
)
// Hibiki Zero-3B — FR/ES/PT/DE → EN, บนอุปกรณ์, สตรีมมิ่งด้วยตัวเข้ารหัส Mimiการตรวจจับเสียงพูด — คู่มือฉบับเต็ม →
import SpeechVAD
let vad = try await SileroVADModel.fromPretrained()
let segments = vad.detectSpeech(audio: samples, sampleRate: 16000)
for s in segments { print("\(s.startTime)s → \(s.endTime)s") }การแยกผู้พูด — คู่มือฉบับเต็ม →
import SpeechVAD
let diarizer = try await DiarizationPipeline.fromPretrained()
let segments = diarizer.diarize(audio: samples, sampleRate: 16000)
for s in segments { print("Speaker \(s.speakerId): \(s.startTime)s - \(s.endTime)s") }การปรับปรุงเสียงพูด — คู่มือฉบับเต็ม →
import SpeechEnhancement
let denoiser = try await DeepFilterNet3Model.fromPretrained()
let clean = try denoiser.enhance(audio: noisySamples, sampleRate: 48000)การตัดเสียงสะท้อนอะคูสติก — คู่มือฉบับเต็ม →
import SpeechEnhancement
let aec = try await LocalVQEEchoCanceller.fromPretrained()
let cleanMicrophone = try aec.processFrame(
microphone: microphoneFrame,
reference: playbackReferenceFrame
)การฟื้นฟูเสียงพูด — คู่มือฉบับเต็ม →
ลดเสียงรบกวน และ ลดเสียงก้องไปพร้อมกันด้วย Sidon (ตัวทำนาย w2v-BERT 2.0 + โวโคเดอร์ DAC, Core ML) ต่างจากตัวลดเสียงรบกวนทั่วไป Sidon ถูกฝึกมาเพื่อรักษาเอกลักษณ์ของผู้พูดไว้ จึงเหมาะอย่างยิ่งสำหรับการทำความสะอาดเสียงอ้างอิงสำหรับการโคลนเสียงที่มีเสียงรบกวนหรือเสียงก้องก่อนทำ TTS อินพุตเป็น 16 kHz เอาต์พุตเป็นโมโน 48 kHz
import SpeechRestoration
let restorer = try await SpeechRestorer.fromPretrained() // .fp16 (default) or .int8
let clean = try restorer.restore(audio: noisySamples, sampleRate: 16000) // → 48 kHzจาก CLI:
speech restore noisy.wav -o clean.wav # denoise + dereverb, 48 kHz output
speech restore noisy.wav --variant int8 # smaller, lower peak RAM
# Clean a voice-cloning reference before TTS (opt-in; preserves speaker identity):
speech speak "Hello" --engine voxcpm2 --voice-sample ref.wav --clean-referenceVoice Pipeline (ASR → LLM → TTS) — คู่มือฉบับเต็ม →
import SpeechCore
let pipeline = VoicePipeline(
stt: parakeetASR,
tts: qwen3TTS,
vad: sileroVAD,
config: .init(mode: .voicePipeline),
onEvent: { event in print(event) }
)
pipeline.start()
pipeline.pushAudio(micSamples)VoicePipeline คือสเตตแมชชีนสำหรับ voice agent แบบเรียลไทม์ (ขับเคลื่อนโดย speech-core) พร้อมการตรวจจับเทิร์นที่ขับเคลื่อนด้วย VAD การจัดการการขัดจังหวะ และ STT แบบ eager เชื่อมต่อ SpeechRecognitionModel + SpeechGenerationModel + StreamingVADProvider ใดก็ได้
speech-server --port 8080เปิดให้เข้าถึงทุกโมเดลผ่าน endpoints HTTP REST + WebSocket รวมถึง API ที่รองรับ OpenAI: Realtime WebSocket ที่ /v1/realtime และ REST endpoint สำหรับการถอดเสียงที่ /v1/audio/transcriptions ดู Sources/AudioServer/
- SALM-Duplex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model — เอกสารอ้างอิงด้านสถาปัตยกรรมของ VoiceChat 11B (Interspeech 2025)
speech-swift ถูกแบ่งเป็นหนึ่ง SPM target ต่อโมเดล เพื่อให้ผู้ใช้จ่ายเฉพาะสิ่งที่นำเข้าเท่านั้น โครงสร้างพื้นฐานที่ใช้ร่วมกันอยู่ใน AudioCommon (โปรโตคอล I/O ของเสียง ตัวดาวน์โหลดจาก HuggingFace SentencePieceModel) และ MLXCommon (การโหลดน้ำหนัก ตัวช่วย QuantizedLinear ตัวช่วย attention หลายหัว SDPA)
แผนภาพสถาปัตยกรรมฉบับเต็มพร้อม backends ตารางหน่วยความจำ และแผนผังโมดูล → soniqo.audio/architecture · API reference → soniqo.audio/api · Benchmarks → soniqo.audio/benchmarks
เอกสารในเครื่อง (repo):
- โมเดล: Qwen3-ASR · WhisperASR · MOSS Transcribe Diarize · Qwen3-TTS · CosyVoice · Kokoro · VoxCPM2 · IndexTTS2 · F5-TTS · Higgs TTS 3 · VibeVoice · Supertonic · Chatterbox · Indic-Mio · Fish Audio S2 Pro · Magpie TTS · Parakeet TDT · Parakeet Streaming · Nemotron Streaming · Omnilingual ASR · PersonaPlex · VoiceChat · CSM · Hibiki · MADLAD-400 · FunctionGemma · Qwen3.5 Chat · Gemma 4 Chat · Qwen3 Dense Chat · FireRedVAD · KWS Zipformer · Sidon · Source Separation · HTDemucs · MAGNeT · Stable Audio 3 · FlashSR · Audio2Face-3D
- การอนุมาน: Qwen3-ASR · WhisperASR · MOSS Transcribe Diarize · Parakeet TDT · Parakeet Streaming · Nemotron Streaming · Omnilingual ASR · TTS · VoxCPM2 · IndexTTS2 · F5-TTS · Higgs TTS 3 · VibeVoice · Fish Audio S2 Pro · Magpie TTS · CSM · Hibiki · MADLAD-400 · MAGNeT · Stable Audio 3 · FlashSR · Forced Aligner · Silero VAD · FireRedVAD · Wake-word · Speaker Diarization · Speech Enhancement · Sidon · Cache/offline
- การตัดเสียงสะท้อน: LocalVQE AEC
- อ้างอิง: Shared Protocols
น้ำหนักของโมเดลจะถูกดาวน์โหลดจาก HuggingFace เมื่อใช้งานครั้งแรก และเก็บแคชไว้ที่ ~/Library/Caches/qwen3-speech/ สามารถเขียนทับด้วย QWEN3_CACHE_DIR (CLI) หรือ cacheDir: (Swift API) ทุก entry point ของ fromPretrained() ยังรับ offlineMode: true เพื่อข้ามการเชื่อมต่อเครือข่ายเมื่อมีน้ำหนักอยู่ในแคชแล้ว
ดู docs/inference/cache-and-offline.md สำหรับรายละเอียดทั้งหมด รวมถึงพาธของคอนเทนเนอร์ iOS แบบ sandboxed
หากคุณเห็น Failed to load the default metallib ในระหว่างการทำงาน แสดงว่าไลบรารี shader ของ Metal หายไป ให้รัน make build หรือ ./scripts/build_mlx_metallib.sh release หลังจาก swift build แบบ manual หากไม่มี Metal Toolchain ให้ติดตั้งก่อน:
xcodebuild -downloadComponent MetalToolchainmake test # ชุดเต็ม (unit + E2E พร้อมการดาวน์โหลดโมเดล)
swift test --skip E2E # เฉพาะ unit (ปลอดภัยสำหรับ CI ไม่มีการดาวน์โหลด)
swift test --filter Qwen3ASRTests # โมดูลเฉพาะคลาสทดสอบ E2E ใช้คำนำหน้า E2E เพื่อให้ CI สามารถกรองออกได้ด้วย --skip E2E ดู CLAUDE.md สำหรับข้อตกลงเรื่องการทดสอบฉบับเต็ม
ยินดีรับ PRs — การแก้ไขบั๊ก การผสานรวมโมเดลใหม่ และเอกสาร Fork สร้าง branch ของฟีเจอร์ รัน make build && make test แล้วเปิด PR ไปที่ main
Apache 2.0