◂ База знанийRYA.AEShorts from a Finished Episode — шортсы из готового выпускаv1.6 · 3 окт 2026, 22:50
На входе — готовый выпуск и его расшифровка с ролями. На выходе — вертикальные шортсы: машина сама ставит кадр по лицу, кладёт субтитры, плашки и знак канала, заливает на YouTube по ссылке и выпускает по графику. Без Premiere и без монтажёра. Первый прогон — «Тараборим», выпуск 1: пять шортсов за вечер.
📌 Когда применять. Разговор за столом, от одного до четырёх человек в кадре, камеры на штативах. Нужны финальный мастер выпуска и расшифровка с ролями. Вычитанные субтитры готовы после 7.2 YouTube Upload & Table. Если шортсу нужны перебивки, графика или сложный кадр — его собирает монтажёр в Premiere, через вкладку Shorts панели.
1Схема2Кадр шортса3Отбор моментов4Как машина ставит кадр5Качество6Варианты7Сдача: страница выпуска8Выход по графику9Субтитры и папки10Перед выходом11Другой канал12Команды и файлы13Грабли

15.1 · 1Схема: от выпуска до выхода

📥 Вход
Мастер 16:9финальный кат, 4K
+
Расшифровка с ролямикто что сказал, по секундам
+
Профиль каналазнак, цвет, ведущие
🗣 Роли
Расшифровкавремя по словам
→
Голосакто когда говорит
→
Имена голосамсверить глазами
→
Расшифровка с ролямиили вычитанный файл с YouTube
🎯 Отбор
Задание отборщикупишется само
→
Агент Draper8–10 кандидатов
→
Проверка кодомдлина, уточнения, запреты
→
picks.json5 в работу
🎨 Подготовка
Проба кадровкто во что одет, где сидит
→
Знак и плашкикартинки из HTML канала
→
Задание выпускаготово к рендеру
🎬 Рендер
Склейки и лицазамер 2 раза в секунду
→
Дорожки лицшум отсеян
→
Кто в кадреодежда, место
→
Кроп 9:16на говорящего
→
Две версииYouTube без субтитров · Инстаграм с ними
➕ Варианты
ВыноскиHyperFrames, поверх кадра
+
МузыкаEpidemic Sound, под речь
→
В рендересли файл сделан для этого шортса
✅ Выбор
Страница выпускаварианты 1·2·3 рядом
→
Роман выбираетответ одной строкой
→
Версия Nвыбранное — следующим номером
🚀 Выход
Контрольный листкадр на каждый кусок
→
YouTubeпо ссылке
→
Субтитрыдорожки ru + en
→
Графикшаг 6 часов
→
Публичносообщение в Telegram
🗂 Учёт
Drive04_Shorts · Instagram · Archive
+
Telegramотчёт по пунктам со ссылками
+
Таблица и Trelloшортсы, папки, сколько, гость
+
Хаб каналаруками

Пунктир — шаг, который делается руками. Всё остальное — команды одного инструмента, порядок — в разделе Команды и файлы.

15.1 · 2Что получается: кадр шортса

Размеры — в пикселях кадра 1080×1920. Они записаны в профиле канала и одинаковы для всех его шортсов.

Кадр шортса: знак канала сверху, плашка гостя слева, субтитры ниже 123
Кадр шортса: уточнение в квадратных скобках цветом канала, целиком в одном субтитре
45
1
Знак канала — сверху по центру, 80 % своего размера, отступ 56. Крупнее или ниже — наезжает на голову.
2
Плашка — имя в две строки, кегль 104; должность 48 цветом канала. Держится 2,8 с. Появляется, только когда её человек на крупном плане и говорит, и гаснет, как только кадр ушёл на другого.
3
Субтитры — Montserrat Bold 70, белые, чёрная обводка 6. Не больше двух строк, строка не шире 900.
4
Уточнение — [в скобках] цветом канала. Это голос редакции: кто такой «он», что за аббревиатура. Шортс смотрят без выпуска. Скобки не отрываются от слова, которое поясняют, и не рвутся между субтитрами.
5
Низ кадра пуст. Ниже 1450 плеер кладёт подпись и кнопки: текст там не читается. Штриховка справа — столбец кнопок приложения, примерно.
Как это выглядит в телефоне
Шортс в мобильном плеере YouTube: кнопки справа внизу, подпись под кадром

Первый шортс в мобильном YouTube. Плеер кладёт на кадр кнопки справа и подпись снизу.

  • Замер в мобильном вебе: кнопки начинаются с 947 по ширине и с 1446 по высоте. Субтитры кончаются на 1450 — впритык.
  • В приложении столбец кнопок шире и выше — по опубликованным замерам, примерно с 880; на своём телефоне не мерили. Строка субтитра во всю ширину кончается на 990; у половины строк первого прогона правый край дальше этой границы — он может зайти под кнопки.
  • Проверять на телефоне на первом вышедшем шортсе. Сузить строки — одно число в профиле канала.

15.1 · 3Отбор моментов

Отбирает агент Draper по расшифровке с ролями. Задание для него пишется само — с каналом, выпуском и правилами канала. Человек смотрит уже готовые шортсы на контрольном листе.

1Что ищем
  • одна законченная мысль, понятная без выпуска
  • 25–59 секунд; код пропускает от 20 до 60
  • первая фраза — крючок: тезис против ожидания, цифра, конфликт
  • конец — точка или смех, не обрыв
2Как оцениваем
  • Hook · Flow · Value · Emotion — по 1–5
  • одна строка «почему сильно»
  • 8–10 кандидатов, в работу — пять
  • номер шортса = порядок выхода: S01 — самый сильный
3Что пишем к каждому
  • название — обещание, которое шортс выполняет
  • описание — одна фраза и хэштеги
  • короткое имя латиницей — оно же имя файла
  • уточнения [в скобках] к репликам, где без выпуска непонятно: реплика целиком, скобки — после поясняемого слова
