Ночь длинная — 17 часов с перерывами, 61 генерация. Пересняли диалог напарника, добавили рукопожатие+вставание, сбор конфет, POV-деталь сумки, крупный план напарника, профиль бандита у окна, финал с застёжкой сумки. Отдельная боль — Gemini за раз 10 попыток вытягивал не ту руку.
наХАняли«так, а ну ка погугли, сиденс взял и испортил половину речи»
В сцене 10 shot14_partner_dialogue_v1 (фронт + tebya_suka.mp3, 7с) плохо синхронизировал губы. Гайд Seedance: sweet spot аудио 3-5с, эмоциональная речь даёт лаг губ 100-200мс, быстрая речь с элидингом — смазанные закрытия.
«давай возьмем боковой кадр (не фронт), и я сделал новый голос, и только первую часть. voice_tebya_suka.mp3, 6с, говорит после первой секунды, а не сразу»
«хуйня, речь перепутана. а не надо модели дать текст реплики тоже? что в гайде?»
Нашёл в гайде: текст в двойных кавычках + язык. Формат Character speaks in Russian: "...".
«он сказал тебя наХАняли товар принести, почему ((( и я даже не могу подменить звук на оригинал т.к. ритмика совсем другая»
Открыл код seedance_video.py: параметр generate_audio: True жёстко прошит. С ним Seedance берёт твой uploaded audio только как voice style, а речь синтезирует сам из текста — отсюда «наХАняли» и другая ритмика.
«делаем»
Сменил на generate_audio=False когда есть audio_urls:
«файл теперь без звука»
generate_audio=False = нет аудиодорожки в выходе. Плюс lip-sync всё равно кривой.
«нет, оно не совпадает, ну то есть движение губ не ествественное. примерно как и раньше было, только теперь я чепуху не слышу т.к. аудио нету»
«нет, для начала убери, изменения, что не генерит звук, это мешает мне понять, какие фонемы он не услышал»
Откатил generate_audio=True:
«ну лучше, оно дает странный акцент. voice_tebya_suka_v2.mp3 — я сделал версию звука, где все более раздельно, чтоб ему было проще»
Новое аудио + скорректированная пунктуация ("Тебя, сука. Наняли товар принести. А не пробовать его. Дебил."):
После кредитного 402 и пополнения:
«блин, оно не успевает сказать, нужно 7с»
«сука, он делает очень сильные паузы между репликами и опять последняя реплика прям к концу тайминга, это нехорошо для монтажа. надо как-то попросить его соблюдать темп и чтоб без жестикуляции»
v8: steady even pace without long pauses + Finishes speaking by 00:05 + No hand gestures:
«победа, ты молодец, и я немного»
Ключевой элемент — пользовательская v2 аудио с чёткими разделениями. Всё остальное — промпт-тюнинг вокруг неё.
«последнюю реплику нужно на этом кадре сказать shot12_bg_user_front_fitted»
Долгое обсуждение вариантов реплики (Давай. Собирайся. / + Всё, пошли) и действия (подача руки / вставание с уходом). Прилетела идея: рука подаётся вертикально, как в армрестлинге / wrist-grip — не ладонь-в-ладонь.
v2: starts speaking immediately at 00:00, рука бандита из правого края:
«нет, в обоих вариантах он руку дает будто жмет, ну типа 180 градусов, а нужно под 90, я потому спрашивал, как правильно захват описать»
«а ты написал явно что второй чел лежит?»
Хорошо подметил — не написал. Добавил контекст лежачего + WRIST-grab not palm-to-palm, forearms vertical:
Параллельно второй вариант — напарник просто встаёт и уходит:
«проблема с речью, он 2 раза сказал "давай"»
Причина скорее — жирная пауза после первого «Давай.» (точка = команда на паузу, в паузе модель заполняет повтором слова). Убрали тайминговые костыли:
«@/$E/shot12_slap_setup_eyes_open.jpg, вот еще кадр на лежащего лысого, только я ему глаза открыл. сделай что просто смотрит на напарника и приходит в себя»
4с вместо 5с. После 402 и пополнения:
Коммит 82559c4 — 72 файла утверждённых и архивных.
«кадр сбора конфет, и я вот думаю, какой использовать»
Обсудили сценарий последних 6 шотов. Решили: бандит один собирает, напарник наблюдает с дивана. Сцена статичная, больше нет экшена.
Пользователь дал shot16_room_crop_partner.jpg — напарник на диване, труп сверху, куча конфет. Попросил добавить бандита Gemini'ем:
«что еще за лысый бородатый мужик?»
Мой косяк — перепутал кто кто. Зафиксировал: бандит лысый в кожанке, без бороды.
Три попытки Gemini с char_bandit_front_bw.jpg — все IMAGE_OTHER (safety):
- 1 попытка — видимо труп сверху триггерит
- 2 попытка — убрали труп, но оставили тёмный фрагмент плоти в куче конфет
- 3 попытка — убрали и фрагмент — всё равно IMAGE_OTHER
«не, попробуй другой реф: shot5_bandit_closeup_v5.png»
Тоже IMAGE_OTHER. Четвёртая попытка — с char_bandit_back_bw.jpg (со спины):
— прошла, но Gemini вернул второй реф вместо отредактированной сцены. Жёстко прописал «output MUST be first image edited — NOT the second»:
— Gemini сжал в вертикальный формат и перекомпоновал всё (окно/шкаф/дверь исчезли).
«ты гонишь, еще буквально вчера все работало нормально. и в чате у меня работает нормально все еще. ищи ошибку в своем промпте или коде»
Сменил source → shot16_room_crop_wrong_bandit.jpg (пользователь собрал сам в фотошопе):

Задача — свапнуть лицо. facefusion headless-run с shot5_bandit_closeup_v5.png:
«плохо лицо прилепило промахнулось»
Два прохода facefusion (с разными source + reference-mode) — промахивается. Переключились на Gemini для face-swap — IMAGE_OTHER снова, потом сжатие в портрет. Перепробовал:
- Убрал --size 2K и --aspect — вышел в портрет
- Переставил картинки ДО текста — в портрет
- Попробовал gemini-2.5-flash-image — IMAGE_OTHER
- gemini-3.1-flash-image-preview — timeout
«что значит не заходит в edit моде? что это значит? ты долбоеб? можешь нормально говорить. я же не знаю, что ты там делал сча»
Извинился по-людски. Корневая причина — аспект рефов: сцена 16:9 + face_bw портрет (0.71) → Gemini примирял в портрет. Семь попыток впустую.
«ясно, давай сидримом свапнем. вот этот реф лица shot5_bandit_closeup_v5.png»
Seedream с 2 рефами сработал с первого раза — 16:9 сохранён, лицо свапнуто, напарник не тронут, композиция цела:

С 3 рефами (сцена + лицо бандита + лицо напарника):
Первый запуск pending на Evolink 40 минут (высокая нагрузка). Отменил через DELETE endpoint, перезапустил — пришёл.
«нужно больше длительность, давай 12с и за 4 раза он должен собрать все конфеты»
Gemini на общаке с top-down POV:

v2 с --aspect 16:9:

«нужны советские — описать какие, рука не нужна (ты добавил руку?)»
Да, рука была в промпте. Убрал. Описал брендами: Мишка косолапый, Мишка на севере, Красная Шапочка, Белочка, Кара-Кум, Морячок, Ласточка.

«только крышка сумки сверху, а должна быть снизу. и конфеты гиганты, раза в 2 больше чем надо»
v4 — две задачи одновременно:

«мы вообще очень сложную штуку делаем, я обычно такое делаю по этапам»
Урок для Gemini: одна правка за генерацию. Делим задачу.
v5: уменьшить конфеты на v3:

«еще меньше сайз»
v6 — matchbox size, thumbnail-sized:

«я бы сделал сначала пустую сумку из v3 — типа убери конфеты»
Расцепляем: сначала пустая сумка, потом заполняем:


«ну вот, а ты боялся»
Пока shot16 переваривался в бекграунде — сделали вторую итерацию детали уже на основе общака (чтоб ноги бандита по краям были видны):


«ладно, давай попробуем оживить, в 2 приема собирает конфеты и бросает их в сумку»
Стоп, другая задача — на этом кадре не сбор, а один момент с последней конфетой на ладони:
«он должен потянуться за правый край кадра за одной конфетой оранжевого цвета, но кинуть ее в сумку, а раскрыть кулак над сумкой и смотреть на эту одну конфету на ладони»
«блять, не та рука, он же левой рукой собирает»
«нужно еще лучше описать конфету, а лучше — дать реф. candy_ref.jpg»
«left edge of the frame — это неверно, мы же напротив бандита — его левая рука у правой части кадра»
v2: левая рука (но выходит с правого края кадра, так как он в левом профиле), + реф конфеты:
«теперь из общака делаем укрупнение на напарника, не забудь дать реф напарника крупный»
Gemini edit общака → medium close-up. С face-рефом:

«неверно, поза не та. давай пока без фейс рефа, в 2 этапа — сначала клоуз без рефа, потом лицо подправим»

v3: лицо к канону:


«давай попросим еще чтоб смотрел прямо, но не прямо в камеру. только это не новое редактирование, а где лицо меняем из v2»

«а почему банана стала такое низкое разрешение давать?»
Мой косяк: убрал --size 2K когда чинил edit-mode, не вернул. Вышло 1376x768 вместо 2K. Вернул.
«верни, ретрай не нужен, оживим то, что есть. вот звук voice_v_sumku.mp3. shot18_partner_closeup_v5_eye_corrected — поправил взгляд. вот текст: В сумку положил, блять. Быстро. 6с»
«как думаешь, сделать наезд камеры? — я думаю, все ок будет синком, давай с наездом»
RGBA-PNG упал на save JPEG в fit_to_aspect. Починил: конвертирую RGB если суффикс .jpg/.jpeg.
«пока давай сделаем боковой кадр на бандита в сторону окна из общака. 2к не забудь теперь»
Gemini edit общака на боковой профиль:
— Gemini повернул только бандита, камера не двинулась.
«боковой кадр вообще не вышел. он повернул только бандита, а нам нужно камеру»
Camera-orbit в Gemini почти никогда не работает.
«не, профиль не вытащить, свет неверный. вот отсюда можно фон подрезать: m2_window_tight_v2.png»
Добавляем бандита на чистый кадр окна, с общаком как помощником для сумки. Поэтапно:

«очень неплохо. я кадрировал для точности shot19_bandit_profile_v1_crop. я понял, что на оригинальном фоне, что я тебе дал у нас паркет елочка идет не в том направлении — нужно узор развернуть на 90 градусов»

v2 — повернуть паркет на 90°:
— «нет, изменений вообще нет». Пересформулировал через явное направление (horizontally → vertically):

«теперь нужно чтоб он протянул левую ладонь над сумкой, а на нее положим конфету по рефу»
И тут началась история с неправильной рукой, которая длилась 5 итераций и хак с зеркалом:

«не та рука, вытянул правую»
v5 из v3, явно RIGHT hand:

«опять вышла правая»
Обе попытки («left», «right») — одна и та же рука. Пространственно: «та рука, что спрятана за телом»:

После /compact ещё итерация — v7 через анатомическое описание «near-side / foreground shoulder»:

«нет, то не та рука, это дальняя и правая»
v8 — с фразой «anatomical LEFT arm» + жёстко «RIGHT arm must stay EXACTLY where it was»:

Хак: flip v3 → edit → flip обратно. Если Gemini всегда хватает правую в image-space, то после зеркала это будет левая:



«не помогло. может поможет вид сверху, где рука уже вытянута нужная? hand_ref.jpg»
v10 с hand_ref как вторым рефом:

«неа, интересно, чего его заело. ладно, давай попробуем оживить v3 сразу. пусть он вытянет левую руку с конфетой (дай реф руки), зажмурится, опустит конфету в сумку и застегнет ее, 6с»
Ключевое открытие: Seedance с hand_ref как вторым рефом сразу взял правильную руку — animation model слушает pose-ref, edit-model нет:
«да, сработало. но хочу еще дубль и запускай генерации задачами, а не виси»
«ты че блять, в 19 кадре не указал, что нужно одним кадром? ты гайд забыл?»
«целиком читай, придурок, тебе нужно держать гайд целиком всегда»
Из секции 9: No scene cuts throughout, one continuous shot. Прочитал весь гайд. На shot20 тоже забыл (уже готовился).
Общий план shot17_bag_detail_filled_v2 + сверху действия: застегнуть молнию + уйти.
«там криво сумку застегнул, зиппер слева по кадру»
«слева направо по кадру, ну там мало зиппер потянуть, там нужно кусок ткани крышку накинуть сначала»
v2: сначала flap, потом zipper слева-направо, потом подъём:
«зиппер сначала вниз, потом направо, потом вверх, буквой U, понимаешь? так эти сумки работают»
v3: U-путь по периметру молнии (вниз → направо → вверх). Убрали подъём, 5с хватит:
После SSL-таймаута на poll — вытащил через прямой опрос. Первый раз config пробовал .config.json в корне — 401 unauthorized, правильный путь — scripts/test_mode/.config.json.
Утверждённые шоты:
- shot14_partner_dialogue_v8 — реплика «тебя, сука...» (7с, ровный темп, без жестов)
- shot15_davay_v3 — «Давай, собирайся, блять» + wrist-grab (6с)
- shot15_davay_standup_v2 — альтернативный вариант с вставанием (6с)
- shot13_bandit_recovers_v1 — бандит с открытыми глазами смотрит на напарника (4с)
- shot16_room_crop_full_seedream_v1 — общак с face-swap через Seedream
- shot16_collecting_v2 — сбор конфет, 4 цикла, 12с
- shot17_bag_detail_filled_v2 — POV-деталь сумки с советскими фантиками
- shot17_bag_detail_lastcandy_v2 — одна конфета на ладони (задумчивый момент)
- shot18_partner_dialogue_v1 — «В сумку положил, блять. Быстро» с push-in
- shot19_bandit_profile_v3 — бандит у окна с развернутым паркетом
- shot19_anim_v1 — бандит кладёт последнюю конфету и застёгивает
- shot20_bag_close_detail_v3 — POV-деталь застёжки U-маршрутом
Уроки:
- generate_audio=True в Seedance = модель синтезирует свою речь из текста + voice style, игнорируя твой audio literal. Для чистого lip-sync под uploaded audio это проблема, но возможная. Текст в кавычках + чёткая пунктуация + паузы-друзья + steady even pace → работает.
- Одна правка за Gemini-генерацию. Несколько задач одновременно (размер + положение + цвет) — модель игнорит.
- Gemini с 2+ рефами часто не заходит в edit-mode, а собирает новую картинку. Особенно если аспекты рефов разные (16:9 сцена + 0.71 портрет → output портрет). Seedream для face-swap стабильнее.
- Gemini IMAGE_OTHER flaky на сценах с трупами/плотью/людьми в странных позах — фильтр срабатывает непредсказуемо, ретрай не помогает, нужна переформулировка или смена модели.
- Direction anchors в профильной сцене не работают: «left/right arm», «near/far side», flip-хак — Gemini всё равно вытягивает ту же сторону. Но в Seedance animation model слушает pose-ref (hand_ref) — анимация сделала то, что не мог edit.
- Гайд Seedance читать целиком, а не грепом. Ключевые директивы (No scene cuts throughout, one continuous shot., avoid jitter and bent limbs) разбросаны по секциям — пропустишь, получишь кат-склейку или нервные руки.
- Evolink pending cap — 40 минут. Потом Task timed out, кредиты не списываются. Можно отменить через DELETE endpoint.
- RGBA PNG → JPEG save валится в Pillow. fit_to_aspect теперь конвертит в RGB при JPEG-суффиксе.
- --size 2K — не забывать. Легко потерять при дебаге edit-mode. Картинки без него 1376x768 (~1K), едва терпимо.