Перейти к основному содержимому

Нераспознанная речь

Если бот работает в телефонном канале, то каждый запрос от клиента перед тем, как он сможет быть обработан в сценарии, проходит автоматическое распознавание речи — процесс преобразования речевого сигнала в текст.

Сценарий должен учитывать ситуации, когда сервис распознавания речи не справляется с полученным запросом. Если в течение 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: Не поняла вас.