البنية — Android
speech-android هو SDK خفيف بلغة Kotlin مع جسر JNI فوق محرّك C++ speech-core. يقيم كامل الاستدلال التعلّمي وتنسيق خط الأنابيب داخل speech-core؛ ولا يتولّى speech-android سوى التغليف لمنصّة Android. أمّا Linux/قطاع السيارات (Yocto، Qualcomm SA8295P/SA8255P مع QNN) فيُستضاف مباشرةً في speech-core/examples/linux.
الحزمة التقنية
تنفِّذ مغلِّفات النماذج (Silero VAD، Parakeet STT، Kokoro TTS، DeepFilterNet3) واجهات speech-core مباشرةً (VADInterface، STTInterface، TTSInterface، EnhancerInterface)، فيتولّى جسر JNI إنشاءها وتسليم المراجع إلى speech_core::VoicePipeline دون أيّ مهايئ vtable بلغة C.
┌──────────────────────────────────────────────┐
│ SpeechPipeline (واجهة Kotlin العامّة) │
│ ↓ JNI │
│ jni_bridge.cpp (~250 سطر) │
└──────────────────┬───────────────────────────┘
│
┌──────────────────┴───────────────────────────┐
│ speech_core_models (وحدة git فرعية) │
│ Silero / Parakeet / Kokoro / DeepFilter │
│ speech_core │
│ كشف الأدوار · المقاطعات · سياق المحادثة │
└──┬────────┬────────┬────────┬────────────────┘
│ │ │ │ تنفيذ مباشر للواجهات
┌──┴──┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────────┐
│ VAD │ │ STT │ │ TTS │ │ Enhancer │
└──┬──┘ └──┬──┘ └──┬──┘ └─┬────────┘
└────────┴────────┴────────┘
ONNX Runtime (CPU / NNAPI)خط الأنابيب
يشغّل خط أنابيب الكلام ثلاث مراحل بالتتابع: VAD → STT → TTS. يُطلِق كشف النشاط الصوتي التسجيل، ثم يتولّى STT تفريغ الصوت إلى نص، ويولّد TTS الردّ. ويتيح دعم المقاطعة (barge-in) إيقاف تشغيل TTS عندما يبدأ المستخدم الكلام في منتصف الردّ.
يدير speech-core كشف الأدوار، ومعالجة المقاطعات، وسياق المحادثة. تنفِّذ مغلِّفات النماذج واجهات speech-core مباشرةً — دون طبقة مهايئ vtable بلغة C — ممّا يجعل من اليسير بالقدر نفسه توصيل محرّكات خلفية غير ONNX (مثل تطبيقات CoreML / MLX في speech-swift) ما دامت تطابق الواجهات ذاتها.
النماذج
تستخدم جميع النماذج صيغة ONNX مع تكميم INT8 بشكل افتراضي. تُستضاف النماذج على HuggingFace ضمن منظّمة aufklarer وتُنزَّل تلقائيًا عند أوّل استخدام عبر ModelManager.kt.
| النموذج | المهمّة | التكميم | الحجم |
|---|---|---|---|
| Parakeet TDT v3 | STT (114 لغة، مفردات BPE بحجم 8192) | INT8 | ~500 MB |
| Kokoro-82M | TTS | INT8 | ~89 MB |
| Silero VAD v5 | كشف النشاط الصوتي | float32 | ~1.2 MB |
| DeepFilterNet3 | إلغاء الضوضاء | FP16 | ~4.2 MB |
حجم تنزيل النماذج الإجمالي نحو 1.2 GB. بعد التنزيل الأوّل، يجري كل الاستدلال دون اتصال بالإنترنت.
الاستدلال: OnnxEngine
يوفّر مغلِّف onnx_engine.h اختيار موفّر التنفيذ (EP) الواعي للمنصّة. يستكشف الموفّرات المتاحة في وقت التشغيل ويرجع تلقائيًا إلى البدائل بسلاسة:
| المنصّة | الشريحة | التسريع |
|---|---|---|
| Android | Snapdragon 8 Gen 1+ | NNAPI → Hexagon NPU |
| Android | Samsung Exynos 2200+ | NNAPI → Samsung NPU |
| Android | Google Tensor G2+ | NNAPI → Google TPU |
| أيّ جهاز Android | الرجوع إلى CPU | XNNPACK |
لمنصّات Qualcomm SA8295P / SA8255P في قطاع السيارات مع QNN (Hexagon DSP)، راجع speech-core/examples/linux.
ملفّات C++ الأساسية
| الملف | الغرض |
|---|---|
jni_bridge.cpp | يبني مغلِّفات نماذج speech_core::* ويسلّم المراجع إلى VoicePipeline |
parakeet_stt.cpp | STT مع مفكِّك جشِع TDT وتطبيع mel لكل ميزة |
kokoro_tts.cpp | TTS بنموذج E2E وقناع انتباه |
kokoro_phonemizer.cpp | مولِّد فونيمات قائم على القاموس لإدخال TTS |
silero_vad.cpp | كشف النشاط الصوتي |
deepfilter.cpp | إلغاء الضوضاء بمعالجة STFT/ERB |
onnx_engine.h | مغلِّف ONNX Runtime واعٍ للمنصّة (NNAPI على Android، QNN على Linux، الرجوع إلى CPU) |
انتقلت مغلِّفات النماذج وonnx_engine.h إلى speech-core في إعادة هيكلة استخراج النماذج؛ راجع docs/models.md للحصول على القائمة الكاملة.
هيكل الكود المصدري
speech-android/
speech-core/ محرّك C++ + مغلِّفات نماذج ONNX (وحدة git فرعية)
sdk/src/main/
cpp/jni_bridge.cpp جسر JNI خفيف فوق speech_core::VoicePipeline
cpp/CMakeLists.txt يضمّن speech-core عبر add_subdirectory(SPEECH_CORE_WITH_ONNX=ON)
kotlin/.../speech/ SDK Kotlin العامّ (SpeechPipeline، ModelManager)
sdk/src/androidTest/ اختبارات e2e بأجهزة فعلية
app/ تطبيق تجريبي
Linux / قطاع السيارات (واجهة C ABI، عرض ALSA، أدوات CLI) تقيم في:
speech-core/examples/linux/الكود المصدري: github.com/soniqo/speech-android