كشف نشاط الصوت — 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— الاحتمال الذي ينتهي تحته الكلام
الاستخدام من سطر الأوامر
# Offline VAD
.build/release/speech vad recording.wav
# JSON output
.build/release/speech vad recording.wav --json
# Custom thresholds
.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
الاستخدام من سطر الأوامر
# Streaming VAD
.build/release/speech vad-stream recording.wav
# Custom thresholds
.build/release/speech vad-stream recording.wav --onset 0.6 --offset 0.3
# Minimum durations
.build/release/speech vad-stream recording.wav --min-speech 0.5 --min-silence 0.2
# Choose engine
.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
// Offline VAD (Pyannote)
let pyannote = try await PyannoteVADModel.fromPretrained()
let segments = pyannote.detectSpeech(audio: samples, sampleRate: 16000)
for segment in segments {
print("\(segment.startTime)s - \(segment.endTime)s")
}
// Streaming VAD (Silero)
let silero = try await SileroVADModel.fromPretrained()
let processor = StreamingVADProcessor(model: silero, config: .sileroDefault)
for event in processor.process(samples: audioBuffer) {
switch event {
case .speechStarted(let time):
print("Speech started at \(time)s")
case .speechEnded(let segment):
print("Speech: \(segment.startTime)s - \(segment.endTime)s")
}
}
متاح أيضًا على Android وLinux وWindows عبر ONNX Runtime.