GPT-6 Sol & Claude Opus 5.5 kini tersediaGPT-6 Sol: setengah harga 5.6 Sol

Seedance 2.0 dan lip sync: prompt dialog dan 4 klip nyata

Mulut mengikuti prompt, dan rekaman kami kembali di trek audio keluaran.

Kiki, OmniaKey COO11 menit baca
Di halaman ini

Seedance 2.0 menggerakkan mulut sesuai prompt. Dua klip 5 detik 720P yang sama kecuali audio dinyalakan atau dimatikan, sama-sama membuka dan menutup mulut. Rekaman 1,8 detik kami lewat reference_to_video, dan kalimatnya kembali di trek audio keluaran. Audio saja ditolak. BytePlus menagih $0.15 per detik di 720P, jadi 5 detik berarti $0.75.

Jawaban singkat

  • Mulut berasal dari prompt. Dua klip 5 detik 720P dengan prompt sama, satu dengan audio dan satu tanpa, bergerak tertutup → terbuka sedikit → terbuka lebar.
  • Audio saja tidak lolos. Seri 2.0 memerlukan setidaknya satu gambar atau video referensi (API pembuatan tugas BytePlus, dicek 3 November 2026).
  • Audio referensi maksimal 3 klip, masing-masing 2–15 detik, total 15 detik, wav atau mp3, 15 MB per file.
  • Audio benar-benar dipakai. Mp3 1,8 detik kami kembali di trek keluaran, kalimatnya utuh.
  • Dengan harga per detik BytePlus, 720P $0.15 per detik, jadi 5 detik $0.75.
  • Empat klip dari hari yang sama: 720P beraudio, 720P tanpa audio, 720P persegi dari gambar, 480P dengan audio referensi.

Apakah Seedance 2.0 bisa lip sync?

Dokumentasi resmi tidak memakai istilah "lip sync". Yang dijelaskan adalah pembuatan gambar dan suara sekaligus, ditambah satu saran: taruh dialog di antara tanda kutip ganda.

Halaman Seed dari ByteDance menyebut Seedance 2.0 sebagai "a unified multimodal audio-video joint generation architecture that supports text, image, audio, and video inputs" (dicek 3 November 2026). Panduan BytePlus ModelArk mengulang hal yang sama dan mencantumkan "Generate videos with audio" di daftar kemampuan (halaman diperbarui 29 September 2026).

Kalau dicari di halaman-halaman itu, "lip sync" dan "talking" tidak muncul sekali pun. "mouth" muncul sekali di dalam contoh prompt, "dialogue" dua kali dan keduanya soal pembuatan audio. Yang paling dekat dengan instruksi adalah kalimat ini: "It is recommended to put dialogue content in double quotes to optimize the audio generation effect" (API pembuatan tugas, diperbarui 28 Oktober 2026).

Jadi kemampuannya ada di celah antara keduanya: model mengeluarkan gambar dan trek audio, tetapi tidak ada halaman resmi yang menjanjikan bibir mengikuti setiap suku kata. Di empat klip kami mulut bergerak saat audio menyala maupun mati, yang memang wajar untuk model video yang prompt-nya menyatakan ada orang berbicara.

Ada yang mencoba. Komentar Hacker News 18 Februari 2026 mengirim lagu bersama video dan menyimpulkan "the model did reference the singing music I provided, but it reinterpreted it on its own" (komentar). Issue GitHub 3 Juni 2026 menaruh "Mouth movements match phoneme timing" sebagai syarat lulus, pengukuran yang tidak ada di dokumentasi (issue).

Cara menulis kalimat ke dalam prompt

Pertama tokohnya, lalu kalimat di antara tanda kutip ganda, terakhir gerakan mulut dan wajah. Prompt kami menuliskan tokoh dan gerakan mulut, tetapi lupa tanda kutip, jadi kalimatnya dipilih model.

Resep yang kami pakai lima langkah.

  1. Tokoh dalam satu kalimat: stop-motion tanah liat, kacamata bulat besar, syal rajut, duduk di meja dapur.
  2. Apa yang dilakukannya: mengucapkan satu kalimat pendek ke arah kamera.
  3. Kalimat itu apa adanya di antara tanda kutip ganda. Ini saran BytePlus.
  4. Mulut dan wajah: bibir terbuka dan tertutup mengikuti kata, alis mengikuti kalimat, kepala sedikit miring pada suku kata yang ditekankan.
  5. Kamera dan cahaya dikunci, supaya yang bergerak hanya aktingnya.

Ini prompt yang dikirim tanpa perubahan untuk keempat klip:

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.

Yang kurang adalah kalimatnya sendiri. Prompt hanya menyebut "satu kalimat pendek", jadi kata-katanya dipilih model. Saat audio menyala ia berkata "You look like you could use a warm hug.", kalimat yang tidak ada di mana pun dalam permintaan. Kalau ingin mengatur dialog, langkah 3 harus ditambahkan sebelum dikirim.

Mulut kami periksa dengan satu frame tiap 0,5 detik. Klip beraudio mulai dengan mulut tertutup, frame 2 sampai 7 terbuka sedikit, frame 8 terbuka lebar, lalu menutup lagi. Klip tanpa audio: tertutup, terbuka sedikit, lebar, sedikit, lebar, dan dua frame terakhir terbuka sedikit.