S01Инвестиции не получает тот, кто их ищет — сооснователь Rapid Bio
Hook 5Flow 5Value 5Emotion 48:21 → 9:12 · 51 с

Почему сильно: контринтуитивный тезис первой же фразой, рабочий приём и смешной финал про футболку и рубашку.

Границы — по репликам, не по секундам: от начала первой реплики до конца последней. К ним добавляется воздух до соседних слов — до 0,25 с в начале и 0,30 с в конце, чтобы фраза не начиналась встык и чужое слово не попадало. Проверка кодом ловит то, что иначе всплывёт после рендера: длину, несуществующие реплики, уточнение к чужой реплике или с обрезанным текстом, запреты канала, имя файла.

15.1 · 4Как машина ставит кадр

Слева — кадр выпуска с рамкой, которую выбрала машина. Справа — то, что попало в шортс.

Крупный план гостя: рамка 9:16 во всю высоту кадраТот же момент в шортсе
Крупный план. В кадре крупное лицо — рамка во всю высоту, лицо по центру. Крупных лиц несколько — берём то, что видно всю склейку, а не мелькнувшее.
Общий план: трое за столом, рамка наезда на говорящегоТот же момент в шортсе
Общий план. Крупных лиц нет — наезд на того, кто сейчас говорит, если его лицо видно. Кто говорит, известно из расшифровки с ролями.
Кто есть кто
Проба кадра: рамки лиц и пятна одежды под ними

Под каждым лицом берём пятно на груди и смотрим его средний цвет. Одежда меняется от съёмки к съёмке — правила пишутся в задании выпуска.

ктоодеждаместо
Татьянасветлаяслева
Семёнтёмнаяпо центру
Ксениякраснаясправа

На этом кадре по одежде узнана только Ксения. Остальным имя дало место за столом: люди слева направо не меняются местами, поэтому неузнанный левее гостя — Татьяна.

Как машина решает
1Кто этораз на склейку

Лица соседних замеров одной склейки — одна дорожка, один человек. Имя получает дорожка целиком, а не каждый кадр.

Лицо видно реже чем в 12 % замеров?рука в жесте, блик, лицо на миг
да →
Шум. В расчёт не идёт
Одежда под лицом подходит под правило?в 30 % замеров дорожки и больше
да →
Имя по одежде. Один замер в тени ничего не меняет
Место за столом подходит одному человеку?слева, по центру, справа
да →
Имя по месту. Порядок слева направо в кадре не меняется
Ничего не подошло → без имени: рамка встанет, плашки не будет.
2Куда рамка2 раза в секунду

Вопросы задаются по порядку, первый ответ «да» решает. В паузе говорящим считается тот, чья реплика ближе.

В кадре крупное лицо?от 120 пикселей в кадре выпуска
да →
Крупный план: рамка во всю высоту по лицу
Лицо говорящего видно?в 60 % замеров его речи и больше
да →
Наезд на говорящего
Рамка в этой склейке уже стояла?говорящий за кадром или затылком
да →
Остаётся на прежнем человеке
Лица в склейке есть?начало склейки
да →
Самый заметный в кадре; никто не узнан — по месту говорящего
Лиц нет → середина кадра. Потом: кусок короче 1,2 с вливается в соседа.
Лента одного шортса
было — версия 1: 11 кусков, два скачка на соседа
стало — версия 2: 8 кусков
крупный планнаезд на говорящегоскачок на полсекундыS04 · 53 с
  • Склейки ищем только внутри куска: резкая смена картинки между соседними кадрами.
  • Лица сверяем два раза в секунду. Оператор перекадрирует и внутри одной склейки — рамка, поставленная один раз на склейку, уезжает.
  • Рамка стоит, пока лицо не ушло дальше 70 пикселей по горизонтали или 50 по вертикали — в кадре выпуска 1920×1080; в шортсе это 124–166 пикселей.
  • Не чаще раза в 1,2 секунды. Кусок короче вливается в соседа: рамка не дёргается туда-обратно.
  • Плашка — на своём человеке. Говорит ведущая, а на крупном плане гость — плашки нет. Кадр ушёл на другого — плашка гаснет.
Что исправляют дорожки
Версия 1: рамка на полсекунды уехала вправо, лицо обрезано краем кадрабыло
Версия 2: тот же момент, лицо в кадре целикомстало
Версия 1: говорит гость, а рамка на полсекунды перескочила на ведущуюбыло
Версия 2: тот же момент, рамка на гостестало

Слева — рука в жесте: детектор принял её за второе крупное лицо, и рамка на полсекунды уехала. Справа — тень на одежде ведущей: на один замер её пятно стало «тёмным», как у гостя, и наезд ушёл на неё. Обе ошибки — один замер из десятков. Дорожка судит по большинству, поэтому одиночный замер больше ничего не решает. Шесть кадров через равные промежутки такие скачки не показывали — теперь контрольный лист берёт кадр из каждого куска.

15.1 · 5Качество: шортсы только из 4K

Вертикаль вырезается из горизонтального кадра. Из мастера 1080p вырезанное приходится растягивать вдвое. Из 4K крупный план даже сжимается, а наезд растянут на 19 % — ниже порога, с которого мягкость видна. Белая черта — родной размер.

Мастер 1080p · крупный план
×1,78
Мастер 1080p · наезд
×2,37
Мастер 4K · крупный план
×0,89
Мастер 4K · наезд
×1,19
  • Первый прогон шёл из мастера 1080p — шортсы вышли мягкими. YouTube сжимает ещё раз, и на телефоне это видно.
  • Рендер сам предупреждает, если кадр растянут больше чем в 1,25 раза.
  • Один файл на всё: он идёт на YouTube, в Telegram и на Drive. H.264, качество CRF 12, звук AAC 320.
