ESPACIO PUBLICITARIO DISPONIBLE · HABLEMOS

Cómo integran los desarrolladores la Streaming API de D-ID para crear avatares conversacionales interactivos en tiempo real

365Finds Editorial
11.430 artículos Wiki recopilados

Usa 365 Wiki con tu IA

Copia el prompt de abajo, pégalo en la IA que ya usas y haz tu pregunta.

Descargar el Skill completo

Pruébalo primero con el prompt. Si usas 365 Wiki a menudo, instala el Skill completo de 365Wiki y no tendrás que volver a pegarlo. Si no tienes una IA habitual, también sirven las versiones web de Gemini o Microsoft Copilot.

Construir una IA visual conversacional en tiempo real exige resolver un cuello de botella de ingeniería fundamental: la latencia. Las canalizaciones tradicionales de generación de video sintético operan de forma asíncrona en modo por lotes, requiriendo desde varios segundos hasta minutos para renderizar, codificar y entregar un archivo de video MP4. En casos de uso interactivos —como representantes de ventas de IA, asistentes virtuales de atención médica, avatares de atención al cliente y tutores digitales interactivos—, una demora de varios segundos interrumpe el flujo de la conversación y degrada la retención del usuario.

D-ID aborda este desafío mediante su infraestructura de transmisión en tiempo real, que combina algoritmos de generación de video de baja latencia con el transporte de datos de WebRTC y LiveKit. En lugar de generar archivos de video completos en disco, el motor de transmisión de D-ID renderiza fotogramas de video del avatar sincronizados con los labios sobre la marcha y los transmite directamente a los navegadores cliente con una respuesta inferior a un segundo. Aunque las implementaciones iniciales dependían de los puntos de conexión heredados de transmisión Talks y Clips (/talks/streams), la arquitectura moderna de D-ID gira en torno al marco de trabajo D-ID Agents y el SDK oficial @d-id/client-sdk.

Esta guía recorre la canalización arquitectónica completa para integrar la API de streaming de D-ID con modelos de lenguaje grande (LLM), lo que incluye la configuración del agente en el backend, la negociación de sesiones WebRTC, la vinculación del flujo de medios en el frontend, los patrones de interacción conversacional, la optimización de latencia y la gestión del ciclo de vida de los créditos.


Descripción general de la arquitectura: La canalización del avatar conversacional

Una aplicación de avatar interactivo en tiempo real opera como un bucle coordinado que abarca la entrada del usuario, el razonamiento del lenguaje, la síntesis de voz, la animación facial y la entrega de medios punto a punto:

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

Los desarrolladores suelen adoptar uno de dos paradigmas de integración según los requisitos de su infraestructura:

  1. Flujo de trabajo con D-ID Agent administrado: D-ID gestiona internamente el mensaje del sistema (prompt) del LLM, la base de conocimiento externa (Generación Aumentada por Recuperación / RAG) y el proveedor de voz de texto a voz (TTS). La aplicación cliente se conecta directamente al agente mediante @d-id/client-sdk y envía las solicitudes del usuario mediante agentManager.chat().
  2. Flujo de trabajo de orquestación en backend personalizado: El backend del desarrollador conserva la propiedad total del estado conversacional, la autenticación de usuarios, las herramientas propietarias, las bases de datos vectoriales y las llamadas a LLM (por ejemplo, OpenAI GPT-4o, Anthropic Claude o modelos autohospedados). Posteriormente, el backend transmite el texto generado o el audio sintético a D-ID a través de agentManager.speak() o puntos de conexión REST de transmisión para animar el avatar.

Paso 1: Aprovisionamiento y configuración del Agent mediante la API REST

Antes de iniciar una transmisión en tiempo real, los desarrolladores configuran el personaje del avatar, sus características de voz y la capa de inteligencia. Aunque los agentes se pueden crear mediante la interfaz de D-ID Studio, las aplicaciones de producción normalmente automatizan este aprovisionamiento a través de la API REST.

Creación de un Agent

