Seedance 2.0 Lip-Sync: Dialog-Prompts und 4 echte Clips
Der Mund folgt dem Prompt, unsere Aufnahme kam in die Tonspur zurück.

Auf dieser Seite
- Kurz gesagt
- Kann Seedance 2.0 Lip-Sync?
- Wie der Satz in den Prompt kommt
- Kann ich eigenes Audio schicken?
- Bild zu Video schneidet von selbst um
- Die Anfrage in Python
- Was es kostet
- Was schiefgeht
- Häufige Fragen
- Folgt der Mund meiner WAV-Datei, wenn ich sie hochlade?
- Warum wurde meine Anfrage mit nur Audio abgelehnt?
- Ton an oder aus für eine gesprochene Zeile?
- Wie lang darf das Referenzaudio sein?
- Quellen geprüft
- Änderungen
Seedance 2.0 bewegt den Mund nach dem Prompt. Zwei 5-Sekunden-Clips in 720P, gleich bis auf den Tonschalter, öffneten und schlossen den Mund. Unsere 1,8-Sekunden-Aufnahme lief durch reference_to_video, und der Satz kam in der Ausgabe-Tonspur zurück. Audio allein wird abgelehnt. BytePlus berechnet $0.15 pro Sekunde in 720P, also $0.75 für 5 Sekunden.
Kurz gesagt
- Der Mund kommt aus dem Prompt. Zwei 5-Sekunden-Clips in 720P mit demselben Prompt, einer mit erzeugtem Ton und einer stumm, zeigten geschlossen → leicht offen → weit offen.
- Ton allein reicht nicht. Die 2.0-Reihe verlangt mindestens ein Referenzbild oder ein Referenzvideo (BytePlus Task-API, geprüft am 03.11.2026).
- Referenzaudio: höchstens 3 Clips, je 2 bis 15 Sekunden, zusammen 15 Sekunden, wav oder mp3, je 15 MB.
- Der Ton wird genutzt. Unsere 1,8-Sekunden-MP3 kam in der Ausgabe-Tonspur zurück, der Satz war vollständig.
- Mit dem BytePlus-Sekundenpreis kostet 720P $0.15 pro Sekunde, 5 Sekunden also $0.75.
- Vier Clips vom selben Tag: 720P mit Ton, 720P stumm, quadratisches 720P Bild zu Video, 480P mit Referenzaudio.
Kann Seedance 2.0 Lip-Sync?
In der offiziellen Dokumentation steht „Lip-Sync“ nicht. Beschrieben wird die gemeinsame Erzeugung von Bild und Ton, dazu ein Rat: den Dialog in doppelte Anführungszeichen setzen.
Die Seed-Seite von ByteDance nennt Seedance 2.0 „a unified multimodal audio-video joint generation architecture that supports text, image, audio, and video inputs“ (geprüft am 03.11.2026). Der Leitfaden von BytePlus ModelArk sagt dasselbe und führt „Generate videos with audio“ in der Liste der Fähigkeiten (Seite aktualisiert am 29.09.2026).
Sucht man auf diesen Seiten, kommen „lip sync“ und „talking“ kein einziges Mal vor. „mouth“ steht einmal in einem Beispiel-Prompt, „dialogue“ zweimal, beide Male geht es um die Tonerzeugung. Am nächsten an einer Anweisung liegt dieser Satz: „It is recommended to put dialogue content in double quotes to optimize the audio generation effect“ (Task-API, aktualisiert am 28.10.2026).
Die Funktion liegt also in der Lücke dazwischen: Das Modell liefert Bild und Tonspur, aber keine offizielle Seite verspricht, dass die Lippen jeder Silbe folgen. In unseren vier Clips bewegte sich der Mund mit und ohne Ton, was bei einem Videomodell zu erwarten ist, dessen Prompt sagt, dass jemand spricht.
Andere probieren es. Ein Hacker-News-Kommentar vom 18.02.2026 schickte einen Song zusammen mit dem Video und kam zu dem Ergebnis „the model did reference the singing music I provided, but it reinterpreted it on its own“ (Kommentar). Ein GitHub-Issue vom 03.06.2026 setzt „Mouth movements match phoneme timing“ als Bestehensbedingung, eine Messung, die in der Dokumentation fehlt (Issue).
Wie der Satz in den Prompt kommt
Erst die Figur, dann der Satz in doppelten Anführungszeichen, zuletzt Mund und Gesicht. Unser Prompt beschrieb Figur und Mundbewegung, ließ aber die Anführungszeichen weg. Den Satz wählte deshalb das Modell.
Unser Vorgehen hat fünf Schritte.
- Die Figur in einem Satz: Stop-Motion aus Knete, große runde Brille, gestrickter Schal, am Küchentisch.
- Was sie tut: eine kurze Zeile in die Kamera sprechen.
- Die Zeile unverändert in doppelte Anführungszeichen setzen. Das rät BytePlus.
- Mund und Gesicht beschreiben: Lippen öffnen und schließen sich mit den Wörtern, die Brauen gehen mit, bei der betonten Silbe neigt sich der Kopf.
- Kamera und Licht festhalten, damit sich nur die Darstellung bewegt.
Diesen Prompt haben wir unverändert für alle vier Clips geschickt:
A stop-motion clay character with big round glasses and a knitted scarf sits at a kitchen table, looks straight into the camera, and speaks one short line to the viewer. The mouth opens and closes in time with the words, the eyebrows move with the sentence, and the head tilts slightly on the stressed word. Fixed camera, warm lamp light, a mug of tea in front of them, gentle 24 fps stop-motion feel.
Es fehlt der Satz selbst. Im Prompt stand nur „eine kurze Zeile“, also suchte das Modell die Wörter aus. Mit Ton sagt es „You look like you could use a warm hug.“, eine Zeile, die in der Anfrage nirgends stand. Wer den Dialog steuern will, muss Schritt 3 vor dem Absenden ergänzen.
Den Mund haben wir mit einem Bild alle 0,5 Sekunden geprüft. Der Clip mit Ton beginnt mit geschlossenem Mund, Bild 2 bis 7 ist er leicht offen, bei Bild 8 weit offen, danach wieder leicht offen bis zu. Der stumme Clip zeigt geschlossen, leicht offen, weit offen, leicht offen, weit offen, die letzten zwei Bilder leicht offen.


