Zur Navigation springen

Batch-Verarbeitung

Mehrere lipsync-Generierungen effizient verarbeiten

Die Sync Labs Batch-API verarbeitet bis zu 500 lip sync-Generierungen in einer einzigen Anfrage, gesendet als JSONL-Datei oder als JSON-Array von Zeilen. Sie ist für große Mengen kurzer Clips gedacht, zum Beispiel personalisierte Videokampagnen oder Content-Lokalisierung, bei denen die Ergebnisse über mehrere Stunden eintreffen können.

Wer kann die Batch-API nutzen?

Die Batch-API erfordert einen Scale-Plan oder höher und eine Freigabe für deine Organisation. Der Zugriff ist standardmäßig deaktiviert, auch bei neuen Scale-Abonnements. Kontaktiere den Support, um Zugriff anzufordern. Bestehende Nutzer benötigen ebenfalls eine Freigabe nach einer Prüfung von Nutzung und Abrechnung.

Ohne Freigabe erhält die Organisation 403 mit errorCode: batch_access_not_enabled, auch bei dry_run. Nach der Freigabe erhalten andere Pläne und kostenlose Konten 402 mit errorCode: plan_feature_unavailable. requiredPlan ist scale, bei Credit-Plänen enterprise.

Wird der Zugriff zum Erstellen entzogen, laufen bereits angenommene Batches weiter. Du kannst ihren Status abfragen und verfügbare Ergebnisse herunterladen.

  • Ein Batch enthält standardmäßig 20 bis 500 Einträge oder das eigene Limit deines Kontos.
  • Jeder aktive Batch belegt einen Platz deines Batch-Limits, das dem Concurrency-Limit deines Plans entspricht. Seine Einträge zählen nicht zur Concurrency von /v2/generate.
  • Die geschätzte Ausgabe jedes Eintrags darf höchstens 30 Sekunden lang sein. Ein längerer Eintrag schlägt in der Ergebnisdatei mit Input files exceed 30s duration, which is not supported in batch mode fehl, der Rest des Batches läuft weiter.
  • Jeder Eintrag wird wie die Generierung abgerechnet, die er ausführt.

Bei einer Multipart-Anfrage sende genau eine JSONL-Datei im Feld input (file funktioniert ebenfalls). Andere Dateifelder oder mehrere Dateien führen zu 400. Bei 503 upload_capacity_unavailable wird kein Batch erstellt. Wiederhole dieselbe Anfrage nach der in Retry-After angegebenen Wartezeit oder sende einen JSON-Body mit rows.

Wann Batch sinnvoll ist und wann nicht

Ein Batch ist eine Pipeline mit Warteschlange. Alle Einträge werden heruntergeladen und geprüft, bevor einer von ihnen startet, und Ergebnisse können Stunden dauern, mit einer angestrebten Bearbeitungszeit von bis zu 24 Stunden. Nutze ihn für große Mengen kurzer Clips, die nicht sofort fertig sein müssen.

Für ein paar Generierungen gleichzeitig ist er nicht gedacht. Dafür:

Batch-Concurrency-Limits

Wenn du bereits so viele Batches ausführst, wie das Concurrency-Limit deines Plans erlaubt, gibt die API 429 Too Many Requests mit errorCode: concurrency_limit_reached zurück:

{
"statusCode": 429,
"error": "Too Many Requests",
"errorCode": "concurrency_limit_reached",
"message": "Batch concurrency limit reached. You have 3 active batches and your plan allows 3. Please wait for existing batches to complete or upgrade your plan for higher limits.",
"activeBatches": 3,
"concurrencyLimit": 3,
"retryAfterSeconds": 20
}

Die Antwort enthält einen Header Retry-After (in Sekunden) und einen Header X-Sync-Concurrency-Limit. Statt sofort erneut zu versuchen, warte retryAfterSeconds oder bis einer deiner aktiven Batches fertig ist.

Wie erstelle ich einen Batch-Job?

1

Eingabedatei vorbereiten

