Saltar a la navegación

Guía de API de doblaje de video

El doblaje de video combina audio traducido con video con lip sync para que el contenido doblado se vea natural en el idioma objetivo. Puedes usar el flujo de doblaje integrado de Sync Labs con dubParams, o proporcionar tú mismo el audio traducido y usar Sync Labs para el paso de lipsync.

Prerrequisitos

  • Una API key de Sync Labs
  • Un video fuente (URL o asset cargado)
  • Para doblaje integrado: audio fuente en el archivo de video
  • Para doblaje manual: audio traducido en el idioma objetivo (de un servicio TTS o un actor de voz humano)

Instala el SDK para tu lenguaje:

# Python
pip install syncsdk
# TypeScript
npm i @sync.so/sdk

Configura tu API key:

export SYNC_API_KEY="your-api-key"

Doblaje integrado por API con dubParams

Usa dubParams cuando quieras que Sync Labs extraiga el audio fuente del video, lo traduzca y lo doble mediante ElevenLabs, y luego ejecute lipsync sobre el resultado doblado. Este es el camino más simple cuando tu video de entrada ya tiene audio fuente.

Cuando dubParams está presente:

  • proporciona una sola entrada video con audio
  • establece dubParams.targetLang con el código de idioma objetivo, como "es", "fr" o "hi"
  • opcionalmente establece dubParams.sourceLang; omítelo o usa "auto" para detección automática del idioma fuente
  • dubParams.numSpeakers está deprecado y se ignora - Doblaje v2 detecta hablantes automáticamente
  • no incluyas una entrada de audio separada para la pista traducida; las entradas de audio se ignoran mientras el doblaje esté habilitado
dub_with_params.ts
import { SyncClient } from "@sync.so/sdk";
const sync = new SyncClient();
const response = await sync.generations.create({
input: [
{
type: "video",
url: "https://your-cdn.com/original-video-with-audio.mp4",
},
],
model: "lipsync-2",
dubParams: {
providerName: "elevenlabs",
targetLang: "es",
sourceLang: "auto",
},
});
console.log(`Dubbing job submitted: ${response.id}`);

El doblaje integrado está respaldado por ElevenLabs. Si el video no tiene audio fuente utilizable, proporciona tu propio audio traducido y sigue el pipeline manual de abajo.

Pipeline manual de doblaje

1

Prepara tu audio traducido

Genera audio traducido usando un servicio de texto a voz como ElevenLabs, Google Cloud TTS o Amazon Polly. También puedes usar un actor de voz humano. El audio debe estar alojado en una URL pública y accesible.

Si ya tienes un archivo de audio traducido, súbelo a tu servicio de hosting y obtén la URL.

2

Envía a la API de Sync Labs

Envía el video fuente y el audio traducido a la API de Sync Labs. La API genera nuevos movimientos labiales que coinciden con el audio traducido.

import { SyncClient } from "@sync.so/sdk";
const sync = new SyncClient();
// Source video with original language
const videoUrl = "https://your-cdn.com/original-video.mp4";
// Translated audio in target language
const dubbedAudioUrl = "https://your-cdn.com/translated-audio-spanish.wav";
const response = await sync.generations.create({
input: [
{ type: "video", url: videoUrl },
{ type: "audio", url: dubbedAudioUrl },
],
model: "lipsync-2",
options: { sync_mode: "cut_off" },
});
const jobId = response.id;
console.log(`Dubbing job submitted: ${jobId}`);
3

Haz polling hasta completar

Revisa el estado de la generación hasta que termine. Para sistemas de producción, usa webhooks en lugar de polling.

let generation = await sync.generations.get(jobId);
while (!["COMPLETED", "FAILED", "REJECTED"].includes(generation.status)) {
console.log(`Status: ${generation.status}`);
await new Promise((r) => setTimeout(r, 10000));
generation = await sync.generations.get(jobId);
}
if (generation.status === "COMPLETED") {
console.log(`Dubbed video ready: ${generation.outputUrl}`);
} else {
console.log(`Dubbing failed for job ${jobId}`);
}
4

