ESPACE PUBLICITAIRE DISPONIBLE · PARLONS-EN

Comment les développeurs intègrent l'API Streaming de D-ID pour créer des avatars conversationnels interactifs en temps réel

365Finds Editorial
11 430 articles Wiki répertoriés

Utilisez 365 Wiki avec votre IA

Copiez le prompt ci-dessous, collez-le dans l’IA que vous utilisez déjà, puis posez directement votre question.

Télécharger le Skill complet

Commencez par essayer le prompt. Si vous utilisez souvent 365 Wiki, installez le Skill 365Wiki complet pour ne plus avoir à le coller. Sans IA habituelle, les versions web de Gemini ou Microsoft Copilot conviennent aussi.

Construire une IA visuelle conversationnelle en temps réel exige de résoudre un goulot d'étranglement d'ingénierie fondamental : la latence. Les pipelines traditionnels de génération de vidéo synthétique fonctionnent de manière asynchrone en mode batch (par lots), nécessitant de plusieurs secondes à quelques minutes pour effectuer le rendu, l'encodage et la livraison d'un fichier vidéo MP4. Pour les cas d'usage interactifs — tels que les représentants commerciaux IA, les assistants virtuels de santé, les avatars de support client et les tuteurs numériques interactifs —, un délai de plusieurs secondes brise la fluidité de la conversation et dégrade l'engagement de l'utilisateur.

D-ID relève ce défi grâce à son infrastructure de streaming en temps réel, combinant des algorithmes de génération vidéo à faible latence avec le transport de données WebRTC et LiveKit. Au lieu de générer des fichiers vidéo complets sur disque, le moteur de streaming de D-ID effectue le rendu à la volée de trames vidéo d'avatars synchronisées sur les lèvres et les diffuse directement aux navigateurs clients avec un temps de réponse inférieur à la seconde. Bien que les premières implémentations reposaient sur les points de terminaison de streaming hérités Talks et Clips (/talks/streams), l'architecture moderne de D-ID s'articule autour du framework D-ID Agents et du SDK officiel @d-id/client-sdk.

Ce guide détaille l'intégralité du pipeline architectural pour intégrer l'API de streaming D-ID avec les grands modèles de langage (LLM), y compris la configuration de l'agent backend, la négociation de session WebRTC, la liaison du flux multimédia frontend, les modèles d'interaction conversationnelle, l'optimisation de la latence et la gestion du cycle de vie des crédits.


Vue d'ensemble de l'architecture : Le pipeline de l'avatar conversationnel

Une application d'avatar interactif en temps réel fonctionne comme une boucle coordonnée englobant l'entrée utilisateur, le raisonnement linguistique, la synthèse vocale, l'animation faciale et la diffusion multimédia de pair à pair :

+-------------+      Audio / Text      +-------------------+
|             | ---------------------> | Application Logic |
| User Client |                        | (STT / LLM / RAG) |
|  (Browser)  | <--------------------- +-------------------+
|             |     WebRTC Video / Audio         |
|             | <---------------------------+    | Text / Audio Chunks
+-------------+                             |    v
                                       +-------------------+
                                       | D-ID Streaming    |
                                       | Engine & Agents   |
                                       +-------------------+

Les développeurs adoptent généralement l'un des deux paradigmes d'intégration suivants selon leurs exigences d'infrastructure :

  1. Flux de travail avec D-ID Agent géré : D-ID gère en interne le prompt système du LLM, la base de connaissances externe (Génération Augmentée par Récupération / RAG) et le fournisseur de voix de synthèse vocale (TTS). L'application cliente se connecte directement à l'agent à l'aide de @d-id/client-sdk et transmet les invites de l'utilisateur via agentManager.chat().
  2. Flux de travail d'orchestration backend personnalisé : Le backend du développeur conserve l'entière maîtrise de l'état conversationnel, de l'authentification des utilisateurs, des outils propriétaires, des bases de données vectorielles et des appels de LLM (par exemple OpenAI GPT-4o, Anthropic Claude ou modèles auto-hébergés). Le backend diffuse ensuite le texte généré ou l'audio synthétisé à D-ID via agentManager.speak() ou les points de terminaison REST de streaming pour animer l'avatar.

Étape 1 : Approvisionnement et configuration de l'Agent via l'API REST

Avant d'ouvrir un flux en temps réel, les développeurs configurent le personnage de l'avatar, les caractéristiques vocales et la couche d'intelligence. Bien que les agents puissent être créés via l'interface D-ID Studio, les applications en production automatisent généralement cet approvisionnement via l'API REST.

Création d'un Agent

Envoyez une requête POST à https://api.d-id.com/agents authentifiée avec votre clé d'API D-ID :