Envíe una solicitud POST a https://api.d-id.com/agents autenticada con su clave de API de 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."
    }
  }'

Parámetros clave de configuración

Objeto de configuraciónParámetroDescripción
presentertypeTipo de renderizado del avatar: talk (basado en fotos V2), clip (presentadores de estudio prerenderizados V3) o expressive (avatares V4 basados en LiveKit).
presenterpresenter_id o source_urlEl identificador de un presentador predeterminado de D-ID o una URL de imagen HTTPS públicamente accesible para avatares fotográficos personalizados.
presenter.voicetypeMotor del proveedor de voz, habitualmente microsoft (Azure Neural) o elevenlabs.
presenter.voicevoice_idIdentificador específico del modelo de voz correspondiente al catálogo del proveedor (por ejemplo, en-US-JennyMultilingualV2Neural).
llmtype y provideropenai para completados nativos administrados, o custom para enrutamiento a través de un backend externo.
llminstructionsInstrucciones del sistema que definen la personalidad del avatar, sus restricciones y sus límites conversacionales.

La API devuelve una respuesta JSON que contiene el agentId único. Almacene este identificador en la base de datos de su aplicación.

Protección de las credenciales del cliente

Las aplicaciones web y móviles en producción nunca deben exponer las claves de API principales de D-ID en el código del lado del cliente. En su lugar, genere una Client Key con permisos específicos a través de su 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"

En el panel de control de D-ID Studio, restrinja esta clave de cliente a sus dominios de producción utilizando la configuración de Allowed Domains para evitar usos no autorizados.


Paso 2: Establecimiento del flujo WebRTC de baja latencia

La interacción en tiempo real requiere una conexión entre pares (peer connection) WebRTC entre el navegador cliente y el clúster de renderizado de D-ID. D-ID ofrece dos rutas de integración: el SDK automatizado @d-id/client-sdk (muy recomendado) y la señalización WebRTC directa basada en REST.

Método A: Integración de cliente mediante @d-id/client-sdk (Recomendado)

El SDK oficial @d-id/client-sdk abstrae la negociación de la sesión, el intercambio de ofertas/respuestas de Session Description Protocol (SDP) y la recopilación de candidatos de Interactive Connectivity Establishment (ICE) en una interfaz JavaScript optimizada.

1. Instalar el SDK

npm install @d-id/client-sdk

2. Inicializar AgentManager y vincular las pistas de medios

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

// Elementos del 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: {
      // Flujo de medios adjunto recibido del par WebRTC de D-ID
      onSrcObjectReady(mediaStream) {
        videoElement.srcObject = mediaStream;
        videoElement.play().catch((err) => console.error("Video autoplay error:", err));
      },
      // Seguimiento de transiciones de conexión: connecting, connected, disconnected, closed
      onConnectionStateChange(state) {
        statusElement.textContent = `Status: ${state}`;
        console.log("WebRTC Connection State:", state);
      },
      // Manejo de turnos conversacionales entrantes
      onNewMessage(messages) {
        const latest = messages[messages.length - 1];
        console.log(`[${latest.role}]: ${latest.content}`);
      },
      // Monitoreo del ciclo de vida del habla del avatar
      onVideoStatusChange(status) {
        console.log("Avatar Video Status:", status); // ej., "playing", "idle"
      },
      onError(error, errorData) {
        console.error("D-ID Agent Error:", error, errorData);
      }
    }
  });

  // Conectar sesión WebRTC
  await agentManager.connect();
}

initializeAvatar().catch(console.error);

Método B: Negociación manual de señalización WebRTC (Bajo el capó)

