Пунктир — человек: лестницы звука на слух, доска цвета, макеты экранов до рендера, листы планов, «ок» по версии.
Конвейер один, вход разный. Подробно — плитки «Пять движков» ниже.
| Движок | Пример | Съёмка | Мультикам | Лог | Фильм |
|---|---|---|---|---|---|
| autocutПример: YTEVO02Съёмка: лекция, несколько днейФильм: v6 · 4K | YTEVO02 | лекция, несколько дней | ✓ | ✓ | v6 · 4K |
| headlessПример: YTLAB01Съёмка: подкаст, 3 камеры 4K 25pФильм: v3 · 4K | YTLAB01 | подкаст, 3 камеры 4K 25p | ✓ | ✗ | v3 · 4K |
| soloПример: YTCG37Съёмка: одна камера, 17 дублейФильм: 4:42 · 26 экранов | YTCG37 | одна камера, 17 дублей | ✗ | ✓ | 4:42 · 26 экранов |
| doc_cutПример: YTCH14Съёмка: документальный от словФильм: 20:13 · 22 экрана · v1 4K | YTCH14 | документальный от слов | ✗ | ✓ | 20:13 · 22 экрана · v1 4K |
| story_cutПример: YTCR04Съёмка: по карте сцен, 12 сценФильм: v6 · 27:15 · 120 экранов | YTCR04 | по карте сцен, 12 сцен | ✓ | ! | v6 · 27:15 · 120 экранов |
Лог: autocut — BMD Film Gen 5; solo и doc_cut — S-Log3; headless — Rec.709 8 бит; story_cut — разные источники, плоский экспорт через gamma_override.
autocut.py --project P status · plan · conform · screens · deliver · qc · all [--range A:B]; части plan.py · audio.py · screens2.py · conform.py · composite.py · qc.py · notes.py · color.pycut.py run --job J --tag vN --par 2: edl → dialog → director → music → master → verify → gfx → conform → join → qc → deliver; --from/--to/--sections, statussolo.py edges → edgeplot → listen → dialog → verify + letters → align → probe → board → plan → gfx build → mock → music → master → run --out F → delivercut.py status · prep · render --job J: prep = story resolve → align memex → sound dialog → align --check → verify → picture plan → color → gfx build → sound music/master → conform plancaffeinate -ims python3 sc_run.py film → sc_conform join → sc_deliver pilot · review · qc0510_doc_cut/ — предшественник doc_cut (dc_*, {CODE}_doc_job.json, YTCH11)0512_reversion/ — ре-версия готового мастера монтажёра по EDL ({CODE}_reversion_edl_v1.json, YTAZ)| Движок | Что делает | Параметры | Грабли |
|---|---|---|---|
| AUSoundIsolation | изоляция голоса в stems/clean (voice_isolate --wet 100 --quality high) | мак, офлайн; «warm» — EQ рецепт C | бинарь вне git |
| ebur128 · standard.py | мастер звука | −14 LUFS ±1, пик −1 dBTP, лимитер −1,5, LRA ≤ 8; autocut: усиление → alimiter → линейная подстройка | aac_at не даёт больше 320 кбит/с — паспорт ждёт 384 |
| Epidemic Sound MCP | музыка под длину программы | autocut/epidemic.py; EditRecording forceDuration ≤ 300 с | CDN 18 КБ/с на поток — Range-куски; ключ в двух местах |
| Цвет ffmpeg по канону 15_color | проявка по гамме → экспозиция числом → look | куб на камеру (headless), группу 65³ (doc_cut), клип и кусок речи (story_cut, match 0,75); look YTAI_look__newstar.cube | немеченые файлы — явно bt709 и in_range; экспозиция в линейном свете (gbrpf32) |
| HyperFrames | экраны → ProRes 4444 с альфой 3840×2160 25p | мини-проект на экран, lint/check, --workers 1 | клипы без меток читать как BT.601 limited; подробно — Screens by Code |
| ffmpeg prores_videotoolbox | кусок = файл (autocut, проход 1) | -profile:v standard; теги цвета через setparams | ключи -color_* не работают |
| ffmpeg libx264 | части и фильм | [email protected], 40M (maxrate 80M/60M), GOP 12, bf 2, stitchable; части затем -c copy; M3 Max ≈ 19 кадров/с одной частью, ≈ 21 двумя | -r 25 + passthrough ffmpeg 8 не принимает — -fps_mode cfr -r 25 |
| ffmpeg videotoolbox · libx265 | лёгкие копии: 1080p CRF 21, 4K H.264 ≈ 27 Мбит/с, HEVC ≈ 12 (hvc1) | light.py --kinds 1080,4kh264,4k; deliver.py h264_videotoolbox 8–10M | -r 25 дублирует хвостовые кадры — passthrough |
| mlx-whisper large-v3 · turbo | verify речи на стыках; audition собранной речи; sc_qc asr | мак под mlx.lock; audition — распознать СОБРАННЫЙ звук с метками резов | Whisper по исходнику дописывает слово — только по собранному звуку видно, чего зритель не услышит |
| video_tech_qc.py | паспорт YouTube yt_4k25; VMAF к прошлой версии (--ref: ok 93 / bad 85) | libvmaf, selftest ≥ 99 | медленнее реального времени → --no-scan; с --ref пока никто не вызывает |
| render_queue.py · render_gate.py | части и экраны по одному; статусы в Telegram | render.lock = RENDER.lock; --idle-pass 240; потолок 6 ч; gate: через 30 мин под nice | замок не FIFO; процесс с .venv_transcribe держит mlx_queue — оркестровка системным python3 |
| Проверка | Где | Норма | Откуда взялась |
|---|---|---|---|
| Кадров столько же, сколько в плане | autocut qc · headless join · doc_cut qc final | равно; CFR; шаг PTS ровно 512; 3840×2160, теги bt709/tv | части уезжали на кадр на стыках |
| Громкость | qc | −14 ±1 LUFS, пик ≤ −1 dBTP, LRA ≤ 8; doc_cut: |I+14| ≤ 1, TP ≤ −0,9 | стандарт 17_audio |
| Синхрон звук–картинка | autocut qc · headless qc · doc_cut qc | autocut: сдвиг ≤ 20 мс на планах ≥ 3 с; headless ≤ 40 мс; doc_cut: 0 ± 2 мс к WAV-мастеру; длина звука = длине картинки | обрезка в QuickTime давала звук позже картинки на 30,5 мс |
| Смены кадра на своих местах | autocut qc cuts | порог 0,10 | склейка «съезжала» после правки листа |
| Цвет бренда после кодирования | qc screens | красный (238,50,39) ±10; screens_verify: (208,2,27) ±2 | кодек уводил красный клиента |
| Чёрное, стоп-кадры, тишина | headless qc · autocut black | blackdetect d=0,2, freezedetect d=1, silencedetect −55 dB d=2 | дыра в листе тянула экран до конца фильма |
| Речь на стыках | headless verify | 3+3 слова в окне ±4 с; < 5 из 6 → ⚠ | первое слово дубля относилось к соседу |
| Собранная речь без обрывов | audition.py · sc_qc asr · doc_cut verify.py | 0 потерянных слов; verify: лишнее/пропавшее только на краях (67 из 79 сошлись) | YTEVO02 v6: обрывы на 11:29 и 15:07 прошли приёмку по исходнику |
| Клип без куба | doc_cut render | не проходит в рендер | клип без проявки тихо оставался серым |
| Часть без графики | sc_run gfx_lack | часть не рендерится | часть ушла без экранов |
| Сборка согласована с листом | doc_cut cut.py status → render | ⛔ если подписи раскладки речи не совпали | рендер шёл по прежнему листу |
| Паспорт YouTube | video_tech_qc run --profile yt_4k25 --no-scan | кодек, GOP, уровень, звук | aac 320 вместо 384 — жёлтая строка |
| Лёгкая копия = мастер | light.py | кадры, первый кадр, сдвиг звука | ⚠ звук против картинки light не сверяет |
| Чистый мастер для шортсов | shorts_master.py verify | сдвиг речи в начале, середине и конце = 0,0 мс | обрезка v5 в плеере дала 30,5 мс |
| Листы всех планов, mock, стиль, цвет, факты | человек | просмотрено до «ок» | машина не оценит язык клиента и факты |
VMAF к прошлой версии (video_tech_qc --ref) доступен, но не встроен ни в один движок — кандидат в общую приёмку.
пик ≤ −1 dBTP, LRA ≤ 8; doc_cut: |I + 14| ≤ 1, TP ≤ −0,9
autocut — на планах ≥ 3 с; doc_cut — 0 ± 2 мс к WAV-мастеру
меньше 5 — ⚠ стык (headless verify.py)
Текст экрана — пересобрать только экран; цвет — conform своей камеры или группы; музыка — master; край речи сдвигает экраны участка. Подробно — таблица ниже.
Таблица для сессии: правка листа не означает «всё заново». Источник правды — README движка, здесь общее правило.
| Что поменялось | Пересобрать | Не трогать | Почему именно так |
|---|---|---|---|
| Край или подрезка куска речи | audio assemble → экраны этого участка (моменты по словам) → conform затронутых кусков → join → deliver → qc | кубы, музыка, остальные экраны | звук до экранов: cues считаются по dialogue.wav текущего листа; две сетки кадров у камеры A — сверять концы частей и стыки |
| Текст или вид экрана | screens build → check → render этого экрана → проход «файл на экран» → deliver | звук, conform кусков | экран — отдельный альфа-клип, картинка под ним не меняется |
| Цвет (куб, экспозиция) | color build → conform кусков этой камеры/группы → deliver | звук, экраны | куб применяется в conform |
| Музыка или уровень | music → master → deliver | картинка | мастер звука идёт отдельной дорожкой в deliver |
| Перебивка или рамка | plan/directives → conform куска → deliver | звук | кадр камеры режется в conform |
| Способ рендера, версия кодека | поднять RECIPE → все части | — | иначе части с прежним рецептом не пересчитаются |
| Файл | Что хранит | Кто и когда пишет |
|---|---|---|
| {CODE}_cut_job.json · directives_v4.json · storycut_job.json | решения по этому фильму: камеры, роли, рамки, куб, gamma_override, музыка; у решений поле _why | человек или сессия при старте и после правок |
| YTs/{CH}/color_profile.json → exposure.target_face_luma | цель экспозиции по лицу канала (YTEVO 134; тёмная кожа — 72, иначе пересвет) | по решению Романа; autocut пока читает путь YTEVO зашитым |
| README движка: «Каноны», «Грабли», таблица пересборки | что стоило времени и как теперь делаем | сессия сразу после ошибки, тем же коммитом |
| PROGRESS.md проекта | журнал сборки, «Что делать, вернувшись» | сессия каждые полчаса автономной работы |
| qc_<tag>.json · verify_<tag>.json · status.json | приёмка версии числами | код; читается при следующей версии |
| _session_tools/ · _v6_tools/ проекта | инструменты, родившиеся на проекте (audition.py, listen.py, cues_build.py) | кандидаты в этап при следующем прогоне |
| CLAUDE.md | раздел про фильм кодом — пока нет | дописать по итогам фиксации трека |
| память: reference_autocut_stage · reference_headless_solo_mode · reference_doc_cut_stage · reference_story_cut_stage | подводные камни по движкам | сессия в конце работы; хаб reference_hub_auto_montage |
V=~/YTAI/environment/.venv_transcribe/bin/python; AC=~/YTAI/scripts/05_editing/0510_autocut $V $AC/autocut.py --project $P status # что готово по текущему листу $V $AC/autocut.py --project $P plan # cut_v4.json + screens_final.json (plan.py faces · build · edges) $V $AC/audio.py --project $P all # stems → clean → ladder → assemble → report → mix_v4.wav $V $AC/screens2.py --project $P build · render # экраны ProRes 4444 с альфой $V $AC/autocut.py --project $P conform · screens · deliver · qc # или all [--range A:B] $V ~/YTAI/scripts/999_extra/video_tech_qc.py run 03_Exports/<CODE>_v6_4K.mp4 --profile yt_4k25 --no-scan # паспорт $V $AC/light.py 03_Exports/<CODE>_v6_4K.mp4 --kinds 1080,4kh264,4k --name <CODE>_v6 # лёгкие копии $V $AC/shorts_master.py --project $P words · map · build · verify --head N --name <CODE>_v6 # чистый мастер для шортсов
HC=~/YTAI/scripts/05_editing/0510_headless_cut $V $HC/cut.py run --job $J --tag v3 --par 2 --out 03_Exports # edl → … → deliver; status, --from/--to/--sections $V $HC/color.py frames · measure · build --ver v2 · board · check --job $J # кубы на камеру $V $HC/tg_status.py --job $J # одно сообщение в Telegram каждые 300 с $V $HC/solo.py plan · gfx build · mock · music · master --job $J # до рендера $V $HC/solo.py run --out F --job $J && $V $HC/solo.py deliver --job $J # экраны и части через render_queue, склейка, приёмка
DC=~/YTAI/scripts/05_editing/0511_doc_cut; SC=~/YTAI/scripts/05_editing/0511_story_cut $V $DC/cut.py status --job $J && $V $DC/cut.py prep --job $J # всё до рендера; мак не грузит (Whisper на Memex) $V $DC/preview.py --job $J # preview_<tag>.html — наружу нельзя $V $DC/cut.py render --job $J # только по слову Романа: экраны → части 4K → склейка → qc final $V $SC/sc_sound.py dialog · nat · music · master && $V $SC/sc_music.py plan # звук $V $SC/sc_color.py probe · plan · board && $V $SC/sc_gfx.py build · check # цвет и экраны $V $SC/sc_conform.py plan && nohup caffeinate -ims python3 $SC/sc_run.py film & # части через очередь — системным python3 $V $SC/sc_conform.py join && $V $SC/sc_deliver.py pilot · review · qc # склейка, пилот в TG, лист каждые 20 с