Нераспознанная речь
Если бот работает в телефонном канале, то каждый запрос от клиента перед тем, как он сможет быть обработан в сценарии, проходит автоматическое распознавание речи — процесс преобразования речевого сигнала в текст.
Сценарий должен учитывать ситуации, когда сервис распознавания речи не справляется с полученным запросом. Если в течение 5 секунд запрос клиента невозможно распознать или на распознавание не поступило речевого ввода, в сценарии возникает событие speechNotRecognized
.
Обработка этого события может быть полезна, если:
- Клиент ответил боту неразборчиво.
- Бот попал на автоответчик.
- Бот часто не дослушивает клиента.
Запрос на повтор
Если клиент озвучил запрос неразборчиво, можно попросить его повторить.
state: NoInput
event!: speechNotRecognized
random:
a: Извините, я не расслышала. Повторите, пожалуйста.
a: Не совсем поняла. Можете повторить, пожалуйста?
a: Повторите, пожалуйста. Вас плохо слышно.
Автоответчик
При запуске обзвонов есть вероятность, что вместо клиента бот попадет на автоответчик. Такие звонки заведомо нерезультативны, однако расходуют минуты телефонии.
state: NoInput || noContext = true
event!: speechNotRecognized
script:
$session.noInputCounter = $session.noInputCounter || 0;
$session.noInputCounter++;
if: $session.noInputCounter >= 3
a: Кажется, проблемы со связью.
script:
$dialer.hangUp();
else:
a: Вас плохо слышно. Повторите, пожалуйста!
Настройка таймаута
Иногда клиент отвечает боту несколькими фразами и делает между ними продолжительные паузы или долго формулирует ответ на сложный вопрос.
Чтобы бот не перебивал клиента в такой ситуации, вы можете реализовать в сценарии активное слушание с помощью метода $dialer.setNoInputTimeout
:
state: Start
q!: $regex</start>
a: Здравствуйте, это служба доставки. Вы оставляли жалобу на качество нашей доставки. Не могли бы вы подробно описать произошедшую ситуацию?
script: $dialer.setNoInputTimeout(10000); // Бот ждёт ответ 10 секунд.
state: Answer
q: *
a: Ага.
script:
$session.answer = $session.answer ? $session.answer + " " + $request.query : $request.query;
$dialer.setNoInputTimeout(2000); // Бот ждёт ответ 2 секунды.
$dialer.bargeInResponse({
bargeIn: "phrase",
bargeInTrigger: "final",
noInterruptTime: 0
});
state: EndCall
event: speechNotRecognized
a: Так, всё записала. Добавила эту информацию в вашу заявку. С вами свяжутся для дальнейшего урегулирования ситуации. Всего доброго.
script:
log("Полный ответ клиента: " + $session.answer);
$dialer.hangUp();
state: NoAnswer || noContext = true
event!: speechNotRecognized
a: Повторите, пожалуйста, вас не слышно.
Вы можете использовать таймаут в ситуации, когда клиент просит подождать:
state: Identification
q!: $regexp</start>
a: Алексей Алексеевич, это вы?
state: Yes
q: * (да/я/(он/она) ~самый) *
go!: /FirstQuestion
state: OneMoment || modal = true
q: * (подожди*/погоди*/[~один] (минут*/секунд*/момент*)) *
q: * (позову/{(передам/дам/передаю) [$oneWord] (телефон*/труб*)}) *
q: * (подожди*/погоди*/[~один] (минут*/секунд*/момент*)) * || fromState = .
a: Хорошо, спасибо. Я подожду.
script:
$dialer.setNoInputTimeout(20000); // После просьбы подождать бот будет ждать ответ от абонента до 20 секунд.
state: ClientIsHere
q: * (алло/да/[я] тут/у аппарата/слушаю) *
go!: /Identification
state: NoAnswer
event: speechNotRecognized
q: *
a: Алло? Вы тут?
script:
$dialer.setNoInputTimeout(20000);
state: Silence
event: speechNotRecognized
a: Вас не слышно, перезвоню вам позже.
script:
$dialer.hangUp();
state: FirstQuestion
a: У нас новая акция, которая действует целый месяц. Рассказать вам о ней?
state: CatchAll || noContext = true
event: noMatch
a: Не поняла вас.