Descarga el video doblado

output_url (Python) o outputUrl (TypeScript) contiene un enlace directo al video doblado. Descárgalo o pásalo a tu pipeline de entrega.

Uso de la integración con ElevenLabs

Sync Labs tiene una integración integrada con ElevenLabs que maneja texto a voz y lipsync en una sola llamada de API. En lugar de generar audio por separado, pasas el texto traducido directamente.

import { SyncClient } from "@sync.so/sdk";
const sync = new SyncClient();
const response = await sync.generations.create({
input: [
{
type: "video",
url: "https://your-cdn.com/original-video.mp4",
},
{
type: "text",
provider: {
name: "elevenlabs",
voiceId: "EXAVITQu4vr4xnSDxMaL",
script: "Hola, bienvenidos a nuestra plataforma. Hoy les mostraremos las nuevas funciones.",
stability: 0.5,
similarityBoost: 0.75,
},
},
],
model: "lipsync-2",
options: { sync_mode: "cut_off" },
});
console.log(`Job ID: ${response.id}`);

El campo script tiene un máximo de 5,000 caracteres por generación. Para scripts más largos, divídelos en segmentos. Consulta la página Integrations para ver detalles de configuración de ElevenLabs.

Idiomas compatibles

Los modelos lipsync de Sync Labs son agnósticos al idioma. Funcionan con audio en cualquier idioma - los modelos analizan las formas de la boca desde la forma de onda de audio, no el idioma en sí. Si tu audio traducido es claro y está bien producido, la salida de lipsync coincidirá.

Para el flujo integrado con dubParams, elige uno de los códigos targetLang compatibles en la API Reference. Si necesitas un idioma fuera de esa lista o quieres más control sobre la traducción, genera o graba el audio traducido por separado y usa el pipeline manual anterior.

Para una guía completa de un pipeline de traducción (transcripción, traducción, TTS y lipsync), consulta la guía de API para traducción de video.

Doblaje con múltiples hablantes

Para videos con múltiples hablantes, usa la API de segments para asignar diferentes pistas de audio a distintos rangos de tiempo. Cada segmento puede referenciar una entrada de audio separada con una voz distinta.

from sync import Sync
from sync.common import Audio, Video
sync = Sync()
response = sync.generations.create(
input=[
Video(url="https://your-cdn.com/interview.mp4"),
Audio(url="https://your-cdn.com/speaker-a-spanish.wav", ref_id="speaker_a"),
Audio(url="https://your-cdn.com/speaker-b-spanish.wav", ref_id="speaker_b"),
],
segments=[
{"startTime": 0, "endTime": 15, "audioInput": {"refId": "speaker_a"}},
{"startTime": 15, "endTime": 30, "audioInput": {"refId": "speaker_b"}},
],
model="lipsync-2",
)

Consulta la guía de segmentos para ver la documentación completa y más ejemplos.

Consejos de rendimiento

Usa webhooks en producción

Reemplaza polling con webhooks en pipelines de producción. Recibes una notificación POST cuando el job termina, eliminando llamadas de API desperdiciadas.

Usa procesamiento por lotes para doblaje masivo

¿Doblando una biblioteca completa de videos? La API de lotes te permite enviar hasta 500 generaciones en una sola operación con un tiempo de entrega de 24 horas.

Elige el modelo correcto

Usa lipsync-2 para la mayoría de jobs de doblaje. Usa sync-3 para doblaje con calidad de producción, escenas complejas, obstrucciones, ángulos de perfil o salida 4K. Cambia a lipsync-2-pro cuando necesites detalle facial premium a menor costo que sync-3.

Haz coincidir la duración del audio

Configura sync_mode para controlar qué ocurre cuando las longitudes de audio y video difieren. cut_off recorta el exceso de audio. bounce repite el video para igualar la longitud del audio. Consulta modo de sincronización para ver la matriz completa de comportamiento.

Próximos pasos