Derselbe Text besetzt auch eine andere Figur: Der stumme Clip kam mit orangefarbenem Körper, graubraunem Scheitel und dunkelgrünem Schal zurück. Den Figurensatz sollte man als Vorschlag schreiben. In beiden Clips bewegte sich die Kamera nicht, dafür sorgt „Fixed camera“.
Kann ich eigenes Audio schicken?
Ja, mit einem Referenzbild oder Referenzvideo in derselben Anfrage. Unsere 1,8-Sekunden-MP3 lief als Referenzaudio mit, und ihre Wörter kamen in der Ausgabe-Tonspur zurück.
Wir nutzten reference_to_video mit drei Teilen: das Standbild aus Knete als Referenzbild, unsere Aufnahme als Referenzaudio und den Prompt von oben. Die Parameter waren 480P, 5 Sekunden und Ton an. OmniaKey antwortete mit 202, die Aufgabe task_3Ay0Ktf2mbYXh9GNZpZ5j9kGyOIzz8Pv lief durch, und nach 120,2 Sekunden kam ein MP4 mit 864×496 und einer aac-Spur von 5,06 Sekunden.
Die Tonspur ergibt abgehört einen Satz: „Why tow it? I told you the keys were in the drawer.“ Die zweite Hälfte ist genau unsere Aufnahme, Wort für Wort. Die ersten drei Wörter standen nicht in unserer Datei; eine Transkription unterscheidet nicht, ob sie unser Atemholen sind oder etwas, das das Modell ergänzt hat. Deshalb steht hier, was zu hören ist.