Sepuluh close-up tokoh tanah liat berkacamata bulat dan bersyal, satu tiap setengah detik: mulut tertutup di frame pertama dan terakhir, terbuka di antaranya, paling lebar di frame kedelapan.
Dengan audio, satu frame tiap setengah detik: mulut tertutup di frame 1, sedikit terbuka di frame 2 sampai 7, terbuka lebar di frame 8, lalu tertutup lagi di frame 10. Seedance 2.0 lewat OmniaKey, teks ke video, 5 detik, 720P, dibuat 3 November 2026.
Sepuluh close-up tokoh tanah liat oranye bersyal hijau tua, satu tiap setengah detik, yang membuka dan menutup mulut, diambil dari video tanpa trek audio.
Dengan audio dimatikan dan prompt yang sama, mulut tetap membuka dan menutup, paling lebar di frame 5, 6, dan 8, dan file tidak punya trek audio. 5 detik, 720P, dibuat 3 November 2026.

Teks yang sama juga memilih tokoh lain: klip tanpa audio kembali dengan badan oranye, belah rambut cokelat keabu-abuan, dan syal hijau tua. Kalimat tokoh sebaiknya ditulis sebagai saran. Di kedua klip kamera tidak bergerak, itu hasil "Fixed camera".

Bisakah saya mengirim audio sendiri?

Bisa, asalkan ada gambar atau video referensi di permintaan yang sama. Mp3 1,8 detik kami dikirim sebagai audio referensi, dan kata-katanya kembali di trek keluaran.

Kami memakai reference_to_video dengan tiga bagian: still tanah liat sebagai gambar referensi, rekaman kami sebagai audio referensi, dan prompt di atas. Parameternya 480P, 5 detik, audio menyala. OmniaKey membalas 202, tugas task_3Ay0Ktf2mbYXh9GNZpZ5j9kGyOIzz8Pv berhasil, dan 120,2 detik kemudian MP4 864×496 tiba dengan trek aac 5.06 detik.

Transkrip trek itu satu kalimat: "Why tow it? I told you the keys were in the drawer.". Paruh keduanya persis rekaman kami, kata per kata. Tiga kata pertama tidak ada di file kami; transkrip tidak bisa membedakan napas kami atau tambahan model, jadi kami menulis apa yang terdengar.

Sepuluh frame tokoh tanah liat cokelat bertopi dan bersyal oranye di belakang meja kayu, mulut menutup dan membuka, uap dari cangkir bergerak.
Dengan rekaman kami sebagai referensi: mulut bergerak, uap cangkir bergeser, dan trek keluaran membawa kalimat yang kami kirim. 5 detik, 480P, dibuat 3 November 2026.

Sepuluh frame dengan jarak 0,5 detik hanya menunjukkan mulut bergerak. Untuk kecocokan per fonem perlu frame lebih rapat dan pengukuran khusus, dan itu tidak kami lakukan, jadi bibir tidak bisa diklaim cocok dengan setiap bunyi.

Batasnya dari API pembuatan tugas BytePlus (dicek 3 November 2026). Audio maksimal 3 klip, masing-masing 2–15 detik, total 15 detik, wav atau mp3, 15 MB per file. Klip bisa datang sebagai URL publik, string Base64, atau id aset. Audio saja tidak bisa: "Audio-only input is not supported; include at least one reference image or video."

Jangan pakai wajah asli. Seri 2.0 menolak gambar dan video referensi yang berisi orang sungguhan, jadi untuk adegan berbicara pakai tokoh tanah liat, gambar, atau CG.

Gambar ke video mengganti bidikan sendiri

Klip gambar ke video kami berpindah dari bidikan lebar berdiri ke bidikan sedang duduk di dapur pada frame 4, padahal prompt tidak meminta potongan atau gerakan kamera.

Frame pertama adalah still yang dibuat untuk percobaan ini: tokoh berdiri di depan dinding putih hangat, tangan di bawah, seluruh badan, 1254×1254 piksel. Prompt-nya yang di atas, dan di situ ia duduk di meja dapur. Frame 1 sampai 3 tetap berdiri, frame 4 melompat ke bidikan sedang duduk lalu bertahan. Mulut tertutup sampai frame 7, terbuka sedikit di frame 8, lebar di frame 9 dan 10. Di audio terdengar "Well, what do you think?" dan suara kain.

Sepuluh frame video persegi: awalnya tokoh tanah liat berdiri, lalu duduk di meja dapur dengan mulut terbuka.
Gambar ke video: bidikan berdiri hanya sebentar, lalu berganti ke adegan duduk di dapur yang diminta prompt, komposisi yang tidak ada di gambar. 5 detik, 720P, dibuat 3 November 2026.

Yang penting di sini komposisinya, bukan mulutnya. Di model ini prompt menentukan posisi tokoh dan gerak kamera, sedangkan frame pertama menentukan penampilan. Bidikan yang penting ditulis di prompt.

