Un vídeo de avatar solo resulta creíble si la persona se mantiene consistente a lo largo del tiempo. Cuando la cara se desplaza, los dientes cambian, la sincronización labial falla o el movimiento se reinicia entre clips, la gente se da cuenta de inmediato. Esto es aún más importante para los avatares que para muchas otras tareas de generación de vídeo, porque el espectador está viendo a una persona concreta hablar, a menudo de cerca y durante bastante tiempo.
In today's video generation world, duration is still one of the most visible limitations. Many models and products expose generation as a fixed-length clip — a few seconds, with few systems able to generate more than a few minutes. For avatar products, that limit shows up directly in customer workflows. Customers want longer consistent scenes/videos for training videos, sales demos, product walkthroughs, education, support, and agents that should keep talking until the task is done, and also they want fast preview to iterate on prompts, motion and script.
En HeyGen, eso se tradujo en tres requisitos concretos:
- Long-scene consistency. The avatar needs to preserve identity, lip sync, expression, and motion continuity not just for one short clip, but across many chunks of generated video.
- No fixed duration cap. A generation might be ten seconds, ten minutes, or an open-ended realtime session.
- Fast preview, realtime or faster-than-realtime generation. The system should start producing frames quickly and even allow streaming out the generated frames while inference is still ongoing.
Esta publicación explica el marco de inferencia que creamos para cumplir esos requisitos.
The Underlying Model Architecture
El framework se basa en los modelos de generación de vídeos con avatares de HeyGen, las familias Avatar IV y Avatar V. A grandes rasgos, el modelo toma una imagen o vídeo de referencia, un audio guía y, opcionalmente, texto o condicionamiento de escena, y luego genera un vídeo de ese avatar hablando con la identidad, la expresión y el movimiento correctos.
The core generation model is a Diffusion Transformer, or DiT, trained with flow matching. Instead of compressing the person into a small identity embedding, the model conditions on rich reference tokens so it can preserve details that matter for avatars: face shape, teeth, skin texture, mouth movement, gesture style, and speaking rhythm.
La ruta de inferencia en producción tiene tres etapas principales:
- Audio-to-video generation. A base DiT generates low-resolution video latents from the reference identity, audio features, and conditioning signals. This stage focuses on motion, lip sync, and temporal coherence.
- Identity-aware super-resolution. A second model refines those latents into high-resolution output, with extra attention on regions where people are most sensitive to artifacts, especially the face and mouth.
- Decodificación VAE en streaming. Un decodificador VAE convierte los latentes de alta resolución en fotogramas RGB por bloques, de modo que los fotogramas pueden emitirse antes de que el vídeo completo esté listo.
Para generar vídeos largos, el sistema procesa los datos en fragmentos. Mientras que el primer fragmento depende por completo de la referencia estática, los fragmentos posteriores utilizan datos de los límites de los segmentos anteriores. Esto permite que el avatar siga hablando de forma natural sin tener que restablecer desde cero su postura ni su identidad.
El marco de streaming y el bucle de canalización
Para adaptarse a la ejecución basada en fragmentos, el framework de inferencia utiliza una arquitectura modular de tres niveles que opera sobre ventanas de tiempo localizadas, liberando los recursos inmediatamente después de que se procesa cada fragmento.
- Módulo: Un contenedor alrededor de un modelo específico y su checkpoint (por ejemplo, A2V DiT, Super-Resolution DiT, componentes VAE, codificadores de texto/audio).
- Etapa: una unidad de ejecución tipada que coordina uno o más módulos (por ejemplo, generación de contexto, superresolución).
- Canalización: El grafo de ejecución que conecta las etapas entre sí, gestiona el estado compartido y coordina los modos de ejecución en streaming o por lotes.
La fase de inicialización codifica la identidad de referencia en latentes una vez por solicitud. A continuación, el pipeline ejecuta un bucle continuo a través de las etapas restantes hasta que se agota el flujo de audio de entrada:

