Détection d'activité vocale — Silero VAD
Deux modèles VAD sont disponibles : Pyannote segmentation pour le traitement par batch hors ligne avec une haute précision, et Silero VAD pour une détection streaming à faible latence. Les deux s'exécutent entièrement sur l'appareil.
Pyannote (hors ligne)
Pyannote segmentation-3.0 fournit une VAD haute précision via une architecture PyanNet. Il traite l'audio dans des fenêtres glissantes de 10 secondes avec un pas de 1 seconde, puis agrège les prédictions chevauchantes et applique un lissage par hystérésis.
Architecture
| Étape | Détails |
|---|---|
| SincNet | 40 filtres passe-bande appris (80 au total : 40 cos + 40 sin) |
| BiLSTM | 4 couches, hidden=128, bidirectionnel (sortie 256 dim) |
| Linéaire | 2 couches linéaires avec LeakyReLU (negative_slope=0.01) |
| Sortie | Softmax à 7 classes avec post-traitement par hystérésis |
Taille du modèle : ~1,49M paramètres, ~5,7 Mo sur disque.
Seuils par défaut
- Onset :
0.767— probabilité au-dessus de laquelle la parole est détectée - Offset :
0.377— probabilité en dessous de laquelle la parole se termine
Utilisation en CLI
# 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 (streaming)
Silero VAD est un modèle streaming léger qui traite des chunks de 512 échantillons (32 ms à 16 kHz). Il s'exécute à 23× le temps réel en mode release, ce qui le rend adapté aux applications audio en direct.
Répartition des backends : MLX et CoreML utilisent désormais tous deux les exports Silero v6.2.1 par défaut : aufklarer/Silero-VAD-v6.2.1-MLX et aufklarer/Silero-VAD-v6.2.1-CoreML. Les deux conservent la même API de streaming à 32 ms.
Architecture
| Étape | Détails |
|---|---|
| STFT | Conv1d (1 vers 258 canaux), padding de réflexion à droite seulement de 64 |
| Encodeur | 4× Conv1d + ReLU |
| LSTM | Taille cachée 128, état porté entre chunks |
| Décodeur | Conv1d (128 vers 1) sur l'état caché LSTM, sortie sigmoïde |
Taille du modèle : ~309K paramètres, ~1,2 Mo sur disque.
Machine à états streaming
Le processeur VAD streaming utilise une machine à 4 états pour produire des segments de parole propres :
- silence — aucune parole détectée
- pendingSpeech — seuil onset franchi, en attente de la durée minimum de parole
- speech — segment de parole confirmé en cours
- pendingSilence — seuil offset franchi, en attente de la durée minimum de silence
Seuils par défaut
- Onset :
0.5 - Offset :
0.35 - Durée minimum de parole :
0.25s - Durée minimum de silence :
0.1s
Utilisation en CLI
# 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
Options
| Option | S'applique à | Description |
|---|---|---|
--onset | Les deux | Seuil de probabilité d'onset de la parole |
--offset | Les deux | Seuil de probabilité d'offset de la parole |
--min-speech | Streaming | Durée minimum de segment de parole (secondes) |
--min-silence | Streaming | Durée minimum de silence pour terminer un segment (secondes) |
--engine | Streaming | Moteur d'inférence : mlx ou coreml |
--json | Les deux | Format de sortie JSON |
Pour les applications temps réel, utilisez speech vad-stream avec Silero VAD. Le modèle Pyannote requiert le fichier audio complet et convient mieux au traitement par batch hors ligne où la précision est la priorité.
Un VAD n'entend que le silence : il ne distingue pas une phrase terminée d'une pause en milieu de phrase. Attachez Smart Turn v3.2 à StreamingVADProcessor — ou lancez speech vad-stream --smart-turn — pour confirmer chaque pause avant la fin du segment : une phrase terminée clôt le tour immédiatement, une pause en milieu de phrase continue d'écouter.
Téléchargements des modèles
| Modèle | Backend | Taille | HuggingFace |
|---|---|---|---|
| Silero-VAD-v6.2.1 | MLX | ~1,2 Mo | aufklarer/Silero-VAD-v6.2.1-MLX |
| Silero-VAD-v6.2.1 | CoreML | ~1,2 Mo | aufklarer/Silero-VAD-v6.2.1-CoreML |
| Pyannote-Segmentation-3.0 | MLX | ~5,7 Mo | aufklarer/Pyannote-Segmentation-MLX |
API 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")
}
}
Également disponible sur Android, et sur Linux et Windows via Speech Core (ONNX Runtime).