◂ База знанийRYA.AETranscript Document — расшифровки съёмочного материала по вкладкамобновлено 26 сен 2026
Прокси сделали — материал стал лёгким, но всё ещё немым: чтобы узнать, что герой сказал на 14-й минуте, надо открыть видео и слушать. Этот этап делает материал читаемым: Google-документ на выпуск, вкладка на каждую сцену (или съёмочную папку), внутри — расшифровка таблицей с таймкодом и именем говорящего, кадры превью и ссылки на оригинал и прокси. Имена голосов сквозные по всему каналу: один человек — одно имя во всех документах. Сценарист ищет цитату текстом, а не перемоткой.
📌 Когда применять. Сразу после 3.4 Прокси для монтажа — это следующий шаг проекта. Вход: съёмочные папки на Drive, прокси-слой и расшифровки из архива (или их дописывают здесь же). Выход: Google-документы с вкладками в папке каждого проекта + HTML-страницы с живым поиском. Живой пример: YTCH — 14 документов, по одному на выпуск: 658 клипов, 37,3 ч, 83 вкладки, 1,32 млн символов речи. Предыдущий — YTFP: один документ, 17 папок, 239 клипов, 13 ч речи, 655 тысяч символов.
расшифровки из архива→ диаризация pyannote→ сквозные голоса→ имена руками→ кадры + VLM→ Docs по вкладкам→ HTML с поиском
1Что во вкладке2Сквозные голоса3Кадры превью4Конвейер5Грабли6Приёмка7Где лежит

3.5 · 1Что во вкладке

Вкладка = сцена, если проект разложен по сценам (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).

3.5 · 2Сквозные голоса

Главное, ради чего этап вообще нужен в таком виде. Поклиповая диаризация знает только «в этом клипе говорили трое»: её SPEAKER_00 в пятой папке и SPEAKER_00 в шестой — разные люди. Читать такое нельзя.

  1. pyannote по каждому клипу отдаёт турны и центроид-эмбеддинг на говорящего. На MPS — около 23× реального времени: 13 часов звука разбираются за полчаса.
  2. Центроиды всех клипов кластеризуются глобально, в одном пространстве. Узлов сотни, а не десятки тысяч, — двухступенчатость и делает задачу подъёмной.
  3. Имена. Интервьюер — кластер, звучащий в наибольшем числе сцен. Герой группы сцен — самый говорливый в ней кластер, кроме интервьюера. Второстепенным голосам роль выбирает локальная LLM из закрытого списка (s3c, Qwen3-8B).
  4. Кластеризация — по всем проектам канала одним прогоном. Сквозь канал идут одни и те же люди; посчитай по спринтам раздельно — и каждый получит в каждом документе своё имя. YTCH: порог 0,38 (потолок без ошибок 0,40), 202 голоса, ошибочных совпадений ноль; Роман — во всех четырнадцати выпусках, куратор фонда — в шести.
🎯 Порог склейки подбирается, а не назначается. Съёмка обычно даёт готовую разметку: часть героев снята в двух папках. Правильный порог обязан склеить голос внутри такой пары и не склеить разных героев между парами. Счёт = склеенные пары − 2 × ошибочные совпадения. Штраф обязателен: без него счёт растёт монотонно и вырождается в «все голоса — один».

Разметку дают сами имена сцен: 11_Curator_Gulya, 08_Curator_Gulya_New_Family, 05_Curator_Gulya_About_Tutorship — один голос в пяти разных днях, комнатах и микрофонах (группы — s3b_cluster.py → GROUPS и SOLO). На YTFP разметкой были герои, снятые в двух папках: 5 из 5 склеены, ноль ложных совпадений, без имени осталось 0,2 % текста. Побочная польза: видно, что мама героя говорит на занятии у логопеда, а голос логопеда звучит в домашнем архиве, — материал связывается между папками сам.

✋ Кого имена сцен не называют — называет человек. Сцены, названные по месту, а не по имени (Аня в YTCH10, Лиза и Виталик в YTCH11), опознаются по репликам. s3d_names.py считает обращения по имени, но автоприсвоение выключено: имя героя чаще произносят, рассказывая о нём («Юля меня забрала»), а не обращаясь, — и голос Ани набрал 26 очков за «Юлю». Счёт остаётся уликой в work/voice_name_evidence.json; имя ставится руками: прочитать work/voices.json → clusters[cid].samples, положить work/voice_overrides.json вида {"7": "Виталик"} и перезапустить s3d + s6.

3.5 · 3Кадры превью

Шесть кадров, снятых равномерно по клипу, в сетке 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 иногда описывает его, а не сцену («время отображено»). Такие хвосты вычищаются фильтром.

3.5 · 4Конвейер

ШагЧто делает
s0 / s0bYTCH: проекты без локального материала и канальный блок (призывы фонда) — звук по сети с 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 ГБ и столько же кадров.

3.5 · 5Грабли

3.5 · 6Приёмка

Гейт читает сам документ и сверяет с индексом материала: у каждой вкладки столько же заголовков клипов, сколько клипов; таблиц столько, сколько клипов с речью; картинок не меньше; у каждой вкладки Pageless; имя каждого клипа встречается в тексте. Именно так поймались пустые заголовки перед таблицами и стёртая вкладка — по журналам оба раза всё выглядело «готово».

3.5 · 7Где лежит

ЧтоГде
Тулинг и 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 Передача монтажёру
Этап 3.5 · после прокси, до передачи монтажёру · RYA.AE