curl -X POST "https://api.d-id.com/agents" \
  -H "Authorization: Basic <YOUR_BASE64_ENCODED_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "presenter": {
      "type": "clip",
      "presenter_id": "v2_public_Amber@0zSz8kflCN",
      "voice": {
        "type": "microsoft",
        "voice_id": "en-US-JennyMultilingualV2Neural"
      }
    },
    "llm": {
      "type": "openai",
      "provider": "openai",
      "model": "gpt-4o",
      "instructions": "You are an AI customer success specialist for an enterprise SaaS platform. Keep responses under two sentences, maintain an empathetic and professional tone, and guide users to relevant product features."
    }
  }'

Paramètres de configuration clés

Objet de configurationParamètreDescription
presentertypeType de rendu de l'avatar : talk (basé sur photo V2), clip (présentateurs de studio pré-rendus V3) ou expressive (avatars V4 basés sur LiveKit).
presenterpresenter_id ou source_urlL'identifiant d'un présentateur D-ID standard ou une URL d'image HTTPS accessible publiquement pour les avatars photo personnalisés.
presenter.voicetypeMoteur du fournisseur vocal, couramment microsoft (Azure Neural) ou elevenlabs.
presenter.voicevoice_idIdentifiant du modèle vocal spécifique correspondant au catalogue du fournisseur (ex. : en-US-JennyMultilingualV2Neural).
llmtype et provideropenai pour les complétions gérées natives, ou custom pour le routage vers un backend externe.
llminstructionsInstructions système définissant la personnalité de l'avatar, ses contraintes et ses limites conversationnelles.

L'API renvoie une réponse JSON contenant l'agentId unique. Enregistrez cet identifiant dans la base de données de votre application.

Sécurisation des identifiants clients

Les applications web et mobiles en production ne doivent jamais exposer les clés d'API principales D-ID dans le code côté client. Générez plutôt une Client Key restreinte via votre backend :

curl -X POST "https://api.d-id.com/agents/<AGENT_ID>/client-key" \
  -H "Authorization: Basic <YOUR_BASE64_ENCODED_API_KEY>" \
  -H "Content-Type: application/json"

Dans le tableau de bord D-ID Studio, restreignez cette clé client à vos domaines de production à l'aide des paramètres Allowed Domains pour empêcher toute utilisation non autorisée.


Étape 2 : Établissement du flux WebRTC à faible latence

L'interaction en temps réel nécessite une connexion de pair à pair (peer connection) WebRTC entre le navigateur client et le cluster de rendu de D-ID. D-ID propose deux voies d'intégration : le SDK automatisé @d-id/client-sdk (fortement recommandé) et la signalisation WebRTC directe basée sur REST.

Méthode A : Intégration côté client via @d-id/client-sdk (Recommandé)

Le SDK officiel @d-id/client-sdk abstrait la négociation de session, les échanges d'offres/réponses du Session Description Protocol (SDP) et la collecte de candidats Interactive Connectivity Establishment (ICE) dans une interface JavaScript simplifiée.

1. Installer le SDK

npm install @d-id/client-sdk

2. Initialiser l'AgentManager et lier les pistes multimédias

import * as did from "@d-id/client-sdk";

// Éléments du DOM
const videoElement = document.getElementById("avatar-video");
const statusElement = document.getElementById("connection-status");
const chatInputElement = document.getElementById("chat-input");
const sendButton = document.getElementById("send-btn");

let agentManager = null;

async function initializeAvatar() {
  const agentId = "agt_xxxxxxxxxxxxxxxx";
  const clientKey = "YOUR_CLIENT_KEY";

  agentManager = await did.createAgentManager(agentId, {
    auth: {
      type: "key",
      clientKey: clientKey
    },
    callbacks: {
      // Flux multimédia attaché reçu du pair WebRTC D-ID
      onSrcObjectReady(mediaStream) {
        videoElement.srcObject = mediaStream;
        videoElement.play().catch((err) => console.error("Video autoplay error:", err));
      },
      // Suivre les transitions d'état de connexion : connecting, connected, disconnected, closed
      onConnectionStateChange(state) {
        statusElement.textContent = `Status: ${state}`;
        console.log("WebRTC Connection State:", state);
      },
      // Gérer les tours conversationnels entrants
      onNewMessage(messages) {
        const latest = messages[messages.length - 1];
        console.log(`[${latest.role}]: ${latest.content}`);
      },
      // Surveiller le cycle de vie de la parole de l'avatar
      onVideoStatusChange(status) {
        console.log("Avatar Video Status:", status); // ex. : "playing", "idle"
      },
      onError(error, errorData) {
        console.error("D-ID Agent Error:", error, errorData);
      }
    }
  });

  // Connecter la session WebRTC
  await agentManager.connect();
}

initializeAvatar().catch(console.error);

Méthode B : Handshake manuel de signalisation WebRTC (Sous le capot)