Мастер не 4K: ищем 4K и пересобираем
Мастер 1080pрендер печатает ⚠
→
Ищем 4KDrive, потом монтажёр
→
Сверяем по звукутот же монтаж?
→
Пересобираемневышедшие, версия 2
→
Заливаем занововремя выхода прежнее
Где искать 4K
  • на общем диске проекта и в «Доступные мне»: машина сама находит видео той же длины, что мастер, и показывает размер кадра
  • свежая заливка бывает ещё без размера — команда скажет, повторить через час-другой
  • у монтажёра — если на Drive только 1080p
  • камеры снимали в 1080p — 4K взять неоткуда, шортсы остаются как есть
Что просить
  • экспорт того же финального монтажа в 4K, 3840×2160
  • тот же хронометраж, кадр в кадр
  • камерные исходники не подходят: шортс режется из монтажа, а не из камер
Что не трогаем
  • вышедшие шортсы: у них просмотры и ссылки
  • файл на YouTube заменить нельзя — только залить новый ролик
  • старые невышедшие удаляем после заливки новых
  • у нового канала лимит — около десяти заливок в сутки: пересборку планировать с запасом по времени
Сверка нового мастера

Отбор и субтитры привязаны ко времени старого мастера. Машина ищет его звук в новом файле — по 12 секунд в начале, в середине, в конце и в начале каждого шортса.

✅ Тот же монтаж
  • сдвиг везде в допуске — до 45 мс, полтора кадра
  • пересобираем
⚠ Начало сдвинуто
  • сдвиг везде одинаковый: точки расходятся не больше чем на 20 мс
  • добавленная заставка ищется в пределах пяти минут
  • вписываем сдвиг в задание и сверяем ещё раз
⛔ Другой монтаж
  • сдвиги между точками разные или звук не находится
  • старый отбор не годится: новая расшифровка и новый отбор

Старый мастер хранить не нужно. При первом рендере рядом с заданием остаётся эталон его звука — файл на несколько мегабайт. Он едет на Drive вместе с заданием, и по нему сверяется любой новый мастер.

15.1 · 6Варианты: выноски и музыка

Базовый шортс — речь, кадр и субтитры. Два варианта добавляются по желанию: рендер берёт их сам, если находит файл для этого шортса. Файл сверяется с шортсом: поменяли отбор — чужие выноски и музыка не подхватятся.

Шортс с выноской: крупное число и подпись цветом канала на груди спикера 13
Шортс с выноской-фразой заглавными буквами 2
1
Число. Считает от нуля до значения, под ним подпись цветом канала. Появляется на словах, к которым привязано.
2
Фраза. Короткая мысль заглавными — когда цифры нет, а тезис надо удержать на экране.
3
Место. Выноска стоит на груди спикера: ниже лица, выше субтитров — там же, где плашка с именем. Субтитры и знак канала остаются поверх. Совпадёт по времени с плашкой — плашка её закроет; рендер об этом предупредит.
Визуализация — HyperFramesвариант
  • что показать, решает отбор: число или фраза, привязанные к реплике
  • машина собирает из них проект HyperFrames и снимает прозрачное видео
  • проект обычный: график, карту или свою сцену дорисовывают руками или скиллами HyperFrames
  • размер, частота кадров и длина — как у шортса, фон прозрачный
Музыка — Epidemic Soundвариант
  • трек ищется по описанию: настроение, темп, без вокала
  • пересобирается ровно под длину шортса — со вступлением и финалом
  • ложится на 21 дБ тише речи: громкость обоих измеряется, уровень меняется в задании
  • длина считается из отбора — подложку можно готовить до первого рендера
  • канал должен быть подключён в аккаунте Epidemic Sound до выхода — иначе придёт претензия

Проверено на шортсе S02 первого прогона: две выноски и подложка. Замер: речь −13,0 LUFS без музыки и с ней, подложка в сведении −33,9 LUFS — на 21 дБ тише. Это демо — на YouTube оно не залито.

⚙️ Выноски: как включить
# в picks.json у кандидата — поле viz
"viz": [{"id": 434, "shift": 2.7, "dur": 3.9, "kind": "number",
         "value": "> $4 млн", "label": "потрачено на тест на инсульт"},
        {"id": 438, "kind": "phrase", "text": "Тест так и не сделали"}]

$V $S viz --job $JOB --only S02 --init     # проект HyperFrames viz/S02/ — его можно править
$V $S viz --job $JOB --only S02 --render   # viz/S02.mov, прозрачное видео
$V $S render --job $JOB --only S02

id — реплика, к началу которой привязана выноска; shift — секунды от её начала; dur — сколько держится. Рядом с проектом лежит brief.json: реплики во времени шортса и свободные зоны кадра — для того, кто дорисовывает сцену. render --plain собирает шортс без вариантов. Выноске нужно не меньше 1,2 с до конца шортса. Шортс уже залит — вариант добавляется новой версией: render --version 2.

⚙️ Музыка: как включить
$V $S music --job $JOB --find "light minimal background for a business talk"
$V $S music --job $JOB --track <id> --only S02   # music/S02.wav ровно под длину шортса
$V $S render --job $JOB --only S02
  • Уровень — "music": {"below_db": 21} в задании или профиле канала: на сколько децибел музыка тише речи.
  • Ключ лежит на маке: ~/.config/ytai/epidemic_sound.env. В базу знаний, git и переписку его не кладём. Ключ живёт год.
  • Тот же сервис подключён к Claude Code как MCP-сервер epidemic-sound: музыку и звуковые эффекты можно искать разговором.
  • Скачивание требует действующей подписки. Опубликованное при подписке остаётся чистым и после её конца.

15.1 · 7Сдача: страница выпуска

Шортсы сдаются одной страницей на вышедший выпуск: все шортсы серией, вышедшие, залитые по ссылке и те, что ждут выбора. Оформление на согласовании идёт вариантами рядом — Роман выбирает у каждого шортса, ответ собирается одной строкой.

