Erzeuge Lip-Sync-Videos programmatisch mit unserer leistungsstarken REST-API
Verwalte deine Authentifizierungsschlüssel
Gib einen einprägsamen Namen an (optional)
Anmeldung erforderlich
Bitte melde dich an, um API-Schlüssel zu erstellen und zu verwalten.
Starte mit flexiblen und wettbewerbsfähigen Tarifen
Hinweis: API-Credits und Benutzer-Credits sind unabhängig und nicht austauschbar.
Schütze deine API-Anfragen
Füge den API-Schlüssel in allen Anfragen im Authorization-Header ein:
Authorization: Bearer sk_XXXX_YYYY
RESTful API-Endpunkte
/api/v1/lipsync-videoVideo-zu-Video mit Audiotausch (Lip-Sync beibehalten)
/api/v1/lipsync-imageBild + Audio → Einsprecher-Avatar
/api/v1/talking-avatarBild + Audio + Prompt -> Talking Avatar mit steuerbarer Mimik und Bewegung
/api/v1/lipsync-image-multiBild + zwei Audios → Mehrsprecher-Avatar (Gespräch/Dialog)
/api/v1/jobs/{requestId}Jobstatus abfragen und Ergebnis abrufen
Eingaben, Datenschutz, Modellabdeckung und Produktionshinweise
Die öffentliche API akzeptiert derzeit Medien-URLs in JSON. Direkter multipart-Dateiupload und Asset-Upload-Endpunkte sind noch nicht verfügbar. Signierte oder temporäre URLs werden unterstützt, solange unsere Worker und der Generierungsanbieter sie während der Jobausführung abrufen können.
API-Jobs werden mit privater Sichtbarkeit gespeichert. Der Web-Schalter Public gilt nicht für API-Anfragen, und derzeit gibt es keinen API-Parameter, um eine Generierung zu veröffentlichen.
Wählen Sie den Workflow über den Endpunkt: lipsync-image, lipsync-video oder lipsync-image-multi. Verwenden Sie talking-avatar für das Bildmodell mit Mimik- und Bewegungssteuerung.
Diese Seite ist die aktuelle API-Referenz. Eine maschinenlesbare OpenAPI/Swagger-Spezifikation ist derzeit nicht veröffentlicht.
Seitenverhältnis, guidance scale und audio guidance sind für die aktuellen Lip-Sync-Endpunkte nicht als API-Parameter verfügbar.
Senden Sie eine API-Anfrage pro Generierung. Bei großen Produktionsbatches müssen Eingabe-URLs bis zum Abschluss gültig bleiben; kontaktieren Sie den Support vor sehr hoher Parallelität.
Vollständige Endpunktspezifikationen
Alle Endpunkte teilen eine gemeinsame Struktur: optionaler webhook und modellspezifische formState-Parameter.
Ersetzt die Tonspur eines bestehenden Videos unter Beibehaltung des Lip-Syncs
webhookoptionalDeine Callback-URL (HTTPS). Wir senden das Ergebnis per POST nach Abschluss.
formStateerforderlichObjekt mit allen Generierungsparametern (siehe unten).
videoerforderlichÖffentliche URL des Quellvideos (MP4, MOV, etc.)
audioerforderlichÖffentliche URL des Audios (MP3, WAV, etc.)
resolutionerforderlich"360p", "480p", "720p", "1080p", "2k" oder "4k"
mask_imageoptionalÖffentliche URL des Maskenbilds (beschränkt den Lip-Sync-Bereich)
promptoptionalText für Stilvorgaben
seedoptionalGanzzahliger Seed für Reproduzierbarkeit
Wähle, wie du Ergebnisse erhältst
Alle API-Aufrufe sind asynchron. Sie haben zwei Möglichkeiten, Ergebnisse abzurufen:
Bei 1080p-, 2k- und 4k-Jobs geben Webhook- und Polling-Antworten nur das finale hochskalierte Video zurück.
Gib eine webhook-URL im JSON an. Wir senden das Ergebnis per POST nach Abschluss.
Webhook-URLs müssen öffentliche HTTPS-URLs sein. Wenn die Zustellung fehlschlägt, versuchen wir es bis zu 5 Mal mit exponentiellem Backoff erneut.
Lass webhook weg und nutze die zurückgegebene requestId, um alle 5–10 s GET /api/v1/jobs/{requestId} abzufragen, bis der Status "completed" ist.
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
}Sofort nutzbare Integrationsbeispiele
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();