Para entornos sin interfaz gráfica (headless), clientes que no son navegadores (como aplicaciones móviles nativas o dispositivos embebidos) o sistemas heredados, los desarrolladores pueden ejecutar el protocolo de enlace WebRTC directamente mediante los puntos de conexión REST de D-ID:

  1. Inicializar la sesión de streaming: Envíe una solicitud POST a https://api.d-id.com/agents/{agentId}/streams (o al extremo heredado /talks/streams). D-ID devuelve:

    • id: El ID único de la sesión de transmisión.
    • session_id: Identificador de seguimiento de la sesión.
    • offer: Una oferta SDP generada por el servidor de medios WebRTC de D-ID.
    • ice_servers: Una lista de credenciales de servidores STUN y TURN necesarias para el cruce de NAT.
  2. Inicializar el RTCPeerConnection local: El cliente crea una instancia de RTCPeerConnection configurada con los ice_servers de D-ID:

    const pc = new RTCPeerConnection({ iceServers: response.ice_servers });
    
  3. Establecer la descripción remota y crear la respuesta local:

    await pc.setRemoteDescription(new RTCSessionDescription(response.offer));
    const answer = await pc.createAnswer();
    await pc.setLocalDescription(answer);
    
    // Enviar la respuesta SDP de vuelta a 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. Intercambiar candidatos ICE: Escuche el evento onicecandidate en la conexión de pares del cliente y reenvíe cada candidato al punto de conexión 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. Recibir la pista de medios: Cuando llegue la pista de medios, vincule el flujo remoto al DOM:

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

Paso 3: Interacción conversacional: chat() frente a speak()

Una vez que la sesión WebRTC está activa, los desarrolladores activan las animaciones del avatar mediante dos métodos principales proporcionados por el SDK.

Patrón 1: Turnos conversacionales autónomos (chat)

Si el agente está configurado con lógica LLM integrada, envíe mensajes de texto directamente al hilo de conversación del agente:

// El usuario envía un mensaje a través de la interfaz de usuario
async function handleUserSubmit(userText) {
  if (!agentManager) return;

  // Envía el mensaje del usuario al agente; el agente consulta al LLM, genera voz y transmite video
  await agentManager.chat(userText);
}

El agente de D-ID gestiona automáticamente el seguimiento de turnos del usuario, la inferencia de LLM, la generación de TTS y la síntesis de video, emitiendo devoluciones de llamada onNewMessage a medida que se resuelven los tokens y los mensajes.

Patrón 2: Orquestación con backend personalizado (speak)

Cuando la lógica de la aplicación requiere flujos de trabajo propietarios —como consultas RAG de múltiples turnos sobre bases de datos corporativas, agentes LangChain con llamadas a herramientas o puntos de conexión LLM personalizados—, los desarrolladores utilizan el método speak(). Esto permite que el backend genere respuestas de forma independiente e indique al avatar que reproduzca un contenido específico.

Envío de entrada de texto

// Instruir al avatar para que hable un texto arbitrario usando la voz TTS configurada en el agente
await agentManager.speak({
  type: "text",
  input: "Welcome back, Sarah. I have pulled your quarterly analytics report."
});

Envío de audio presintetizado

Para aplicaciones que utilizan motores de voz especializados (como voces clonadas personalizadas o modelos de habla a medida), los desarrolladores pueden pasar directamente una URL de audio HTTPS públicamente accesible:

// El avatar anima la boca y las expresiones faciales en sincronía con el audio proporcionado
await agentManager.speak({
  type: "audio",
  audio_url: "https://storage.yourdomain.com/audio/response_chunk_01.mp3"
});

Optimización de latencia en producción y estrategias de rendimiento

En la IA conversacional interactiva, la tolerancia humana a la latencia es excepcionalmente baja; las pausas conversacionales que superan los 1.000 a 1.500 milisegundos resultan poco naturales. Lograr un diálogo fluido requiere optimizar cada fase de la canalización.

1. Precalentamiento de la conexión

El establecimiento de la conexión WebRTC (intercambio SDP, descubrimiento de candidatos STUN/TURN y comprobaciones de conectividad ICE) suele tardar entre 800 ms y 2.500 ms según las condiciones de la red.

2. Fragmentación de streaming para respuestas extensas de LLM

Esperar a que un LLM genere un párrafo completo de varias oraciones antes de llamar a speak() introduce una latencia considerable (tiempo hasta el primer token más el tiempo total de completado).

Para minimizar el retraso percibido:

3. Manejo de interrupciones (Barge-In)

