ElevenLabs Dubbing
Übersetzen Sie Audio oder Video in andere Sprachen, während die Originalstimmen der Sprecher erhalten bleiben. Erstellen Sie ein Projekt aus einer Datei oder URL, prüfen und bearbeiten Sie das Quelltranskript, fügen Sie eine oder mehrere Zielsprachen hinzu, verfeinern Sie Übersetzungen pro Segment und generieren Sie die Ausgabe neu.
Wichtig: Verwenden Sie die Dubbing Projects API –
elevenlabs.dubbing.project.*in den SDKs oder die REST-Endpunkte/v1/dubbing/project. Verwenden Sie nicht die veraltete v1-Dubbing-Oberfläche (client.dubbing.create(),client.dubbing.get(),client.dubbing.audio.get()oder bloße/v1/dubbing-Routen) – dies ist die ältere Dubbing-API, die sich jetzt unter „Legacy“ in der API-Referenz befindet.
Einrichtung: Siehe Installationsanleitung. Die REST-Basis-URL ist
https://api.elevenlabs.iomit Ihrem API-Schlüssel imxi-api-key-Header; die SDKs lesenELEVENLABS_API_KEYautomatisch aus.
Konzepte
| Konzept | Bedeutung |
|---|---|
| Projekt | Eine Quelle von Medien (Datei oder URL) plus zugehöriges Quelltranskript. Einmal vorbereitet (transkribiert), verbleibt es im Status ready, während Sie Sprachen hinzufügen. |
| Quelltranskript | Bearbeitbare Segmente (Text, Sprecher, Zeitangaben), die aus der Quelle transkribiert wurden. Die einzige Quelle der Wahrheit, von der jede Sprache übersetzt wird. |
| Sprache (Ziel) | Eine ausgegebene Dubbing-Sprache. Jede hat ihr eigenes Transkript (Quellsegmente + eine Übersetzung pro Segment) und ihre eigene Dubbing-Audioausgabe. |
| Revisionen | Unabhängige monotone Zähler. Die revision des Projekts erhöht sich bei Bearbeitungen des Quelltranskripts; die revision einer Sprache erhöht sich bei Übersetzungsbearbeitungen oder Quellbearbeitungen, die sie betreffen. Die output_revision einer Sprache ist die Revision, aus der ihr aktuelles Audio generiert wurde – wenn sie hinter der revision liegt, ist die Ausgabe veraltet. |
Empfohlene Vorgehensweise: Finalisieren Sie das Quelltranskript bevor Sie Sprachen hinzufügen. Übersetzungen werden aus der Quelle erstellt. Wenn Sie zuerst die Quelle korrigieren, beginnen alle Sprachen mit dem richtigen Text – eine Bearbeitung der Quelle nach Abschluss einer Sprache markiert diese als stale und erfordert eine (kostenpflichtige) Neugenerierung.
Enterprise: Die Transkriptbearbeitung und -neugenerierung sind nur für Enterprise-Workspaces verfügbar. Das Erstellen von Projekten, das Hinzufügen von Sprachen und das Herunterladen von Dubs funktioniert mit allen Tarifen.
Workflow
- Erstellen Sie das Projekt aus einer Datei oder URL →
queued - Poll das Projekt ab, bis es
readyist - Prüfen und finalisieren Sie das Quelltranskript (Segmente bearbeiten/hinzufügen/löschen)
- Hinzufügen Sie eine Sprache pro Ziel →
queued→processing→completed - Herunterladen Sie die
outputs.lossless_audiojeder Sprache, wenn siecompletedist - Verfeinern Sie Übersetzungen pro Segment, falls nötig → die Sprache wird
stale - Neugenerieren Sie die Sprache → erneut
completedmit frischer Ausgabe
Kurzanleitung (Python)
import os
import time
import requests
from elevenlabs.client import ElevenLabs
elevenlabs = ElevenLabs(api_key=os.getenv("ELEVENLABS_API_KEY"))
# 1. Ein Projekt aus einer lokalen Datei erstellen (oder source_url=... anstelle von file übergeben)
with open("promo.mp4", "rb") as f:
project = elevenlabs.dubbing.project.create(
file=f,
source_language="en",
reference="Q3 marketing video",
)
# 2. Warten, bis die Quellmedien transkribiert sind
while True:
project = elevenlabs.dubbing.project.get(project.project_id)
if project.status == "ready":
break
if project.status == "failed":
raise RuntimeError("Projektvorbereitung fehlgeschlagen")
time.sleep(5)
# 3. Spanisch als Zielsprache hinzufügen
language = elevenlabs.dubbing.project.language.create(
project.project_id,
target_language="es",
)
# 4. Warten, bis die Synchronisation abgeschlossen ist
while True:
language = elevenlabs.dubbing.project.language.get(
project.project_id, language.language_id
)
if language.status == "completed":
break
if language.status == "failed":
raise RuntimeError("Synchronisation fehlgeschlagen")
time.sleep(5)
# 5. Die synchronisierte Audio herunterladen (signierte URL, ~1 Stunde gültig – Sprache erneut abrufen für eine neue)
audio = requests.get(language.outputs.lossless_audio)
with open("promo_es.wav", "wb") as f:
f.write(audio.content)
Kurzanleitung (JavaScript)
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import { writeFile } from "fs/promises";
const elevenlabs = new ElevenLabsClient();
// 1. Projekt erstellen (sourceUrl gezeigt; Datei-Upload wird ebenfalls unterstützt)
let project = await elevenlabs.dubbing.project.create({
sourceUrl: "https://example.com/promo.mp4",
sourceLanguage: "en",
reference: "Q3 marketing video",
});
// 2. Warten, bis die Quellmedien transkribiert sind
while (true) {
project = await elevenlabs.dubbing.project.get(project.projectId);
if (project.status === "ready") break;
if (project.status === "failed") throw new Error("Projektvorbereitung fehlgeschlagen");
await new Promise((resolve) => setTimeout(resolve, 5000));
}
// 3. Spanisch als Zielsprache hinzufügen
let language = await elevenlabs.dubbing.project.language.create(project.projectId, {
targetLanguage: "es",
});
// 4. Warten, bis die Synchronisation abgeschlossen ist
while (true) {
language = await elevenlabs.dubbing.project.language.get(project.projectId, language.languageId);
if (language.status === "completed") break;
if (language.status === "failed") throw new Error("Synchronisation fehlgeschlagen");
await new Promise((resolve) => setTimeout(resolve, 5000));
}
// 5. Die synchronisierte Audio von der signierten URL herunterladen
const response = await fetch(language.outputs!.losslessAudio!);
await writeFile("promo_es.wav", Buffer.from(await response.arrayBuffer()));
Kurzanleitung (cURL)
# 1. Ein Projekt erstellen (verwenden Sie -F "source_url=https://..." anstelle von file, um von einer URL zu dubben)
curl -X POST "https://api.elevenlabs.io/v1/dubbing/project" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-F "[email protected]" \
-F "source_language=en"
# → {"project_id": "proj_...", "status": "queued", ...}
# 2. Abfragen, bis der Status "ready" ist
curl "https://api.elevenlabs.io/v1/dubbing/project/proj_..." \
-H "xi-api-key: $ELEVENLABS_API_KEY"
# 3. Eine Zielsprache hinzufügen
curl -X POST "https://api.elevenlabs.io/v1/dubbing/project/proj_.../language" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"target_language": "es"}'
# 4. Die Sprache abfragen, bis sie "completed" ist, dann outputs.lossless_audio herunterladen
curl "https://api.elevenlabs.io/v1/dubbing/project/proj_.../language/lang_..." \
-H "xi-api-key: $ELEVENLABS_API_KEY"
Optionen beim Erstellen
POST /v1/dubbing/project akzeptiert multipart/form-data mit entweder file oder source_url (nicht beides):
| Feld | Erforderlich | Hinweise |
|---|---|---|
file | eines von file/source_url | Quellmedien zum Dubbing (Audio oder Video), bis zu 3 GiB |
source_url | eines von file/source_url | Öffentliche URL zum Abrufen der Quellmedien |
source_language | nein | ISO 639-Code (z.B. en). Weglassen zur automatischen Erkennung – die erkannte Sprache wird im Feld language des Quelltranskripts gemeldet |
reference | nein | Freiform-Label zur Identifizierung des Projekts auf Ihrer Seite (max. 500 Zeichen) |
model_id | nein | dubbing_v2 (Standard) |
target_language | nein | Optional die erste Zielsprache bei der Erstellung in die Warteschlange stellen; weitere mit language.create hinzufügen |
keyterms | nein | Begriffe zur Beeinflussung von Transkription/Übersetzung (Produkt-/Markennamen). Bis zu 100 Begriffe mit jeweils 200 Zeichen; wiederholen Sie das Feld einmal pro Begriff im multipart |
Bearbeiten des Quelltranskripts
Sobald das Projekt ready ist, lesen Sie das Transkript, korrigieren Sie es, bevor Sie Sprachen hinzufügen. Jede Bearbeitung erhöht die revision des Projekts. Jedes Segment hat eine stabile id, die zum Bearbeiten oder Löschen verwendet wird. (Nur Enterprise-Workspaces.)
# Quelltranskript lesen
transcript = elevenlabs.dubbing.project.transcript.get(project_id)
# Text eines Segments korrigieren – nur die zu ändernden Felder senden (text, speaker_id, start_s, end_s)
elevenlabs.dubbing.project.transcript.update_segment(
project_id,
segment_id=transcript.segments[0].id,
text="Welcome to our latest product demo.",
)
# Ein Segment hinzufügen (eine vorhandene speaker_id wiederverwenden, damit es mit der Stimme dieses Sprechers synchronisiert wird)
added = elevenlabs.dubbing.project.transcript.create_segment(
project_id,
text="Thanks for watching.",
speaker_id=transcript.segments[0].speaker_id,
start_s=40.0,
end_s=42.0,
)
# Ein Segment löschen
elevenlabs.dubbing.project.transcript.delete_segment(project_id, segment_id=added.segment.id)
Via REST: GET /v1/dubbing/project/{project_id}/transcript, dann PATCH .../transcript/segment/{segment_id} mit nur den geänderten Feldern:
curl -X PATCH "https://api.elevenlabs.io/v1/dubbing/project/{project_id}/transcript/segment/{segment_id}" \
-H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" \
-d '{"text": "Welcome to our latest product demo."}'
Übersetzungen verfeinern und neu generieren
Das Transkript einer Sprache ordnet jedem Quellsegment seine translation zu (null = noch nicht übersetzt; Segment-IDs stimmen mit der Quelle überein). Bearbeiten Sie eine einzelne Übersetzung, generieren Sie dann neu. (Nur Enterprise-Workspaces.)
# Die Übersetzungen der Sprache lesen
target = elevenlabs.dubbing.project.language.transcript.get(project_id, language_id)
# Eine einzelne Übersetzung verfeinern (translation=None übergeben, um sie zu löschen und für eine Neuübersetzung zu markieren)
elevenlabs.dubbing.project.language.transcript.update_segment(
project_id,
language_id,
segment_id=target.segments[0].id,
translation="Bienvenido a nuestra última demostración de producto.",
)
# Den Dub aus dem aktuellen Transkript neu generieren (kostenpflichtig wie eine Generierung)
elevenlabs.dubbing.project.language.transcript.regenerate(project_id, language_id)
Via REST: PATCH /v1/dubbing/project/{project_id}/language/{language_id}/transcript/segment/{segment_id} mit {"translation": "..."}, dann POST .../language/{language_id}/transcript/regenerate (gibt 202 Accepted zurück).
Eine Übersetzungsbearbeitung betrifft nur diese Sprache. Nach der Bearbeitung wird eine completed-Sprache stale – sie stellt weiterhin ihre vorherige Ausgabe bereit, bis Sie neu generieren. Pollen Sie, bis completed; output_revision ist dann gleich revision und outputs.lossless_audio spiegelt das aktuelle Transkript wider.
Dubbing in mehrere Sprachen
Fügen Sie ein Sprachziel pro Sprache hinzu – jedes wird unabhängig generiert. Verfolgen Sie alle mit language.list, anstatt eines nach dem anderen abzufragen:
for lang in ["es", "fr", "de", "ja"]:
elevenlabs.dubbing.project.language.create(project_id, target_language=lang)
while True:
result = elevenlabs.dubbing.project.language.list(project_id)
if not any(l.status in ("queued", "processing") for l in result.languages):
break
time.sleep(5)
Zustände
Projekt:
| Status | Bedeutung |
|---|---|
queued | Erstellt; Quellabruf + Vorbereitung in die Warteschlange gestellt |
preparing | Vorbereitung (Transkription) läuft |
ready | Quelltranskript verfügbar; Sprachen hinzufügen/generieren. Projekte bleiben ready – der Fortschritt pro Sprache wird in den Sprachen abgebildet |
failed | Vorbereitung fehlgeschlagen (z.B. Quelle konnte nicht abgerufen oder dekodiert werden) |
Sprache:
| Status | Bedeutung |
|---|---|
queued | Wartet darauf, dass das Projekt ready wird, oder auf einen Generierungs-Worker |
processing | Der Dub wird generiert |
completed | Abgeschlossen; outputs enthalten eine signierte Download-URL (ca. 1 Stunde gültig – neu abrufen für eine frische URL) |
stale | Zuvor abgeschlossen, aber das Transkript hat sich geändert; behält die letzte Ausgabe bis zur Neugenerierung |
failed | Generierung fehlgeschlagen |
Sie können eine Sprache hinzufügen, bevor das Projekt ready ist – sie bleibt queued und startet automatisch, sobald das Projekt ready wird. Beim Hinzufügen einer Sprache können optionale model_id (standardmäßig die des Projekts) und voice_settings (z.B. {"cloning_strength": 7}, Bereich 0–10, Standard 7 – steuert, wie stark die synchronisierten Sprecher die Quellstimmen klonen) angegeben werden.
Fehlerbehandlung
- 401: Ungültiger API-Schlüssel |
- 409 Conflict bei Neugenerierung: Das Projekt ist nicht
readyoder die Sprache ist nicht abgeschlossen (z.B. bereits in Generierung) – warten und erneut versuchen | - Abgelaufene Download-URL:
outputs.lossless_audioist signiert und ca. 1 Stunde gültig; Sprache erneut abrufen für eine neue URL | - Transkriptbearbeitung / Neugenerierung nicht verfügbar: Diese Endpunkte sind nur für Enterprise – bei anderen Tarifen das Projekt mit einem finalisierten Quelltranskript erstellen und direkt Sprachen hinzufügen |
Referenzen
- Installationsanleitung
- API-Referenz – jeder Endpunkt mit vollständigen Request/Response-Schemata und SDK-Methodennamen