Страница выпуска YTTRBM01: шапка выпуска, лента всех шортсов, вышедшие и залитые по ссылке со ссылкой на версию для Инстаграма
1Чистый кадр
  • кадр, знак канала, плашка с именем
  • без графики
2Карточки
  • тёмные карточки с цифрами и тезисами на груди спикера
  • появляются на его словах
3Моушнвыбран для YTTRBM01
  • крючок в первые секунды, крупный текст по словам
  • на сильной цифре — сцена во весь кадр: 3D и частицы, спикер в круге
  • Что на странице: шапка выпуска · лента всех шортсов по порядку выхода · «Вышли» · «Залиты по ссылке» — время выхода, ссылка и версия для Инстаграма · «На согласовании» — варианты рядом · «Не собраны» с причиной.
  • Выбор: «▶ Все сразу» играет варианты синхронно, звук у одного; «Выбрать вариант N» у каждого шортса → внизу «⧉ Скопировать ответ»: YTTRBM01 · шортсы, выбор вариантов: S02 — 3 (моушн), …
  • Вариант — отдельное задание со своим манифестом и своей версией файла (v4 · v5 · v6); выбранное пересобирается следующей версией (v7).
  • Перед отправкой — глазами: скриншоты страницы на 1240 px и на телефоне (iframe 390 px), кадры каждой сцены графики — по готовым файлам. На YouTube — только выбранное.

15.1 · 8Выход: по ссылке и по графику

Первый шортс выходит сразу, остальные — с шагом. До выхода каждый открывается по ссылке: его можно показать гостю и ведущим. Ниже — график YTTRBM01, версия 7 (моушн): S02 вышел сразу по слову Романа, новая версия уже вышедшего S01 — последней.

S02сб 20:37сразу, публично
S03вс 06:00по ссылке → публично
S04вс 12:00по ссылке → публично
S05вс 18:00по ссылке → публично
S07пн 00:00по ссылке → публично
S08пн 06:00по ссылке → публично
S09пн 12:00по ссылке → публично
S01 · v7пн 18:00новая версия вышедшего
1Свой графикпо умолчанию
  • до выхода ролик открыт по ссылке
  • в назначенный час сам становится публичным
  • пишет в Telegram: «опубликован» и ссылку
  • не вышел — тоже пишет: причину, сразу и потом раз в час
  • время выхода можно сдвинуть одной командой; уже вышедшие она не трогает
  • публикует мак, на котором стоит задача: спит или выключен — шортс выйдет, когда мак проснётся
2Расписание YouTubeне берём
  • до выхода ролик приватный
  • по ссылке его не открыть и не показать
  • годится, только если показывать никому не надо
  • зато выходит сам, даже если мак выключен

Состояние одной командой. status спрашивает YouTube и показывает по каждому шортсу: вышел, по ссылке или приватный; время выхода; стоит ли он в графике — и что осталось сделать. Путь публикации проверен 02.10.2026 сухим прогоном в тех же условиях, в каких работает задача; первый боевой выход по графику — 03.10.2026.

Новая версия до выхода

Пересобранный шортс — новый файл и новый ролик на YouTube. Манифест, график и YouTube меняются не разом: остановиться посередине — значит выпустить старую версию.

шагманифестграфикYouTube
1 · рендер версии 2новое имя файла; прежний ролик записан как заменённый; время выхода осталосьстоит прежний роликпрежний — по ссылке
2 · заливканомер нового роликастоит прежний роликоба по ссылке
3 · графиквремя выхода подтвержденоновый — на прежнем времениоба по ссылке
4 · удалить прежнийего id — в deleted—Studio или инструментом выпуска

Рендер версии, которая уже залита, откажется работать: файл разошёлся бы с YouTube и с копией на Drive. Вышедшее не трогаем.

  • Лимит заливок. У нового канала — около десяти роликов в сутки, окно скользящее; удалённые ролики тоже считаются. Пять шортсов, выпуск и новая версия всех шортсов в одни сутки не помещаются.
  • Упёрлись — заливка останавливается сама и называет, что не залито. В графике при этом стоят прежние версии: в срок выйдут они.
  • Очередь доливки. Недолитое ставится в очередь: раз в два часа машина пробует снова, после заливки ставит новую версию на прежнее время и пишет в Telegram. Срок подошёл раньше, чем освободился лимит, — новая версия не заливается.
Связь шортса с выпуском
  • Где ставится: YouTube Studio → карточка шортса → Related video → выбрать выпуск. Под шортсом появляется ссылка на полное видео.
  • Только руками в Studio. Через API это поле не ставится.
  • У нового канала закрыто. Кнопка отвечает «Build your channel history». Откроется вместе с Advanced features: Settings → Channel → Feature eligibility.
  • Ссылка в описании шортса не поможет: в описаниях шортсов ссылки не кликаются ни у кого — правило YouTube с 31.08.2023. Выпуск называем в описании словами.
  • Там же — «больше шортсов в день»: у нового канала дневной лимит заливок. 02.10.2026 YouTube отказал на одиннадцатой заливке за сутки, считая удалённые ролики.
Куда ещё уходит шортс
Telegram
  • отчёт по пунктам: вышли, запланированы — каждый со ссылкой и временем, папки
  • файлы — в «Избранное», если попросили
  • бот шлёт только до 50 МБ
Drive
  • для YouTube — в 04_Shorts проекта
  • с субтитрами — в 04_Shorts/Instagram
  • прежние версии — в 04_Shorts/Archive
  • задание, отбор и манифест — в 00_Setup/07_Shorts
Учёт
  • одной командой: в таблице канала — чекбокс Shorts и чип на папку
  • Shorts subs folder, Shorts count и Note (гость) — пока руками
  • в карточке Trello — ссылки и время выхода
  • хаб канала: карточки шортсов — руками

15.1 · 9Субтитры, Инстаграм и папки

На YouTube шортс выходит без субтитров в кадре, но с дорожками субтитров — русской и английской: зритель включает их кнопкой «Субтитры». Для Инстаграма — та же версия с субтитрами в кадре, своей папкой (Роман, 03.10.2026).

