# Fish Audio: два 20-секундных демо webrtc-komaroff

Один текст и первые две анимированные сцены исходной презентации с короткой финальной заставкой, два разных русскоязычных голоса. Это **тест облачной озвучки**, а не новая полная версия ролика. Темп обновлён по замечанию пользователя о медленном звучании; первоначальные версии сохранены в [original-tempo/](#archive-availability).

| Голос | Готовый MP4 | SRT | Длительность |
|---|---|---|---:|
| Женский — [«Спокойный женский голос»](<https://fish.audio/ru/m/e64409e787324864bdf9e5c1b6acd97a/>) | [female-20s.mp4](#archive-availability) | [subtitles-female.srt](</experiments/voice-ai/archive/c/videos/webrtc-explainer-2026-09-17/voice-variants/fish-audio-20s/subtitles-female.srt>) | 20,000 с |
| Мужской — [«Мужской Профессиональный213»](<https://fish.audio/ru/m/7312c38557eb4fb384e3874e8e9cea67/>) | [male-20s.mp4](#archive-availability) | [subtitles-male.srt](</experiments/voice-ai/archive/c/videos/webrtc-explainer-2026-09-17/voice-variants/fish-audio-20s/subtitles-male.srt>) | 20,000 с |

Точный текст, идентификаторы голосов и параметры — в [script.json](</experiments/voice-ai/archive/c/videos/webrtc-explainer-2026-09-17/voice-variants/fish-audio-20s/script.json>). Предметная анимация переиспользует две начальные сцены полного объясняющего ролика; надпись «ПО КОДУ» относится к снимку `772de4a` от 16.09.2026, а не к проверке работающего кластера. Тексты демо немного сокращены относительно полной версии, чтобы дать двум голосам одну и ту же понятную 20-секундную историю.

## Как получена озвучка

- Официальный `POST https://api.fish.audio/v1/tts`, заголовок `model: s2.1-pro-free`, тело JSON с `reference_id` и `format: mp3`. Восемь запросов (четыре фразы × два голоса) вернули `200 audio/mpeg`; CAPTCHA не потребовалась. [Документация TTS](<https://docs.fish.audio/features/text-to-speech>), [цена модели](<https://docs.fish.audio/developer-guide/models-pricing/pricing-and-rate-limits>).
- Ключ при вызове API читается только из `FISH_API_KEY` в окружении процесса. По запросу пользователя он сохранён в локальной системной связке ключей GNOME Keyring с атрибутами `scope=monitorsoft`, `service=fish-audio`; это не Git и не файл ролика. Исходный текст фраз был передан Fish Audio; по [описанию бесплатной модели](<https://fish.audio/ru/blog/s2-1-pro-free-api/>) запросы могут сохраняться для улучшения модели. Не передавайте этим способом закрытые сценарии без отдельного решения.
- Исходные MP3 — в `raw/`. `build_demo.py` декодирует их в PCM 48 кГц, измеряет реальную длительность каждой фразы, добавляет паузы и формирует WAV ровно из 600 кадров × 1600 отсчётов, отдельный таймлайн и SRT для каждого голоса. Коррекция темпа FFmpeg `atempo` сохраняет высоту голоса: теперь 1,14× для женского и 1,04× для мужского, вместо 1,06× и 0,92×. Последние фразы заканчиваются на кадрах 552 и 529 соответственно; после них показана финальная заставка.
- Видеоряд — Remotion 4.0.507, 1920×1080, 30 кадров/с. Звук в MP4 — AAC 48 кГц, моно, с нормализацией до целевых −16 LUFS. Исходные WAV сохранены отдельно.

## Воспроизведение сборки

Из корня `videos/webrtc-explainer-2026-09-17` после установки зависимостей задайте `FISH_API_KEY` в окружении локального процесса, не записывая его в исходники или командную строку. На этом компьютере ключ можно подать из системной связки ключей без вывода значения:

```bash
FISH_API_KEY="[скрыто]" python3 voice-variants/fish-audio-20s/synthesize.py
```

Остальные шаги:

```bash
python3 voice-variants/fish-audio-20s/build_demo.py
env -u NODE_OPTIONS pnpm exec tsc --noEmit
env -u NODE_OPTIONS node voice-variants/fish-audio-20s/render_demo.mjs
python3 voice-variants/fish-audio-20s/mux_demo.py
```

`synthesize.py` всегда делает новые API-запросы. Если нужны только повторный рендер или сборка из сохранённых MP3, начните с `build_demo.py`; ключ тогда не нужен. Промежуточный первый пробный MP3 с более длинной фразой сохранён в `raw/probe/`, но в ролик не входит.

## Проверка 17.09.2026

- `pnpm exec tsc --noEmit` — без ошибок.
- `ffprobe`: оба MP4 — H.264 1920×1080/30 fps и AAC 48 кГц, ровно 20,000 с для видео, звука и контейнера.
- `ffmpeg -v error -i <файл> -f null -` — полное декодирование обоих файлов без ошибок.
- `volumedetect`: средний уровень −16,9 dB (женский), −16,5 dB (мужской); максимальный −1,1/−1,5 dB. После речи остаётся 1,7/2,6 с тишины с финальной заставкой; это не обрыв аудио.
- Проверены кадры 120, 285, 480, 558 и 582 обеих версий, а также мужской кадр на 16-й секунде в полном разрешении: текст и схема не обрезаны. Контрольные листы находятся в [qc-faster/](#archive-availability).
- Субтитры и смена сцен рассчитаны по длительности конкретной дорожки. Прослушивание человеком, оценка произношения и независимая ASR-сверка пока не проводились.

Ролики подготовлены для заявленного некоммерческого использования. Бесплатный API действует по fair-use и без SLA; дата доступности в [публикации Fish Audio](<https://fish.audio/ru/blog/s2-1-pro-free-api/>) — до 30.11.2026, не бессрочно. Лицензию самого toolkit см. в [основном README](</experiments/voice-ai/archive/c/videos/webrtc-explainer-2026-09-17/README.md>).
