Genera videos de sincronización labial mediante nuestra potente API REST
Administra tus claves de autenticación
Ponle un nombre fácil de recordar (opcional)
Inicio de sesión requerido
Inicia sesión para crear y administrar claves de API.
Empieza con planes flexibles y competitivos
Nota: Los créditos de API y de usuario son independientes y no intercambiables.
Asegura tus solicitudes a la API
Incluye tu clave de API en el encabezado Authorization:
Authorization: Bearer sk_XXXX_YYYY
Endpoints RESTful
/api/v1/lipsync-videoVideo a video con sustitución de audio (labios sincronizados)
/api/v1/lipsync-imageImagen + audio → avatar de un hablante
/api/v1/talking-avatarImagen + audio + prompt -> avatar parlante con expresión y movimiento controlados
/api/v1/lipsync-image-multiImagen + doble audio → avatar multi-hablante (conversación/diálogo)
/api/v1/jobs/{requestId}Consulta el estado del trabajo y recupera el resultado
Entradas, privacidad, cobertura de modelos y notas de producción
La API pública acepta actualmente URL de medios en JSON. La subida directa de archivos multipart y los endpoints de carga de recursos aún no están disponibles. Se admiten URL firmadas o temporales siempre que nuestros workers y el proveedor de generación puedan acceder a ellas mientras el trabajo se ejecuta.
Los trabajos de API se almacenan con visibilidad privada. El interruptor Public de la web no se aplica a las solicitudes de API y actualmente no existe un parámetro de API para publicar una generación.
Selecciona el flujo por endpoint: lipsync-image, lipsync-video o lipsync-image-multi. Usa talking-avatar para el modelo de imagen con control de expresión y movimiento.
Esta página es la referencia actual de la API. Actualmente no se publica una especificación OpenAPI/Swagger legible por máquina.
La relación de aspecto, guidance scale y audio guidance no están expuestos como parámetros de API para los endpoints actuales de lip-sync.
Envía una solicitud de API por generación. Para lotes grandes de producción, mantén válidas las URL de entrada hasta finalizar y contacta con soporte antes de ejecutar concurrencias muy altas.
Especificaciones completas del endpoint
Todos los endpoints comparten una estructura común: parámetro opcional webhook y parámetros específicos en formState.
Sustituye el audio de un video existente manteniendo la sincronía labial
webhookopcionalTu URL de callback (HTTPS). Enviamos el resultado por POST al completar.
formStaterequeridoObjeto con todos los parámetros de generación (ver abajo).
videorequeridoURL pública del video fuente (MP4, MOV, etc.)
audiorequeridoURL pública del audio (MP3, WAV, etc.)
resolutionrequerido"360p", "480p", "720p", "1080p", "2k" o "4k"
mask_imageopcionalURL pública de la imagen máscara (limita el área de sincronización labial)
promptopcionalTexto de guía de estilo
seedopcionalSemilla entera para reproducibilidad
Elige cómo recibir los resultados
Todas las llamadas a la API son asíncronas. Tienes dos opciones para recuperar los resultados:
Para trabajos 1080p, 2k y 4k, las respuestas de webhook y polling devuelven solo el resultado final de video reescalado.
Proporciona una URL de webhook en el JSON. Enviaremos el resultado por POST al completar.
Las URL de webhook deben ser URL HTTPS públicas. Si la entrega falla, reintentamos hasta 5 veces con retroceso exponencial.
Omite el webhook y usa el requestId devuelto para sondear GET /api/v1/jobs/{requestId} cada 5–10 s hasta que el estado sea "completed".
POST /api/v1/lipsync-image
Authorization: Bearer sk_XXXX_YYYY
Content-Type: application/json
{
"webhook": "https://your-app.example.com/webhooks/lipsync",
"formState": {
"image": "https://.../face.png",
"audio": "https://.../voice.mp3",
"resolution": "720p",
"seed": 42
}
}
// Immediate Response:
{
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"message": "Task submitted successfully. Use requestId to query job status."
}
// Later, when job completes, we POST to your webhook:
POST https://your-app.example.com/webhooks/lipsync
Content-Type: application/json
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync-image",
"status": "completed",
"output": "https://.../result.mp4",
"error": "",
"executionTime": 12345,
"timings": null
}POST /api/v1/talking-avatar
Authorization: Bearer sk_XXXX_YYYY
Content-Type: application/json
{
"webhook": "https://your-app.example.com/webhooks/lipsync",
"formState": {
"image": "https://.../character.png",
"audio": "https://.../speech.mp3",
"prompt": "Warm presentation style, natural facial expression, subtle head motion",
"resolution": "1080p"
}
}
// Completed webhook or polling response:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "talking-avatar",
"status": "completed",
"output": "https://.../result.mp4",
"error": "",
"executionTime": 12345,
"timings": null
}// Step 1: Submit job (no webhook parameter)
POST /api/v1/lipsync-image
Authorization: Bearer sk_XXXX_YYYY
Content-Type: application/json
{
"formState": {
"image": "https://.../face.png",
"audio": "https://.../voice.mp3",
"resolution": "720p"
}
}
// Immediate Response:
{
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"message": "Task submitted successfully. Use requestId to query job status."
}
// Step 2: Poll for status (repeat every 5-10 seconds)
GET /api/v1/jobs/550e8400-e29b-41d4-a716-446655440000
Authorization: Bearer sk_XXXX_YYYY
// Response while processing:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync-image",
"status": "processing",
"output": null,
"error": "",
"executionTime": null,
"timings": null
}
// Response when completed:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync-image",
"status": "completed",
"output": "https://.../result.mp4",
"error": "",
"executionTime": 12345,
"timings": null
}
// Response if failed:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync-image",
"status": "failed",
"output": null,
"error": "Generation failed. Please try again later.",
"executionTime": null,
"timings": null
}Ejemplos de integración listos para usar
import fetch from 'node-fetch';
import express from 'express';
const API_KEY = 'Bearer sk_XXXX_YYYY';
const BASE_URL = 'https://lipsync.studio/api/v1';
// Set up webhook server to receive results
const app = express();
app.use(express.json());
app.post('/webhooks/lipsync', (req, res) => {
const { id, status, output, error, model } = req.body;
console.log('Job update received.');
console.log('Job ID:', id);
console.log('Model:', model);
console.log('Status:', status);
if (status === 'completed') {
console.log('Video URL:', output);
} else if (status === 'failed') {
console.error('Error:', error);
}
// TODO: Save output URL to your database, send notification, etc.
res.status(200).json({ received: true });
});
app.listen(3000, () => {
console.log('Webhook server listening on port 3000');
});
// Submit job with webhook
async function submitJobWithWebhook() {
const webhookUrl = 'https://your-public-domain.com/webhooks/lipsync';
const res = await fetch(`${BASE_URL}/lipsync-image`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': API_KEY
},
body: JSON.stringify({
webhook: webhookUrl,
formState: {
image: 'https://example.com/portrait.jpg',
audio: 'https://example.com/speech.mp3',
resolution: '720p'
}
})
});
const data = await res.json();
console.log('Job submitted:', data.requestId);
console.log('Waiting for webhook callback...');
// You don't need to poll! The result will be POSTed to your webhook.
}
submitJobWithWebhook();