Zehn Bilder im Abstand von 0,5 Sekunden zeigen nur, dass der Mund sich bewegt. Für die Übereinstimmung pro Laut braucht es dichtere Bilder und eine eigene Messung, und die haben wir nicht gemacht. Dass die Lippen zu jedem Laut passen, lässt sich damit nicht sagen.
Die Grenzen stehen in der BytePlus Task-API (geprüft am 03.11.2026). Audio: 3 Clips, je 2 bis 15 Sekunden, zusammen 15 Sekunden, wav oder mp3, je 15 MB. Ein Clip darf als öffentliche URL, Base64-String oder Asset-ID kommen. Nur Ton geht nicht: „Audio-only input is not supported; include at least one reference image or video.“
Bild zu Video schneidet von selbst um
Unser Bild-zu-Video-Clip wechselte von der stehenden Ganzfigur bei Bild 4 auf eine sitzende Naheinstellung in der Küche, obwohl im Prompt weder Schnitt noch Kamerafahrt standen.
Das erste Bild ist ein Standbild, das wir für diesen Lauf erzeugt haben: die Knetfigur vor einer warmweißen Wand, Arme unten, ganze Figur im Bild, 1254×1254 Pixel. Der Prompt ist der von oben, und darin sitzt die Figur an einem Küchentisch. Bild 1 bis 3 bleiben stehen, Bild 4 springt auf die sitzende Naheinstellung und bleibt dort. Der Mund ist bis Bild 7 geschlossen, bei Bild 8 leicht offen, bei Bild 9 und 10 weit offen. Im Ton hört man „Well, what do you think?“ und Stoffgeräusche.