YouTubeдорожки ru + en
  • в кадре субтитров нет — им не мешают графика и плашки
  • русская — текст реплик по словам, время каждого слова — по звуку
  • английская — перевод реплики; фраза перевода встаёт на время своей русской фразы
  • проверка: у каждого ролика ru и en, не автоматические
Инстаграмсубтитры в кадре
  • тот же шортс с субтитрами: в ленте звук часто выключен
  • файл …_v7_insta_….mp4 — в папке Instagram
  • в профиле канала "captions": {"burn": false} — YouTube без субтитров; render --insta — с ними
Папки: на диске и на Drive одинаково
04_Shorts/
├─ YTTRBM01_S02_v7_proval-na-4-mln.mp4   # для YouTube, без субтитров — 8
├─ Instagram/                             # с субтитрами в кадре — 8
└─ Archive/                               # прежние версии: перенос, не удаление
Таблица канала
  • Shorts — галочка «шортсы есть»
  • Shorts folder — чип папки 04_Shorts
  • Shorts subs folder — чип папки Instagram
  • Shorts count — сколько шортсов в папке
  • Note — имя гостя
Отчёт в Telegram
  • ✅ вышли — дата и ссылка
  • ⏳ запланированы — каждый строкой: дата, время, номер, ссылка
  • 📝 что сделано сверх — например, субтитры
  • 📁 папки деревом и ссылки на папки Drive
  • структуру люди понимают плохо — пишем по пунктам, не абзацем

15.1 · 10Перед выходом

Контрольный лист — кадр из каждого куска рамки с подписью: время, план, кто в кадре. Там, где стоит плашка, кадр взят с плашкой. Ошибка рамки видна в любом куске — без просмотра ролика.

Контрольный лист шортса S04: восемь кусков рамки, под каждым время, план и имя
✓ мастер 4K: растяжение не больше ×1,25 ✓ новый мастер сверен по звуку ✓ каждый шортс короче 60 с ✓ плашка — на своём человеке ✓ лицо в кадре целиком — в каждом куске листа ✓ в кадре тот, кто говорит, или тот, кто слушает, — не случайный сосед ✓ выноска не закрывает лицо ✓ с музыкой — канал подключён в Epidemic Sound ✓ скобки уточнений целые ✓ текст не выходит за кадр ✓ на телефоне субтитры не под кнопками ✓ в названии и описании нет запретов канала ✓ status: все по ссылке и в графике ✓ имена файлов по канону

15.1 · 11Повторить на другом канале

Канал настраивается один раз. Дальше на каждый выпуск нужны три вещи: расшифровка с ролями, задание и отбор.

Один раз на канал
1Профиль
  • цвет уточнений
  • шрифт и размеры субтитров
  • ведущие: имена, плашки и где сидят — слева, по центру, справа
  • шаг выхода, правила и запреты канала
  • таблица и доска канала — для учёта
2Графика
  • знак канала
  • стиль плашек
  • одна HTML-страница — из неё снимаются картинки
3YouTube
  • канал в общем реестре
  • токен с правом заливки и правок: шортсы заливаются по ссылке и публикуются через API
  • как завести — 0.1 Channel Launch, шаг «YouTube + токен»
  • после первой заливки — status: ролик должен быть «по ссылке», не приватным
На каждый выпуск
4Расшифровка с ролями
  • быстро: расшифровка по словам, роли по голосам
  • точнее: вычитанный файл субтитров с YouTube, имя в начале реплики
  • имена ролей — те же, что имена людей в профиле и задании. «Гость» вместо «Семён» — и плашек не будет; команды об этом предупреждают
  • имена голосам раздаются по времени речи — сверить глазами
  • без ролей нет плашек и наезда на говорящего
5Задание
  • мастер выпуска, 4K
  • гость: плашка и место за столом
  • кто во что одет в этот день
  • проба на двух-трёх кадрах подскажет цвета
  • путь проекта на общем диске — для Drive, поиска 4K и учёта
6Отбор
  • 8–10 кандидатов по расшифровке
  • пять — в работу
  • названия, описания, уточнения
канал
~/YTAI/YTs/{CH}/shorts_profile.jsonпрофиль: цвет, субтитры, ведущие, YouTube, запреты
~/YTAI/YTs/{CH}/shorts_gfx.htmlзнак и стиль плашек
выпуск
{project}/00_Setup/07_Shorts/{CODE}_shorts_job.jsonзадание: мастер, гость, одежда
{project}/00_Setup/07_Shorts/{CODE}_roles.jsonрасшифровка с ролями: по словам (.words.json), файл с YouTube (.srt) или JSON
{project}/00_Setup/07_Shorts/picks_prompt.mdзадание отборщику — пишется командой transcript
{project}/00_Setup/07_Shorts/picks.jsonотбор: кандидаты, оценки, названия
{project}/00_Setup/07_Shorts/out/manifest.jsonчто отрендерено, залито и когда выходит; рядом — контрольный лист sheet.jpg и сами шортсы, пока они на маке
{project}/00_Setup/07_Shorts/viz/S{NN}/вариант: проект HyperFrames с выносками шортса
{project}/00_Setup/07_Shorts/music/S{NN}.wavвариант: подложка ровно под длину шортса
{project}/00_Setup/07_Shorts/master_ref.m4aэталон звука мастера — по нему сверяется мастер получше
{project}/04_Shorts/{CODE}_S{NN}_v{N}_{slug}.mp4готовые шортсы на Drive — туда их кладёт команда drive
код
~/YTAI/scripts/07_shorts/0701_finished/инструмент и его README

Образец — канал «Тараборим»: ~/YTAI/YTs/YTTRBM/. Имя в дереве копируется по клику.

15.1 · 12Команды и файлы

