◂ Этап IngestRYA.AESources for the Machine — исходники машине: оригиналы, слова, роли, лицаэтап · 3 окт 2026
Монтажёру нужны прокси и секвенции в синхроне. Машине — другое: оригиналы на быстром диске, каждое слово со временем и ролью, края слов по звуку (а не по Whisper), кто в кадре с эталоном лица героя, синхрон до миллисекунд и куб цвета на клип. Из этого агенты пишут монтажный лист, а код его проверяет. Общие с треком Premiere шаги — разбор дня, транскрибация, цвет — здесь не повторяются, на них ссылки.
📌 Главный канон этапа. Словам Whisper верить только как указателю места и текста: первое слово после паузы он растягивает назад на 1–2,5 с, короткие слова теряет, конец ставит раньше звука, а оборванное слово дописывает до целого. Края — только выравниванием текста по звуку (CTC) с резом в паузе на границе кадра; мерило — audit: ноль резов вне паузы.
Одним взглядом
0из 458
резов вне паузы — мерило audit
YTCR04: края по звуку (CTC)
1–2,5с
Whisper тянет первое слово назад
метка — указатель места, не край
≤ 10мс
остаток синхрона по речи, окон ≥ 18
хлопок ±1 кадр · sync_model.json
≥ 0,30
сходство SFace с эталоном героя
ложные 0,42–0,54 — смотреть глазами
1Схема2Края3Что получает4Модели5Проверки6Знания7Грабли8Команды9Где лежит

12.1 · 1Схема

📥 Вход
Карты дня на Driveкамеры, петлички, *M01.XML
+
Паспорт днясцены, голоса, кто на каком TX
+
Профиль цветагамма → куб, цель по лицу
💾 Оригиналы
fetch_ranges · fetchDrive мимо VPN, кусками
→
md5originals_verified.json
→
T9 _originals/не прокси
🗣 Слова
mlx-whisperслово · начало · конец
→
pyannote · листроль каждому слову
→
Memex: местная расшифровка±4 с вокруг реплики
→
.words.jsonроли = имена людей
✂️ Края
CTC-выравниваниеMMS_FA · xlsr-ru · 960H
→
Огибающаяпауза между словами
→
Граница кадразвук точнее кадра
→
audit0 резов вне паузы
🎚 Синхрон
sync measureкорреляция речи
→
clap · anchorхлопок ±1 кадр
→
sync_model.jsonокон ≥ 18, остаток ≤ 10 мс
👤 Кадр
YuNetлица 2 раза в секунду
→
SFace + эталонгерой ≥ 0,30
→
scout · VLMсклейки, каталог кадров
→
Человекимена, лицо героя глазами
🎨 Цвет
frames · measureлица, кожа, белое
→
buildкуб на камеру, группу, кусок
→
boardдоска — смотрит Роман
машиначеловек решает или смотритагент Claudeитог дорожки

Пунктир — человек: имена голосам и лицам ставит только он, доску цвета утверждает он. Всё остальное должно собираться без вопросов.

12.1 · 2Край слова: метка Whisper → звук

Главный канон этапа в двух колонках: метке верим как указателю места, край режем по звуку.

былопо меткам Whisper
85–570мс
метки слов рано
YTCR04, 2249 слов
~45из 229
кусков теряли слово
  • первое слово после паузы — назад на 1–2,5 с
  • короткие «и / вот / но» теряет
  • конец ставит раньше звука, оборванное слово дописывает
сталоCTC по звуку, рез в паузе
0из 458
резов вне паузы
YTCR04, sc_align audit
  • MMS_FA · xlsr-ru · 960H — буквы по звуку
  • рез в паузе огибающей, на границе кадра
  • буква за тишиной > 0,15 с — не своя

12.1 · 3Что получает машина и откуда

1Оригиналы на T9
  • autocut: fetch_ranges.py по спискам originals_a.tsv / _b.tsv, кусками с докачкой (rclone cat --offset)
  • headless: fetch.py → md5 → originals_verified.json
  • Drive — мимо VPN адресом en0; сеть ночью прыгает между двумя Wi-Fi
/Volumes/T9-Black-RYA/<CH>/_originals/
2Слова с ролями
  • wordrole_transcribe.py: WAV 16k → mlx-whisper → pyannote → роль каждому слову (.words.json)
  • иначе: {CODE}_transcript.words.json дня, Claude4_assembly.json, SRT с ролями, JSON-реплики
  • имена --speaker-names раздаются по времени речи — сверять; роли = ключи people/hosts
{P}/01_Source/Transcription/ · 00_Setup/07_Shorts/{base}.words.json
3Края по звуку
  • story_cut: sc_align.py edges · show · audit — MMS_FA, два окна 5+3 и 10+10 слов
  • doc_cut: align.py memex — Whisper заново по куску ±4 с, якоря в местной расшифровке
  • headless: align.py (xlsr-ru), solo: align · letters (960H); шортсы: edges --fix
