كشف نشاط الصوت — Silero VAD v5

يتوفّر نموذجان للكشف عن نشاط الصوت: Pyannote segmentation للمعالجة دون اتصال على دفعات بدقّة عالية، وSilero VAD v5 للكشف بالبثّ بزمن انتقال منخفض. كلاهما يعمل بالكامل على الجهاز.

Pyannote (دون اتصال)

يوفّر Pyannote segmentation-3.0 كشفًا لنشاط الصوت بدقّة عالية باستخدام بنية PyanNet. يعالج الكلام في نوافذ منزلقة مدّتها 10 ثوانٍ بخطوة ثانية واحدة، ثم يجمع التنبؤات المتداخلة ويطبّق تنعيمًا بالتخلّف (hysteresis).

البنية

المرحلةالتفاصيل
SincNet40 مرشّح تمرير نطاق مكتسَب (80 إجمالًا: 40 cos + 40 sin)
BiLSTM4 طبقات، hidden=128، ثنائي الاتجاه (خرج 256 بُعدًا)
Linearطبقتان خطّيّتان مع LeakyReLU (negative_slope=0.01)
الخرجSoftmax من 7 فئات مع معالجة لاحقة بالتخلّف

حجم النموذج: نحو 1.49M معلمة، نحو 5.7 MB على القرص.

العتبات الافتراضية

الاستخدام من سطر الأوامر

# 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، ممّا يجعله مناسبًا لتطبيقات الصوت المباشر.

البنية

المرحلةالتفاصيل
STFTConv1d (من 1 إلى 258 قناة)، reflection pad على اليمين فقط بطول 64
Encoder4x Conv1d + ReLU
LSTMHidden size 128، الحالة تُنقَل بين المقاطع
DecoderConv1d (من 128 إلى 1) على الحالة المخفيّة لـ LSTM، خرج sigmoid

حجم النموذج: نحو 309K معلمة، نحو 1.2 MB على القرص.

آلة الحالات في البثّ

يستخدم معالج VAD بالبثّ آلة من 4 حالات لإنتاج مقاطع كلام نظيفة:

  1. silence — لا يوجد كلام مكتشَف
  2. pendingSpeech — تمّ تجاوز عتبة onset، بانتظار الحدّ الأدنى لمدّة الكلام
  3. speech — مقطع كلام مؤكّد قيد التنفيذ
  4. pendingSilence — تمّ تجاوز عتبة offset، بانتظار الحدّ الأدنى لمدّة الصمت

العتبات الافتراضية

الاستخدام من سطر الأوامر

# 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-v5MLX~1.2 MBaufklarer/Silero-VAD-v5-MLX
Silero-VAD-v5CoreML~1.2 MBaufklarer/Silero-VAD-v5-CoreML
Pyannote-Segmentation-3.0MLX~5.7 MBaufklarer/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.