# Seedance 2.0: липсинк, реплики и 4 реальных клипа

> Мы вписали реплику в промпт Seedance 2.0 и отправили свою запись длиной 1,8 секунды как референсное аудио: губы, звуковая дорожка, поля запроса и четыре клипа.

- Canonical HTML: https://omniakey.com/ru/blog/seedance-lip-sync
- Markdown: https://omniakey.com/ru/blog/seedance-lip-sync.md
- Published: 2026-11-03 (updated 2026-11-03)
- Author: Kiki, COO at OmniaKey
- Language: ru
- Category: Guide
- Reading time: 11 min
- All posts: https://omniakey.com/blog/llms.txt

---

Seedance 2.0 двигает губы по промпту. Два клипа по 5 секунд в 720P, одинаковые кроме включённого и выключенного звука, открывали и закрывали рот. Наша запись длиной 1,8 секунды прошла через `reference_to_video`, и фраза вернулась в выходной дорожке. Одно аудио отклоняется. BytePlus берёт $0.15 за секунду в 720P, то есть $0.75 за 5 секунд.

## Коротко

- Губы берутся из промпта. Два клипа по 5 секунд в 720P с одним промптом, со звуком и без него, прошли через закрытый рот → приоткрытый → широко открытый.
- Одно аудио не проходит. Серия 2.0 требует хотя бы одно референсное изображение или видео (API создания задачи BytePlus, проверено 3 ноября 2026).
- Референсного аудио максимум 3 клипа, по 2–15 секунд каждый, 15 секунд в сумме, wav или mp3, по 15 MB.
- Звук действительно используется. Наш mp3 на 1,8 секунды вернулся в выходной дорожке, фраза полная.
- По цене BytePlus за секунду 720P стоит $0.15, а 5 секунд — $0.75.
- Четыре клипа за один день: 720P со звуком, 720P без звука, квадратное 720P из картинки, 480P с референсным аудио.

## Умеет ли Seedance 2.0 липсинк

В официальной документации слова «lip sync» нет. Там описана совместная генерация картинки и звука, плюс совет: реплику нужно ставить в двойные кавычки.

Страница Seed от ByteDance называет Seedance 2.0 «a unified multimodal audio-video joint generation architecture that supports text, image, audio, and video inputs» (проверено 3 ноября 2026). Руководство BytePlus ModelArk повторяет это и ставит «Generate videos with audio» в список возможностей (страница обновлена 29 сентября 2026).

Если поискать по этим страницам, «lip sync» и «talking» не встречаются ни разу. «mouth» встречается один раз, в примере промпта, «dialogue» — дважды, оба раза про генерацию звука. Ближе всего к инструкции такая фраза: «It is recommended to put dialogue content in double quotes to optimize the audio generation effect» (API создания задачи, обновлено 28 октября 2026).

То есть возможность живёт в промежутке: модель выдаёт картинку и звуковую дорожку, но ни одна официальная страница не обещает, что губы совпадут с каждым слогом. В наших четырёх клипах рот двигался и со звуком, и без него. Для видеомодели, которой промпт говорит, что человек говорит, это ожидаемо.

