> For the documentation index, fetch https://sync.so/docs/llms.txt. Append .md to a page URL for Markdown. Documentation-search MCP: https://sync.so/docs/_mcp/server.

# API-Anleitung für Videosynchronisation

> Schritt-für-Schritt-Anleitung zum Erstellen einer Videoüberspielung pipeline mit dem sync. labs lip sync API. Kombinieren Sie TTS mit Lipsync für die mehrsprachige Videoüberspielung mit Python oder TypeScript.

Bei der Videosynchronisation werden übersetzte Audioinhalte mit lippensynchronen Videos kombiniert, sodass synchronisierte Inhalte in der Zielsprache natürlich aussehen. Sie können entweder den integrierten Synchronisierungsablauf von Sync Labs mit `dubParams` verwenden oder selbst übersetztes Audio bereitstellen und Sync Labs für den lip syncsschritt verwenden.

## Voraussetzungen - A [Sync Labs API Schlüssel](https://sync.so/settings/api-keys) - Ein Quellvideo (URL oder hochgeladenes Asset) - Für integriertes Überspielen: Quellaudio in der Videodatei - Für manuelles Überspielen: übersetztes Audio in der Zielsprache (von einem TTS-Dienst oder einem menschlichen Synchronsprecher)

Installieren Sie den SDK für Ihre Sprache:

```bash
# Python
pip install syncsdk

# TypeScript
npm i @sync.so/sdk
```

Legen Sie Ihren API-Schlüssel fest:

```bash
export SYNC_API_KEY="your-api-key"
```

## Integriertes API-Überspielen mit `dubParams`

Verwenden Sie `dubParams`, wenn Sie möchten, dass Sync Labs das Quellaudio aus dem Video extrahiert, es über ElevenLabs übersetzt und überspielt und dann die lip sync für das überspielte Ergebnis durchführt. Dies ist der einfachste Weg, wenn Ihr Eingabevideo bereits über Quellaudio verfügt.
Wenn `dubParams` vorhanden ist: - Stellen Sie einen einzelnen `video`-Eingang mit Audio bereit - Stellen Sie `dubParams.targetLang` auf den Zielsprachencode ein, z. B. `"es"`, `"fr"` oder `"hi"` - optionales Set `dubParams.sourceLang`; Lassen Sie es weg oder verwenden Sie `"auto"` für die automatische Erkennung der Quellsprache - `dubParams.numSpeakers` ist veraltet und wird ignoriert - Synchronisation v2 erkennt Lautsprecher automatisch - Fügen Sie keinen separaten Audioeingang für den übersetzten Titel hinzu. Audioeingänge werden ignoriert, während das Überspielen aktiviert ist

**`dub_with_params.ts`**

```typescript dub_with_params.ts
import \{ SyncClient } from "@sync.so/sdk";

const sync = new SyncClient();

const response = await sync.generations.create(\{
    input: [
        \{
            type: "video",
            url: "https://your-cdn.com/original-video-with-audio.mp4",
        },
    ],
    model: "lipsync-2",
    dubParams: \{
        providerName: "elevenlabs",
        targetLang: "es",
        sourceLang: "auto",
    },
});

console.log(`Dubbing job submitted: $\{response.id}`);
```

\<Note>
Die integrierte Synchronisierung wird durch ElevenLabs unterstützt. Wenn das Video kein verwendbares Quellaudio hat, stellen Sie stattdessen Ihr eigenes übersetztes Audio bereit und folgen Sie der Anleitung pipeline unten.
\</Note>

## Manuelle Synchronisationspipeline

\<Steps>
\<Step title="Bereiten Sie Ihr übersetztes Audio vor">
Generieren Sie übersetzte Audiodaten mit einem Text-zu-Sprache-Dienst wie ElevenLabs, Google Cloud TTS oder Amazon Polly. Sie können auch einen menschlichen Synchronsprecher einsetzen. Das Audio muss auf einem öffentlich zugänglichen URL gehostet werden.
Wenn Sie bereits über eine übersetzte Audiodatei verfügen, laden Sie diese auf Ihren Hosting-Dienst hoch und schnappen Sie sich den URL.
\</Step>
\<Step title="Senden Sie an Sync Labs API">
Senden Sie das Quellvideo und das übersetzte Audio an den Sync Labs API. Der API generiert neue Lippenbewegungen passend zum übersetzten Audio.
\<CodeBlocks>    \`\`\`typescript dub.ts
import \{ SyncClient } from "@sync.so/sdk";

const sync = new SyncClient();

// Source video with original language
const videoUrl = "[https://your-cdn.com/original-video.mp4](https://your-cdn.com/original-video.mp4)";
// Translated audio in target language
const dubbedAudioUrl = "[https://your-cdn.com/translated-audio-spanish.wav](https://your-cdn.com/translated-audio-spanish.wav)";

const response = await sync.generations.create(\{
input: \[
\{ type: "video", url: videoUrl },
\{ type: "audio", url: dubbedAudioUrl },
],
model: "lipsync-2",
options: \{ sync\_mode: "cut\_off" },
});

const jobId = response.id;
console.log(`Synchronisation job submitted: $\{jobId}`);

````

```python dub.py
import time
from sync import Sync
from sync.common import Audio, Video, GenerationOptions