⚙️ Порядок команд
V=~/YTAI/environment/.venv_transcribe/bin/python
S=~/YTAI/scripts/07_shorts/0701_finished/shorts.py
JOB=<папка 00_Setup/07_Shorts>/{CODE}_shorts_job.json

# расшифровка по словам с ролями — если вычитанных субтитров с ролями ещё нет
# имена — те же, что у людей в профиле канала и в задании
$V ~/YTAI/scripts/999_extra/wordrole_transcribe.py --media <мастер> --language ru --plain \
   --num-speakers 3 --speaker-names "Семён,Татьяна,Ксения" --out-dir <папка задания>
# → {base}.words.json, его и вписать в cues. Имена перепутаны — поменять порядок и повторить с --rebuild-only

$V $S transcript --job $JOB          # расшифровка одним текстом + задание отборщику picks_prompt.md
# агент Draper по заданию пишет picks.json
$V $S picks --job $JOB               # проверка отбора: длина, id реплик, уточнения, запреты, имена
$V $S probe --job $JOB --t 4:45 8:25 # кадры с лицами и цветом одежды
$V $S gfx --job $JOB                 # знак и плашки → gfx/*.png; без них рендер не начнётся
# по желанию: viz и music — см. «Варианты»
$V $S render --job $JOB              # шортсы → out/ + manifest.json + эталон звука master_ref.m4a
$V $S render --job $JOB --version N --insta   # Инстаграм: те же шортсы с субтитрами → 04_Shorts/Instagram
$V $S sheet --job $JOB               # контрольный лист out/sheet.jpg — кадр из каждого куска рамки
$V $S page --job $JOB --open         # страница выпуска: варианты 1·2·3 рядом, выбор Романа строкой
$V $S upload --job $JOB              # YouTube по ссылке; не залилось — код выхода 1
$V <выпуск>/00_Setup/07_Shorts/_session_tools/yt_subs.py build   # дорожки ru + en → upload → list (пока инструмент выпуска)
$V $S schedule --job $JOB --start now --every 6   # первый выходит сейчас, остальные через 6, 12, 18 часов
$V $S status --job $JOB              # что на YouTube: видимость, время выхода, стоит ли в графике
$V $S telegram --job $JOB            # файлы в «Избранное»
$V $S archive --job $JOB             # прежние версии → 04_Shorts/Archive; в корне — только актуальные
$V $S drive --job $JOB               # 04_Shorts, Instagram, Archive и 00_Setup/07_Shorts на Drive
$V $S ledger --job $JOB              # таблица канала и карточка Trello — после drive
  • schedule --start 2026-10-03T06:00:00+03:00 — первый невышедший в это время, дальше с шагом. --start now — первый выходит сейчас. Без --start — каждому его прежнее время из манифеста.
  • --only S02,S04 — работать с частью. Лишний флаг у команды, которая его не умеет, — ошибка, а не тихий пропуск.
  • render --version 2 — новая версия файла. Прежняя заливка остаётся в графике, пока не пройдут upload и schedule — см. «Новая версия до выхода».
⚙️ Пересборка из 4K
$V $S find4k --job $JOB              # есть ли 4K-версия выпуска на общем диске проекта
# в задании: "master" — путь к 4K-экспорту того же монтажа
$V $S check --job $JOB               # тот же монтаж? есть сдвиг начала?
# ⚠ сдвиг → вписать в задание "master_offset": 0.48 и повторить check

$V $S render --job $JOB --only S02,S03,S04,S05 --version 2
$V $S sheet --job $JOB --only S02,S03,S04,S05
$V $S upload --job $JOB --only S02,S03,S04,S05
$V $S schedule --job $JOB --only S02,S03,S04,S05   # без --start: время выхода прежнее
$V $S status --job $JOB
$V $S drive --job $JOB
$V $S ledger --job $JOB

Номера — те шортсы, что ещё не вышли. schedule сам снимает прежние ролики с графика; удалить их — в Studio или инструментом выпуска (yt_cleanup.py, удаляет только ролик по ссылке не длиннее трёх минут). Мастер версии 1 в 04_Shorts остаётся: мастера на Drive не перезаписываются, рабочие файлы задания — обновляются.

⚙️ Задание выпуска
{
 "project": "YTTRBM01",
 "channel": "YTTRBM",
 "master": "/путь/к/финальному_мастеру_4K.mp4",
 "cues": "YTTRBM01_roles.json",
 "picks": "picks.json",
 "version": 1,
 "people": {
  "Семён":   {"plate": ["СЕМЁН", "ПОКАЦКИЙ"], "role": "сооснователь Rapid Bio",
              "seat": "center", "wear": "dark", "big_face": 200},
  "Татьяна": {"wear": "light_warm"},
  "Ксения":  {"wear": "red"}
 },
 "wear_order": ["Ксения", "Семён", "Татьяна"],
 "tags": ["Семён Покацкий", "Rapid Bio"],
 "drive": "gdrive_rscore,team_drive=<id общего диска>:YTTRBM S1/YTTRBM01_Semyon_Pokatskii"
}

drive — rclone-путь проекта на общем диске, именно в таком виде: по нему работают выгрузка, поиск 4K и учёт. cues — расшифровка с ролями: .words.json (по словам), .srt с именем в начале реплики или JSON. Ведущие, их плашки и места берутся из профиля канала. Одежда: red, dark, light_warm, blue, green, white или точный цвет с кадра пробы — {"rgb": [137, 30, 46], "tol": 50}. big_face — очень крупное лицо без опознанной одежды считается этим человеком. seat — место за столом, как его видит камера: left, center, right.

⚙️ Отбор: одна запись picks.json
{"candidates": [
 {"rank": 2, "take": true,
  "pieces": [{"from_id": 430, "to_id": 438}],
  "scores": {"hook": 5, "flow": 4, "value": 4, "emotion": 5},
  "why": "Цифра и провал первой же фразой…",
  "title": "Больше $4 млн на тест на инсульт, который так и не сделали",
  "description": "… #shorts #Тараборим",
  "slug": "proval-na-4-mln",
  "clarifications": [{"id": 433, "text": "Чтобы вы понимали, в ДРД [прежнее название компании] совокупно, вместе с грантами Бортника, инвесторскими"}]}
]}