Люди пробуют. Комментарий на Hacker News от 18 февраля 2026 отправил песню вместе с видео и получил «the model did reference the singing music I provided, but it reinterpreted it on its own» ([комментарий](https://news.ycombinator.com/item?id=47056286)). Issue на GitHub от 3 июня 2026 ставит «Mouth movements match phoneme timing» условием успеха, но такого измерения в документации нет ([issue](https://github.com/etblues449/Faceless-Finance/issues/92)).

## Как вписать реплику в промпт

Сначала персонаж, потом реплика в двойных кавычках, в конце движение рта и лица. В нашем промпте были персонаж и движение рта, а кавычек не было, поэтому фразу выбрала модель.

Наш подход состоит из пяти шагов.

1. Персонаж одним предложением: пластилиновый стоп-моушен, большие круглые очки, вязаный шарф, сидит за кухонным столом.
2. Что он делает: говорит короткую реплику в камеру.
3. Реплика дословно, в двойных кавычках. Это совет BytePlus.
4. Рот и лицо: губы открываются и закрываются вместе со словами, брови идут за фразой, на ударном слоге голова слегка наклоняется.
5. Камера и свет зафиксированы, чтобы двигалась только игра.

Вот промпт, который ушёл без изменений во все четыре клипа:

> 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.

Не хватает самой реплики. В промпте было только «одна короткая реплика», поэтому слова выбрала модель. Со звуком она говорит «You look like you could use a warm hug.», а этой строки в запросе не было нигде. Чтобы управлять репликой, шаг 3 нужно добавить до отправки.

Рот мы смотрели по кадру каждые 0,5 секунды. Клип со звуком начинается с закрытого рта, кадры со 2 по 7 приоткрыт, на 8-м широко открыт, потом снова приоткрыт и закрыт. Клип без звука: закрыт, приоткрыт, широко открыт, приоткрыт, широко открыт, последние два кадра приоткрыт.

![Десять крупных планов пластилинового персонажа в круглых очках и шарфе, по одному каждые полсекунды: в первом и последнем кадре рот закрыт, между ними открыт, шире всего в восьмом.](https://omniakey.com/_img/blog/seedance-lip-sync/t1-t2v-audio-strip.3d59731f.1600.webp)

_Со звуком, кадр каждые полсекунды: в кадре 1 рот закрыт, со 2-го по 7-й приоткрыт, в 8-м широко открыт, к 10-му снова закрыт. Seedance 2.0 через OmniaKey, текст в видео, 5 секунд, 720P, сгенерировано 3 ноября 2026._

![Десять крупных планов оранжевого пластилинового персонажа в тёмно-зелёном шарфе, по одному каждые полсекунды: рот открывается и закрывается, видео без звуковой дорожки.](https://omniakey.com/_img/blog/seedance-lip-sync/t1-t2v-silent-strip.58b1caee.1600.webp)

_С выключенным звуком и тем же промптом рот всё равно открывается и закрывается, шире всего в кадрах 5, 6 и 8, а в файле нет звуковой дорожки. 5 секунд, 720P, сгенерировано 3 ноября 2026._

Тот же текст выбирает и другого персонажа: клип без звука вернулся с оранжевым телом, серо-коричневым пробором и тёмно-зелёным шарфом. Фразу про персонажа лучше писать как предложение. В обоих клипах камера не двигалась, это эффект «Fixed camera».

## Можно отправить своё аудио?

Можно, если в том же запросе есть референсное изображение или видео. Наш mp3 на 1,8 секунды ушёл как референсное аудио, и его слова вернулись в выходной дорожке.

Мы использовали `reference_to_video` с тремя частями: стоп-кадр из пластилина как референсное изображение, нашу запись как референсное аудио и промпт выше. Параметры: 480P, 5 секунд, звук включён. OmniaKey ответил 202, задача `task_3Ay0Ktf2mbYXh9GNZpZ5j9kGyOIzz8Pv` завершилась успешно, через 120,2 секунды пришёл MP4 864×496 со звуковой дорожкой $5.06секунды в aac.

Расшифровка этой дорожки — одна фраза: «Why tow it? I told you the keys were in the drawer.». Вторая половина в точности наша запись, слово в слово. Первых трёх слов в нашем файле не было; расшифровка не отличает наше дыхание от того, что добавила модель, поэтому оставляем то, что слышно.

![Десять кадров коричневого пластилинового персонажа в шляпе и оранжевом шарфе за деревянным столом: рот закрывается и открывается, пар над чашкой движется.](https://omniakey.com/_img/blog/seedance-lip-sync/t3-ref-audio-strip.edfa40c7.1600.webp)

_С нашей записью как референсом: рот двигается, пар над чашкой плывёт, а в выходной дорожке наша фраза. 5 секунд, 480P, сгенерировано 3 ноября 2026._

Десять кадров с шагом 0,5 секунды показывают только, что рот двигается. Для совпадения по фонемам нужны более частые кадры и отдельное измерение, а мы его не делали, поэтому утверждать, что губы совпали с каждым звуком, нельзя.

Ограничения взяты из API создания задачи BytePlus (проверено 3 ноября 2026). Аудио: максимум 3 клипа, по 2–15 секунд, 15 секунд в сумме, wav или mp3, по 15 MB. Клип можно передать публичным URL, строкой Base64 или id ресурса. Одно аудио нельзя: «Audio-only input is not supported; include at least one reference image or video.»

> Не добавляйте реальные лица. Серия 2.0 отклоняет референсные изображения и видео с настоящими людьми, поэтому для говорящей сцены берите пластилинового, нарисованного или CG-персонажа.

## Картинка в видео сама меняет план

Наш клип из картинки перешёл от общего плана стоя к среднему плану сидя за кухонным столом на 4-м кадре, хотя в промпте не было ни склейки, ни движения камеры.

Первый кадр — стоп-кадр, сделанный для этого запуска: персонаж стоит у тёплой белой стены, руки опущены, в полный рост, 1254×1254 пикселя. Промпт — тот, что выше, и в нём персонаж сидит за кухонным столом. Кадры с 1 по 3 остаются стоя, на 4-м происходит переход к среднему плану сидя, и так до конца. Рот закрыт до 7-го кадра, на 8-м приоткрыт, на 9-м и 10-м широко открыт. В звуке «Well, what do you think?» и шорох ткани.

![Десять кадров квадратного видео: сначала пластилиновый персонаж стоит, потом сидит за кухонным столом с открытым ртом.](https://omniakey.com/_img/blog/seedance-lip-sync/t2-i2v-audio-strip.c23818f5.1600.webp)

_Картинка в видео: план стоя держится недолго, затем смена на сидячую кухонную сцену из промпта, которой не было на картинке. 5 секунд, 720P, сгенерировано 3 ноября 2026._

Здесь важен кадр, а не рот. В этой модели промпт решает, где персонаж и как движется камера, а первый кадр задаёт внешность. Важный план нужно писать в промпте.

Файл пришёл 960×960, а не 1280×720. Причина: мы взяли квадратную картинку первым кадром и не отправили пропорцию, а API по умолчанию следует картинке. Нужен формат — пишите `ratio`, а не угадывайте по названию разрешения.

## Запрос на Python

Создать задачу, узнать id, скачать MP4: три запроса и только стандартная библиотека. Один и тот же помощник обслуживает все три шага.

```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 для картинки, 15 MB для аудио
        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"]  # ссылка истекает, скачиваем сразу
    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"))
```

Три вещи стоит оставить. `Idempotency-Key` — новый UUID на каждый запрос, поэтому повтор вернёт исходную задачу, а не спишет деньги дважды. Цикл ожидания останавливается через 15 минут с исключением: таймаут значит, что клип всё ещё рендерится, и повторная отправка покупает второй. Скачивание идёт при первом `succeeded`, потому что `assets[0].url` — подписанная ссылка с ограниченным сроком.

Две другие операции меняют только тело, помощники остаются:

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

Поля короткие: `model`, `type`, `operation`, `input.prompt`, `input.media[]` с `type` равным `first_frame`, `reference_image`, `reference_video` или `reference_audio`, и `parameters.duration`, `resolution`, `ratio`, `generate_audio`, `watermark`. Та же форма — в [документации видео API](https://docs.omniakey.com/ru/media/video) OmniaKey, а цикл создания, опроса и скачивания описан в [обзоре media API](https://docs.omniakey.com/ru/media/overview). Модель можно попробовать на [странице Seedance 2.0](https://omniakey.com/ru/dreamina-seedance-2-0-260128).

## Сколько это стоит

BytePlus считает по секундам. Цена за 5 секунд в 16:9 без видео на входе такая (страница цен ModelArk, проверено 3 ноября 2026):

|Выход|За секунду|Клип 5 с|
|-|-|-|
|480p|$0.07|$0.35|
|720p|$0.15|$0.76|
|1080p|$0.37|$1.87|
|4K|$0.78|$3.89|

Если считать по колонке за секунду, получается то же самое с копейкой округления на странице: 5 секунд × $0.15 = $0.75 против $0.76в строке 720p. Наши два клипа из текста были 720P по 5 секунд, то есть каждый на этих $0.75.

Запрос с видео на входе считается иначе и дороже, поэтому задача с референсным видео в эту таблицу не попадает (страница цен ModelArk, проверено 3 ноября 2026). OmniaKey списывает за сгенерированные секунды и возвращает плату, если задача завершилась со статусом `failed` или `canceled` (обзор media API, проверено 3 ноября 2026); актуальная цена — на [странице модели](https://omniakey.com/ru/dreamina-seedance-2-0-260128).

## Что идёт не так

- Одно аудио отклоняется. Добавьте к дорожке хотя бы одно референсное изображение или видео.
- Реальные лица не проходят. Референсное изображение или видео с настоящим человеком блокируется, поэтому берите пластилинового, нарисованного или CG-персонажа.
- `generate_audio` по умолчанию включён. Для немого файла его нужно выключить; для реплики оставить и написать в промпте, что человек говорит.
- Размер выхода следует `ratio`. 720P дал 1280×720 из текста, 960×960 из квадратного стоп-кадра без пропорции и 864×496 в 480P с 16:9.
- Скорость разная. Четыре задачи по 5 секунд заняли 259,0, 202,0, 155,3 и 120,2 секунды, так что закладывайте от двух до пяти минут и опрашивайте статус.
- Длина выхода 4–15 секунд, референсные клипы по 2–15 секунд, 15 в сумме. Все четыре файла пришли с 24 fps.

## Частые вопросы

### Если загрузить WAV, губы будут двигаться по моей записи?

Да, вместе с референсным изображением, и модель его использует: наша запись вернулась в выходной дорожке. Попадают ли губы в каждый звук файла, наши кадры показать не могут: кадр каждые полсекунды показывает, что рот движется, но это не измеренное совпадение.

### Почему запрос только с аудио отклонили?

Серия 2.0 не принимает аудио единственным входом. Добавьте в тот же запрос референсное изображение или видео, и дорожка пройдёт вместе с ними.

### Включать звук для реплики или нет?

Оставьте включённым, это значение по умолчанию. С `false` в файле не будет звуковой дорожки, а персонаж всё равно откроет рот, если в промпте сказано, что он говорит, как в нашем немом клипе.

### Какая длина референсного аудио допустима?

Каждый клип 2–15 секунд, максимум 3 клипа, 15 секунд в сумме, wav или mp3, по 15 MB (API создания задачи BytePlus, проверено 3 ноября 2026). Наш длился 1,8 секунды, меньше этого минимума, и всё равно прошёл как data URL в Base64.

## Источники

- [ByteDance Seed: Seedance 2.0](https://seed.bytedance.com/en/seedance2_0), проверено 3 ноября 2026
- [BytePlus ModelArk: руководство по Seedance 2.0](https://docs.byteplus.com/en/docs/ModelArk/seedance-2-0), проверено 3 ноября 2026
- [BytePlus ModelArk: API создания задачи видео](https://docs.byteplus.com/en/docs/ModelArk/create-video-generation-task-api), проверено 3 ноября 2026
- [BytePlus ModelArk: цены на модели](https://docs.byteplus.com/en/docs/ModelArk/model-pricing), проверено 3 ноября 2026

## История изменений

- 3 ноября 2026: первая версия, все четыре клипа сделаны в этот день.
