البدء

توفّر speech-swift معالجة كلام بالذكاء الاصطناعي على الجهاز لأنظمة macOS وiOS على Apple Silicon. تعمل النماذج محلّيًا باستخدام MLX (Metal GPU) وCoreML (Neural Engine).

المتطلّبات

التثبيت

Homebrew (CLI)

أسرع طريقة لتجربة speech-swift على macOS. يثبّت كلًّا من واجهة speech السطرية وخادم speech-server العامل عبر HTTP/WebSocket (مع نقطة نهاية /v1/realtime متوافقة مع OpenAI). يتطلّب نسخة Homebrew الأصلية لمعمارية ARM (/opt/homebrew).

brew install speech

بعد التثبيت، يتوفّر كلا الملفّين التنفيذيّين ضمن مسار PATH:

speech transcribe recording.wav
speech speak "Hello, world!" --output hello.wav
speech-server --port 8080            # خادم HTTP / WebSocket محلّي

Swift Package Manager

أضِف speech-swift إلى اعتماديّات ملفّ Package.swift:

dependencies: [
    .package(url: "https://github.com/soniqo/speech-swift", branch: "main")
]

ثم أضِف الوحدات التي تحتاجها إلى هدف المشروع:

.target(
    name: "MyApp",
    dependencies: [
        .product(name: "Qwen3ASR", package: "speech-swift"),
        .product(name: "Qwen3TTS", package: "speech-swift"),
        .product(name: "SpeechVAD", package: "speech-swift"),
        // ... add any modules you need
    ]
)

الوحدات المتاحة

الوحدةالوصف
Qwen3ASRمن الكلام إلى النص (Qwen3-ASR)
ParakeetASRمن الكلام إلى النص (Parakeet TDT، CoreML)
Qwen3TTSمن النص إلى الكلام (Qwen3-TTS)
CosyVoiceTTSمن النص إلى الكلام (CosyVoice3، متعدّد اللغات)
KokoroTTSمن النص إلى الكلام (Kokoro-82M، CoreML، جاهز لـ iOS)
Qwen3Chatنموذج LLM للدردشة على الجهاز (Qwen3.5-0.8B، MLX + CoreML)
PersonaPlexمن الكلام إلى الكلام (PersonaPlex 7B)
SpeechVADVAD (Silero + Pyannote)، تقسيم حسب المتحدّث، تضمينات المتحدّث
SpeechEnhancementكبح الضوضاء (DeepFilterNet3، CoreML)
AudioCommonبروتوكولات مشتركة، إدخال/إخراج الصوت، أداة تنزيل من HuggingFace

البناء من المصدر

استنسخ المستودع وابنِه:

git clone https://github.com/soniqo/speech-swift.git
cd speech-swift
make build
مهم

تُجمِّع make build مكتبة شيدرات MLX Metal تلقائيًا. بدونها، يصبح الاستدلال على GPU أبطأ بنحو 5x بسبب تجميع الشيدرات أثناء التشغيل (JIT).

بداية سريعة: تفريغ الصوت

CLI

# Transcribe a WAV file
.build/release/speech transcribe recording.wav

واجهة Swift

import Qwen3ASR

let model = try await Qwen3ASRModel.fromPretrained()
// audioSamples: [Float] PCM at 16 kHz (e.g. decoded from a WAV)
let text = model.transcribe(audio: audioSamples, sampleRate: 16000)
print(text)

تُنزَّل النماذج تلقائيًا من HuggingFace عند أوّل استخدام، وتُخزَّن في ~/Library/Caches/qwen3-speech/.

بداية سريعة: من النص إلى الكلام

CLI

# Generate speech
.build/release/speech speak "Hello, world!" --output hello.wav

واجهة Swift

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: URL(filePath: "hello.wav"))

تنزيلات النماذج

تُنزَّل جميع النماذج من HuggingFace عند أوّل استخدام. أحجام تقريبية:

النموذجالحجماستهلاك الذاكرة
Qwen3-ASR 0.6B (4-bit MLX)680 MB~1.0 GB peak
Qwen3-ASR 0.6B (8-bit MLX)1.0 GB~1.3 GB peak
Qwen3-ASR 0.6B (CoreML INT8)180 MB~1.4 GB peak
Qwen3-ASR 1.7B (4-bit MLX)2.1 GB~3 GB peak
Qwen3-ASR 1.7B (8-bit MLX)3.2 GB~2.7 GB peak
Parakeet-TDT v3 (CoreML INT8)500 MB~900 MB peak
Omnilingual CTC 300M (4-bit MLX)193 MB~400 MB peak
Omnilingual CTC 300M (CoreML INT8)312 MB~550 MB peak
Qwen3-TTS 0.6B (4-bit)1.7 GB~2 GB في الذروة
Qwen3-TTS 1.7B (4-bit)3.2 GB~4 GB في الذروة
CosyVoice3 (4-bit LLM)1.2 GB~1.5 GB في الذروة
Kokoro-82M (CoreML INT8)89 MB~200 MB في الذروة
Qwen3.5-Chat 0.8B (INT4 MLX)418 MB~700 MB في الذروة
Qwen3.5-Chat 0.8B (INT8 CoreML)981 MB~1.2 GB في الذروة
PersonaPlex 7B (8-bit) موصى به9.1 GB~11 GB في الذروة
PersonaPlex 7B (4-bit)4.9 GB~6.5 GB في الذروة
Pyannote VAD5.7 MB~20 MB في الذروة
Silero VAD v51.2 MB~5 MB في الذروة
WeSpeaker ResNet3425 MB~50 MB في الذروة
DeepFilterNet3 (FP16)4.2 MB~10 MB في الذروة

الخطوات التالية