Gere vídeos de lipsync programaticamente com nossa poderosa API REST
Gerencie suas chaves de autenticação
Dê um nome fácil de lembrar (opcional)
Login necessário
Faça login para criar e gerenciar chaves de API.
Comece com planos flexíveis e competitivos
Nota: Créditos de API e de usuário são independentes e não intercambiáveis.
Proteja suas requisições à API
Inclua sua chave de API no cabeçalho Authorization:
Authorization: Bearer sk_XXXX_YYYY
Endpoints RESTful
/api/v1/lipsync-videoVídeo para vídeo com substituição de áudio (lipsync)
/api/v1/lipsync-imageImagem + áudio → avatar de um único falante
/api/v1/talking-avatarImagem + áudio + prompt -> avatar falante com expressão e movimento controlados
/api/v1/lipsync-image-multiImagem + dois áudios → avatar multi-falantes (conversa/diálogo)
/api/v1/jobs/{requestId}Consultar status do job e obter resultado
Entradas, privacidade, cobertura de modelos e notas de produção
A API pública atualmente aceita URLs de mídia em JSON. Upload direto multipart e endpoints de upload de assets ainda não estão disponíveis. URLs assinadas ou temporárias são suportadas desde que nossos workers e o provedor de geração possam acessá-las enquanto o job estiver em execução.
Jobs da API são armazenados com visibilidade privada. O botão Public da web não se aplica a solicitações de API, e atualmente não há parâmetro de API para publicar uma geração.
Selecione o fluxo pelo endpoint: lipsync-image, lipsync-video ou lipsync-image-multi. Use talking-avatar para o modelo de imagem com controle de expressão e movimento.
Esta página é a referência atual da API. Uma especificação OpenAPI/Swagger legível por máquina ainda não foi publicada.
Proporção, guidance scale e audio guidance não estão expostos como parâmetros de API para os endpoints atuais de lip-sync.
Envie uma solicitação de API por geração. Para grandes lotes de produção, mantenha as URLs de entrada válidas até a conclusão e fale com o suporte antes de executar concorrência muito alta.
Especificações completas do endpoint
Todos os endpoints compartilham uma estrutura comum: parâmetro opcional webhook e parâmetros específicos em formState.
Substitui o áudio de um vídeo existente mantendo a sincronização labial
webhookopcionalSua URL de callback (HTTPS). Enviaremos o resultado via POST ao finalizar.
formStateobrigatórioObjeto contendo todos os parâmetros de geração (veja abaixo).
videoobrigatórioURL pública do vídeo de origem (MP4, MOV, etc.)
audioobrigatórioURL pública do áudio (MP3, WAV, etc.)
resolutionobrigatório"360p", "480p", "720p", "1080p", "2k" ou "4k"
mask_imageopcionalURL pública da imagem de máscara (restringe a área de lipsync)
promptopcionalTexto de orientação de estilo
seedopcionalSemente inteira para reprodutibilidade
Escolha como receber os resultados
Todas as chamadas de API são assíncronas. Você tem duas opções para recuperar resultados:
Para jobs em 1080p, 2k e 4k, respostas de webhook e polling retornam apenas o vídeo final ampliado.
Forneça uma URL de webhook no JSON. Faremos POST do resultado ao concluir.
URLs de webhook devem ser URLs HTTPS públicas. Se a entrega falhar, tentamos novamente até 5 vezes com backoff exponencial.
Omitir webhook e usar o requestId retornado para consultar GET /api/v1/jobs/{requestId} a cada 5–10 s até o status ser "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
}Exemplos de integração prontos para uso
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();