Pour les environnements sans interface graphique (headless), les clients non navigateurs (tels que les applications mobiles natives ou les appareils embarqués) ou les systèmes hérités, les développeurs peuvent exécuter le handshake WebRTC directement via les points de terminaison REST de D-ID :

  1. Initialiser la session de flux : Envoyez une requête POST à https://api.d-id.com/agents/{agentId}/streams (ou le point de terminaison hérité /talks/streams). D-ID renvoie :

    • id : L'ID unique de session de streaming.
    • session_id : Identifiant de suivi de session.
    • offer : Une offre SDP générée par le serveur multimédia WebRTC de D-ID.
    • ice_servers : Une liste d'identifiants de serveurs STUN et TURN requis pour la traversée NAT.
  2. Initialiser l'RTCPeerConnection locale : Le client crée une instance RTCPeerConnection configurée avec les ice_servers de D-ID :

    const pc = new RTCPeerConnection({ iceServers: response.ice_servers });
    
  3. Définir la description distante et créer la réponse locale :

    await pc.setRemoteDescription(new RTCSessionDescription(response.offer));
    const answer = await pc.createAnswer();
    await pc.setLocalDescription(answer);
    
    // Renvoyer la réponse SDP à D-ID
    await fetch(`https://api.d-id.com/agents/${agentId}/streams/${response.id}/sdp`, {
      method: "POST",
      headers: {
        "Authorization": `Basic ${API_KEY}`,
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        answer: answer,
        session_id: response.session_id
      })
    });
    
  4. Échanger les candidats ICE : Écoutez l'événement onicecandidate sur la connexion de pair du client et transférez chaque candidat au point de terminaison ICE de D-ID :

    pc.onicecandidate = (event) => {
      if (event.candidate) {
        fetch(`https://api.d-id.com/agents/${agentId}/streams/${response.id}/ice`, {
          method: "POST",
          headers: {
            "Authorization": `Basic ${API_KEY}`,
            "Content-Type": "application/json"
          },
          body: JSON.stringify({
            candidate: event.candidate.candidate,
            sdpMid: event.candidate.sdpMid,
            sdpMLineIndex: event.candidate.sdpMLineIndex,
            session_id: response.session_id
          })
        });
      }
    };
    
  5. Recevoir la piste multimédia : Lorsque la piste multimédia arrive, liez le flux distant au DOM :

    pc.ontrack = (event) => {
      videoElement.srcObject = event.streams[0];
    };
    

Étape 3 : Interaction conversationnelle : chat() vs speak()

Une fois la session WebRTC active, les développeurs déclenchent les animations de l'avatar à l'aide de deux méthodes principales fournies par le SDK.

Modèle 1 : Tours conversationnels autonomes (chat)

Si l'agent est configuré avec la logique LLM intégrée, envoyez des messages texte directement dans le fil de conversation de l'agent :

// L'utilisateur soumet un prompt via l'interface
async function handleUserSubmit(userText) {
  if (!agentManager) return;

  // Envoie le message utilisateur à l'agent ; l'agent interroge le LLM, génère la voix et diffuse la vidéo
  await agentManager.chat(userText);
}

L'agent D-ID gère automatiquement le suivi des tours utilisateur, l'inférence LLM, la génération TTS et la synthèse vidéo, déclenchant des rappels onNewMessage au fur et à mesure que les tokens et les messages sont résolus.

Modèle 2 : Orchestration backend personnalisée (speak)

Lorsque la logique applicative nécessite des flux de travail propriétaires — tels que des requêtes RAG multitours sur des bases de données d'entreprise, des agents LangChain avec appels d'outils ou des points de terminaison LLM sur mesure —, les développeurs utilisent la méthode speak(). Cela permet au backend de générer des réponses de manière indépendante et de demander à l'avatar de prononcer un contenu spécifique.

Envoi d'une entrée textuelle

// Demander à l'avatar de prononcer un texte arbitraire avec la voix TTS configurée de l'agent
await agentManager.speak({
  type: "text",
  input: "Welcome back, Sarah. I have pulled your quarterly analytics report."
});

Envoi d'un audio pré-synthétisé

Pour les applications utilisant des moteurs vocaux spécialisés (tels que des voix clonées personnalisées ou des modèles vocaux sur mesure), les développeurs peuvent directement transmettre une URL audio HTTPS publiquement accessible :

// La bouche et les expressions faciales de l'avatar s'animent en synchronisation avec l'audio fourni
await agentManager.speak({
  type: "audio",
  audio_url: "https://storage.yourdomain.com/audio/response_chunk_01.mp3"
});

Optimisation de la latence en production et stratégies de performance

En IA conversationnelle interactive, la tolérance humaine à la latence est exceptionnellement faible ; les pauses conversationnelles dépassant 1 000 à 1 500 millisecondes paraissent contre nature. Obtenir un dialogue fluide exige d'optimiser chaque phase du pipeline.