Una conversación natural exige que los usuarios puedan interrumpir al avatar a mitad de su alocución. En la arquitectura de streaming moderna de D-ID, las capacidades de interrupción se admiten de forma nativa mediante controles de transmisión fluidos:

// Manejar la voz del usuario detectada mientras el avatar está hablando
function onUserSpeechDetected() {
  if (agentManager) {
    // Interrumpir la reproducción de voz actual y devolver el avatar al estado inactivo de escucha
    agentManager.interrupt();
  }
}

Cuando se dispara un evento de interrupción, D-ID trunca la cola de voz activa en el servidor y detiene la transmisión de video, asegurando que el avatar no continúe hablando por encima del usuario.

4. Avatares expresivos (V4) con LiveKit

Para aplicaciones que priorizan una presencia natural, los V4 Expressive Avatars de D-ID emplean el transporte LiveKit en lugar de WebRTC punto a punto estándar. Los avatares expresivos mantienen un movimiento inactivo continuo (parpadeos sutiles, micromovimientos de cabeza y ritmos de respiración) entre los turnos conversacionales, eliminando el efecto de cuadro congelado común en motores de avatares anteriores.


Gestión del ciclo de vida de recursos y economía de facturación

El despliegue de avatares de video en tiempo real a escala requiere un cumplimiento estricto de las reglas de cierre de sesión y la contabilidad de créditos.

1. Cierre adecuado de la sesión

Las sesiones de WebRTC no cerradas continúan consumiendo recursos del servidor y pueden provocar un agotamiento inesperado de créditos. Implemente siempre controladores de desconexión explícitos al desmontar componentes o en eventos de descarga de la ventana:

// Limpiar la sesión al descargar la ventana
window.addEventListener("beforeunload", () => {
  if (agentManager) {
    agentManager.disconnect().catch(console.error);
  }
});

// Limpieza en aplicaciones de página única (desmontaje en React / Vue / Svelte)
function cleanupAvatarSession() {
  if (agentManager) {
    agentManager.disconnect();
    agentManager = null;
  }
}

Para implementaciones REST, envíe una solicitud DELETE a https://api.d-id.com/agents/{agentId}/streams/{streamId} al finalizar la sesión.

2. Consumo de créditos y regla de redondeo a 15 segundos

D-ID deduce el uso de generación de video directamente del saldo unificado de minutos de su cuenta (compartido entre Creative Reality™ Studio y la API).

3. Tiempos de espera por inactividad y protección contra abandono

Para protegerse contra sesiones huérfanas cuando los usuarios dejan abiertas las pestañas del navegador, implemente un temporizador de inactividad. Si no se produce ninguna interacción del usuario durante 90 a 120 segundos, notifique al usuario o cierre automáticamente la conexión WebRTC mediante agentManager.disconnect().


Resumen de la lista de verificación de integración

FaseAcción principalHerramienta / Punto de conexión recomendado
AprovisionamientoCrear agente con voz, personalidad e instrucciones de LLMPOST /agents
SeguridadEmitir credenciales de cliente restringidas con lista de dominios permitidosPOST /agents/{agentId}/client-key
ConexiónEstablecer sesión WebRTC peer y vincular flujo <video>@d-id/client-sdk (agentManager.connect())
InteracciónEnviar solicitud conversacional o fragmentos de texto de LLM externoagentManager.chat() o agentManager.speak()
Optimización de UXHabilitar interrupción de usuario (barge-in) y precalentamiento de conexiónagentManager.interrupt() ante actividad del micrófono
Ciclo de vidaCerrar flujos WebRTC al salir de la página o por tiempo de inactividadagentManager.disconnect() / DELETE /streams/{id}

Al combinar el motor de transmisión en tiempo real de D-ID con la orquestación estructurada de mensajes de LLM y la gestión del ciclo de vida de WebRTC del lado del cliente, los equipos de desarrollo pueden desplegar avatares de IA conversacionales rápidos y naturales que ofrecen un rendimiento de nivel empresarial en plataformas web y móviles.