from_id и to_id — номера реплик из расшифровки. take — берём в работу. clarifications — реплика из этого же шортса, целиком, со скобками после поясняемого слова: её текст заменяет реплику на экране. Обрезанный текст с многоточиями обрежет и субтитр — проверка отбора это ловит.

⚙️ Задание отборщику

Шаблон лежит рядом с кодом — PICKS_PROMPT.md. Команда transcript подставляет в фигурные скобки канал, выпуск, говорящих, хэштеги и правила из профиля и кладёт готовое задание в папку выпуска.

Дон, выбери лучшие моменты для YouTube Shorts из выпуска {PROJECT} канала «{TITLE}» ({CHANNEL}). Работай сам, без вопросов.

## Источник
Расшифровка финальной версии с ролями и таймкодами по репликам:
{TRANSCRIPT}
Формат строки: `[id] м:сс.сс–м:сс.сс Говорящий: текст`. Говорящие: {SPEAKERS}.
{CONTEXT}

## Что нужно
1. 8–10 кандидатов, из них **пять к выпуску** (`"take": true`), по приоритету: rank 1 — самый сильный, он выйдет первым.
   - 25–59 с (строго < 60 с), законченная мысль: не начинается и не обрывается на полуслове;
   - первые 2–3 с — крючок (вопрос, сильное утверждение, цифра, конфликт); конец — панчлайн или вывод;
   - понятен без выпуска; если нужен контекст «кто / о чём» — уточнение в квадратных скобках прямо в реплике: «он [CEO компании]»;
   - один непрерывный кусок (предпочтительно) или два, если вырезанная середина пустая.
2. Для каждого: куски по id реплик (первая и последняя включительно), оценки Hook / Flow / Value / Emotion (1–5) и одна строка «почему».
3. Для пяти к выпуску — упаковка:
   - `title` ≤ 70 знаков, крючок в первых ~40, честное обещание (PROMISE CHECK из памяти: feedback_draper_promise_honesty.md);
   - `description` — 1–2 строки и хэштеги в конце: {HASHTAGS} (+1 по теме);
   - `slug` — латиница kebab-case, 2–5 слов, транслит крючка: он станет именем файла;
   - `clarifications` — реплики с уточнениями: `[{"id": …, "text": "реплика целиком, с [уточнением] в скобках"}]`.
     `text` заменяет реплику на экране полностью: бери её текст из расшифровки слово в слово и вставляй скобки сразу
     после слова, которое они поясняют; сокращать многоточиями нельзя. Этим же полем правится ошибка расшифровки
     внутри реплики. `id` — реплика из кусков этого же шортса;
   - `viz` (по желанию, не больше двух на шортс) — выноска на экране, когда в куске звучит сильная цифра или тезис:
     `{"id": реплика, "shift": секунд от её начала, "dur": 3–4, "kind": "number", "value": "> $4 млн", "label": "…"}`
     или `{"id": …, "kind": "phrase", "text": "…"}`. Только то, что действительно сказано в кадре.
4. ⚠️ Правила канала: {RULES}

## Выход
JSON в {PICKS}:
```json
{"candidates": [{"rank": 1, "take": true, "pieces": [{"from_id": 0, "to_id": 0}],
  "scores": {"hook": 0, "flow": 0, "value": 0, "emotion": 0}, "why": "…",
  "title": "…", "description": "…", "slug": "…", "clarifications": [], "viz": []}]}
```
Проверь кодом: `{CHECK}` — длительности (код пропускает 20–60 с, целимся в 25–59), id реплик существуют и лежат
внутри кусков своего шортса, уточнения не переписывают реплику, в названиях и описаниях нет запретов канала.
В ответе — таблица пяти (ранг, время, длительность, title) и коротко, почему именно они.
⚙️ Что должно стоять на маке
чтозачем
~/YTAI/environment/.venv_transcribeинтерпретатор всех команд
ffmpeg, ffprobeкадры, звук, кодирование
environment/models/face/yunet.onnxпоиск лиц; в git не лежит
~/Library/Fonts/Montserrat-Bold.ttfшрифт субтитров
Google Chrome и сетьзнак канала и плашки; шрифт страницы грузится из сети
Node 22+, npx и сетьтолько выноски HyperFrames
токен канала и запись в 08_youtube/channels.jsonзаливка по ссылке и публикация через API: права youtube.upload и youtube.force-ssl
задача launchd com.romansergeev.ytai-publish-scheduleвыход по графику; одна на мак, на все каналы
задача launchd com.romansergeev.ytai-shorts-pendingочередь доливки — если заливка упёрлась в дневной лимит канала
~/.config/rscore/token.json, rclone-remote gdrive_rscoreDrive, поиск 4K, таблица
~/.config/rya/trello.envкарточка Trello
python3 из Homebrew с Telethon и сеанс Telegramфайлы в «Избранное»; команда сама находит нужный интерпретатор
~/.config/ytai/epidemic_sound.envтолько музыка
~/.cache/huggingface/token, очередь локальных моделейтолько расшифровка по словам с ролями
# задачи графика и очереди доливки ставятся один раз
cp ~/YTAI/scripts/08_youtube/com.romansergeev.ytai-publish-schedule.plist ~/Library/LaunchAgents/
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.romansergeev.ytai-publish-schedule.plist
cp ~/YTAI/scripts/07_shorts/0701_finished/com.romansergeev.ytai-shorts-pending.plist ~/Library/LaunchAgents/
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.romansergeev.ytai-shorts-pending.plist

Команда schedule сама скажет, если задача не загружена. Проверки для каждой строки — в README рядом с кодом.

