lct-09: звук звонящего на фронте, перебивание, аудио-фон

Очередь AudioBufferSourceNode, а не <audio>: перебивание требует
оборвать звук мгновенно и выбросить очередь. Планирование встык по
currentTime с упреждением 50 мс — иначе между чанками щелчок.

Перебивание двухслойное: фронт гасит звук по громкости микрофона за два
кадра (40 мс), сервер подтверждает по VAD за 88–90 мс и присылает
tts.cancel. Сервер — авторитет, фронт — скорость.

Логика вынесена из WebAudio и проверена в Node: очередь планируется без
щелей и наложений, сброс останавливает все чанки, гейт не срабатывает на
шуме и ловит начало речи ровно один раз.

Нет файла фона — звонок идёт без фона с предупреждением в консоли, а не
падает: записи это контент, их кладёт методист.

Путь через браузер с живым микрофоном не проверен: шаги записаны
в карточке.
This commit is contained in:
Ivan Gerasimov 2026-09-17 21:13:41 +03:00
commit 750ded2991
9 changed files with 402 additions and 98 deletions

View file

@ -0,0 +1,17 @@
# Аудио-фон происшествия
Сюда кладутся зацикленные записи, которые звучат под голосом звонящего: треск огня,
детский плач, шум улицы, гудки, сирена. Имя файла указывается в сценарии:
```yaml
background:
loop: fire_crackle.mp3
gain_db: -18
```
Требования: зацикливается без щелчка на стыке, моно или стерео, mp3 или ogg,
10–30 секунд. Гейн задаётся сценарием и должен быть заметно ниже голоса — фон
даёт ощущение места, но не мешает разбирать речь.
Файла нет — занятие идёт без фона: в консоли браузера останется предупреждение,
звонок не прервётся.