Merci — je vais vous proposer le meilleur plan VAD professionnel, clair et actionnable, avec un fallback robuste pour les cas incertains (répondeur / machine). Je réponds ici à votre demande : un plan VAD optimisé pour appels vers des professionnels, prêt à être implémenté côté serveur avec LiveKit + services STT/LLM.
Plan VAD professionnel (architecture en couches)
• Couche 1 — VAD audio en temps réel (baseline)
◦ Utiliser un VAD léger et fiable (ex. Silero VAD) pour détecter la présence de parole instantanée.
◦ Paramètres recommandés :
▪︎ Frame size : 20–30 ms
▪︎ Energie / seuils adaptatifs : calibrer automatiquement sur les 1ères 500 ms de l’appel
▪︎ Debounce (hystérésis) : 200–300 ms pour éviter toggles sur bruits courts
• Couche 2 — Endpointing sémantique via STT
◦ Envoyer flux audio à un STT de haute qualité avec endpointing (ou chunks de 2–4s pour faible latence).
◦ Utiliser les signaux d’endpointing et ponctuation du STT (fin de phrase, intonation) pour distinguer une courte pause d’une vraie fin d’intervention.
◦ Paramètres recommandés :
▪︎ Chunk size : 2–3 s pour streaming; flush si silence > 0.8s
▪︎ Confidence threshold STT : 0.85 pour considérer la transcription comme fiable
• Couche 3 — Classification LLM/ML pour AMD (voicemail vs humain)
◦ Si VAD + STT donnent un doute, envoyer un extrait court (3–6s) au modèle de classification audio/LLM spécialisé en AMD.
◦ Le modèle renvoie probabilité humain vs répondeur + raison (ex. tonalité plate, message standard “laisser message”).
◦ Seuils suggérés : probabilité_humain > 0.80 = humain ; < 0.40 = répondeur ; entre 0.40–0.80 = incertain (fallback).
Logique de décision (pipeline temps réel)
1. Call connected → activer VAD et démarrer STT streaming en parallèle.
2. Si VAD détecte parole dans les 2s :
◦ Passer l’audio au STT; si transcription cohérente (confidence >= 0.85) et réponse contextuelle => considérer humain.
1. Si VAD détecte silence prolongé (> SILENCE_THRESHOLD, ex. 5s) sans paroles :
◦ Classer comme probable répondeur.
1. Si détection contradictoire (parole très brève, phrase générique) → extraire 3–6s et appeler classification LLM.
◦ Si LLM dit humain → connecter / transférer à l’agent.
◦ Si LLM dit répondeur → laisser message ou raccrocher.
◦ Si LLM incertain → activer fallback progressif (voir ci‑dessous).
Fallback robuste pour cas incertains (prioritaire pour professionnels)
• Politique progressive “Verify-Human” (préserver l’expérience pro)
a. Prompt automatique court et neutre (TTS) : “Bonjour, c’est [Nom]. Êtes-vous disponible ?”
• Durée < 2s, voix naturelle, ton professionnel.
a. Window d’écoute : attendre jusqu’à 4s pour réponse active détectée par VAD+STT.
b. Si réponse vocale détectée et STT fiable → humain confirmé.
c. Si silence ou message générique → laisser message prédéfini ou raccrocher.
• Variante conservatrice (si vous ne voulez rater aucun humain) :
◦ Étendre la window à 6s et demander une confirmation explicite (“Dites ‘oui’ si vous êtes disponible”), puis classifier.
◦ Coût : allonge temps d’appel et charge, mais réduit faux positifs.
Limitation / Priorisation pour agents (votre contrainte 5–10 premiers)
• Maintenir compteur atomique de sessions agent connectées.
• Quand détection = humain et compteur < N (N = 5–10), connecter immédiatement.
• Si compteur >= N et détection humain :
◦ Option A (préférée pour pros) : Mettre en file avec message d’attente puis rappel prioritaire.
◦ Option B : Proposer callback automatique dès qu’un agent libre.
Monitoring et apprentissage continu
• Logger chaque décision AMD + extrait audio + résultat final (agent connecté / voicemail).
• Construire dataset pour réentraîner classifier LLM interne — cela améliore précision sur votre population cible (professionnels parlent différemment).
• Mesures clés : TPR humain, FPR répondeur, temps moyen de décision, latence pour connecter agent.
Paramètres finaux recommandés (valeurs initiales à tester)
• VAD frame : 25 ms
• VAD debounce : 250 ms
• SILENCE_THRESHOLD (initial) : 5 s
• STT chunk : 2–3 s, confidence_threshold : 0.85
• LLM prob_humain seuil : > 0.80 = humain ; < 0.40 = répondeur ; 0.40–0.80 = incertain
• Prompt verify-human : 1.5–2 s TTS + 4 s window (ou 6 s pour variante conservatrice)
Exemple de flux (pseudocode simple)
on_call_connect():
start_vad()
start_stt_stream()
start_timer()
on_vad_speech_detected():
reset_timer()
if stt_confidence_high() and stt_response_is_coherent():
classify_as_human()
else:
send_snippet_to_llm()
on_timer_exceed(SILENCE_THRESHOLD):
classify_as_voicemail()
on_llm_result(score):
if score > 0.8: classify_as_human()
elif score < 0.4: classify_as_voicemail()
else: run_verify_human_prompt()
Questions pour adapter au mieux (réponse rapide requise)
• Voulez‑vous privilégier vitesse (décision < 5s) ou minimiser les faux-détectés (préserver chance de joindre humain) ?
• Préférez‑vous la variante conservatrice (verification plus longue) ou réactive (prompt court + window 4s) ?
• Quels volumes (appels simultanés) visez‑vous ? (impacte choix d’architecture et coût LLM/STT)
Si vous me confirmez ces points (vitesse vs précision, variante, volume cible), je vous fournis :
• Un schéma d’architecture prêt à déployer (components LiveKit + STT + LLM + queue),
• Un exemple d’implémentation plus détaillé (pseudocode ou snippets pour worker Node/Python),
• Les recommandations de monitoring/KPIs à suivre pour itérer.
Souhaitez‑vous la version conservatrice ou réactive pour commencer ?
Sources:
Turns overview | LiveKit Documentation |
Turn Detection for Voice Agents: VAD, Endpointing, and Model-Based Detectio... |
How does end-of-utterance detection work in conversations? |
examples/voice_agents | livekit/livekit_composite | DeepWiki |
How to detect and handle silence during calls, with interactive elements