Очередь AudioBufferSourceNode, а не <audio>: перебивание требует оборвать звук мгновенно и выбросить очередь. Планирование встык по currentTime с упреждением 50 мс — иначе между чанками щелчок. Перебивание двухслойное: фронт гасит звук по громкости микрофона за два кадра (40 мс), сервер подтверждает по VAD за 88–90 мс и присылает tts.cancel. Сервер — авторитет, фронт — скорость. Логика вынесена из WebAudio и проверена в Node: очередь планируется без щелей и наложений, сброс останавливает все чанки, гейт не срабатывает на шуме и ловит начало речи ровно один раз. Нет файла фона — звонок идёт без фона с предупреждением в консоли, а не падает: записи это контент, их кладёт методист. Путь через браузер с живым микрофоном не проверен: шаги записаны в карточке.
17 lines
946 B
Markdown
17 lines
946 B
Markdown
# Аудио-фон происшествия
|
||
|
||
Сюда кладутся зацикленные записи, которые звучат под голосом звонящего: треск огня,
|
||
детский плач, шум улицы, гудки, сирена. Имя файла указывается в сценарии:
|
||
|
||
```yaml
|
||
background:
|
||
loop: fire_crackle.mp3
|
||
gain_db: -18
|
||
```
|
||
|
||
Требования: зацикливается без щелчка на стыке, моно или стерео, mp3 или ogg,
|
||
10–30 секунд. Гейн задаётся сценарием и должен быть заметно ниже голоса — фон
|
||
даёт ощущение места, но не мешает разбирать речь.
|
||
|
||
Файла нет — занятие идёт без фона: в консоли браузера останется предупреждение,
|
||
звонок не прервётся.
|