align_v1.json · words_local_v1 · edges.json
4Синхрон
  • sync.py measure: окон ≥ 18, остаток ≤ 10 мс; clap ±1 кадр; anchor
  • doc_cut: пара синхрона — окон ≥ 3, MAD ≤ 12 мс; звук из *_orig*.wav, не из timeline
  • петличка ≠ человек: хозяин громче ≥ 6 дБ, иначе чужая фраза «через комнату»
08_Cut/sync_model.json
5Кто в кадре
  • YuNet: дорожки лиц, имя по одежде (≥ 30 % замеров) или по месту за столом
  • SFace с эталонами refs_<герой>.npy: герой под «я» — только он
  • scout.py cuts · sheets · faces: склейки мастера и каталог кадров; каталог VLM «verified by vision» — выше по течению
broll/cuts.json · _analysis/*_source_index*.json
6Цвет
  • color.py frames · measure · build · board: куб на камеру (headless), на группу 65³ (doc_cut), на клип и кусок речи (story_cut)
  • канон 15_color: проявка по гамме → экспозиция числом → look канала
  • незнакомая гамма — отказ с именем клипа; плоский экспорт без метаданных — gamma_override
01_Source/00_LUT/{CODE}_{cam}_{ver}.cube · 00_LUT/_build/cut_<ver>/
Под листом агента — слоями
Кто в кадреYuNet 2 раза в секунду, SFace с эталоном, каталог кадровcuts.json · refs_*.npy
Края словCTC по звуку, рез в паузеalign_v1 · edges.json
Ролиимя человека на каждом слове.words.json
Слова со временемmlx-whisper large-v3 — указатель местаtranscript.words.json
Синхронпо речи: окон ≥ 18, остаток ≤ 10 мсsync_model.json
Куб цветапроявка по гамме: на камеру, группу или клип00_LUT/*.cube
Оригиналы на T9не прокси: кусками с докачкой, md5originals_verified.json
сверху — что читает агентснизу — основа: оригиналы

12.1 · 4Модели и движки этапа

Версии, веса и замки целиком — на Machine Stack.

МодельЧто делает здесьГдеЗамок, время
mlx-whisper large-v3слова со временем; местная расшифровка краёв (doc_cut)мак; Memex по sshmlx.lock; 84 куска за 6 мин на Memex
pyannote speaker-diarization-3.1кто говорит → роль каждому слову (вход шортсов)мак, MPSHF-токен; в движках фильмов диаризации нет — роли из листа или по уровню петлички
MMS_FA (torchaudio)выравнивание текста по звуку: sc_align, edges шортсовмак, процессорmlx.lock; ≈ 1 с на край; порциями по 40 краёв
wav2vec2-xlsr-russianвыравнивание русской речи (headless align)мак, .venv_whisperxокна ≈ 25 с; слова без кириллицы — «звезда»
WAV2VEC2_ASR_BASE_960Halign по тексту листа и 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

12.1 · 5Проверки

ПроверкаКогдаНормаОткуда взялась
md5 оригиналовfetch.pyoriginals_verified.json: все сошлисьrclone терял недокачанное при смене сети
Синхронsync.py measure · clapокон ≥ 18, остаток ≤ 10 мс; хлопок ±1 кадр; doc_cut: окон ≥ 3, MAD ≤ 12 мсчасы устройств врут на минуты и часы — якорь синхрона речь
Роли = людиtranscript · picks · render (⚠)ни одной роли без имени в people/hosts«Гость» вместо имени — шортсы без плашек (YTTRBM01)
Края: рез в паузеsc_align audit · edges0 резов вне паузы (YTCR04: 0 из 458); шортсы: воздух после ≤ 0,30 с, до ≤ 0,15, не ближе 0,05 к чужому словуметки слов рано на 85–570 мс: ~45 кусков из 229 теряли слово
Буква не чужаяedges.pyбуква, отделённая тишиной > 0,15 с, отбрасываетсявыравнивание цепляло крайнюю букву за похожий звук соседа («есть … Знаете»)
Герой в кадреsc_color probe · sc_sheet clipSFace ≥ 0,30 и глазамикаталог VLM назвал коллегу героем в 12 местах (YTCR04)
Гамма известнаcolor buildклип без распознанной гаммы — стопS-Log3-куб на D-Log2 топит экспозицию (YTEVO03: 61 клип из 163)
Дорожка лица — не шумrender шортсовдорожка ≥ 12 % замеров; имя по одежде ≥ 30 % и ≥ 2 замерарука или тень давали «лицо» на один замер
Петличка = хозяинdoc_cut story.pyхозяин громче ≥ 6 дБчужая фраза через комнату попадала в реплику
Пороги одним взглядом
Синхрон по речиостаток, мс · окон ≥ 18
≤ 10 мс
05101520

хлопок ±1 кадр; doc_cut: окон ≥ 3, MAD ≤ 12 мс.

Герой в кадресходство SFace с эталоном
0,30 порогложные 0,42–0,54
01

выше порога — только кандидат: ложные совпадения доходят до 0,54, героя подтверждают глазами.

Петличка = хозяиндБ громче чужого голоса
≥ 6 дБ
036912

иначе чужая фраза «через комнату» попадает в реплику.

Дорожка лица — не шум% замеров YuNet
≥ 12 %
012203040

имя по одежде — ≥ 30 % замеров и ≥ 2 замера.

нормана гранибрак

12.1 · 6Что обновляет базу знаний

ФайлЧто хранитКто и когда пишет
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 врёт, и что сработалосессия после каждого проекта — заметка растёт

12.1 · 7Ошибки и грабли

Whisper растягивает первое слово назадна 1–2,5 с в тишину — начало куска по острову речи, не по меткеYTEVO03
Whisper теряет короткие слова«и / вот / но» — край попадает внутрь непрописанного слова; текст у края вычитыватьYTEVO03
Whisper дописывает оборванное слово«…мир во» → «вокруг»: повторное распознавание куска ничего не доказывает — только CTC и распознавание СОБРАННОЙ речиYTEVO02
Фразы на часовой записи сдвинуты на 1–7 сместная расшифровка ±4 с вокруг реплики (align.py memex)YTCH14
Смычка согласной — 40–110 мс тишины внутри словапровал громкости ≠ пауза: рез только после выравнивания буквYTFP01
Слово после паузы на 0,25–0,6 с раньше звукаsolo.py align (CTC) — не метка WhisperYTCG37
Один порог среза съедает «s» и «-ng»два порога: пол + 10 дБ находит слово, пол + 5 дБ — где хвост ушёл в тишинуYTCG37
Петличка ≠ человекхозяин громче ≥ 6 дБ, иначе чужая фраза в репликеYTCH14
Каталог VLM путает людейколлега под словами героя 12 раз — SFace с эталоном плюс лист кадровYTCR04
Ложные лица: телевизор за спиной, игрушкиуверенность до 0,95 — crop.close_face 100 в задании, у героя только seatYTFP01
Часы DJI/Sony +1 чспаренные устройства живут в чужом поясе — якорь синхрона речь, не часысъёмочные дни
Номер кадра уходит от временина 24 с к концу 41 минуты — карту «кто в кадре» по ptsYTFP01
rclone теряет недокачанное при смене сетиfetch_ranges.py / fetch.py: кусками, --bind en0, md5YTEVO02 ночь
Склейки уезжают на кадр-r на входе дублирует первый кадр куска — читать -fps_mode passthroughYTFP01 v1
Процесс venv держит mlx_queuewordrole без замка и чужой venv в командной строке — очередь стоит часамиstory_cut
Абзацы diarized.srt по 10–20 свходом брать {base}.words.json, не SRT диаризацииYTTRBM01

12.1 · 8Команды

Оригиналы, слова, края
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  # куб на клип и кусок речи

12.1 · 9Где лежит

Входы
/Volumes/T9-Black-RYA/<CH>/_originals/ · {P}/01_Source/оригиналы
{P}/01_Source/Transcription/{CODE}_transcript.words.json · {P}/00_Setup/{CODE}_Claude4_assembly.jsonслова дня
{P}/00_Setup/07_Shorts/{base}.words.json (+ .review.html, _wordrole_work/)слова с ролями от wordrole
Что считает этап
{P}/00_Setup/08_Cut/sync_model.json · words_aligned.json · align_v1.json · words_local_v1.jsonсинхрон и края
{P}/00_Setup/07_Shorts/edges.json · broll/cuts.json · broll/shots_NN.jpgкрая и каталог кадров шортсов
{P}/01_Source/00_LUT/{CODE}_{cam}_{ver}.cube · 00_LUT/_build/кубы
Реестры канала
~/YTAI/YTs/{CH}/{CH}_voices.json · ~/YTAI/scripts/999_extra/face_finder/refs_*.npyголоса и лица, которым верим
Исходники машине · сверено 02.10.2026 · примеры: YTCR04 (края 0 из 458) · YTCH14 (местная расшифровка на Memex)