Schéma MVP “web only” avec Daily pour un agent vocal (ASR ↔ LLM ↔ TTS)
Voici un schéma MVP “web only” avec Daily pour un agent vocal (ASR ↔ LLM ↔ TTS) — simple, robuste, et prêt à brancher vos “tools” (Odoo, CRM, etc.).
Schéma d’architecture (vue d’ensemble)
[React Client] <--WebRTC--> [Daily Room (SFU)] | mic pub | router audio | \ | \ (tracks) | \ v v [Bot Worker] <------ webhooks ------ [Daily Webhooks] | | |----> ASR (OpenAI) ------------------| |----> LLM tools (OpenAI) | |----> TTS (OpenAI) ------------------| | \--> publie une piste audio (réponse) --> (retransmis via Daily à l’utilisateur)
A- Composants
1- Front React (daily-js)
- Rejoint une room Daily et publie le micro (audio-only).
-
Joue la piste audio de l’assistant (le bot).
Docs utiles : création/gestion de rooms, SDK daily-js, gestion des pistes audio. docs.daily.co+3docs.daily.co+3docs.daily.co+3
2- Daily (SFU)
- Transporte les flux audio en temps réel et gère la scalabilité audio-only/recordings.
- Optionnel : transcription intégrée (startTranscription) et webhooks (meeting.started, transcript.*). docs.daily.co+5docs.daily.co+5docs.daily.co+5
3- Bot Worker (Node/Python)
- Rejoint la room comme participant “agent”, s’abonne à l’audio de l’utilisateur, envoie l’audio à OpenAI (ASR), exécute le LLM (avec vos tools), synthétise la réponse avec OpenAI (TTS), puis publie une piste audio de réponse dans la room.
- Vous pouvez le coder avec daily-js + node-webrtc, ou utiliser des kits côté serveur (ex. daily-python) / transports prêts à l’emploi (ex. Pipecat DailyTransport). Daily+1
4.Webhook Handler (Node)
- Reçoit les événements Daily (meeting.started, participant.joined, transcript.*) pour démarrer/arrêter le bot, consigner les métriques et récupérer des transcripts si vous activez la transcription Daily.
B- Flux temps réel (pas-à-pas)
- Création/Config de room via REST (POST /rooms) — en audio-only pour réduire la latence/coût. docs.daily.co
- Le client React rejoint la room et publie le micro. Le SDK permet de lister les participants/pistes. docs.daily.co+1
- Webhook meeting.started déclenche le lancement du Bot Worker (s’il n’est pas déjà en veille). docs.daily.co
- Le Bot rejoint la même room (auth côté serveur), souscrit à la piste audio de l’utilisateur.
- Le Bot envoie l’audio à OpenAI ASR, appelle le LLM (avec function calling/tools pour vos services), puis TTS.
- Le Bot publie sa piste audio de réponse dans la room. Le client la joue automatiquement (ex. <DailyAudioTrack/>). docs.daily.co
- (Optionnel) Activez startTranscription() pour obtenir un transcript natif Daily + webhooks transcript.*. docs.daily.co+1
C- Squelettes de code (très concis)
Front React (audio-only minimal)
import DailyIframe from "@daily-co/daily-js"; import { useEffect, useRef } from "react"; export default function VoiceClient() { const callRef = useRef<any>(null); useEffect(() => { const call = DailyIframe.createCallObject({ audioSource: true, videoSource: false }); callRef.current = call; (async () => { await call.join({ url: "https://<votre-sous-domaine>.daily.co/<room>" }); await call.setLocalAudio(true); })(); return () => call.leave(); }, []); // Côté UI, abonnez-vous aux events "participant-updated" et // attachez la piste audio du bot via <audio> ou DailyAudioTrack. return null; }
Docs : Get started, participants(), DailyAudioTrack. docs.daily.co+2docs.daily.co+2
Webhook (Node) — démarrage Bot sur meeting
app.post("/webhooks/daily", async (req, res) => { const event = req.body; if (event.type === "meeting.started") { // Démarrer/attacher le Bot Worker sur event.data.room } res.sendStatus(200); });
Docs : Webhooks & events. docs.daily.co+1
Bot Worker — options d’implémentation
- Option A (Node pur) : @daily-co/daily-js + node-webrtc pour rejoindre la room côté serveur, souscrire la piste, puis publier l’audio TTS en retour.
- Option B (Python) : daily-python (blog officiel) pour accélérer l’intégration avec pipelines IA. Daily
- Option C (framework bot) : Pipecat avec DailyTransport (gère l’aller/retour audio et le branchement STT/LLM/TTS). docs.pipecat.ai
D- Décisions techniques clés
- Audio-only dès la room (moins d’overhead) ; Daily le supporte nativement et à grande échelle. docs.daily.co
-
Transcription :
- Low-latency OpenAI ASR streaming (pour la logique IA).
- Transcription Daily en // si vous voulez un fichier de référence + webhooks (startTranscription() + transcript.*). docs.daily.co+1
- Enregistrements : si vous avez besoin de replays/QA, utilisez les modes recording Daily (cloud/local/raw-tracks). docs.daily.co
- Observabilité : écoutez les meeting events (join/left, live stream start, etc.) pour métriques et supervision. docs.daily.co
E- Checklist sécurité & prod
- Tokens courts côté client, règles de room minimales (audio-only, pas d’invités anonymes en prod). docs.daily.co
- Webhook signature + rate limiting.
- Isolation du Bot (une instance par room, auto-shutdown sur meeting.ended). docs.daily.co
- Fallback : si ASR/TTS indispo, bascule sur transcription Daily + TTS local/temporaire.
Si vous voulez, je vous fournis un repo starter au choix :
- Node + daily-js (bot serveur) + OpenAI (ASR/LLM/TTS).
- Python (daily-python) + OpenAI (pipeline prêt à l’emploi).
- Pipecat + DailyTransport (le plus rapide pour un POC). Daily+1
Dites-moi lequel vous préférez, je vous livre l’ossature complète (env vars, scripts, endpoints, et exemples “tools” pour appeler Odoo).
> Voir la fin du dialogue suivant https://chatgpt.com/share/68db9d2b-73ec-8005-92a6-a7deb0a0eead