Genera video lipsync con la nostra potente API REST
Gestisci le tue chiavi di autenticazione
Assegna un nome facile da ricordare (opzionale)
Accesso richiesto
Accedi per creare e gestire le chiavi API.
Inizia con piani flessibili e competitivi
Nota: I crediti API e utente sono indipendenti e non intercambiabili.
Proteggi le tue richieste API
Includi la chiave API nell'header Authorization:
Authorization: Bearer sk_XXXX_YYYY
Endpoint RESTful
/api/v1/lipsync-videoVideo a video con sostituzione dell'audio (lipsync)
/api/v1/lipsync-imageImmagine + audio → avatar con un solo parlante
/api/v1/talking-avatarImmagine + audio + prompt -> avatar parlante con espressione e movimento controllati
/api/v1/lipsync-image-multiImmagine + doppio audio → avatar multi-parlante (conversazione/dialogo)
/api/v1/jobs/{requestId}Consulta lo stato del job e recupera il risultato
Input, privacy, copertura dei modelli e note di produzione
L’API pubblica attualmente accetta URL multimediali in JSON. Il caricamento diretto multipart e gli endpoint di upload asset non sono ancora disponibili. URL firmati o temporanei sono supportati se i nostri worker e il provider di generazione possono recuperarli durante l’esecuzione del job.
I job API vengono salvati con visibilità privata. Il toggle Public del web non si applica alle richieste API e attualmente non esiste un parametro API per pubblicare una generazione.
Seleziona il workflow tramite endpoint: lipsync-image, lipsync-video o lipsync-image-multi. Usa talking-avatar per il modello immagine con controllo di espressione e movimento.
Questa pagina è l’attuale riferimento API. Una specifica OpenAPI/Swagger leggibile da macchina non è attualmente pubblicata.
Aspect ratio, guidance scale e audio guidance non sono esposti come parametri API per gli endpoint lip-sync attuali.
Invia una richiesta API per ogni generazione. Per grandi batch di produzione, mantieni validi gli URL di input fino al completamento e contatta il supporto prima di usare concorrenza molto elevata.
Specifiche complete dell'endpoint
Tutti gli endpoint condividono una struttura comune: webhook opzionale e parametri specifici del modello in formState.
Sostituisce l'audio di un video mantenendo la sincronizzazione labiale
webhookopzionaleLa tua URL di callback (HTTPS). Inviamo il risultato via POST al termine.
formStateobbligatorioOggetto con tutti i parametri di generazione (vedi sotto).
videoobbligatorioURL pubblica del video sorgente (MP4, MOV, ecc.)
audioobbligatorioURL pubblica dell'audio (MP3, WAV, ecc.)
resolutionobbligatorio"360p", "480p", "720p", "1080p", "2k" o "4k"
mask_imageopzionaleURL pubblica della maschera (limita l'area di lipsync)
promptopzionaleTesto guida per lo stile
seedopzionaleSeed intero per la riproducibilità
Scegli come ricevere i risultati
Tutte le chiamate API sono asincrone. Hai due opzioni per recuperare i risultati:
Per job 1080p, 2k e 4k, le risposte webhook e polling restituiscono solo il video finale upscalato.
Fornisci una URL di webhook nel JSON. Invieremo il risultato via POST al termine.
Gli URL webhook devono essere URL HTTPS pubblici. Se la consegna fallisce, riproviamo fino a 5 volte con backoff esponenziale.
Ometti il webhook e usa il requestId restituito per interrogare GET /api/v1/jobs/{requestId} ogni 5–10 s finché lo stato non sia "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
}Esempi di integrazione pronti all’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();