# Субтитры: реальные слова, реальные секунды

## Источник истины

Субтитры строятся только из `timeline.json`, полученного из пословной транскрибации. Сценарий не может быть источником временных меток и не может добавлять фразы.

## Временные правила

- первый блок: начало первого слова ± 80 мс;
- начало каждого блока = начало первого слова;
- конец = конец последнего слова + 40–100 мс;
- внутри блока каждое слово имеет собственный интервал;
- искусственное появление не должно задерживать видимость первого слова;
- при паузе более 500 мс старый блок скрывается.

## Текст

- 2–7 слов;
- 1–2 строки;
- использовать фактически сказанную форму, а не литературно переписанный сценарий;
- имена и цифры исправляются вручную, но временная позиция сохраняется;
- нельзя добавлять заголовок, которого нет в речи;
- нельзя оставлять призыв из сценария, если человек его не произнёс.

## Стиль 9:16

Для 1080×1920:

- кегль 54–76 px;
- ширина 70–86%;
- базовая линия 70–77% высоты;
- нижний запас 360–500 px.

Для 720×1280:

- кегль 36–52 px;
- нижний запас 260–360 px.

Один основной гротеск, максимум два начертания. Тонкий контур, мягкая тень, один акцентный цвет. Никакой вечной чёрной плашки.

Готовые идентичности находятся в `assets/caption_styles/`. Для референса с золотым текстом используй `reference_neon`: RGB-регистрация должна быть сдвинута примерно на 1–2 px и оставаться вторичной по отношению к читаемому основному слою. Для мототемы можно использовать `moto_speed`. `yellow_highlight` применяется только к короткой ударной фразе.

Перед финалом проверить кириллицу и лицензию шрифта:

```bash
python scripts/font_audit.py
```

## Подсветка слова

Допустима мягкая пословная подсветка, если она помогает увидеть синхронизацию. Не нужно заставлять каждое слово прыгать и увеличиваться, будто оно выиграло отдельную премию.

## Проверка

`validate_sync.py` обязан подтвердить:

- покрытие ≥ 97%;
- нет слов, отсутствующих в транскрипте;
- начало и конец блоков совпадают с соответствующими словами;
- первый блок не задержан;
- последний блок не обрывается.
