Skip to content

Latest commit

 

History

History
563 lines (422 loc) · 56.2 KB

File metadata and controls

563 lines (422 loc) · 56.2 KB

Speech Swift

โมเดล 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

Homebrew installs Verified public repositories: 15

soniqo%2Fspeech-swift | Trendshift

Speech AI ที่ทำงานในเครื่องบน MacBook — ชมทัวร์ไลบรารีโอเพนซอร์สความยาว 4 นาทีบน YouTube

Speech AI ที่ทำงานในเครื่องบน MacBook — ชมทัวร์ไลบรารีโอเพนซอร์สความยาว 4 นาทีบน YouTube

กรณีการใช้งาน: Voice Agents · การถอดเสียง · การสังเคราะห์เสียงพูด

สร้างด้วย Speech Swift

รีโพสาธารณะ 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)

ข่าวสาร

เริ่มต้นอย่างรวดเร็ว

เพิ่มแพ็กเกจลงใน 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

ต้องใช้ 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)

คู่มืออ้างอิง CLI ฉบับเต็ม →

Swift Package Manager

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 build

make 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 (ผลลัพธ์บางส่วนแบบสด)

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 พร้อมเล่น
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-reference

Voice 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 ใดก็ได้

เซิร์ฟเวอร์ HTTP API

speech-server --port 8080

เปิดให้เข้าถึงทุกโมเดลผ่าน endpoints HTTP REST + WebSocket รวมถึง API ที่รองรับ OpenAI: Realtime WebSocket ที่ /v1/realtime และ REST endpoint สำหรับการถอดเสียงที่ /v1/audio/transcriptions ดู Sources/AudioServer/

งานวิจัย

สถาปัตยกรรม

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):

การกำหนดค่าแคช

น้ำหนักของโมเดลจะถูกดาวน์โหลดจาก 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

ไลบรารี MLX Metal

หากคุณเห็น Failed to load the default metallib ในระหว่างการทำงาน แสดงว่าไลบรารี shader ของ Metal หายไป ให้รัน make build หรือ ./scripts/build_mlx_metallib.sh release หลังจาก swift build แบบ manual หากไม่มี Metal Toolchain ให้ติดตั้งก่อน:

xcodebuild -downloadComponent MetalToolchain

การทดสอบ

make 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