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