كشف نشاط الصوت — Silero VAD v5
يتوفّر نموذجان للكشف عن نشاط الصوت: Pyannote segmentation للمعالجة دون اتصال على دفعات بدقّة عالية، وSilero VAD v5 للكشف بالبثّ بزمن انتقال منخفض. كلاهما يعمل بالكامل على الجهاز.
Pyannote (دون اتصال)
يوفّر Pyannote segmentation-3.0 كشفًا لنشاط الصوت بدقّة عالية باستخدام بنية PyanNet. يعالج الكلام في نوافذ منزلقة مدّتها 10 ثوانٍ بخطوة ثانية واحدة، ثم يجمع التنبؤات المتداخلة ويطبّق تنعيمًا بالتخلّف (hysteresis).
البنية
| المرحلة | التفاصيل |
|---|---|
| SincNet | 40 مرشّح تمرير نطاق مكتسَب (80 إجمالًا: 40 cos + 40 sin) |
| BiLSTM | 4 طبقات، hidden=128، ثنائي الاتجاه (خرج 256 بُعدًا) |
| Linear | طبقتان خطّيّتان مع LeakyReLU (negative_slope=0.01) |
| الخرج | Softmax من 7 فئات مع معالجة لاحقة بالتخلّف |
حجم النموذج: نحو 1.49M معلمة، نحو 5.7 MB على القرص.
العتبات الافتراضية
- Onset:
0.767— الاحتمال الذي يُكتشَف فوقه الكلام - Offset:
0.377— الاحتمال الذي ينتهي تحته الكلام
الاستخدام من سطر الأوامر
# VAD دون اتصال
.build/release/speech vad recording.wav
# خرج JSON
.build/release/speech vad recording.wav --json
# عتبات مخصّصة
.build/release/speech vad recording.wav --onset 0.6 --offset 0.3
Silero VAD v5 (بثّ)
Silero VAD v5 نموذج خفيف بالبثّ يعالج مقاطع من 512 عيّنة (32 ms عند 16 kHz). يعمل بسرعة 23 ضعف الزمن الحقيقي في وضع release، ممّا يجعله مناسبًا لتطبيقات الصوت المباشر.
البنية
| المرحلة | التفاصيل |
|---|---|
| STFT | Conv1d (من 1 إلى 258 قناة)، reflection pad على اليمين فقط بطول 64 |
| Encoder | 4x Conv1d + ReLU |
| LSTM | Hidden size 128، الحالة تُنقَل بين المقاطع |
| Decoder | Conv1d (من 128 إلى 1) على الحالة المخفيّة لـ LSTM، خرج sigmoid |
حجم النموذج: نحو 309K معلمة، نحو 1.2 MB على القرص.
آلة الحالات في البثّ
يستخدم معالج VAD بالبثّ آلة من 4 حالات لإنتاج مقاطع كلام نظيفة:
- silence — لا يوجد كلام مكتشَف
- pendingSpeech — تمّ تجاوز عتبة onset، بانتظار الحدّ الأدنى لمدّة الكلام
- speech — مقطع كلام مؤكّد قيد التنفيذ
- pendingSilence — تمّ تجاوز عتبة offset، بانتظار الحدّ الأدنى لمدّة الصمت
العتبات الافتراضية
- Onset:
0.5 - Offset:
0.35 - الحدّ الأدنى لمدّة الكلام:
0.25s - الحدّ الأدنى لمدّة الصمت:
0.1s
الاستخدام من سطر الأوامر
# VAD بالبثّ
.build/release/speech vad-stream recording.wav
# عتبات مخصّصة
.build/release/speech vad-stream recording.wav --onset 0.6 --offset 0.3
# الحدود الدنيا للمدد
.build/release/speech vad-stream recording.wav --min-speech 0.5 --min-silence 0.2
# اختيار المحرّك
.build/release/speech vad-stream recording.wav --engine coreml
الخيارات
| الخيار | يُطبَّق على | الوصف |
|---|---|---|
--onset | كلاهما | عتبة احتمال بداية الكلام |
--offset | كلاهما | عتبة احتمال نهاية الكلام |
--min-speech | البثّ | الحدّ الأدنى لمدّة مقطع الكلام (بالثواني) |
--min-silence | البثّ | الحدّ الأدنى لمدّة الصمت لإنهاء المقطع (بالثواني) |
--engine | البثّ | محرّك الاستدلال: mlx أو coreml |
--json | كلاهما | تنسيق خرج JSON |
للتطبيقات في الوقت الحقيقي، استخدم speech vad-stream مع Silero VAD. نموذج Pyannote يتطلّب ملفّ الصوت الكامل وهو أنسب للمعالجة دون اتصال على دفعات حيث تكون الدقّة هي الأولوية.
تنزيلات النماذج
| النموذج | المحرّك | الحجم | HuggingFace |
|---|---|---|---|
| Silero-VAD-v5 | MLX | ~1.2 MB | aufklarer/Silero-VAD-v5-MLX |
| Silero-VAD-v5 | CoreML | ~1.2 MB | aufklarer/Silero-VAD-v5-CoreML |
| Pyannote-Segmentation-3.0 | MLX | ~5.7 MB | aufklarer/Pyannote-Segmentation-MLX |
واجهة Swift
import SpeechVAD
// VAD دون اتصال (Pyannote)
let pyannote = try await PyannoteVAD.loadFromHub()
let segments = try await pyannote.detectSpeech(audioFile: "recording.wav")
for segment in segments {
print("\(segment.start)s - \(segment.end)s")
}
// VAD بالبثّ (Silero)
let silero = try await SileroVAD.loadFromHub()
let processor = StreamingVADProcessor(model: silero, config: .sileroDefault)
for chunk in audioChunks {
if let segment = try processor.process(chunk: chunk) {
print("Speech: \(segment.start)s - \(segment.end)s")
}
}
متاح أيضًا على Android وLinux عبر ONNX Runtime.