How-To Guides

Créer un chatbot IA vocal : Intégration de Whisper et TTS avec LangChain

Les interfaces basées sur le texte dominent le paysage actuel des applications IA, mais l'avenir de l'interaction homme-machine réside dans des conversations vocales naturelles et fluides. En combinant Whisper d'OpenAI pour une transcription robuste (STT), LangChain pour l'orchestration de la logique des grands modèles de langage (LLM) et un moteur de Synthèse vocale (TTS), nous pouvons créer des chatbots qui semblent véritablement vivants. Ce guide vous accompagne à travers l'architecture et la mise en œuvre d'un tel système, en mettant l'accent sur l'optimisation de la latence et l'intégration fiable.

Comprendre l'architecture

Avant de plonger dans le code, il est crucial de comprendre le flux de données. Un bot vocal suit généralement un pipeline en quatre étapes :

  1. Capture audio : Enregistrement de l'entrée utilisateur depuis un microphone ou un fichier audio.
  2. Transcription : Conversion des octets audio bruts en texte à l'aide de Whisper.
  3. Raisonnement : Traitement du texte via LangChain pour générer une réponse consciente du contexte.
  4. Synthèse : Conversion du texte généré à nouveau en audio à l'aide d'un service TTS.

Le défi ici est la latence. Les utilisateurs s'attendent à des réponses en temps réel. Par conséquent, les capacités de streaming dans Whisper et chez le fournisseur de LLM sont essentielles. De plus, la gestion des erreurs pour les entrées silencieuses ou les audio non vocaux doit être robuste pour éviter les boucles infinies.

Configuration de l'environnement

Assurez-vous d'avoir Python 3.9+ installé. Installez les bibliothèques nécessaires via pip :


pip install openai-whisper langchain langchain-openai gtts soundfile

Note : Bien que gtts (Google Text-to-Speech) soit utilisé ici pour sa simplicité et son usage gratuit, les applications de production pourraient préférer OpenAI TTS ou Azure Speech Services pour une fidélité supérieure.

Mise en œuvre : Le pipeline central

Ci-dessous se trouve un exemple condensé démontrant l'intégration. Dans un environnement de production, vous envelopperiez ces étapes dans un framework asynchrone comme FastAPI pour gérer plusieurs utilisateurs simultanément.


import whisper
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
import gtts
import io

# Charger le modèle Whisper une seule fois pour l'efficacité
model = whisper.load_model("base")

# Initialiser le LLM LangChain
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

def transcribe_audio(audio_file_path: str) -> str:
    """
    Utilise Whisper pour convertir un fichier audio en texte.
    """
    result = model.transcribe(audio_file_path)
    return result['text'].strip()

def generate_response(user_input: str, chat_history: list) -> str:
    """
    Envoie le texte transcrit et l'historique au LLM.
    """
    system_prompt = "Vous êtes un assistant vocal utile. Gardez vos réponses concises et conversationnelles."
    
    messages = [
        SystemMessage(content=system_prompt),
        *chat_history,
        HumanMessage(content=user_input)
    ]
    
    response = llm.invoke(messages)
    return response.content

def synthesize_speech(text: str, output_file_path: str) -> None:
    """
    Convertit le texte en MP3 à l'aide de gTTS.
    """
    tts = gtts.TTS(text=text, lang='en')
    tts.save(output_file_path)

# Flux d'exécution principal
if __name__ == "__main__":
    # Simuler l'entrée audio (en réalité, cela provient d'un flux micro)
    audio_path = "user_input.wav"
    
    # 1. Transcrire
    print("Traitement de l'audio...")
    text_input = transcribe_audio(audio_path)
    print(f"L'utilisateur a dit : {text_input}")

    if not text_input:
        print("Aucune parole détectée.")
        exit()

    # 2. Générer la réponse
    print("Réflexion...")
    chat_history = [] # Dans une vraie app, cela serait persisté
    bot_response = generate_response(text_input, chat_history)
    print(f"Le bot dit : {bot_response}")

    # 3. Synthétiser
    print("Génération de l'audio...")
    output_path = "bot_response.mp3"
    synthesize_speech(bot_response, output_path)
    print(f"Audio enregistré dans {output_path}")

Optimisations pour la production

Pour rendre cela viable pour une interaction en temps réel, envisagez ces techniques avancées :

1. Streaming Whisper

Whisper standard traite l'ensemble du fichier audio. Pour les conversations en direct, vous avez besoin d'un traitement par morceaux. Des bibliothèques comme whisper-streaming ou l'utilisation de flux audio WebRTC vous permettent de transcrire l'audio pendant qu'il est prononcé, réduisant considérablement le temps jusqu'au premier jeton (TTFT).

2. Mise en cache et gestion du contexte

Les LLM sont coûteux. Implémentez une base de données vectorielle via LangChain pour récupérer le contexte pertinent uniquement lorsque nécessaire, plutôt que d'envoyer l'historique de chat entier à chaque fois. Utilisez Redis pour la mémoire de session à court terme afin de garder les derniers tours rapides.

3. Optimisation du format audio

Normalisez toujours votre audio d'entrée en 16 kHz mono avant de le passer à Whisper. Ce format standard minimise le temps de prétraitement et garantit une précision de transcription constante entre différents microphones.

Gestion des cas limites

Les interfaces vocales font face à des défis uniques par rapport au texte :

  • Bruit de fond : Whisper est robuste, mais les environnements extrêmement bruyants peuvent causer des hallucinations. Implémentez un détecteur d'activité vocale (VAD) comme Silero VAD pour filtrer les périodes silencieuses avant la transcription.
  • Gestion des interruptions : Si l'utilisateur parle pendant que le bot fait de la TTS, vous avez besoin d'un mécanisme de barge-in. Cela nécessite une surveillance audio en temps réel capable d'arrêter immédiatement la lecture TTS.
  • Correction d'erreurs : Si la confiance de la transcription est faible, le LLM devrait demander des clarifications plutôt que de deviner. Vous pouvez passer le score de confiance de Whisper au contexte du prompt.

Conclusion

L'intégration de Whisper, LangChain et TTS crée une base puissante pour les applications IA vocales. Bien que le pipeline de base soit simple, la distinction entre une démo et un système prêt pour la production réside dans la gestion de la latence, la gestion robuste des erreurs et l'optimisation du contexte. À mesure que les modèles vocaux continuent d'améliorer leur précision et leur vitesse, la barrière à l'entrée pour le développement d'interfaces vocales naturelles est plus basse que jamais. Commencez avec l'approche modulaire décrite ci-dessus, testez soigneusement avec divers échantillons audio et itérez sur vos métriques de latence. La prochaine génération d'assistants IA ne se contentera pas d'écouter — elle comprendra, répondra et semblera humaine.

Share: