glamorous-telephone-35069
03/02/2026, 9:21 AMtall-airline-16756
03/02/2026, 9:21 AMtall-airline-16756
03/02/2026, 9:22 AMBVCTelephony) peut être trop agressive et supprimer de la parole faible (cas typique du haut‑parleur).
• Si le signal d’entrée est trop faible, Silero VAD risque de ne pas déclencher et Deepgram recevra peu ou pas d’utterances exploitables.
• Le modèle STT utilisé peut ne pas être optimisé pour la qualité des appels téléphoniques / haut‑parleur.
Étapes de diagnostic recommandées (faites-les une par une pour isoler la cause)
1. Désactivez temporairement la réduction de bruit (noise_cancellation.BVCTelephony) et testez en haut‑parleur.
◦ Si le volume perçu et la transcription s’améliorent, la réduction de bruit est trop agressive.
1. Appliquez un gain audio côté agent avant l’analyse par VAD/STT (amplifier les frames audio entrantes).
◦ Test rapide : +6 à +12 dB puis vérifier si Silero VAD déclenche et si Deepgram transcrit mieux.
1. Testez sans Silero VAD : envoyez l’audio directement à Deepgram en streaming pour voir si la détection/finalisation est meilleure sans pré‑filtre VAD.
2. Changez de modèle Deepgram pour un modèle optimisé pour appels téléphoniques (ex. nova-2-phonecall) si vous utilisez un modèle général.
3. Ajustez les paramètres de VAD (sensibilité, min_speech_duration) pour détecter voix faibles ou distantes. Réduisez min_speech_duration ou augmentez sensibilité si possible.
4. Vérifiez la qualité du flux audio (métriques de session : latence, perte de paquets, niveau RMS) pour exclure un problème réseau ou d’échantillonnage.
Actions concrètes que je peux vous fournir maintenant
• Exemple de code pour amplifier les frames audio avant envoi à VAD/STT.
• Exemple de configuration pour remplacer BVCTelephony par BVC (moins agressif) et comment basculer la configuration.
• Paramètres suggérés pour Silero VAD à tester (valeurs de sensibilité et min_speech_duration).
• Commande / snippet pour utiliser nova-2-phonecall dans l’intégration Deepgram.
Pour aller plus loin, j’ai besoin de quelques informations rapides
• Utilisez‑vous BVCTelephony ou BVC exactement ? (vous avez mentionné BVCTelephony mais confirmez)
• Pouvez‑vous préciser : navigateur / mobile (iOS/Android) / appareil utilisé en haut‑parleur ?
• Utilisez‑vous le pipeline : client → Silero VAD → Deepgram, ou client → Deepgram → turn_detection multilingue ?
• Avez‑vous des logs VAD (indiquant si Silero déclenche) ou un exemple d’audio court que je puisse analyser (si possible) ?
Souhaitez‑vous que je commence par vous fournir l’exemple de code pour amplifier l’audio ? Je peux aussi fournir des snippets pour désactiver BVCTelephony et tester BVC, ou pour configurer nova-2-phonecall avec Deepgram.
Sources: Troubleshooting STT not picking up utterances | LiveKit | An open source stack for real-time multimodal AI | Speech-to-text (STT) models overview | LiveKit Documentation | Deepgram STT | LiveKit Documentation | STT Metrics | LiveKit Documentationglamorous-telephone-35069
03/02/2026, 9:23 AMtall-airline-16756
03/02/2026, 9:24 AMmin_speech_duration si la voix est faible ou distante.
• Pour STT, choisissez un modèle optimisé pour appels téléphoniques (Deepgram phonecall model) plutôt qu’un modèle général.
• Utilisez turn_detection="vad" pour endpointing rapide ; si vous voulez endpointing sémantique, testez turn_detection="stt" avec un modèle STT adapté.
• Testez chaque changement isolément : d’abord désactiver NC, puis appliquer gain, puis modifier VAD, puis changer de modèle STT.
Exemple Python (configuration téléphonie + amplification audio + VAD + Deepgram)
• Ce snippet montre : préchargement Silero VAD, choix BVCTelephony() pour SIP, application d’un gain simple sur les frames audio avant envoi au pipeline, et utilisation d’un modèle Deepgram optimisé.
# Exemple Python LiveKit — téléphonie optimisée (adaptable)
import os
import asyncio
from dotenv import load_dotenv
# Importez les modules LiveKit/Agents selon votre SDK installé
from livekit import rtc
from livekit.agents import AgentServer, AgentSession, JobContext
from livekit.plugins import silero
from livekit.plugins.noise_cancellation import BVCTelephony, BVC
load_dotenv()
# Paramètres de configuration modifiables
AUDIO_GAIN_DB = 9 # +9 dB de gain initial à tester (ajustez entre 6-12 dB)
USE_BVCTELEPHONY_FOR_SIP = True
DEEPGRAM_MODEL = "deepgram/nova-2-phonecall" # modèle optimisé pour appels téléphoniques
# Fonction utilitaire pour convertir dB en facteur linéaire
def db_to_linear(db):
return 10 ** (db / 20.0)
# Amplification simple d'un buffer PCM 16-bit signed (little-endian)
def amplify_pcm16(pcm_bytes: bytes, gain_db: float) -> bytes:
import struct
factor = db_to_linear(gain_db)
out = bytearray()
# chaque sample 16-bit
for i in range(0, len(pcm_bytes), 2):
sample = struct.unpack_from("<h", pcm_bytes, i)[0]
amplified = int(sample * factor)
# clip sur 16-bit
if amplified > 32767:
amplified = 32767
elif amplified < -32768:
amplified = -32768
out += struct.pack("<h", amplified)
return bytes(out)
# Précharge VAD pour réduire latence
def prewarm(proc):
proc.userdata["vad"] = silero.VAD.load()
server = AgentServer()
server.setup_fnc = prewarm
@server.rtc_session(agent_name="telephony-agent")
async def agent_entry(ctx: JobContext):
# Attendre le participant pour déterminer son type
participant = await ctx.wait_for_participant()
# Choix du noise cancellation selon le type participant (SIP vs WebRTC)
if participant.kind == rtc.ParticipantKind.PARTICIPANT_KIND_SIP and USE_BVCTELEPHONY_FOR_SIP:
noise_filter = BVCTelephony()
else:
noise_filter = BVC() # Optionnel pour WebRTC, ou None
# Récupérer le VAD préchargé
vad_model = ctx.proc.userdata.get("vad")
# Construire la session agent avec STT optimisé pour la téléphonie
session = AgentSession(
stt={
"provider": "deepgram",
"model": DEEPGRAM_MODEL,
# autres options STT : language, diarization, streaming config...
},
vad=vad_model,
turn_detection="vad",
)
# Démarrer la session en fournissant les options audio (noise_cancellation)
await session.start(
room=ctx.room,
agent=None, # remplacez par votre instance agent si nécessaire
room_options={
"audio_input": {
"noise_cancellation": noise_filter
},
},
)
# Exemple d'écoute d'un flux audio entrant et amplification avant traitement VAD/STT
# NOTE: l'API exacte pour intercepter frames audio dépend de votre SDK LiveKit spécifique.
async for audio_frame in session.receive_audio_frames(): # pseudo-API illustrative
# audio_frame.data doit être PCM16 bytes (adapter si format différent)
amplified = amplify_pcm16(audio_frame.data, AUDIO_GAIN_DB)
audio_frame.data = amplified
# envoyez la frame amplifiée à la pipeline de VAD/STT (pseudo-API)
await session.process_audio_frame(audio_frame)
# Fermer proprement
await session.stop()
if __name__ == "__main__":
# Lance le serveur agent (CLI utilitaire fourni par le SDK)
server.run()
Notes pratiques et étapes de test
• Testez d’abord sans BVCTelephony : si la reconnaissance s’améliore, la réduction de bruit est trop agressive.
• Commencez avec AUDIO_GAIN_DB = 6–9 dB ; surveillez la saturation/clipping. Ajustez si nécessaire.
• Si Silero VAD ne déclenche pas malgré amplification, réduisez min_speech_duration ou augmentez sensibilité dans la config VAD.
• Essayez turn_detection="stt" si vous préférez endpointing basé sur le STT (utile pour silences courts mais dialogues complexes).
• Vérifiez les métriques de session (niveau RMS, perte de paquets, latence) pour exclure des problèmes réseau/codec.
Souhaitez‑vous que je :
• vous fournisse un snippet adapté à votre SDK LiveKit exact (version/nom de package) ?
• génère un exemple complet pour l’envoi direct vers Deepgram en streaming (sans VAD) pour comparaison ?
Dites‑moi votre priorité et j’adapte le code au besoin.
Sources: Choosing the right noise cancellation for your agent | LiveKit | Agent session | LiveKit Documentation | Using Noise Cancellation for SIP and WebRTC Participants | Troubleshooting STT not picking up utterances | LiveKit | examples/frontdesk | livekit/livekit_composite | DeepWikiglamorous-telephone-35069
03/02/2026, 9:26 AMtall-airline-16756
03/02/2026, 9:26 AMproc.userdata["vad"]) et réutilisé pour toutes les sessions gérées par ce processus, économisant CPU et I/O.
• Stabilité : évite des pics ponctuels de charge CPU/mémoire au moment critique où une session commence.
Quand l’utiliser ?
• Toujours pour des pipelines temps réel (appels, streaming) où la latence initiale compte.
• Moins utile pour des traitements batch où un délai de démarrage est acceptable.
Exemple pratique (rappel)
• Dans le code fourni, prewarm(proc) appelle silero.VAD.load() et place l’objet VAD dans proc.userdata. Ensuite, chaque session récupère ctx.proc.userdata["vad"] pour utiliser le VAD déjà chargé.
Si vous voulez, je peux :
• montrer comment mesurer la latence avant/après préwarm, ou
• adapter le préwarm pour précharger plusieurs modèles (VAD + modèles STT) si vous en avez besoin. Quel est votre cas préféré ?