Слушать, пока говоришь, и что агент делает с открытым каналом звонящего

Как агент Dialogist продолжает слушать, пока говорит, начинает ответ внутри паузы и отличает перебивание от кашля.

Исследования

98%ответов запускают языковую модель до конца паузы

По телефонной линии оба собеседника могут говорить одновременно. Голосовой агент, который отвечает, только когда звонящий молчит, и глохнет, пока говорит сам, работает в полудуплексном режиме и звучит как рация. Эта заметка описывает, как агент Dialogist продолжает слушать, пока говорит. Она опирается на предыдущую заметку, Как понять, что звонящий договорил.

Цифры по задержке получены в настоящих телефонных звонках (модель конца реплики) и на стенде нагрузочного тестирования с агентом-рекрутером (ранний старт).

Цифры по задержке, на которых построена заметка.
Показатель Значение
Реплик звонящих в настоящих звонках, закрытых по интонации раньше таймера 87%
Возвращённое время на реплику благодаря этим ранним закрытиям, в среднем ≈ 0,3 с
Ответов, которые запускают языковую модель до конца паузы 98%
Сэкономленное время ответа при раннем старте, от одного звонка до 128 разговоров от 89 до 235 мс
Клипов «ага», проигранных звонящему без одобрения человека 0

Что мы называем полным дуплексом

Агент представляет собой потоковый конвейер, и важное для нас свойство в том, что канал звонящего остаётся открытым. Пока агент говорит:

  • детектор голоса продолжает работать на аудио звонящего;
  • распознавание продолжает получать его кадрами по 20 мс;
  • собственное исходящее аудио агента идёт через микшер, который умеет снижать его громкость, приглушать, ставить на паузу, возобновлять и подмешивать другие звуки.

В следующих разделах описано, что агент делает с этим открытым каналом.

Как решить, что реплика закончена

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

Агент ждёт 192 мс, а затем спрашивает небольшую модель, прозвучала ли фраза законченной. Если модель уверена, реплика закрывается сразу. Если нет, агент продолжает слушать, а более долгая тишина всё равно закрывает реплику, чтобы никто не ждал вечно.

  • Вердикт модели применяется на следующем 32-миллисекундном кадре аудио.
  • В настоящих звонках (1468 реплик звонящих) модель закрыла раньше срока 87% реплик, 95% из них с первого взгляда, и вернула в среднем около 0,3 с на реплику. В 96% пауз, где звонящий просто думал, она подождала.
  • Сначала наблюдение. У модели три режима для каждого агента: выключена, наблюдение и фиксация. В режиме наблюдения она записывает, что решила бы, и ничего не меняет. Мы настраиваем пороги на настоящих звонках в режиме наблюдения и переключаемся на фиксацию, когда журнал согласуется с тем, что делали звонящие.
  • Списки и числа — то место, где мы особенно внимательно ищем слишком ранние закрытия. Звонящий, который называет номер карты, звучит так, будто закончил, между группами цифр.

Начать ответ до конца паузы

Между последним словом звонящего и закрытием реплики есть окно от 200 до 400 мс. Распознавание делает пробный проход во время паузы, поэтому текст обычно уже известен.

Ранний старт использует это окно. Когда пауза достаточно длинная, а пробный текст достаточно уверенный, агент собирает промпт, который собрал бы после закрытия реплики, с ожидаемой репликой звонящего сверху, и отправляет его языковой модели. Модель пишет первую фразу, пока реплика формально ещё открыта.

Ранний запрос может только читать, и это делает его безопасным:

  • он ничего не записывает в историю разговора;
  • он не вызывает синтез речи;
  • он не выполняет инструмент и не может завершить или перевести звонок;
  • если реплика закрывается с тем же текстом, тем же промптом и той же историей, агент берёт подготовленные фразы. Если что-то отличается, агент отбрасывает запрос, и работает обычный путь;
  • если звонящий снова начинает говорить или перебивает, агент отменяет запрос и закрывает HTTP-поток.

В нагрузочном тесте запрос уходил раньше решения в 98% ответов, в среднем на 225 мс раньше при 50 разговорах и на 508 мс раньше при 128. Ранний старт сократил среднее время ответа на 89 мс при одном разговоре, на 189 мс при 96 и на 235 мс при 128.

Выигрыш растёт с нагрузкой: под нагрузкой реплика закрывается дольше, и у подготовленного ответа больше времени, чтобы быть готовым.

Перебивания

Звонящие говорят поверх агентов. Агент за несколько десятков миллисекунд решает две вещи: перебивание ли это вообще и достаточно ли оно весомо, чтобы остановиться.

Два способа обнаружить

Перебивание, подтверждённое текстом, требует, чтобы распознавание выдало хотя бы четыре буквы текста. Акустическому нужно, чтобы детектор голоса услышал устойчивую речь, что происходит быстрее. У акустического режима собственный порог, отдельный от порога, открывающего обычную реплику, потому что ошибка стоит дороже: ложное «реплика открыта» стоит пустого буфера, а ложное перебивание обрывает агента на полуслове.

