Вкладка = сцена, если проект разложен по сценам (YTCH спринт 3: 01_Drive_To_Abramovo; русское название вкладки задано в common.py → SCENE_RU, латинское имя папки — под заголовком), или съёмочная папка, если сцен нет (YTFP, YTCH спринты 1–2, Video_Light; ветка выбирается флагом flat в реестре). Сверху паспорт вкладки, дальше клипы подряд.
| Элемент | Зачем |
|---|---|
| Объём и ссылки папки | Вес оригиналов и вес прокси отдельно, ссылки на обе папки Drive. Сразу понятно, что качать и сколько это стоит. |
| Голоса папки | Кто говорит и сколько. Второстепенные сворачиваются в счётчик, иначе в занятиях с детьми список на два экрана. |
| По клипу: ссылки | Оригинал и лёгкая копия — открыть в один клик, не разыскивая файл. |
| Контактный лист | Шесть кадров с таймкодами. Понятно, что за сцена, не открывая видео. |
| «В кадре» | Строка описания локальной VLM. Помечена как машинная — это подсказка, не проверенные данные. |
| Таблица расшифровки | Таймкод · Голос · Реплика. Реплики одного голоса подряд склеены в абзац, иначе таблица рассыпается на строчки по три слова. |
Вкладки — режим Pageless, каждой назначается отдельно. Сводная вкладка держит таблицу папок и таблицу голосов; номер папки в ней ведёт прямо на её вкладку.
Документ на выпуск, а не на канал. Речи YTCH 1,32 млн символов — в один документ (лимит 1 020 000) не влезает и по смыслу не нужно; самый крупный, YTCH10, — 294 тысячи. Каждый документ заводится сразу в папке своего проекта на Shared Drive: папку в Shared Drive задним числом не перенести. Ссылки на документы — в Content List канала, колонка D «Doc» (s9_sheet_links.py).
Главное, ради чего этап вообще нужен в таком виде. Поклиповая диаризация знает только «в этом клипе говорили трое»: её SPEAKER_00 в пятой папке и SPEAKER_00 в шестой — разные люди. Читать такое нельзя.
s3c, Qwen3-8B).Разметку дают сами имена сцен: 11_Curator_Gulya, 08_Curator_Gulya_New_Family, 05_Curator_Gulya_About_Tutorship — один голос в пяти разных днях, комнатах и микрофонах (группы — s3b_cluster.py → GROUPS и SOLO). На YTFP разметкой были герои, снятые в двух папках: 5 из 5 склеены, ноль ложных совпадений, без имени осталось 0,2 % текста. Побочная польза: видно, что мама героя говорит на занятии у логопеда, а голос логопеда звучит в домашнем архиве, — материал связывается между папками сам.
s3d_names.py считает обращения по имени, но автоприсвоение выключено: имя героя чаще произносят, рассказывая о нём («Юля меня забрала»), а не обращаясь, — и голос Ани набрал 26 очков за «Юлю». Счёт остаётся уликой в work/voice_name_evidence.json; имя ставится руками: прочитать work/voices.json → clusters[cid].samples, положить work/voice_overrides.json вида {"7": "Виталик"} и перезапустить s3d + s6.Шесть кадров, снятых равномерно по клипу, в сетке 3×2 на тёмной подложке, с таймкодом на каждом. У коротких клипов кадров меньше — сетка перестраивается, чтобы не было дыр. Источник — локальный оригинал, а для папок, которых нет на дисках, скачанный прокси: ещё одна причина делать этот этап после прокси, а не до.
Кадры по сети — когда видео локально нет вовсе (YTCH спринты 1–2, только Drive). Прокси собраны faststart (moov в начале), поэтому ffmpeg долистывает range-запросом до нужной секунды и читает один GOP вместо файла: шесть кадров с гигабайтного 4K HEVC — 22,8 с против 105 с на скачивание целиком; 207 контактных листов — 15 минут и 0 ГБ на диске. Платим за round-trip, а не за размер файла. Обвязка — netframes.py (rclone serve http + range-seek).
⚠️ Ноутбук ходит в Drive через VPN и упирается в 9,5 МБ/с при любом --transfers — считать выгрузку по этой цифре, а не по числу потоков.
⚠️ Таймкод выжжен в кадр, и VLM иногда описывает его, а не сцену («время отображено»). Такие хвосты вычищаются фильтром.
| Шаг | Что делает |
|---|---|
s0 / s0b | YTCH: проекты без локального материала и канальный блок (призывы фонда) — звук по сети с Drive + расшифровка. Один файл в нескольких проектах расшифровывается один раз, копии получают её по akey. |
s1 индекс | Сводит проекты → сцены/съёмочные папки → клипы, Drive-ID оригиналов и прокси, пути к расшифровкам. Отсеивает готовые выпуски, сток, референсные фильмы и скринкасты без речи. |
s2 расшифровки | Берёт готовые из архива, недостающее дописывает mlx-whisper large-v3. |
s3a/b/c/d голоса | Диаризация, глобальная кластеризация, роли второстепенных голосов, имена из voice_overrides.json. |
s4/s5/s5b кадры | Контактные листы, выгрузка на Drive, описания VLM. |
s6 документ | Вкладки, ссылки, картинки, таблицы. |
s8 HTML | Страница на проект + индекс канала: живой поиск по всем репликам (клавиша «/»), фильтр по голосу, клик по таймкоду копирует «клип + таймкод». Запрос живёт в адресе. |
s9 ссылки | YTCH: чипы на документы в Content List, колонка D, порциями по 10. |
verify | Приёмка по документу, а не по журналам. |
Каждый шаг идемпотентный и резюмируемый: повторный запуск подхватывает работу с места обрыва. Оркестратор run_all.py после каждого этапа спрашивает гейт — не набран объём → повтор до трёх раз с растущей паузой; статусы в Telegram, подробности в logs/. Присмотр раз в 10 минут поднимает упавший прогон.
cd ~/YTAI/scripts/999_extra/ytch_transcript_doc # YTFP — ytfp_transcript_doc, те же команды python3 run_all.py # весь конвейер python3 run_all.py --from s4 # с этапа и дальше python3 run_all.py --only s6 # один этап python3 s6_build_doc.py YTCH13 # документ одного проекта nohup ./supervisor.sh > logs/supervisor.log 2>&1 & python3 verify.py # приёмка по самим документам
⚠️ work/ живёт на внутреннем диске и не чистится — там резюмируемость: одних wav16 набирается 2,2 ГБ и столько же кадров.
index 1 и оказывается над предыдущим. Ячейки таблицы заполняются от последней к первой.index I даёт таблицу с T = I + 1; пустая ячейка (r, c) лежит по адресу T + 3 + r·(1 + 2C) + 2c.namedStyleType сбрасывает оформление текста — назначать его надо ДО кегля и цвета. А новый абзац наследует стиль соседа, поэтому обычному тексту NORMAL_TEXT ставится явно.insertTable заводит перед таблицей пустой абзац, и тот тоже наследует стиль заголовка. Пустых заголовков набирается по одному на таблицу — навигация превращается в кашу.includeTabsContent=true. Снимок тяжёлый — берётся редко.files.get на Shared Drive даёт 404 без supportsAllDrives=true — легко принять за битую ссылку.Гейт читает сам документ и сверяет с индексом материала: у каждой вкладки столько же заголовков клипов, сколько клипов; таблиц столько, сколько клипов с речью; картинок не меньше; у каждой вкладки Pageless; имя каждого клипа встречается в тексте. Именно так поймались пустые заголовки перед таблицами и стёртая вкладка — по журналам оба раза всё выглядело «готово».
| Что | Где |
|---|---|
| Тулинг и README — YTCH, документ на выпуск | ~/YTAI/scripts/999_extra/ytch_transcript_doc/ |
| Тулинг и README — YTFP, один документ | ~/YTAI/scripts/999_extra/ytfp_transcript_doc/ |
| Состояние конвейера | work/ — не чистить, там резюмируемость |
| HTML-версия | html/{КОД}_transcripts.html + html/YTCH_index.html + html/sheets/; копии — в {проект}/00_Setup/05_Review/ |
| Соседние этапы | 3.9 Каталог материала · 3.4 Прокси · 5.2 Передача монтажёру |