1. Préchauffage de la connexion

L'établissement de la connexion WebRTC (échange SDP, découverte de candidats STUN/TURN et vérifications de connectivité ICE) prend généralement entre 800 ms et 2 500 ms selon les conditions du réseau.

2. Découpage en flux pour les longues réponses LLM

Attendre qu'un LLM génère un paragraphe complet de plusieurs phrases avant d'appeler speak() introduit une latence considérable (temps jusqu'au premier token plus temps total de complétion).

Pour minimiser le délai perçu :

3. Gestion des interruptions (Barge-In)

Une conversation naturelle requiert que les utilisateurs puissent interrompre l'avatar en cours d'élocution. Dans l'architecture de streaming moderne de D-ID, les capacités d'interruption sont prises en charge nativement via des contrôles de streaming fluides :

// Détecter la voix de l'utilisateur pendant que l'avatar parle
function onUserSpeechDetected() {
  if (agentManager) {
    // Interrompre la lecture audio en cours et remettre l'avatar en état d'écoute inactif
    agentManager.interrupt();
  }
}

Lorsqu'un événement d'interruption se produit, D-ID tronque la file d'attente vocale active sur le serveur et arrête la transmission vidéo, garantissant que l'avatar ne continue pas de parler sur la voix de l'utilisateur.

4. Avatars expressifs (V4) avec LiveKit

Pour les applications qui privilégient une présence naturelle, les avatars expressifs V4 de D-ID utilisent le transport LiveKit plutôt que le WebRTC point à point standard. Les avatars expressifs maintiennent un mouvement d'inactivité continu (clignements d'yeux subtils, micromouvements de la tête et rythmes respiratoires) entre les tours de conversation, éliminant l'effet d'image figée fréquent dans les moteurs d'avatars antérieurs.


Gestion du cycle de vie des ressources et économie de facturation

Le déploiement d'avatars vidéo en temps réel à grande échelle exige le respect strict des règles de fermeture de session et de comptabilisation des crédits.

1. Fermeture propre de la session

Les sessions WebRTC non fermées continuent de consommer des ressources serveur et peuvent entraîner un épuisement inattendu des crédits. Implémentez systématiquement des gestionnaires de déconnexion explicites lors du démontage des composants et des événements de déchargement de fenêtre :

// Nettoyer la session lors du déchargement de la fenêtre
window.addEventListener("beforeunload", () => {
  if (agentManager) {
    agentManager.disconnect().catch(console.error);
  }
});

// Nettoyage dans les applications monopages (démontage React / Vue / Svelte)
function cleanupAvatarSession() {
  if (agentManager) {
    agentManager.disconnect();
    agentManager = null;
  }
}

Pour les implémentations REST, envoyez une requête DELETE à https://api.d-id.com/agents/{agentId}/streams/{streamId} dès la fin de la session.

2. Consommation de crédits et règle d'arrondi à 15 secondes

D-ID déduit l'utilisation de génération vidéo directement du solde de minutes unifié de votre compte (partagé entre Creative Reality™ Studio et l'API).

3. Délais d'inactivité et protection contre l'abandon

Pour vous prémunir contre les sessions orphelines lorsque les utilisateurs laissent les onglets de leur navigateur ouverts, mettez en place un minuteur d'inactivité. Si aucune interaction utilisateur ne se produit pendant 90 à 120 secondes, invitez l'utilisateur à réagir ou fermez automatiquement la connexion WebRTC à l'aide de agentManager.disconnect().


Résumé de la liste de contrôle d'intégration

PhaseAction principaleOutil / Point de terminaison recommandé
ApprovisionnementCréer un agent avec voix, persona et instructions LLMPOST /agents
SécuritéÉmettre des identifiants clients restreints avec liste blanche de domainesPOST /agents/{agentId}/client-key
ConnexionÉtablir la session WebRTC de pair et lier le flux <video>@d-id/client-sdk (agentManager.connect())
InteractionEnvoyer un prompt conversationnel ou des fragments de texte d'un LLM externeagentManager.chat() ou agentManager.speak()
Optimisation UXActiver l'interruption utilisateur (barge-in) et le préchauffage de connexionagentManager.interrupt() sur activité microphonique
Cycle de vieFermer les flux WebRTC lors de la fermeture de page ou après inactivitéagentManager.disconnect() / DELETE /streams/{id}

En combinant le moteur de streaming en temps réel de D-ID avec une orchestration structurée des invites LLM et une gestion rigoureuse du cycle de vie WebRTC côté client, les équipes de développement peuvent déployer des avatars d'IA conversationnelle réactifs et naturels, offrant des performances de niveau entreprise sur le Web et le mobile.