⚙️ График выхода: как устроен
  • Команда schedule пишет время выхода в ~/.config/ytai/publish_schedule.json.
  • Задача launchd com.romansergeev.ytai-publish-schedule раз в 5 минут запускает scheduled_publish.py.
  • Наступило время — ролик становится публичным, в Telegram уходит сообщение. Нечего публиковать — выход без запросов к YouTube.
  • Сбой — сеть, токен, квота: запрос повторяется, потом в Telegram уходит ⛔ с причиной — сразу и раз в час, пока не выйдет. Ролик удалён — пункт снимается с графика.
  • Журнал: ~/Library/Logs/ytai_publish_schedule.log.
  • Проверить путь заранее, ничего не публикуя: копия графика с прошедшим временем и scheduled_publish.py --dry-run --schedule <копия.json> — в ответ строка DRY would publish.
  • Очередь доливки: ~/.config/ytai/shorts_pending.json, задача launchd com.romansergeev.ytai-shorts-pending раз в два часа запускает pending.py run. Очередь пуста — ни одного запроса. Журнал: ~/Library/Logs/ytai_shorts_pending.log.
⚙️ Если что-то пошло не так
что случилосьчто делать
рендер упал посерединеманифест уже хранит собранные шортсы. Запустить render --only на остальных
рендер: «нет графики»сначала gfx
upload вернул код 1причины в выводе: сеть, запрет канала, нет файла. Повторный upload зальёт только незалитые
upload: лимит заливок каналаокно лимита — сутки. Поставить в очередь: pending.py add --job … --only S04,S05 — дольёт, поставит в график и напишет в Telegram. До тех пор в графике прежние версии
шортс не вышел в срокв Telegram придёт ⛔ с причиной. Мак спал — выйдет при пробуждении. Вручную: scheduled_publish.py
status: приватныйдоступ сменили в Studio — вернуть «Доступ по ссылке». На выход не влияет: публикатор переводит в публичный из любого состояния. Если YouTube сам запирает ролики канала приватными — выпускать руками в Studio
status: не в графикепосле новой версии забыли upload и schedule
check: другой монтажсдвиг начала команда нашла бы сама — значит, монтаж правда другой: новая расшифровка и отбор
find4k: видео без размераDrive считает размер свежей заливки до нескольких часов — повторить позже
ledger: нет папки 04_Shortsсначала drive. В таблице нужны заголовки «Video Project», «Shorts», «Shorts folder» и одна строка проекта; на доске — одна карточка с кодом проекта

15.1 · 13Грабли

Круг со спикером в сцене во весь кадр дёргалсясборка теряла микросекунду на стыке и брала кадр графики раньше; метки кадров — на сетку
Субтитр «17 %» появлялся позже, чем звучитцифры звук не выравнивает — число ставится в паузу перед следующим словом
Полоса графики гасла, не договорив словополоса стоит собранной ≥ 0,5 с до ухода: поздние появления — раньше и быстрее
Мелкий текст в графикеподпись ≥ 50, строка ≥ 56, число 150–240 при 1080×1920; не влезает — сокращать, а не мельчить
Рамка уехала с лица посреди склейкилица сверяем два раза в секунду, а не раз на склейку
Рамка на полсекунды прыгала в сторонудетектор принял руку за лицо; одиночный замер больше не решает — судит дорожка
Наезд уходил на соседа, пока говорит гостьтень на одежде меняла «кто это» на один замер; имя даётся дорожке по большинству
Говорит ведущая — в кадре её затылокнаезд только на того, чьё лицо видно; иначе рамка остаётся на госте
Плашка ведущей легла на гостяплашка только когда её человек на крупном плане, и гаснет вместе с кадром
Скобки уточнения рвались и вылезали за кадрстрока набирается по ширине в пикселях; уточнение держится со своим словом в одном субтитре
Контрольный лист не показал скачокшесть кадров через равные промежутки его пропускают — кадр берётся из каждого куска рамки
Роли названы «Гость» и «Ведущая1»плашки и места ищутся по имени: роли называем так же, как людей в профиле и задании
Новую версию собрали, а вышла стараяпосле рендера версии нужны заливка и график; status показывает, что осталось
Публикация по графику могла упасть молчазапрос к YouTube повторяется; не вышло — ⛔ в Telegram с причиной
YouTube отказал в заливке: дневной лимит каналазаливка останавливается и говорит, что не залито; очередь доливает сама, когда лимит освободится
Знак канала наехал на голову80 % размера, отступ сверху 56
В ffmpeg нет модулей субтитровсубтитры идут потоком прозрачных картинок — работает в любой сборке
Поиск склеек по всему выпуску падалищем только внутри отобранного куска
Расписание YouTube сделало ролики приватнымисвой график: до выхода ролик открыт по ссылке
Заливка на YouTube обрываласьзаливаем в обход: --sni-bypass, команда upload ставит его сама
Бот не отправил файлы в Telegramбольше 50 МБ — только от своего аккаунта
Мастер 1080p: шортсы вышли мягкимиищем 4K-экспорт того же монтажа и пересобираем невышедшие
У копии с YouTube звук отстаёт на 36 мсэталон звука делается только из самого мастера
Прозрачный рендер HyperFrames давал пустые кадрыснимаем в один поток — команда viz делает это сама
Музыка без подключённого канала — претензияканал подключают в аккаунте Epidemic Sound до выхода ролика
На YouTube ушла лёгкая сборка, а мастер — в Telegramодин файл на всё: что на YouTube, то и на Drive
Расшифровка абзацами по 10–20 секундсубтитры уплывают от речи — на вход идёт расшифровка по словам
Мак спал в час выходашортс выйдет при пробуждении; важен точный час — держать мак включённым
Новую версию YouTube счёл дублемпосле render --version команда upload льёт заново сама
Шортс — одна законченная мысль, кадр по лицу, выход по графику.
версия 1.6 · 03.10.2026, 22:50 · пример: YTTRBM01_Semyon_Pokatskii · код: ~/YTAI/scripts/07_shorts/0701_finished/