Pourquoi les agents vocaux ?
Selectra recoit des milliers d'appels par jour. 200+ commerciaux passent les 2-3 premieres minutes de chaque appel a poser les memes questions : adresse, fournisseur actuel, numero PDL, consommation estimee. C'est repetitif, couteux, et les clients attendent parfois longtemps avant d'avoir quelqu'un.
L'agent vocal IA resout ca : il repond instantanement, 24/7, collecte les infos de qualification, et transfere au commercial humain avec un dossier pre-rempli. Le commercial gagne 2-3 minutes par appel et se concentre sur le conseil et la vente.
Le pipeline classique : STT → LLM → TTS
L'architecture la plus repandue aujourd'hui pour un agent vocal suit ce pipeline en cascade :
Pipeline vocal classique (cascade)
Client parle (audio)
|
┌─────────────────┐
│ STT │ Speech-to-Text
│ (Deepgram, │ Audio → Texte
│ Gladia, │ ~100-300ms
│ Whisper) │
└────────┬────────┘
|
┌────────▼────────┐
│ LLM │ Raisonnement
│ (Claude, GPT) │ Texte → Texte
│ │ ~200-1000ms
│ + Tool calling │
└────────┬────────┘
|
┌────────▼────────┐
│ TTS │ Text-to-Speech
│ (ElevenLabs, │ Texte → Audio
│ Voxtral, │ ~100-300ms
│ OpenAI TTS) │
└────────┬────────┘
|
Agent parle (audio)
LATENCE TOTALE : 400ms - 1.6s
(acceptable si < 1s, perceptible si > 1.5s)
import whisper # pip install openai-whisper
model = whisper.load_model("base") # small, medium, large pour + de precision
result = model.transcribe("appel_client.wav", language="fr")
print(result["text"])
# → "Bonjour, je demenage a Lyon et j'ai besoin d'ouvrir un contrat d'electricite"
# Avec timestamps par segment
for segment in result["segments"]:
print(f"[{segment['start']:.1f}s → {segment['end']:.1f}s] {segment['text']}")# Option 1 : TTS open-source avec Coqui (pip install TTS)
from TTS.api import TTS
tts = TTS(model_name="tts_models/fr/css10/vits")
tts.tts_to_file("Bonjour, bienvenue chez Selectra.", file_path="reponse.wav")
# Option 2 : API ElevenLabs (pip install elevenlabs)
from elevenlabs import generate, save
audio = generate(
text="Tres bien, quelle est l'adresse de votre nouveau logement ?",
voice="Rachel", # voix pre-faite ou clonee
model="eleven_multilingual_v2"
)
save(audio, "reponse.mp3")| Composant | Fournisseur | Latence | Forces |
|---|---|---|---|
| STT | Deepgram | ~100ms (streaming) | Ultra-rapide, streaming mot par mot |
| STT | Gladia (Solaria) | <103ms | Excellent francais, utilise par Selectra |
| STT | Whisper (OpenAI) | ~300-500ms | Tres precis, mais plus lent (pas de streaming) |
| STT | Mistral Voxtral Transcribe | <200ms | Francais natif, open weights |
| LLM | Claude Sonnet | ~300-500ms (streaming) | Excellent suivi d'instructions |
| LLM | GPT-4o mini | ~100-200ms | Tres rapide, bon pour le routage |
| TTS | ElevenLabs | ~200ms | Voix tres naturelles, francais excellent |
| TTS | Mistral Voxtral TTS | 90ms first audio | Open weights, voice cloning 3s |
| TTS | OpenAI TTS | ~200ms | Bon rapport qualite/prix |
La revolution : Speech-to-Speech (Kyutai / Moshi)
Et si on supprimait completement les etapes intermediaires ? C'est exactement ce qu'a fait Kyutai, un labo de recherche francais finance par Xavier Niel (Free) et Eric Schmidt.
Pipeline classique vs Speech-to-Speech
CLASSIQUE (cascade) SPEECH-TO-SPEECH (Moshi)
─────────────────── ──────────────────────────
Audio ──▶ STT ──▶ LLM ──▶ TTS Audio ──▶ ┌────────────┐ ──▶ Audio
100ms 500ms 200ms │ MOSHI │
───────────────────── │ (un seul │
Total: ~800ms+ │ modele) │
└────────────┘
Demi-duplex: Total: ~200ms
L'un parle, l'autre
ecoute. Pas les deux. Full-duplex:
Ecoute ET parle en
meme temps. Peut
s'interrompre.
Comment ca marche techniquement ?
Mimi (codec neural)
L'audio est compresse en tokens semantiques a 12.5 Hz grace au codec Mimi. Ces tokens capturent a la fois le contenu (les mots) et le style (l'intonation, l'emotion). C'est comme un tokenizer, mais pour l'audio.
Dual-stream Transformer (7B params)
Un seul Transformer traite simultanement deux flux : la voix de l'utilisateur ET la voix de Moshi. Ca permet le full-duplex — Moshi peut commencer a repondre avant que tu aies fini de parler.
Inner Monologue
Moshi genere du texte en interne avant de generer l'audio. Ca ameliore la qualite linguistique sans ajouter de latence perceptible — le texte est genere "dans la tete" du modele, pas en sortie.
# pip install moshi (necessite un GPU avec >=16GB VRAM)
from moshi.client import Client
# Se connecter au serveur Moshi local
client = Client("localhost:8998")
# Moshi fonctionne en streaming bidirectionnel :
# tu envoies de l'audio, il repond en audio, en temps reel
import sounddevice as sd
import numpy as np
def callback(indata, outdata, frames, time, status):
# Envoie l'audio du micro → recoit l'audio de Moshi
response = client.send_audio(indata)
outdata[:] = response # joue la reponse dans les speakers
# Stream full-duplex : ecoute ET parle en meme temps
with sd.Stream(samplerate=24000, channels=1, callback=callback):
print("Parle a Moshi... (Ctrl+C pour arreter)")
sd.sleep(60000) # 60 secondes de conversation| Pipeline classique | Moshi (S2S) | Gradium (commercial) | |
|---|---|---|---|
| Latence | 400ms - 1.6s | ~200ms | Sub-seconde |
| Full-duplex | Non | Oui | Oui |
| Interruptions | Complexe (VAD) | Natif | Natif |
| Qualite voix | Depends du TTS | Correcte, en progres | En cours d'amelioration |
| Tool calling | Oui (via le LLM) | Limite | En developpement |
| Open-source | Depends des composants | Oui (CC BY 4.0) | Non (API) |
| Production-ready | Oui | Recherche | Bientot |
VAD et turn-taking — qui parle quand ?
Un des plus gros defis des agents vocaux : savoir quand le client a fini de parler pour commencer a repondre. C'est le et le .
| Technique | Principe | Avantage | Inconvenient |
|---|---|---|---|
| Silence threshold | Attendre N ms de silence avant de repondre | Simple a implementer | N fixe = trop court ou trop long selon le contexte |
| Endpointing avance | Modele ML qui detecte la fin de phrase (prosodie, syntaxe) | Plus naturel, s'adapte | Plus complexe, necessite un bon modele |
| Semantic turn-taking (Gradium) | Le modele comprend le CONTENU pour detecter la fin de pensee | Le plus naturel, gere les hesitations | Etat de l'art, pas encore standard |
En pratique pour ton agent Selectra :
// Configuration VAD typique pour un agent de qualification
const vadConfig = {
// Silence minimum avant de considerer que le client a fini
silenceThreshold: 700, // ms — augmenter a 1200 quand on attend un numero PDL
// Seuil d'energie pour detecter la parole
energyThreshold: 0.02,
// Gestion des interruptions (barge-in)
allowBargeIn: true, // Le client peut couper l'agent
bargeInThreshold: 300, // ms de parole client pour interrompre
// Padding
speechPadding: 200, // ms de marge apres la detection de silence
};Architectures et frameworks
Tu n'as pas besoin de tout coder from scratch. Plusieurs frameworks gerent l'orchestration vocale pour toi.
| Framework | Type | Avantage | Inconvenient | Prix |
|---|---|---|---|---|
| Vapi | Platform (managed) | Le plus simple — config par JSON, telephonie integree | Moins de controle, vendor lock-in | ~5c/min |
| LiveKit Agents | Open-source | Full controle, self-hosted possible, communaute active | Plus de code a ecrire | Gratuit (self-hosted) ou hosted |
| Retell AI | Platform | Bonne qualite francais, API simple | Moins flexible que LiveKit | ~7c/min |
| Bland.ai | Platform | Optimise pour les appels sortants (outbound) | Moins bon en inbound | ~9c/min |
| Custom (WebSocket) | DIY | Controle total, pas de dependance | Beaucoup de travail, gestion de la telephonie | Cout des APIs STT/LLM/TTS |
L'ecosysteme francais de la voix IA
La France est un des leaders mondiaux en voice AI. Connaitre cet ecosysteme est un atout enorme pour ton stage.
| Boite | Produit | Approche | Lien avec Selectra |
|---|---|---|---|
| Kyutai | Moshi (speech-to-speech) | Modele end-to-end, full-duplex, open-source | Futur de la techno, pas encore production |
| Gradium | Audio Language Models API | Spin-off commercial de Kyutai ($70M) | Pourrait etre le fournisseur de Selectra demain |
| Gladia | Solaria (STT) | STT ultra-rapide (<103ms), 100 langues | DEJA UTILISE par Selectra pour l'analyse d'appels |
| Mistral | Voxtral (STT + TTS) | Open weights, voice cloning 3s, 90ms latence | Alternative open-source pour STT et TTS |
Architecture complete : l'agent vocal Selectra
Architecture de production
┌─────────────────────────────────────────────────────┐
│ TELEPHONIE │
│ Numero entrant → SIP trunk → WebSocket │
│ (Twilio, Vonage, ou Vapi integre) │
└──────────────────────┬──────────────────────────────┘
│ audio stream
┌──────────────────────▼──────────────────────────────┐
│ ORCHESTRATEUR VOCAL │
│ (LiveKit Agents ou Vapi) │
│ │
│ ┌──────────┐ ┌───────────┐ ┌──────────────────┐ │
│ │ VAD │ │ STT │ │ TTS │ │
│ │ (silence │ │ (Gladia │ │ (Voxtral TTS │ │
│ │ detect) │ │ Solaria) │ │ ou ElevenLabs) │ │
│ └──────────┘ └─────┬─────┘ └────────▲─────────┘ │
│ │ texte │ texte │
│ ┌─────▼─────────────────┐│ │
│ │ LLM + AGENT ││ │
│ │ (Claude via AI SDK) ├┘ │
│ │ │ │
│ │ Tools: │ │
│ │ - chercherPDL() │ │
│ │ - comparerOffres() │ │
│ │ - transfererHumain() │ │
│ │ │ │
│ │ RAG: │ │
│ │ - FAQ Selectra │ │
│ │ - Tarifs actuels │ │
│ └────────────────────────┘ │
└─────────────────────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────┐
│ BACKEND (Next.js) │
│ - API routes pour les tools │
│ - Base de donnees (fiches client) │
│ - Dashboard temps reel (WebSocket) │
│ - CRM integration │
└─────────────────────────────────────────────────────┘
Ce schema, c'est exactement ce qu'on a construit module par module :
| Module | Brique | Role dans l'agent |
|---|---|---|
| Module 1 | Fondations LLM | Comprendre comment le cerveau de l'agent fonctionne |
| Module 2 | Prompt Engineering | Ecrire le system prompt de qualification |
| Module 3 | RAG | Donner les tarifs actuels et la FAQ a l'agent |
| Module 4 | Tool Calling & Agents | Chercher le PDL, comparer les offres, transferer |
| Module 5 | Pipeline vocal | STT + TTS + orchestration + telephonie |
Quiz final
Module 05 termine
Tu connais maintenant tout le pipeline vocal : STT, LLM, TTS, orchestration, VAD, turn-taking. Tu connais l'ecosysteme francais (Kyutai, Gradium, Gladia, Mistral Voxtral) et tu as l'architecture complete de l'agent vocal Selectra. Tu es pret pour ton stage.