Прерывание фразы бота
Вы можете определить прерывание фразы бота клиентом в сценарии. Для этого в сценарии используйте метод $dialer.bargeInResponse().
Фраза бота может быть прервана сразу же при появлении речи клиента или после того, как бот закончит свою реплику.
Параметры прерывания
$dialer.bargeInResponse({
bargeIn:"phrase", //режим прерывания
bargeInTrigger: "final",
noInterruptTime: 0
});bargeIn— режим прерывания. Принимает значения:disabled— прерывание отключено.forced— при перебивании фразы бота, он не договаривает реплику до конца, а сразу прерывается.phrase— при перебивании фразы бота, он договаривает реплику до конца, а потом прерывается.
bargeInTrigger— событие, по которому бот определяет, что абонент пытается его перебить. Принимает значения:interim— прерывание с промежуточными результатами распознавания.final— прерывание с финальными результатами распознавания.
noInterruptTime— время в миллисекундах от начала ответа бота, в течение которого бот не прервётся при срабатыванииbargeInTrigger. ЕслиbargeInTriggerсработает во время данного интервала, то бот прервётся сразу после его окончания. ПриnoInterruptTime: 0бот прервётся сразу.
Использование в сценарии:
state: Yes
q: * ($yes/могу/сейчас [позову]/минут*/секунд*/подожди*) * || fromState = "..", onlyThisState = true
script:
$dialer.bargeInResponse({
bargeIn:"phrase", //режим прерывания
bargeInTrigger: "final",
noInterruptTime: 0
})
а: Хорошо, я перезвоню вам попозже.Обработка места прерывания
Вы можете в сценарии задать различные реакции бота в зависимости от фразы, на которой его прервал клиент.
Если ответ бота зависит от места, на котором его прервали, для каждой реплики указывается путь до стейта. При перебивании переход в указанный стейт будет совершен перед анализом намерения клиента. Если стейт для перехода не был указан, то анализ фразы перебивания происходит в рамках текущего контекста.
Синтаксис
a: фраза бота || bargeInTransition = /path1, bargeInLabel = "phrase"
audio: https://someurl.ru || bargeInTransition = /path2, bargeInLabel = "audio"bargeInTransition— путь до стейта, куда будет перенаправлен бот при перебивании. Путь задается в соответствии с правилами для тегаgo.bargeInLabel— метка, принимает значенияstring. Метка будет установлена и доступна из сценария при срабатыванииbargeIn.
Например:
state: Offer
q: *start
a: У меня для вас особое предложение || bargeInTransition = /Offer/OfferNotDone, bargeInLabel = "first_phrase"
a: Только сегодня и только у нас || bargeInTransition = /Offer/OfferNotDone, bargeInLabel = "second_phrase"
a: Второй продукт в подарок || bargeInTransition = /OfferDone, bargeInLabel = "third_phrase"
go: OfferDoneВ данном примере одна фраза бота разбита на три и для каждой определен путь перехода.
Примеры использования
- Рассмотрим сценарий обработки места прерывания:
theme: /
state: Offer
q: *start
a: У меня для вас особое предложение || bargeInTransition = /Offer/OfferNotDone, bargeInLabel = "first_phrase"
a: Только сегодня и только у нас || bargeInTransition = /Offer/OfferNotDone, bargeInLabel = "second_phrase"
a: Второй товар в подарок || bargeInTransition = /OfferDone, bargeInLabel = "third_phrase"
go: OfferDone
script:
$dialer.bargeInResponse({ // метод прерывания указывается сразу для всех фраз
bargeIn: "forced",
bargeInTrigger: "interim",
noInterruptTime: 0 // бота можно перебить в любой момент фразы
});
state: OfferNotDone // стейт для перехода первой и второй фраз
state:
q: не хочу
a: Подождите, вы же еще не знаете о чем речь!
a: Это уникальное предложение!
go: /Offer/OfferDone
state:
event: noMatch
a: Совершенно бесплатно!
go: /Offer/OfferDone
state:
event: speechNotRecognized
a: я вас не слышу
state: OfferDone // стейт для перехода третьей фразы
state:
q: не хочу
a: Ну ладно, как хочешь!
state:
q: хорошо
a: Хорошо, сейчас заверну!
state:
event: noMatch
a: То есть согласен?
state:
event: speechNotRecognized
a: я вас не слышуВ начале сценария мы задали метод прерывания $dialer.bargeInResponse(). Обратите внимание, что параметр noInterruptTime = 0, то есть бота можно перебить в любой момент фразы.
Для вариативности сценария мы использовали вложенные стейты. Бот при перебивании переходит в указанный стейт, далее согласно намерению пользователя сценарий направляется в один из вложенных стейтов.
- Рассмоторим сценарий отладки сценария бота с прерыванием:
state: OfferSwitch
q!: switch offer
a: first statement || bargeInTransition = /OfferSwitch/RepeatTrans/First, bargeInLabel = "first"
a: second statement || bargeInTransition = /OfferSwitch/RepeatTrans/Second, bargeInLabel = "second"
a: third statement || bargeInTransition = /OfferSwitch/RepeatTrans/RepeatLast, bargeInLabel = "third"
state: RepeatRouter
q: repeat
go!: {{$dialer.getBargeInTransition()}}
state: RepeatTrans
state: First
a: isInterrupted = {{ $dialer.isBargeInInterrupted() }} label = {{ $dialer.getBargeInLabel() }} trans = {{ $dialer.getBargeInTransition() }}
state: Second
a: isInterrupted = {{ $dialer.isBargeInInterrupted() }} label = {{ $dialer.getBargeInLabel() }} trans = {{ $dialer.getBargeInTransition() }}
state: RepeatLast
a: isInterrupted = {{ $dialer.isBargeInInterrupted() }} label = {{ $dialer.getBargeInLabel() }} trans = {{ $dialer.getBargeInTransition() }}В данном сценарии в ответе бота будут выведены параметры перехода. Например, при попадании в стейт First ответ бота:
isInterrupted = true label = first trans = /OfferSwitch/RepeatTrans/FirstФункция $dialer.isBargeInInterrupted() позволяет узнать, была ли прервана реплика бота. Результатом функции будет значение true или false.
Если в сценарии флаг bargeInTransition не установлен, а используется только флаг bargeInLabel, то с помощью $dialer.isBargeInInterrupted() можно проверить, был ли прерван бот или нет.