sync = Sync()

# Source video with original language
video_url = "https://your-cdn.com/original-video.mp4"
# Translated audio in target language
dubbed_audio_url = "https://your-cdn.com/translated-audio-spanish.wav"

response = sync.generations.create(
    input=[
        Video(url=video_url),
        Audio(url=dubbed_audio_url),
    ],
    model="lipsync-2",
    options=GenerationOptions(sync_mode="cut_off"),
)

job_id = response.id
print(f"Synchronisation job submitted: \{job_id}")
````

\</CodeBlocks>
\</Step>
\<Step title="Umfrage zum Abschluss">
Überprüfen Sie den Generierungsstatus, bis er abgeschlossen ist. Verwenden Sie für Produktionssysteme [webhooks](/api-reference/guides/webhooks) anstelle von Polling.
\<CodeBlocks>    \`\`\`typescript
let generation = await sync.generations.get(jobId);
while (!\["COMPLETED", "FAILED", "REJECTED"].includes(generation.status)) \{
console.log(`Status: $\{generation.status}`);
await new Promise((r) => setTimeout(r, 10000));
generation = await sync.generations.get(jobId);
}

if (generation.status === "COMPLETED") \{
console.log(`Dubbed video ready: $\{generation.outputUrl}`);
} else \{
console.log(`Dubbing failed for job $\{jobId}`);
}

````

```python
generation = sync.generations.get(job_id)
while generation.status not in ["COMPLETED", "FAILED", "REJECTED"]:
    print(f"Status: \{generation.status}")
    time.sleep(10)
    generation = sync.generations.get(job_id)

if generation.status == "COMPLETED":
    print(f"Dubbed video ready: \{generation.output_url}")
else:
    print(f"Dubbing failed for job \{job_id}")
````

\</CodeBlocks>
\</Step>
\<Step title="Laden Sie das synchronisierte Video herunter">
Der `output_url` (Python) oder `outputUrl` (TypeScript) enthält einen direkten Link zum synchronisierten Video. Laden Sie es herunter oder geben Sie es an Ihre Lieferung pipeline weiter.
\</Step>
\</Steps>

## Verwendung der ElevenLabs-Integration

Sync Labs verfügt über eine integrierte ElevenLabs-Integration, die Text-zu-Sprache und lip sync in einem einzigen API-Anruf übernimmt. Anstatt Audio separat zu generieren, übergeben Sie den übersetzten Text direkt.
\<CodeBlocks>\`\`\`typescript dub\_with\_elevenlabs.ts
import \{ SyncClient } from "@sync.so/sdk";

const sync = new SyncClient();

const response = await sync.generations.create(\{
input: \[
\{
type: "video",
url: "[https://your-cdn.com/original-video.mp4](https://your-cdn.com/original-video.mp4)",
},
\{
type: "text",
provider: \{
name: "elevenlabs",
voiceId: "EXAVITQu4vr4xnSDxMaL",
script: "Hola, bienvenidos a nuestra plataforma. Hoy les mostraremos las nuevas funciones.",
stability: 0.5,
similarityBoost: 0.75,
},
},
],
model: "lipsync-2",
options: \{ sync\_mode: "cut\_off" },
});

console.log(`Job ID: $\{response.id}`);

````

```python dub_with_elevenlabs.py
from sync import Sync
from sync.common import Video, TTS, GenerationOptions

sync = Sync()

response = sync.generations.create(
    input=[
        Video(url="https://your-cdn.com/original-video.mp4"),
        TTS(
            provider=\{
                "name": "elevenlabs",
                "voiceId": "EXAVITQu4vr4xnSDxMaL",
                "script": "Hola, bienvenidos a nuestra plataforma. Hoy les mostraremos las nuevas funciones.",
                "stability": 0.5,
                "similarityBoost": 0.75,
            }
        ),
    ],
    model="lipsync-2",
    options=GenerationOptions(sync_mode="cut_off"),
)

print(f"Job ID: \{response.id}")
````

\</CodeBlocks>
\<Note>
Das Feld `script` hat maximal 5.000 Zeichen pro Generation. Teilen Sie längere Skripte in Segmente auf. Einzelheiten zur ElevenLabs-Einrichtung finden Sie auf der Seite [Integrationen](/docs/product/integrations).
\</Note>