Erstelle eine JSON Lines-Datei (.jsonl) mit deinen Generierungsanfragen. Jede Zeile sollte eine eindeutige request_id, den endpoint (muss "/v2/generate" sein) und ein payload im Standardformat der Generierungsanfrage enthalten (wie bei der Generierungs-API). Die Datei muss im JSON Lines-Format (.jsonl) vorliegen, höchstens 5 MB groß sein und standardmäßig 20 bis 500 Einträge enthalten.

input.jsonl
{"request_id": "request-1", "endpoint": "/v2/generate", "payload": {"model": "lipsync-2", "input": [{"type": "video", "url": "https://assets.sync.so/docs/example-video.mp4"}, {"type": "audio", "url": "https://assets.sync.so/docs/example-audio.wav"}]}}
{"request_id": "request-2", "endpoint": "/v2/generate", "payload": {"model": "lipsync-2", "input": [{"type": "video", "url": "https://assets.sync.so/docs/example-video.mp4"}, {"type": "audio", "url": "https://assets.sync.so/docs/example-audio.wav"}]}}
2

Einen Batch erstellen

from sync import Sync
sync = Sync()
batch = sync.batch.create(
input=open("input.jsonl", "rb")
)
print(f"Batch created with ID: {batch.id}")

Statt eine Datei hochzuladen, kannst du application/json mit den Einträgen in rows senden. Jedes Element von rows ist dasselbe Objekt wie eine Zeile der JSONL-Datei, und beide Formen werden gleich validiert: die oben genannten Eintragslimits, höchstens 5 MB im JSONL-Format und eindeutige request_id-Werte. Wenn ein Eintrag abgelehnt wird, nennt der Fehler dessen Zeile. Ablehnungen bei Dialogbearbeitungen geben sie im Feld lineNumber zurück; andere Fehler zu einem Eintrag, etwa ungültiges JSON oder eine fehlende request_id, nennen sie nur in message (zum Beispiel Record at line 4: payload is required). Gezählt werden nicht leere Einträge, nicht physische Zeilen, Leerzeilen in einer JSONL-Datei werden also übersprungen; bei einem JSON-Body entspricht Zeile N rows[N-1]. Die Beispiele oben zeigen der Kürze halber zwei Einträge; ein Batch braucht mindestens 20.

Optionale Parameter:

  • webhook_url: Benachrichtigungen erhalten, wenn der Batch abgeschlossen ist
  • dry_run: Auf true setzen, um deine Eingabe ohne Verarbeitung zu validieren. Eine gültige Eingabe gibt {"status": "VALIDATED"} zurück und erstellt keinen Batch.

Die Batch-Erstellung ist nicht durch idempotente Anfragen abgedeckt. Wenn bei einer Erstellungsanfrage ein Timeout auftritt, liste deine Batches mit GET /v2/batch auf, bevor du erneut einreichst, damit du dieselben Zeilen nicht zweimal ausführst.

3

Batch-Status prüfen

Überwache den Fortschritt deines Batches, indem du den Status pollst:

batch = sync.batch.get(batch_id)
print(f"Status: {batch.status}")
print(f"Progress: {batch.metrics}")

Ein Batch kann einen der folgenden Status haben:

  1. PENDING: Batch erstellt, wartet auf den Verarbeitungsstart
  2. PROCESSING: Generierungen werden verarbeitet
  3. COMPLETED: Alle Generierungen sind abgeschlossen (erfolgreich oder mit Fehlern)
  4. FAILED: Batch-Verarbeitung ist vollständig fehlgeschlagen
4

Batch-Ergebnisse prüfen

Wenn ein Batch abgeschlossen ist, stehen die Ergebnisse als JSON Lines-Datei unter der outputUrl der Antwort von get batch bereit. Ein GET auf diese URL gibt eine Weiterleitung 302 auf eine signierte Ergebnisdatei zurück. Clients, die Weiterleitungen automatisch folgen, können die JSONL-Antwort direkt lesen. Jede Zeile enthält:

output.jsonl
{"request_id": "request-1", "endpoint": "/v2/generate", "payload": {...}, "status": "COMPLETED", "error": null, "response": {...}, "updated_at": "2024-01-15T10:35:00Z"}
{"request_id": "request-2", "endpoint": "/v2/generate", "payload": {...}, "status": "FAILED", "error": {"code": "INVALID_INPUT", "message": "..."}, "response": null, "updated_at": "2024-01-15T10:35:00Z"}

