# Музыка под речь: выбор и подкладка

Две отдельные проблемы, которые обычно путают: **какой трек** и **как его
подложить**. Жалоба «музыка ни о чём и плохо слышно» почти всегда означает и то,
и другое сразу.

## Выбор: ранжирование по тому, что мешает речи

```bash
python scripts/audition_music.py candidates/*.mp3 --brief calm_talk \
  --under-duration 105 --excerpt-dir excerpts --out audition.json
```

Трек выбирается не по тегам. Решает то, чего в метаданных нет:

| Величина | Что означает | Порог |
|---|---|---|
| `mid_occupancy` | Доля энергии в 300–3400 Гц — полосе, которая нужна голосу. | Ниже 0.30 хорошо, выше 0.40 — трек придётся задавить до неслышимости. |
| `syllabic_ratio` | Плотность модуляции 2–8 Гц в полосе 1–4 кГц против всего диапазона 0.2–20 Гц. 1.0 — ровно. | Выше 1.6 — в речевой полосе что-то движется со скоростью речи: вокал или солирующая линия. |
| `intro_seconds` | Сколько до выхода трека на рабочую энергию. | Больше 12 с — под короткий ролик не подложить. |
| `dynamic_spread_db` | Разброс уровня. | Меньше 4 дБ — кирпич, ровная стена под голосом. Больше 20 — будет нырять под сайдчейном. |
| `peak_dbfs` | Пик исходника. | Выше 0 — файл уже клиппован, чище не станет. |
| `pulse_strength` | Выраженность бита. | Ниже 0.12 — резать по битам не выйдет. |

### `hf_transients_per_second` — почему трек одновременно «не слышно» и «бьёт по ушам»

Это самая контринтуитивная метрика набора, и она объясняет реальную жалобу:
музыки не слышно, но её высокие биты перебивают голос.

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

Считается плотность резких атак выше 5 кГц. Выше **2.5 в секунду** — трек будет
слышен щелчками, а не телом.

Реальный пример: выбранный по остальным метрикам трек имел 3.1 транзиента/с и
172 BPM. Заменивший его — 1.7 транзиента/с и 68 BPM, при вдвое более свободной
речевой полосе.

`mix_music_bed.py` дополнительно считает эту величину сам и вешает на бас полку
`treble` до −7 дБ от 6 кГц, пропорционально измеренному. Полка, а не срез: цель
— чтобы хэты перестали пробивать, а не чтобы трек звучал из соседней комнаты.
Отключается через `--tame-hats 0`.

**`mid_occupancy` — самый сильный предиктор.** Трек на падах и сабе оставляет
речевую полосу пустой, и его можно играть на 6 дБ громче трека с гитарой при той
же интегральной громкости, не теряя разборчивости. Поэтому «музыку не слышно» и
«музыка мешает голосу» — это одна и та же проблема: трек с плотной серединой
приходится задавить до неслышимости.

Метрика `syllabic_ratio` считается по **плотности**, а не по сумме полос. Сумма
здесь не говорит ничего: 2–8 Гц — это 6 Гц из 19.8 Гц эталона, поэтому даже
абсолютно ровный спектр модуляции даёт 0.30, и все треки оказываются у порога.

Ранжирование не выбирает. Слушай `excerpt` двух-трёх верхних кандидатов.

### Реальный пример

Трек, который стоял в предыдущей версии монтажа, получил 62 из 100: пик
+2.4 дБFS (клиппован), и **интро 69 секунд** при длине ролика 105. Отсюда и
«плохо слышно» — почти весь ролик шёл под тихим вступлением. Заменивший его трек
получил 100: `mid_occupancy` 0.11, пик −6.8 дБFS, интро 6 с, лицензия CC-BY.

## Подкладка: три полосы вместо одного дакера

```bash
python scripts/mix_music_bed.py cut.mp4 track.mp3 out.mp4 \
  --intent under_talk --timeline timeline.json
```

Плоский sidechain-компрессор — причина, по которой фон в монтаже либо не слышен,
либо мешает. Он давит **всю** музыку одинаково, поэтому единственная ручка —
«насколько закопать», и басы с воздухом исчезают вместе с серединой, которая
только и была проблемой.

Здесь бас делится на три полосы, и каждая обрабатывается за то, что она делает:

- **низ (< 250 Гц)** — разборчивости не мешает никогда, давится слабее всех и
  держит тело трека под говорящей головой;
- **середина (250–3500 Гц)** — единственная настоящая коллизия. Давится сильнее
  всех плюс получает статический вырез, потому что статика не качает;
- **верх (> 3500 Гц)** — воздух и тарелки слышны поверх речи, не маскируя её.

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

## Сколько LU под голосом — и почему не 19

Вещательная практика называет 15–22 LU для музыки под речью. Это верно для
непрерывного микса, где бас **играет между фразами**: слушатель регулярно слышит
трек в открытом виде и достраивает его присутствие под речью сам.

В плотно нарезанной говорящей голове этих пауз нет. Они вырезаны — в этом и был
смысл нарезки. Поэтому та же цифра воспринимается на несколько дБ тише, чем
показывает прибор, и корректно измеренная подкладка на 19 LU звучит как «музыки
почти нет». Рабочее значение здесь — **15 LU**, и трёхполосный дакинг это
позволяет: середина освобождена, поэтому бас можно посадить ближе, не теряя
разборчивости.

| Intent | LU под голосом | Подъём в конце |
|---|---|---|
| `bed` | 20 | +5 дБ |
| `under_talk` | 15 | +6 дБ |
| `support` | 12 | +7 дБ |
| `drive` | 10 | +8 дБ |

После последнего слова дакеру больше не на что реагировать, и бас поднимается
сам — это то, что отличает «ролик закончился» от «ролик оборвался».

Уровни не угадываются. Оба входа меряются `ebur128`, и трек ставится на заданное
число LU ниже измеренного голоса. Ключ сайдчейна —
голос, ограниченный полосой 200–4000 Гц: если открывать дакер полнополосным
сигналом, скрип кресла раскрывает его так же широко, как фраза.

`acrossover` разделяет полосы фазово-когерентно — иначе сумма трёх полос даёт
гребёнку.

## Лицензия

Openverse отдаёт `cc0`, `by`, `by-nc`, `by-nc-nd`. Для ролика, который может
стать коммерческим, годятся только `cc0` и `by`. `by-nc-nd` запрещает и
коммерческое использование, и производные — подкладка под видео является
производным. Карточка трека обязательна: см. `PIXABAY_MUSIC.md`.