Hier zählt das Bild, nicht der Mund. In diesem Modell entscheidet der Prompt, wo die Figur steht und wie die Kamera läuft, und das erste Bild entscheidet, wie sie aussieht. Wichtige Einstellungen gehören in den Prompt.
Geliefert wurde 960×960 statt 1280×720. Der Grund: Wir nutzten ein quadratisches Bild als erstes Bild und schickten kein Seitenverhältnis, und die API folgt dann dem Bild. Wer ein Format will, schreibt ratio, statt es aus dem Auflösungsnamen zu raten.
Die Anfrage in Python
Aufgabe anlegen, ID abfragen, MP4 herunterladen: drei Anfragen, nur die Standardbibliothek. Derselbe Helfer bedient alle drei Schritte.
import base64
import json
import os
import time
import urllib.error
import urllib.request
import uuid
API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
MODEL = "dreamina-seedance-2-0-260128"
PROMPT = (
"A stop-motion clay character with big round glasses and a knitted scarf sits at a kitchen table, "
"looks straight into the camera, and speaks one short line to the viewer. The mouth opens and closes "
"in time with the words, the eyebrows move with the sentence, and the head tilts slightly on the "
"stressed word. Fixed camera, warm lamp light, a mug of tea in front of them, gentle 24 fps "
"stop-motion feel."
)
MIME = {".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg",
".webp": "image/webp", ".mp3": "audio/mpeg", ".wav": "audio/wav"}
def call(method, url, body=None, idempotency_key=None):
headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
data = None
if body is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(body).encode()
if idempotency_key:
headers["Idempotency-Key"] = idempotency_key
req = urllib.request.Request(url, data=data, headers=headers, method=method)
with urllib.request.urlopen(req, timeout=120) as resp:
return json.load(resp)
def data_url(path, limit_mb):
raw = open(path, "rb").read()
if len(raw) > limit_mb * 1024 * 1024: # 30 MB für Bilder, 15 MB für Audio
raise ValueError(f"{path} is over {limit_mb} MB, the limit for this input type")
mime = MIME[os.path.splitext(path)[1].lower()]
return f"data:{mime};base64," + base64.b64encode(raw).decode()
def wait(task_id, timeout=900, step=5):
deadline = time.time() + timeout
while time.time() < deadline:
state = call("GET", f"{API}/{task_id}")
if state["status"] not in ("queued", "processing"):
return state
time.sleep(step)
raise TimeoutError(f"{task_id} is still running: poll it again, do not resubmit")
def run(body, out_path):
task_id = call("POST", API, body, str(uuid.uuid4()))["id"]
print("task", task_id, flush=True)
state = wait(task_id)
if state["status"] != "succeeded":
raise RuntimeError(state.get("error") or state["status"])
signed = state["assets"][0]["url"] # läuft ab, also sofort laden
req = urllib.request.Request(signed, headers={"User-Agent": "omniakey-example/1"})
with urllib.request.urlopen(req, timeout=300) as resp, open(out_path, "wb") as f:
f.write(resp.read())
return task_id
def reference_to_video(prompt, image_path, audio_path, out_path):
body = {
"model": MODEL,
"type": "video",
"operation": "reference_to_video",
"input": {
"prompt": prompt,
"media": [
{"type": "reference_image", "url": data_url(image_path, 30)},
{"type": "reference_audio", "url": data_url(audio_path, 15)},
],
},
"parameters": {"duration": 5, "resolution": "480P", "ratio": "16:9",
"generate_audio": True, "watermark": False},
}
return run(body, out_path)
if __name__ == "__main__":
print("done", reference_to_video(PROMPT, "character.png", "line.mp3", "line-clip.mp4"))
Drei Dinge daran bleiben drin. Der Idempotency-Key ist pro Anfrage eine neue UUID, ein Wiederholungsversuch bekommt also die ursprüngliche Aufgabe zurück, statt doppelt zu zahlen. Die Warteschleife bricht nach 15 Minuten mit einer Ausnahme ab, denn eine Zeitüberschreitung heißt, dass der Clip noch rendert, und ein erneutes Senden kauft einen zweiten. Der Download passiert beim ersten succeeded, weil assets[0].url ein signierter Link mit Ablaufdatum ist.
Die anderen beiden Operationen tauschen nur den Body, die Helfer bleiben:
def text_to_video(prompt, out_path):
body = {
"model": MODEL,
"type": "video",
"operation": "text_to_video",
"input": {"prompt": prompt},
"parameters": {"duration": 5, "resolution": "720P", "ratio": "16:9",
"generate_audio": True, "watermark": False},
}
return run(body, out_path)
def image_to_video(prompt, image_path, out_path):
body = {
"model": MODEL,
"type": "video",
"operation": "image_to_video",
"input": {"prompt": prompt,
"media": [{"type": "first_frame", "url": data_url(image_path, 30)}]},
"parameters": {"duration": 5, "resolution": "720P", "ratio": "adaptive",
"generate_audio": True, "watermark": False},
}
return run(body, out_path)
Die Feldliste ist kurz: model, type, operation, input.prompt, input.media[] mit type als first_frame, reference_image, reference_video oder reference_audio, dazu parameters.duration, resolution, ratio, generate_audio, watermark. Dieselbe Form steht in der Video-API-Dokumentation von OmniaKey, und den Ablauf aus Anlegen, Abfragen und Laden beschreibt die Übersicht der Media-API. Dieses Modell lässt sich auf der Seedance-2.0-Modellseite ausprobieren.
Was es kostet
BytePlus rechnet pro Sekunde ab. Der Listenpreis für 5 Sekunden in 16:9 ohne Videoeingabe sieht so aus (ModelArk-Preisliste, geprüft am 03.11.2026):
| Ausgabe | Pro Sekunde | 5-Sekunden-Clip |
|---|---|---|
| 480p | $0.07 | $0.35 |
| 720p | $0.15 | $0.76 |
| 1080p | $0.37 | $1.87 |
| 4K | $0.78 | $3.89 |
Rechnet man mit der Sekundenspalte, kommt dasselbe heraus, mit einem Cent Rundung auf der Seite: 5 Sekunden × $0.15 = $0.75 gegenüber $0.76 in der 720p-Zeile. Unsere beiden Text-zu-Video-Clips liefen in 720P über 5 Sekunden, also liegt jeder bei diesen $0.75.
Eine Anfrage mit Videoeingabe wird anders und teurer abgerechnet, eine Aufgabe mit Referenzvideo fällt also nicht in diese Tabelle (ModelArk-Preisliste, geprüft am 03.11.2026). OmniaKey rechnet pro erzeugter Sekunde ab und erstattet die Gebühr, wenn eine Aufgabe mit failed oder canceled endet (Übersicht der Media-API, geprüft am 03.11.2026); die aktuellen Preise stehen auf der Modellseite.
Was schiefgeht
- Ton allein wird abgelehnt. Mindestens ein Referenzbild oder Referenzvideo gehört zur Tonspur.
- Echte Gesichter fallen durch. Ein Referenzbild oder -video mit einer echten Person wird blockiert, also eine Figur aus Knete, Zeichnung oder CG nehmen.
generate_audioist standardmäßig an. Für eine stumme Datei muss es aus, für eine Zeile bleibt es an und der Prompt sagt, dass jemand spricht.- Die Ausgabegröße folgt
ratio. 720P ergab 1280×720 aus Text, 960×960 aus einem quadratischen Standbild ohne Verhältnis und 864×496 in 480P mit 16:9. - Die Dauer schwankt. Vier 5-Sekunden-Aufgaben brauchten 259,0, 202,0, 155,3 und 120,2 Sekunden, also zwei bis fünf Minuten einplanen und abfragen.
- Die Länge liegt bei 4 bis 15 Sekunden Ausgabe, Referenzclips bei je 2 bis 15 Sekunden und zusammen 15 Sekunden. Alle vier Dateien kamen mit 24 fps zurück.
Häufige Fragen
Folgt der Mund meiner WAV-Datei, wenn ich sie hochlade?
Ja, zusammen mit einem Referenzbild, und das Modell nutzt sie: Unsere Aufnahme kam in der Ausgabe-Tonspur zurück. Ob die Lippen jeden Laut der Datei treffen, können unsere Bilder nicht zeigen; ein Bild pro halbe Sekunde zeigt, dass sich der Mund bewegt, aber keinen gemessenen Treffer.
Warum wurde meine Anfrage mit nur Audio abgelehnt?
Die 2.0-Reihe nimmt Audio nicht als einzige Eingabe. Mit einem Referenzbild oder Referenzvideo in derselben Anfrage geht die Tonspur mit durch.
Ton an oder aus für eine gesprochene Zeile?
An lassen, das ist der Standard. Mit false hat die Datei keine Tonspur, und die Figur öffnet den Mund trotzdem, wenn im Prompt steht, dass sie spricht, wie in unserem stummen Clip.
Wie lang darf das Referenzaudio sein?
Je Clip 2 bis 15 Sekunden, höchstens 3 Clips, zusammen 15 Sekunden, wav oder mp3 mit je 15 MB (BytePlus Task-API, geprüft am 03.11.2026). Unsere Datei war mit 1,8 Sekunden kürzer als dieses Minimum und lief trotzdem als Base64-Daten-URL mit.
Quellen geprüft
- ByteDance Seed: Seedance 2.0, geprüft am 03.11.2026
- BytePlus ModelArk: Seedance-2.0-Leitfaden, geprüft am 03.11.2026
- BytePlus ModelArk: Task-API für Videogenerierung, geprüft am 03.11.2026
- BytePlus ModelArk: Modellpreise, geprüft am 03.11.2026
Änderungen
- 03.11.2026: erste Fassung, alle vier Clips am selben Tag erzeugt.
Modelle in diesem Artikel
Verwandte Artikel
Seedance 2.0 API: Text-zu-Video und Bild-zu-Video mit Python
Ein Skript legt die Aufgabe an, fragt den Status ab und speichert die MP4. Hier stehen die Felder, die Limits und zwei 5-Sekunden-Clips vom 30. Oktober 2026.
Seedance 2.5 Prompt-Guide: Aufbau, Beispiele und echte Clips
Sechs Prompts, sechs echte Clips: was Seedance 2.5 übernommen hat, was es geändert hat und wie Sie nachbessern.
Seedance 2.5 im Test
Das sinnvolle Upgrade ist 30-Second-Storytelling und Produktionskontrolle, nicht die unbestätigten 4K-Schlagzeilen, die darüber kursieren.
Neueste Beiträge
- Nano Banana Pro API: Python-Tutorial, Bildbearbeitung und Preis
- Qwen Image 3 Pro vs GPT Image 2: gleiche Prompts, Preis und Tempo
- GPT-6.2 Astra: Erscheinungsdatum, Leaks, was bestätigt ist
- HappyHorse 1.1 Bild zu Video: API-Anleitung und fünf echte Clips
- Lovable API Key: wohin damit und wie Sie ihn schützen
