Так работают тема и подложка autocut, трек на блок story_cut и подложка шортсов. Дорожка «Звуки» есть только для заставки главы и входа в карту в двух движках — остальное надо построить (раздел «Звуки»).
Роман, 03.10.2026: «ещё не забудь отдельно подбор музыки в MCP Эпидемик Саунд. Музыка это супер важно! Настроение, динамика, какие-то звуки чего (кроме музыки же надо звуки ещё отображать или показывать)». Канон этапа: музыка — настроение и динамика блока, не фон.
Один блок крупно. Штрафы — из оценки audio_music.py (autocut): они не выкидывают трек, а опускают его в списке.
Звук — тоже показ: событие на экране получает удар, свист или клик. Сегодня это умеют два движка для двух событий.
| Событие | Где в фильме | Сегодня в коде | Надо |
|---|---|---|---|
| Заставка главы | карточка или плашка главы | story_cut: Ping Boom −12 дБ из палитры монтажёра; headless: stinger Epidemic −2 дБ RMS к речи с главы 2 | solo, doc_cut, autocut — построить |
| Вход в карту | map_route, map_place, map_world | story_cut: свист whoosh −20 дБ, удар за 0,48 с до кадра | остальные — построить |
| Цифра встала | экраны number, counter; выноска viz считает 0,8 с | нет | клик или тик на остановке счётчика — 💬 моё мнение |
| Плашка появилась | lower third, имя, плашка шортсов | нет | короткий мягкий свист на кадр появления |
| Карта рисуется | линия маршрута, точки | нет (только вход) | шелест на длину рисования, тише отбивки |
| Смена куска в шортсе | стык двух реплик | нет; клиент music.py умеет sfx(), команды нет | команда shorts.py sfx — открыто |
Откуда: SearchSoundEffects (term, ≤ 3 с) → DownloadSoundEffect WAV (02.10 пришёл 96 кГц); похожее — SearchSimilarToSoundEffect. Уровни как у отбивок: удар −2…−12 дБ к речи, клик тише; звук — на кадр события, не в слово. Список событий утверждает Роман.
| Событие | story_cut | headless | solo | doc_cut | autocut | шортсы |
|---|---|---|---|---|---|---|
| Заставка главы | ✓ | ✓ | ✗ | ✗ | ✗ | · |
| Вход в карту | ✓ | ✗ | ✗ | ✗ | ✗ | · |
| Цифра встала | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Плашка появилась | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Карта рисуется | ✗ | ✗ | ✗ | ✗ | ✗ | · |
| Смена куска | · | · | · | · | · | ! |
Шортсы: клиент music.py умеет sfx(), команды нет. Какие события озвучивать — решает Роман.
| Движок | Откуда трек и как выбран | Укладка и уровни | Состояние |
|---|---|---|---|
| autocut (YTEVO) | scout по 10 запросам: теги + замеры превью → music/choice.json; тема и подложка, WAV FULL + INSTRUMENTS | стем INSTRUMENTS под речью ≤ −20 (тема) / −21 (подложка) дБ к речи, провал 2–4 кГц −3,5 дБ; без речи подъём до −9, не выше −6; пол −26…−28 | лестница из 3 тем; report меряет музыку к речи |
| headless (YTLAB) | трек и stinger из задания: music.track (file, id, drop_s, outro_card_at_s), music.sting | открытие −21 → −15 → 0 (заставка) → −15 дБ RMS к речи; финал на outro_card_at_s; отбивка −2 дБ на плашке глав со 2-й | журнал music_ledger.json; под разговором музыки нет |
| solo (YTCG37) | один трек, подрезан сервисом ровно под длину программы (282 с) | level_bed подтягивает тихие места до 10 дБ; подложка −21 дБ RMS к речи, хвост без слов −7 | «Brighter», журналы v1–v3; ждёт safelist канала |
| doc_cut (YTCH) | план руками или агентом {CODE}_music_v1.json: 8 треков, 12 кусков с at в треке | bed −22 / lift −9 дБ к речи, вход 1,5 с, уход 3 с; речь ловится с упреждением 0,2 с | журнал music_v1_ledger.json; канал фонда подключён к Epidemic 02.10 |
| story_cut (YTCR04) | палитра монтажёра music_palette.json: 8 треков, 7 звуков, энергия на блок → sc_music.py plan | энергия 1–4 = −26 / −20 / −11 / −2 дБ при программе −16 LUFS + поправка на речь; паузы > 1 с: +7 дБ для энергий 1–2; уход за 0,35 с до слова | 45 кусков, 23 отбивки → sc_sound.py music → мастер |
| шортсы | music --find → --track id: EditRecording ровно под длину куска; поиск ≥ 45 с без вокала | below_db 21 LUFS к речи по замерам обоих, вход 0,3 с, уход 0,8 с; замер: речь −13,0, подложка −33,9 LUFS | music/S{NN}.wav + .json; рендер берёт по файлу, чужой пропускает с ⚠ |
music плана screen-plan-v1: title, text, variants[id, title, note, audio], default; у варианта можно указать at — где в фильмеmusic ещё не показывали; лестница autocut (audio.py ladder --what music) пока локальная, в ~/Downloads — Роману нужна ссылка на yt.rya.aeshorts.py telegram); рядом ссылка на страницу версииmusic/choice.json — theme, bed, theme_candidates, why; руками --theme / --bedmusic.track, music.sting в {CODE}_cut_job.json; журнал — 08_Cut/music_v{N}.json{CODE}_music_v1.json; story_cut: палитра → {CODE}_music_plan.json; шортсы: music/S{NN}.jsonmusic.version нет — версия живёт в теге файла| Проверка | Когда | Норма | Откуда взялась |
|---|---|---|---|
| Музыка ниже речи | report · render | autocut ≤ −20 (тема) / −21 (подложка) дБ к речи в окнах 3 с с речью ≥ 70 %; headless, solo −21 RMS; doc_cut −22; шортсы 21 LUFS | запас к «не ближе 18 дБ»: окно с паузой читает речь на 1–2 дБ тише |
| Подъём без речи | карточки, финал | самое громкое место −9 дБ к речи, не выше −6; подъём ≤ 15 дБ | удар на карточке приходил приглушённым |
| Нет вокала | scout · поиск | vocals=false; теги без «no vocals» −10; доля голоса > −8 дБ −4 | в инструментале изолятор речи почти ничего не находит |
| Длина = блок | music шортсов · solo | EditRecording forceDuration, ≤ 300 с; шортс: разница > 0,5 с → ⚠ и пропуск | отбор меняли — музыка ложилась на чужой шортс |
| Подложка не пропадает | solo level_bed · autocut floor | solo: тихие места не ниже «обычный − 3 дБ», подъём ≤ 10 дБ; autocut: пол −26…−28 | YTCG37: вступление на 7–11 дБ тише — музыка пропадала на полминуты |
| Лицензия | до upload и выхода | канал в safelist Epidemic; запись в журнале лицензий | без safelist — претензия Content ID |
| Музыка в шортсе | upload | ≤ 90 с музыки при Content ID (шортсы 1–3 мин) | правило YouTube с 24.09.2026 — по памяти qc 28.09, кодом не сверено |
| Мастер | master | −14 ±1 LUFS, пик ≤ −1 dBTP, LRA ≤ 8; autocut ±0,5 | 17_audio/standard.py — одно место чисел |
autocut: тема ≤ −20, подложка ≤ −21, пол −26…−28; headless и solo −21 RMS; doc_cut −22; шортсы — на 21 LUFS ниже речи.
пик ≤ −1 dBTP, LRA ≤ 8; autocut держит ±0,5 — числа в 17_audio/standard.py.
| Файл | Что хранит | Кто пишет |
|---|---|---|
music/choice.json (кэш autocut) | тема, подложка, 3 кандидата, why | исполнитель «звук» по лестнице; Роман — «Скопировать выбор» |
music.track, music.sting в {CODE}_cut_job.json | трек, дроп, карточка финала, stinger | сессия после выбора Романа |
08_Cut/{CODE}_music_v1.json (doc_cut) | треки и куски: at, bed, lift, in, out, note | человек или агент по структуре |
08_Cut/music_palette.json + .md (story_cut) | как монтажёр ставил музыку: треки, звуки, энергия по блокам | сессия по проекту монтажёра; план — sc_music.py |
_licenses.json · music_ledger.json · music_v{N}.json · sound_music_<tag>.json | что скачано, где звучит, уровни | движки сами |
профиль канала: треки, настроения, music.below_db | поля нет: shorts_profile.json читает ключ music, но он не задан ни у одного канала (умолчание 21); в color_profile.json музыки нет; запросы зашиты в audio_music.py | надо построить — YTs/{CH}/music_profile.json (предложение) |
память reference_epidemic_sound_mcp | адрес, инструменты, лицензия, где ключ | сессия после проверки |
V=~/YTAI/environment/.venv_transcribe/bin/python S=~/YTAI/scripts/07_shorts/0701_finished/shorts.py; SC=~/YTAI/scripts/05_editing/0511_story_cut $V $S music --job $JOB --find "light minimal background for a business talk" --n 8 # кандидаты с превью $V $S music --job $JOB --track <id> --only S02 # music/S02.wav + S02.json ровно под длину куска; render подхватит сам, --plain — без музыки $V $SC/sc_music.py plan $P # палитра → {CODE}_music_plan.json: куски, отбивки глав и карт $V $SC/sc_sound.py music $P && $V $SC/sc_sound.py master $P # укладка по энергии → music_<tag>.wav → мастер −14
AC=~/YTAI/scripts/05_editing/0510_autocut $V $AC/audio_music.py scout --cache $CACHE --first 10 # поиск → превью → замеры → music/scout.json; show — таблица с оценками $V $AC/audio_music.py fetch --cache $CACHE --ids <id> --dest $P/02_Edit/Sound/Epidemic # WAV FULL + INSTRUMENTS, запись в _licenses.json $V $AC/audio.py ladder --what music # лестница трёх тем → ~/Downloads/<CODE>_v4_choices/music/_chooser.html $V $AC/audio.py assemble --theme <id> --bed <id> # укладка под речь, сведение, мастер; выбор запоминается в music/choice.json $V $AC/epidemic.py search "hopeful piano strings" --no-vocals --mood hopeful --min-dur 120 --max-dur 300 # прямой клиент: tools · search · similar · preview · download · edit
HC=~/YTAI/scripts/05_editing/0510_headless_cut; DC=~/YTAI/scripts/05_editing/0511_doc_cut $V $HC/music.py build --job $J --edl edl.json --tag v1 # открытие, финал, отбивки → music_v1.wav, mix_v1.wav, music_ledger.json $V $HC/solo.py music --job $J # один трек под длину программы: подложка −21, финал −7 $V $DC/sound.py music --job $J --tag v1 # по плану {CODE}_music_v1.json → music_v1.wav + ledger
~/.local/bin/claude mcp list # epidemic-sound ✔ Connected
SearchRecordings · SearchSimilarToRecording · SearchExternalReferences · EditRecording → PollEditRecordingJob → DownloadRecordingEdit · DownloadRecording (FULL / INSTRUMENTS / BASS / DRUMS) · SearchSoundEffects · SearchSimilarToSoundEffect · DownloadSoundEffect · ListVoices · GenerateVoiceoverКлюч — в ~/.config/ytai/epidemic_sound.env (права 600), в ~/.claude.json — ссылка на переменную, не ключ. Действует год; новый — в кабинете Epidemic Sound.