- Generación de contexto: Convierte los segmentos de audio entrantes en características, los combina con el texto o la configuración de la escena y prepara los tensores de ruido objetivo.
- Audio a vídeo: Ejecuta un proceso de difusión de varios pasos para producir latentes de baja resolución. Esta etapa condiciona el fragmento actual en los fotogramas de límite del fragmento anterior para mantener la continuidad del movimiento.
- Súper resolución: Amplía los latentes de movimiento a resolución completa en un solo paso, priorizando el detalle espacial del rostro.
- VAE Decode-and-Publish: decodifica los latentes de alta resolución en fotogramas RGB y los envía directamente al codificador de salida (H.264 / AAC) para su almacenamiento inmediato o reproducción en directo.
Continuidad de límites y coherencia entre fragmentos
Generar vídeo en segmentos diferenciados introduce posibles discontinuidades en los límites. El framework mitiga este problema utilizando dos clasificaciones de fragmentos distintas:
- Fragmentos N: segmentos que generan la línea temporal principal del avatar.
- I Chunks (Interpolación): segmentos diseñados para suavizar las transiciones entre N Chunks secuenciales.
La secuencia de ejecución se estructura de la siguiente manera:
N0 -> N1 -> I0 -> N2 -> I1 -> N3 -> I2 -> ...
Un fragmento I se genera solo después de que se hayan completado los fragmentos N que lo preceden y lo siguen. Utiliza el fotograma final del fragmento N anterior y un fotograma temprano del fragmento N actual como fotogramas de anclaje para calcular el movimiento de transición. Tras la generación, se descartan las predicciones de anclaje redundantes, dejando únicamente la transición suavemente interpolada. Este mecanismo limita la ventana de contexto necesaria a la vez que preserva la coherencia temporal.
Memoria constante a lo largo de la duración
Una canalización de vídeo convencional acumula latentes, fotogramas decodificados y contexto de atención durante la ejecución, lo que provoca que el consumo de memoria de la GPU aumente de forma lineal con la duración del vídeo.
Para permitir una generación abierta, este framework mantiene un estado rodante estricto. El sistema conserva únicamente el condicionamiento de referencia estático y un conjunto mínimo de tensores ancla necesarios para las transiciones entre fragmentos. Todos los recursos intermedios —incluidas las características de audio, los tensores de ruido, las activaciones internas y los fotogramas RGB sin procesar— se eliminan de la memoria inmediatamente después de que un fragmento se haya decodificado y escrito.
Como resultado, el perfil máximo de memoria de la GPU se mantiene constante tanto si se genera un clip corto como una secuencia prolongada; el uso de recursos escala con el tamaño de bloque definido en lugar de con la duración total de la sesión.
Fases de carga y descarga dentro de la canalización
Cada solicitud se ejecuta en un nodo con 8 GPU. Usamos FSDP para fragmentar los parámetros de los modelos grandes entre las GPU. Cada rango posee solo una fracción de los pesos, reúne los parámetros que necesita para un cálculo y luego los libera de nuevo. Esto es lo que permite que varios modelos grandes —el DiT base, el DiT de superresolución, el codificador de texto, el codificador de audio y el VAE— quepan en un solo nodo.
Hay una contrapartida. FSDP introduce sobrecarga de comunicación durante la inferencia porque es necesario reunir los parámetros durante las pasadas hacia adelante. Utilizamos una combinación de técnicas para ocultar esa sobrecarga y mantener los modelos ubicados en el mismo nodo fuera de la GPU cuando no se están usando:
- Prefetching hacia adelante. El AllGather de los parámetros del siguiente bloque se lanza con antelación y se solapa con el cálculo del bloque actual, ocultando la latencia de recopilación en la ruta crítica.
- Desfragmentación perezosa por bloque desde la CPU. Cuando un modelo se recupera de la memoria de CPU fijada, no preparamos por adelantado el conjunto completo de pesos. Cada bloque del transformador se desfragmenta (copia de host a dispositivo + AllGather) justo antes de su pasada hacia adelante, de modo que la transferencia H2D del bloque n+1 se solapa con el cómputo del bloque n.
- Descarga en CPU fijada entre etapas. Los parámetros de un modelo que no se está ejecutando en ese momento se mantienen en memoria de CPU fijada, de modo que los modelos ubicados en el mismo servidor (DiT base, DiT de superresolución, codificador de texto, codificador de audio, VAE) no tengan que mantener todos sus pesos en la GPU al mismo tiempo. La memoria fijada es lo que hace que las copias H2D sean lo suficientemente rápidas como para solaparse con el cómputo.
- Ubicación de procesos optimizada para NUMA. Cada proceso se fija al mismo nodo NUMA que su GPU asignada, de modo que las transferencias CPU↔GPU se realizan al ancho de banda completo de PCIe/NVLink sin cruzar el interconector entre sockets.
Cambio de modelo en menos de 10 ms entre etapas
El beneficio práctico de las técnicas anteriores es que pasar la GPU del modelo de una etapa al de la siguiente — por ejemplo, de A2V DiT → Super-Resolution DiT, o de SR DiT → decodificador VAE — resulta prácticamente gratuito. Como el modelo saliente se descarga de forma asíncrona y el primer bloque del modelo entrante se desfragmenta justo a tiempo, tanto la copia H2D como el AllGather quedan ocultos tras el cómputo que ya se está ejecutando. De extremo a extremo, la sobrecarga observable por cada cambio de modelo es inferior a 10 ms, muy por debajo del presupuesto de un solo fotograma a nuestras tasas de fotogramas objetivo. En la práctica, esto es lo que permite que el bucle de la canalización de streaming (Context Gen → A2V → SR → VAE Decode-and-Publish) recorra varios modelos grandes por fragmento sin que el propio cambio de modelo se convierta nunca en el cuello de botella.
Publicación en streaming en tiempo real
Para que el modelo sea lo suficientemente rápido como para transmitir en tiempo real, hemos realizado muchas optimizaciones de inferencia; consulta https://www.heygen.com/research/avatar-v-inference para obtener más detalles sobre esta parte.
Una vez que la canalización emite el vídeo fragmento a fragmento en tiempo real, la entrega por streaming se convierte en una extensión natural de la inferencia en lugar de un paso de posprocesamiento independiente.
Para la ruta en tiempo real de tipo emisión, publicamos los fotogramas generados en Amazon Kinesis Video Streams (KVS). KVS suele mencionarse en el contexto de cámaras, dispositivos IoT y contenido multimedia subido. En nuestro caso, la «cámara» es la propia canalización de inferencia: los fotogramas son creados por el modelo, codificados de inmediato y enviados a KVS como una transmisión en directo.
El escritor de salida recibe fotogramas RGB decodificados desde el VAE en streaming y los envía a una canalización de GStreamer. El vídeo se codifica en H.264 y el audio en AAC, y después ambas pistas se envían a kvssink, el sumidero productor de KVS. A partir de ahí, los espectadores pueden reproducir la sesión como una transmisión en directo mientras todavía se está generando.
Resultados y aprendizajes
El framework transformó la generación de Avatar IV y Avatar V de un renderizado de escenas fijas a una generación en streaming abierta. El resultado más importante es sencillo: eliminamos los límites de duración de escena para Avatar IV y Avatar V. Para la generación en tiempo real de Avatar IV, hemos logrado un tiempo hasta el primer fotograma de menos de 5 segundos y una generación de más de 27 fotogramas por segundo para vídeos de Avatar IV en 720p, más rápido que la reproducción en tiempo real.