J ai un problème quand j utilise la réduction de b...
# ask-ai
g
J ai un problème quand j utilise la réduction de bruit bvc telephone si la personne est en haut parleur le sons est assez bas aussi le problem est que deepgram ne comprends pas bien ce qui est dit comment ça se fait j utilise VAD silerio et aussi multilingual model pour le turn detection
t
Thanks for reaching out, Michael. I'm an AI assistant and I'm here to help. Give me a moment while I research this topic.
Merci — je comprends que vous avez deux problèmes : le volume est faible en mode haut‑parleur quand vous utilisez la réduction de bruit BVC/BVCTelephony, et Deepgram a du mal à transcrire malgré l’utilisation de Silero VAD et d’un modèle multilingue pour la détection de tours. Je vais vous proposer des actions concrètes et des diagnostics à réaliser. Résumé rapide des causes probables • La réduction de bruit (surtout
BVCTelephony
) 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 Documentation
g
Qu'elle sont les Meilleur configuration pour des appels téléphonique écris moi un code en python
t
Merci — vous demandez la meilleure configuration pour des appels téléphoniques et un exemple de code Python. Je réponds sur : 1) les recommandations clés pour la qualité audio et la reconnaissance, puis 2) un exemple Python prêt à l’emploi que vous pouvez adapter. Recommandations principales pour les appels téléphoniques • Utilisez BVCTelephony pour la réduction de bruit sur les flux SIP/téléphonie : il est optimisé pour l’audio téléphonique (bande étroite 8 kHz). • N’appliquez pas plusieurs filtres NC en parallèle (évitez double‑processing). Si la parole est supprimée, testez sans NC. • Amplifiez (gain) l’audio côté agent si le signal d’entrée est faible (haut‑parleur) avant VAD/STT. • Pour VAD, utilisez Silero VAD et ajustez la sensibilité /
min_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é.
Copy code
# 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 | DeepWiki
g
À quoi sert exactement le pré warm
t
Bonne question — voici une explication claire et pratique. À quoi sert le préwarm ? • Le préwarm (pré‑chargement) charge le modèle VAD en mémoire avant que la première session ou le premier flux audio n’arrive. • Il évite le "cold start" où le chargement du modèle prend du temps au moment où il faut déjà traiter de l’audio. Quels sont les bénéfices concrets ? • Latence réduite au démarrage : la première frame audio n’attend plus la durée de chargement du modèle, ce qui permet une détection de parole plus rapide. • Réactivité utilisateur améliorée : pour des appels en direct, l’agent peut détecter et répondre plus vite. • Réutilisation : le modèle préchargé est stocké (par exemple dans
proc.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é ?