audit: ноль резов вне паузы.Пунктир — человек: имена голосам и лицам ставит только он, доску цвета утверждает он. Всё остальное должно собираться без вопросов.
Главный канон этапа в двух колонках: метке верим как указателю места, край режем по звуку.
fetch_ranges.py по спискам originals_a.tsv / _b.tsv, кусками с докачкой (rclone cat --offset)fetch.py → md5 → originals_verified.jsonwordrole_transcribe.py: WAV 16k → mlx-whisper → pyannote → роль каждому слову (.words.json)sc_align.py edges · show · audit — MMS_FA, два окна 5+3 и 10+10 словalign.py memex — Whisper заново по куску ±4 с, якоря в местной расшифровкеalign.py (xlsr-ru), solo: align · letters (960H); шортсы: edges --fixsync.py measure: окон ≥ 18, остаток ≤ 10 мс; clap ±1 кадр; anchorcolor.py frames · measure · build · board: куб на камеру (headless), на группу 65³ (doc_cut), на клип и кусок речи (story_cut)Версии, веса и замки целиком — на Machine Stack.
| Модель | Что делает здесь | Где | Замок, время |
|---|---|---|---|
| mlx-whisper large-v3 | слова со временем; местная расшифровка краёв (doc_cut) | мак; Memex по ssh | mlx.lock; 84 куска за 6 мин на Memex |
| pyannote speaker-diarization-3.1 | кто говорит → роль каждому слову (вход шортсов) | мак, MPS | HF-токен; в движках фильмов диаризации нет — роли из листа или по уровню петлички |
| MMS_FA (torchaudio) | выравнивание текста по звуку: sc_align, edges шортсов | мак, процессор | mlx.lock; ≈ 1 с на край; порциями по 40 краёв |
| wav2vec2-xlsr-russian | выравнивание русской речи (headless align) | мак, .venv_whisperx | окна ≈ 25 с; слова без кириллицы — «звезда» |
| WAV2VEC2_ASR_BASE_960H | align по тексту листа и letters — что реально звучит на краях дубля (EN) | мак | solo.py |
| YuNet | лица: дорожки, крупный план, кто говорит | мак | score 0,6; дорожка реже 12 % замеров — шум |
| SFace + refs_*.npy | узнавание героя в перебивках и пробах цвета | мак | HERO_SIM 0,30; ложные 0,42–0,54 — глазами |
| Qwen2.5-VL-7B-Instruct-4bit | каталог кадров «что в кадре» для перебивок | Memex / мак | 60–70 мин на фильм; путает людей — только с эталоном |
| ffmpeg (videotoolbox decode) | склейки мастера аппаратным декодером (scout cuts ≈ 0,4 длины выпуска) | мак | -fps_mode passthrough, иначе склейки уезжают на кадр |
| rclone | оригиналы с Drive кусками | мак | --bind en0; --drive-chunk-size 64M |
| Проверка | Когда | Норма | Откуда взялась |
|---|---|---|---|
| md5 оригиналов | fetch.py | originals_verified.json: все сошлись | rclone терял недокачанное при смене сети |
| Синхрон | sync.py measure · clap | окон ≥ 18, остаток ≤ 10 мс; хлопок ±1 кадр; doc_cut: окон ≥ 3, MAD ≤ 12 мс | часы устройств врут на минуты и часы — якорь синхрона речь |
| Роли = люди | transcript · picks · render (⚠) | ни одной роли без имени в people/hosts | «Гость» вместо имени — шортсы без плашек (YTTRBM01) |
| Края: рез в паузе | sc_align audit · edges | 0 резов вне паузы (YTCR04: 0 из 458); шортсы: воздух после ≤ 0,30 с, до ≤ 0,15, не ближе 0,05 к чужому слову | метки слов рано на 85–570 мс: ~45 кусков из 229 теряли слово |
| Буква не чужая | edges.py | буква, отделённая тишиной > 0,15 с, отбрасывается | выравнивание цепляло крайнюю букву за похожий звук соседа («есть … Знаете») |
| Герой в кадре | sc_color probe · sc_sheet clip | SFace ≥ 0,30 и глазами | каталог VLM назвал коллегу героем в 12 местах (YTCR04) |
| Гамма известна | color build | клип без распознанной гаммы — стоп | S-Log3-куб на D-Log2 топит экспозицию (YTEVO03: 61 клип из 163) |
| Дорожка лица — не шум | render шортсов | дорожка ≥ 12 % замеров; имя по одежде ≥ 30 % и ≥ 2 замера | рука или тень давали «лицо» на один замер |
| Петличка = хозяин | doc_cut story.py | хозяин громче ≥ 6 дБ | чужая фраза через комнату попадала в реплику |
хлопок ±1 кадр; doc_cut: окон ≥ 3, MAD ≤ 12 мс.
выше порога — только кандидат: ложные совпадения доходят до 0,54, героя подтверждают глазами.
иначе чужая фраза «через комнату» попадает в реплику.
имя по одежде — ≥ 30 % замеров и ≥ 2 замера.
| Файл | Что хранит | Кто и когда пишет |
|---|---|---|
| YTs/{CH}/{CH}_voices.json | реестр голосов канала | voice_registry.py --enroll — только подтверждённые человеком имена: ошибка отравит узнавание во всех будущих проектах |
| 999_extra/face_finder/refs_<герой>.npy | эталоны лица героя | сессия по кадрам, где герой точно он; проверка глазами |
| YTs/{CH}/color_profile.json | гамма → куб, цель экспозиции по лицу | color_plan.py save_choice по выбору Романа в витрине |
| originals_verified.json · sync_model.json · align_v1.json · words_local_v1 · edges.json | кэши проекта: что уже сверено | код; пересчитываются при смене границ или листа |
| edge_overrides_vN.json (story_map) | края, выверенные по звуку агентом или человеком | рядом со story_vN.json; берётся последний N |
| память: reference_whisper_word_edges_unreliable | каталог способов, которыми Whisper врёт, и что сработало | сессия после каждого проекта — заметка растёт |
V=~/YTAI/environment/.venv_transcribe/bin/python; X=~/YTAI/scripts/999_extra AC=~/YTAI/scripts/05_editing/0510_autocut; HC=…/0510_headless_cut; DC=…/0511_doc_cut; SC=…/0511_story_cut $V $AC/fetch_ranges.py --project $P # оригиналы на T9 кусками, Drive мимо VPN $V $HC/fetch.py --job $J # md5 → originals_verified.json python3 $X/mlx_queue.py wordrole -- $V $X/wordrole_transcribe.py --media $M --language ru --plain --num-speakers 2 --speaker-names 'Имя,Имя' --out-dir $OUT # .words.json с ролями $V $HC/sync.py measure · clap · anchor --job $J # синхрон → sync_model.json $V $DC/align.py memex --job $J && $V $DC/align.py --check # местная расшифровка на Memex, сверка якорей $V $SC/sc_align.py edges --project $P && $V $SC/sc_align.py audit # края по звуку, мерило $V $HC/align.py --job $J · $V $HC/solo.py align · letters --job $J # headless RU · solo EN
$V ~/YTAI/scripts/07_shorts/0701_finished/scout.py cuts --job $JOB && … sheets --ranges 0:51-1:00 && … faces 'src,dur' # склейки, каталог кадров, лица $V $X/face_finder/detect.py … (эталоны refs_<герой>.npy) # герой в кадре $V $HC/color.py frames · measure · build --ver v2 --skin 104,158 --white 190 · board --job $J # куб на камеру, доска $V $SC/sc_color.py probe · plan · board --project $P # куб на клип и кусок речи