Das Feld response enthält dieselben Daten wie einzelne Antworten der Generierungs-API. Feldnamen in der Ergebnisdatei sind in snake_case, das Video einer abgeschlossenen Zeile liegt also unter response.output_url und ihre Generierungs-ID unter response.id. Ordne jede Zeile anhand der request_id deiner Eingabe zu.

Ein vollständiges, funktionierendes Beispiel findest du im Batch-Verarbeitungsbeispiel in unserem Beispiel-Repository.

Webhook-Benachrichtigungen

Wenn du eine webhook_url angibst, erhältst du eine POST-Benachrichtigung, wenn dein Batch abgeschlossen ist oder fehlschlägt. Sie ist wie Generierungs-webhooks mit einem Sync-Signature-Header signiert und folgt denselben Wiederholungsregeln: bis zu 6 Versuche über etwa 2 Stunden, mit demselben Sync-Delivery-Id-Header bei jedem Versuch.

Anders als die Antwort von Get Batch verwendet der webhook-Payload Feldnamen in camelCase:

webhook_payload.json
{
"id": "batch_abc123",
"createdAt": "2024-01-15T10:30:00Z",
"status": "COMPLETED",
"webhookUrl": "https://your-webhook-url.com/batch-webhook",
"metrics": {
"totalGenerations": 5,
"successCount": 4,
"failedCount": 1,
"pendingCount": 0
},
"options": {},
"outputUrl": "https://api.sync.so/v2/batches/batch_abc123/result"
}

Der webhook für den Batch-Abschluss kann für denselben Batch mehr als einmal zugestellt werden. Verwende den Header Sync-Delivery-Id oder die id des Batches, um Benachrichtigungen zu ignorieren, die du bereits verarbeitet hast.

Dialogbearbeitungs-Zeilen (früher Zugriff)

Eine Batch-Zeile kann eine abgeschlossene Vorschau einer Dialogbearbeitung rendern, statt ein Video mit neuem Audio zu kombinieren. So machst du aus einem aufgenommenen Video viele Varianten, zum Beispiel eine pro Empfängername. Personalisierte Videobotschaften enthält ein vollständiges Skript.

Dialogbearbeitungs-Zeilen befinden sich im frühen Zugriff und werden pro Organisation aktiviert. Kontaktiere uns, um sie freischalten zu lassen. Bis dahin werden Zeilen mit dialogueEdit beim Einreichen abgelehnt.

Das payload jeder Zeile enthält:

  • model, zum Beispiel sync-3.
  • input mit genau einem Video: demselben Quellvideo, aus dem die Vorschau erstellt wurde.
  • dialogueEdit: {"id": "..."}: die ID einer abgeschlossenen Vorschau aus POST /v2/dialogue-edits in deiner Organisation.

Füge keine Audio- oder Texteingaben, segments oder dubParams hinzu; die Vorschau liefert das Audio.

{
"rows": [
{
"request_id": "line-2",
"endpoint": "/v2/generate",
"payload": {
"model": "sync-3",
"input": [{"type": "video", "url": "https://assets.sync.so/docs/example-video.mp4"}],
"dialogueEdit": {"id": "7644754c-bdfc-4d51-a78f-e0cb0cbbd40f"}
}
}
],
"dry_run": true
}

Dieselben Zeilenobjekte funktionieren auch als Zeilen in einer hochgeladenen JSONL-Datei.