File tiba 960×960, bukan 1280×720. Sebabnya, kami memakai gambar persegi sebagai frame pertama dan tidak mengirim rasio, dan API mengikuti gambar. Kalau ingin rasio tertentu, tulis ratio, jangan menebak dari nama resolusi.

Permintaan Python

Buat tugas, tanya id, unduh MP4: tiga permintaan dan hanya pustaka standar. Helper yang sama melayani ketiga langkah.

python
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 untuk gambar, 15 MB untuk 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"]  # tautan kedaluwarsa, unduh segera
    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"))

Tiga hal layak dipertahankan. Idempotency-Key adalah UUID baru untuk tiap isi permintaan, jadi pengiriman ulang mengembalikan tugas asli, bukan menagih dua kali. Loop tunggu berhenti setelah 15 menit dengan pengecualian, karena batas waktu berarti klip masih dirender dan mengirim ulang membeli satu lagi. Unduhan terjadi pada succeeded pertama, karena assets[0].url adalah tautan bertanda tangan yang kedaluwarsa.

Dua operasi lain hanya mengganti isi, helper-nya tetap:

python
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)

Daftar kolomnya pendek: model, type, operation, input.prompt, input.media[] dengan type berisi first_frame, reference_image, reference_video, atau reference_audio, lalu parameters.duration, resolution, ratio, generate_audio, watermark. Bentuk yang sama ada di dokumentasi API video OmniaKey, dan alur buat, tanya, unduh dijelaskan di ringkasan API media. Model ini bisa dicoba di halaman model Seedance 2.0.

Berapa biayanya

BytePlus menagih per detik. Harga daftar untuk 5 detik 16:9 tanpa masukan video seperti ini (halaman harga ModelArk, dicek 3 November 2026):

KeluaranPer detikKlip 5 detik
480p$0.07$0.35
720p$0.15$0.76
1080p$0.37$1.87
4K$0.78$3.89

Kalau dihitung dari kolom per detik hasilnya sama, dengan selisih pembulatan satu sen di halaman: 5 detik × $0.15 = $0.75, sedangkan baris 720p menulis $0.76. Dua klip teks ke video kami 720P selama 5 detik, jadi masing-masing di posisi $0.75 itu.

Permintaan dengan masukan video dihitung dengan cara lain dan lebih mahal, jadi tugas dengan video referensi tidak masuk tabel ini (halaman harga ModelArk, dicek 3 November 2026). OmniaKey menagih per detik yang dihasilkan dan mengembalikan biaya saat tugas berakhir failed atau canceled (ringkasan API media, dicek 3 November 2026); harga terkini ada di halaman model.

Yang sering gagal

  • Audio saja ditolak. Sertakan setidaknya satu gambar atau video referensi bersama treknya.
  • Wajah asli tidak lolos. Gambar atau video referensi dengan orang sungguhan diblokir, jadi pakai tokoh tanah liat, gambar, atau CG.
  • generate_audio menyala secara bawaan. Untuk file tanpa suara harus dimatikan; untuk kalimat biarkan bawaan dan prompt menyebut ada orang berbicara.
  • Ukuran keluaran mengikuti ratio. 720P memberi 1280×720 dari teks, 960×960 dari still persegi tanpa rasio, dan 864×496 pada 480P 16:9.
  • Kecepatan tidak tetap. Empat tugas 5 detik memakan 259,0, 202,0, 155,3, dan 120,2 detik, jadi siapkan dua sampai lima menit dan tanyakan statusnya.
  • Durasi keluaran 4–15 detik, klip referensi 2–15 detik masing-masing, 15 detik total. Keempat file datang dengan 24 fps.

Pertanyaan umum

Kalau saya unggah WAV, apakah mulut mengikuti rekaman saya?

Bisa, bersama satu gambar referensi, dan model akan memakainya: rekaman kami kembali di trek keluaran. Apakah bibir pas dengan setiap bunyi di file, frame kami tidak bisa menunjukkannya; satu frame tiap setengah detik hanya memperlihatkan mulut bergerak, bukan kecocokan yang diukur.

Kenapa permintaan audio saja ditolak?

Seri 2.0 tidak menerima audio sebagai satu-satunya masukan. Tambahkan gambar atau video referensi di permintaan yang sama, dan trek audio ikut terkirim.

Audio dinyalakan atau dimatikan untuk kalimat?

Biarkan menyala, itu nilai bawaannya. Dengan false file tidak punya trek audio, dan tokoh tetap membuka mulut kalau prompt menyebut ia berbicara, seperti klip tanpa audio kami.

Berapa panjang audio referensi yang boleh?

Tiap klip 2–15 detik, maksimal 3 klip, total 15 detik, wav atau mp3, 15 MB per file (API pembuatan tugas BytePlus, dicek 3 November 2026). Punya kami 1,8 detik, lebih pendek dari batas minimum itu, dan tetap diterima sebagai URL data Base64.

Sumber yang dicek

Riwayat perubahan

  • 3 November 2026: versi pertama, keempat klip dibuat hari itu juga.

Model di artikel ini

Seedance 2.0lip syncvideo AIaudio referensiAPI videoPython

Artikel terkait

Artikel terbaru

Panduan populer