Что не считается

Акустический режим требует непрерывной речи выше порога. Клавиатура даёт много коротких всплесков; счётчик сбрасывается в каждом промежутке между ними и не достигает предела. Речь удерживает его без промежутков. Кашель и одинокое «ага» тоже не считаются.

Эхо

В звонках из браузера эхо собственного голоса агента может попасть в микрофон. Агент распознаёт его как эхо, без акустического подтверждения и при низкой уверенности распознавания, и договаривает фразу.

Что помнит агент

Агент отмечает прерванный ответ в следующем промпте, чтобы модель знала: звонящий услышал не всё. По желанию агент получает и непроизнесённую часть ответа и может продолжить её или отбросить.

Выключатель

Агента можно настроить так, чтобы он вообще не уступал, для реплик, которые нужно прочитать целиком.

Отступить, прежде чем остановиться

Обрываться на первом звуке грубо, когда этот звук — «да, да». Когда звонящий начинает говорить, голос агента сначала отступает и останавливается, только если речь окажется перебиванием.

  • Когда звонящий начинает говорить, громкость приглушается. По умолчанию она падает на 15 дБ за 150 мс, а голос ещё и тускнеет: высокие частоты спадают и включается фильтр нижних частот, так что провал звучит, как будто человек отодвинулся от телефона.
  • В режиме hold (пауза) агент останавливается примерно через один слог (200 мс). В режиме duck (приглушение) он продолжает говорить тише.
  • Если речь звонящего считается перебиванием, агент останавливается с затуханием за 30 мс. Если нет, голос возвращается за 300 мс.
  • После паузы агент ждёт полсекунды на случай, если звонящий вот-вот заговорит снова, и затем возобновляет с ближайшего промежутка между слогами (до 400 мс назад), с начала фразы или с точного места, смотря что подходит. Если пауза была долгой (1,5 с), он возвращается к началу фразы.
  • Если ничего из этого не произошло за 2,5 с, агент решает, остановиться ему или восстановить голос.

Каждый из этих параметров настраивается для каждого агента, а агент, которого нельзя перебивать, не приглушается.

Сказать «ага»

Пока звонящий долго говорит, тишина на другом конце звучит как обрыв связи. Люди заполняют её короткими звуками.

Агент делает то же самое, используя набор коротких подтверждений: «ага», «понятно», «угу». Клипы заранее синтезированы голосом самого агента, и человек прослушивает и одобряет их до того, как любой из них можно будет использовать. Если у голоса нет одобренного набора, функция сама отключается для этого звонка, и агент не проигрывает непроверенных клипов.

Агент проигрывает такой клип:

  • внутри паузы в речи звонящего (250–600 мс тишины) или по таймеру;
  • только после того, как звонящий говорил 2,5 с;
  • с некоторой вероятностью (по умолчанию 0,6), не чаще одного раза за 3 с и трёх раз за реплику;
  • никогда тот же клип, что был среди последних четырёх;
  • не тогда, когда модель конца реплики оценивает вероятность «закончил» выше 0,4.

Агент не включает проигранный клип в историю разговора, а когда его эхо возвращается по линии из трубки звонящего, убирает его из стенограммы. Для всего этого нужно окно паузы: реплика должна оставаться открытой дольше, чем паузы, которые ищет агент. Если настройки не оставляют места, функция сама отключается для этого звонка, а карточка агента в Prompt Studio показывает предупреждение.

Всё остальное в комнате

  • Фон. Необязательный звук офиса или переговорной, выровненный по частотам и подмешиваемый с первой секунды звонка. Агент не считает его собственным голосом при расчёте таймеров тишины и перебиваний.
  • Тишина. Повторный запрос, затем вежливое прощание, с отсчётом от конца воспроизведения на линии, а не от конца синтеза.
  • Уверенность. Агент передаёт языковой модели неуверенность распознавателя в виде пометки к реплике, числа или отметок на отдельных словах. Промпт велит модели переспросить, а не угадывать имя или цифру.
  • Приветствие. Агент генерирует приветствие и передаёт его потоком по предложениям на время дозвона, чтобы оно начиналось в момент ответа на вызов.

Как мы это проверяем

  • Наблюдение до фиксации для модели конца реплики, как описано выше.
  • В Prompt Studio есть вкладка звонка: вы звоните агенту из браузера и слышите то же приветствие, ту же обработку тишины и те же переводы, что и по телефону.
  • Пробы Polygon проверяют поведение в имитируемых разговорах («переспросил ли агент после странного ответа?»). Метод описан в заметке Как мы оцениваем разговор, а Polygon описан на странице «Технологии».
  • Нагрузочный тест подтверждает, что всё это работает при 100 одновременных звонках: см. Один Server Unit под нагрузкой.

Читайте дальше

Следующий шаг

Получите ранний доступ к голосовым агентам Dialogist: мы приглашаем команды из листа ожидания по мере освобождения мощностей.

Лист ожидания

Мы подключаем команды постепенно. Напишем вам, когда подойдёт ваша очередь.