Beim Einreichen wird jede Dialogbearbeitungs-Zeile genau zu der Anfrage erweitert, die POST /v2/generate für diese Vorschau erstellt, und sie wird genauso abgerechnet wie diese Generierung. Das payload in der Ergebnisdatei zeigt die erweiterte Anfrage (das Video, das Vorschau-Audio und die bearbeiteten Segmente), nicht die Zeile, die du gesendet hast. Sende den Batch zuerst mit dry_run: true: Damit laufen alle unten aufgeführten Prüfungen, einschließlich der Erweiterung, ohne dass etwas gerendert wird.

  • Alle Dialogbearbeitungs-Zeilen in einem Batch müssen Vorschauen verwenden, die aus demselben Quellvideo erstellt wurden. Für mehrere Videos reichst du einen Batch pro Video ein.
  • Es gelten die üblichen Batch-Limits: standardmäßig 20 bis 500 Einträge und 5 MB. Bei der Erweiterung werden jeder Zeile das Vorschau-Audio und die bearbeiteten Segmente hinzugefügt. Das Limit von 5 MB gilt auch für den erweiterten Batch. Ein gesendeter Batch unter 5 MB kann deshalb mit einem Dateigrößenfehler und Status 400 abgelehnt werden. Auch ein Testlauf meldet diesen Fehler. Teile die Zeilen dann in kleinere Batches auf.
  • Die meisten Vorschauen werden als bearbeitete Segmente des Videos gerendert. Eine Vorschau, die sich nur als lip sync über das gesamte Video rendern lässt, wird in einem Batch nur akzeptiert, wenn dieses Rendering 30 Sekunden oder kürzer ist; längere renderst du mit POST /v2/generate.

Ablehnungen bei Dialogbearbeitungen

Wenn eine Dialogbearbeitungs-Zeile nicht gerendert werden kann, wird die gesamte Anfrage abgelehnt und kein Batch erstellt. Die Antwort enthält den errorCode, den POST /v2/generate für diese Vorschau zurückgeben würde, sowie die lineNumber der ersten fehlerhaften Zeile:

{
"statusCode": 422,
"errorCode": "dialogue_edit_not_found",
"lineNumber": 3,
"message": "Record at line 3: The dialogue edit was not found in this organization."
}
errorCodeStatusUrsacheLösung
dialogue_edit_not_found422Die ID ist unbekannt oder gehört zu einer anderen Organisation.Verwende eine Vorschau, die deine Organisation erstellt hat.
dialogue_edit_not_completed422Die Vorschau ist noch PENDING oder PROCESSING, oder sie ist FAILED.Solange sie aussteht oder verarbeitet wird, polle GET /v2/dialogue-edits/{id}, bis sie abgeschlossen ist, und reiche dann ein. Eine FAILED-Vorschau ist endgültig: Erstelle eine neue.
dialogue_edit_source_mismatch422Das Video der Zeile ist nicht das Video, aus dem die Vorschau erstellt wurde.Sende das ursprüngliche Quellvideo der Vorschau.
dialogue_edit_retime_required422Der Vorschau fehlt das Retiming, das sie zum Rendern braucht (segmentLipsyncEnabled oder sectionExpansionEnabled ist bei ihr false).Erstelle eine neue Vorschau. Wenn sie weiterhin false meldet, kontaktiere uns.
dialogue_edit_removal_too_large422Die Bearbeitung entfernt mehr Sprache, als das umgebende Filmmaterial auffangen kann.Stelle einige Wörter wieder her und erstelle eine neue Vorschau.
dialogue_edit_audio_conflict422Die Zeile enthält zusätzlich eine Audio- oder Texteingabe, segments oder dubParams.Sende nur die Videoeingabe und dialogueEdit.
dialogue_edit_unsupported422Die API kann diese Vorschau nicht rendern; dazu zählt auch ein Rendering des gesamten Videos, das länger als 30 Sekunden ist.Erstelle mit einem API-Schlüssel eine neue Vorschau für das gesamte Video oder rendere diese mit POST /v2/generate.
dialogue_edit_batch_mixed_sources422Die Vorschauen im Batch stammen aus unterschiedlichen Quellvideos.Reiche einen Batch pro Quellvideo ein.
generation_input_validation_failed400dialogueEdit ist kein Objekt mit einer UUID als id, oder input enthält nicht genau ein Video.Korrigiere die Struktur der Zeile.

Es wird nur die erste fehlerhafte Zeile gemeldet. Korrigiere sie und wiederhole den Testlauf, bis er {"status": "VALIDATED"} zurückgibt.

Verwandte Ressourcen

  • Rate Limits — API rate limit verstehen, um deine Batch-Größen wirksam zu planen
  • Webhooks Guide — webhook-Benachrichtigungen für Batch-Abschlussereignisse einrichten
  • Fehlerbehandlung — Referenz für Batch-spezifische Fehlercodes und Fehlerbehebung