Présentation
RealtimeVAD est une bibliothèque Python qui accélère la détection de la fin de parole (VAD) en combinant le modèle Silero VAD avec un contrôle de niveau audio toutes les 10 ms. Sur un jeu de 3 279 tours réels d’assistant vocal, le signal speech‑off apparaît en médiane 100 ms avant la chute de probabilité du modèle Silero et 206 ms avant le VADIterator de Silero. L’événement end précède Silero dans 82 % des tours, avec un gain médian de 70 ms.
Fonctionnement technique
Le flux d’entrée accepte du son mono à 16 kHz, découpé en blocs de taille arbitraire (float32, int16 ou int16 bytes). Silero fournit la décision de parole tandis qu’un second algorithme mesure le niveau RMS du canal audio et le compare au bruit ambiant ainsi qu’au niveau du locuteur. Dès que le niveau chute en dessous du seuil, un événement speech‑off est émis, bien avant que la probabilité du modèle Silero ne tombe sous son seuil. Tous les seuils (niveau RMS, marge, durée minimale) sont paramétrables via le fichier SPEC.md.
from RealtimeVAD import VAD
vad = VAD()
for chunk in microphone_chunks():
for event in vad.feed(chunk):
if event.kind == "start":
stream_to_asr(vad.audio())
elif event.kind == "pause":
speculate(vad.audio())
elif event.kind == "end":
finalize(event.segment.audio)
Le module fonctionne sur un seul thread CPU, ne nécessite que numpy et onnxruntime, et ne dépend pas de torch. La version alpha 0.0.5 inclut le modèle Silero intégré.
Performances et limites
Les mesures montrent un gain de 65 à 110 ms sur la fin de parole lorsqu’on utilise les mêmes seuils que Silero (silence réglé à 0,25 s). Dans le plugin LiveKit, le détecteur de tour démarre 95 à 180 ms plus tôt, ce qui se traduit par un engagement de tour 150 ms plus précoce que les paramètres par défaut de Silero. Cependant, le mécanisme de pause génère de nombreux faux positifs : chaque respiration ou courte pause entre mots déclenche un événement pause. L’auteur recommande de ne considérer que les événements end comme définitifs, ou d’ignorer les pauses si le coût d’un faux arrêt dépasse le gain de latence.
Une limitation notable apparaît avec les locuteurs très silencieux ou les lignes téléphoniques à bande étroite. Jusqu’à la version 0.0.4, le seuil de silence était fixe à ≈ ‑54 dBFS, ce qui coupait les mots doux de locuteurs autour de ‑32 dBFS. Depuis 0.0.5, le plancher s’ajuste à 20 dB sous le niveau du locuteur, éliminant la coupure des voix calmes. En revanche, sur des canaux très bruyants où le bruit de fond se situe moins de 20 dB sous la voix, le gain de latence disparaît : RealtimeVAD et Silero terminent simultanément.
Intégration et usage
Le flux de travail recommandé consiste à lancer le traitement dès le signal start, à préparer la transcription et l’appel LLM, puis à annuler ces opérations si un événement pause est suivi d’un nouveau start. L’API accepte un paramètre playback=True pour ignorer la voix du système lorsqu’il parle, évitant ainsi les échos. Le code source propose également une version compatible avec l’interface silero_vad.VADIterator, permettant une migration transparente des projets existants.