## Unterstützte Sprachen

Die Lipsync-Modelle von Sync Labs sind sprachunabhängig. Sie arbeiten mit Audio in jeder Sprache - die Modelle analysieren Mundformen anhand der Audiowellenform, nicht anhand der Sprache selbst. Wenn Ihr übersetzter Ton klar und gut produziert ist, stimmt die lip syncsausgabe überein.
Wählen Sie für den integrierten `dubParams`-Flow einen der unterstützten `targetLang`-Codes in der API-Referenz. Wenn Sie eine Sprache außerhalb dieser Liste benötigen oder mehr Kontrolle über die Übersetzung wünschen, generieren oder zeichnen Sie die übersetzten Audiodaten separat auf und verwenden Sie das Handbuch pipeline oben.
Eine vollständige Komplettlösung für die Übersetzung von pipeline (Transkription, Übersetzung, TTS und Lipsync) finden Sie im [Video Translation API-Handbuch](/tutorials/video-translation-api-guide).

## Synchronisation mit mehreren Sprechern

Bei Videos mit mehreren Sprechern nutzen Sie die Segmente API, um unterschiedliche Audiospuren unterschiedlichen Zeitbereichen zuzuordnen. Jedes Segment kann auf einen separaten Audioeingang mit einer bestimmten Stimme verweisen.

```python
from sync import Sync
from sync.common import Audio, Video

sync = Sync()

response = sync.generations.create(
    input=[
        Video(url="https://your-cdn.com/interview.mp4"),
        Audio(url="https://your-cdn.com/speaker-a-spanish.wav", ref_id="speaker_a"),
        Audio(url="https://your-cdn.com/speaker-b-spanish.wav", ref_id="speaker_b"),
    ],
    segments=[
        \{"startTime": 0, "endTime": 15, "audioInput": \{"refId": "speaker_a"}},
        \{"startTime": 15, "endTime": 30, "audioInput": \{"refId": "speaker_b"}},
    ],
    model="lipsync-2",
)
```

Eine vollständige Dokumentation und weitere Beispiele finden Sie im [Segment-Leitfaden](/developer-guides/segments).

## Leistungstipps

\<CardGroup cols=\{1}>
\<Card title="Verwenden Sie webhooks für die Produktion" icon="bell">
Ersetzen Sie die Abfrage durch [webhooks](/api-reference/guides/webhooks) für Produktions-pipelines. Sie erhalten eine POST-Benachrichtigung, wenn der Auftrag abgeschlossen ist, wodurch unnötige API-Aufrufe vermieden werden.
\</Card>
\<Card title="Verwenden Sie die batch-Verarbeitung für die Massenüberspielung" icon="layer-group">
Eine ganze Videobibliothek überspielen? Mit dem [Batch-API](/api-reference/guides/batch-processing) können Sie bis zu 500 Generationen in einem einzigen Vorgang mit einer Bearbeitungszeit von 24 Stunden einreichen.
\</Card>
\<Card title="Wählen Sie das richtige Modell" icon="sliders">
Verwenden Sie **[lipsync-2](/models/lipsync)** für die meisten Synchronisationsaufträge. Verwenden Sie **[sync-3](/models/sync-3)** für Synchronisation in Produktionsqualität, komplexe Szenen, Hindernisse, Profilwinkel oder 4K-Ausgabe. Wechseln Sie zu **[lipsync-2-pro](/models/lipsync)**, wenn Sie erstklassige Gesichtsdetails zu einem günstigeren Preis als sync-3 benötigen.
\</Card>
\<Card title="Passen Sie die Audiodauer an" icon="clock">
Stellen Sie `sync_mode` ein, um zu steuern, was passiert, wenn Audio- und Videolängen unterschiedlich sind. `cut_off` schneidet überschüssiges Audio ab. `bounce` wiederholt das Video, um es an die Audiolänge anzupassen. Die vollständige Verhaltensmatrix finden Sie unter [Sync-Modus](/developer-guides/sync-mode).
\</Card>
\</CardGroup>
\<llms-ignore>

## Nächste Schritte - [Video Translation API-Anleitung](/tutorials/video-translation-api-guide) - Erstellen Sie eine vollständige Transkription-zu-Lipsync-pipeline - [Batch-API](/api-reference/guides/batch-processing) - Hunderte von Synchronisationsaufträgen gleichzeitig verarbeiten - [Segment-Leitfaden](/developer-guides/segments) - Behandeln Sie Videos mit mehreren Sprechern - [Leitfaden für Lip sync mit Text-zu-Sprache](/tutorials/text-to-speech-lipsync) - Kombinieren Sie TTS mit Lipsync

\</llms-ignore>