This site is no longer updated.Go to new Conversational Cloud docs

Прерывание фразы бота


Вы можете определить прерывание фразы бота клиентом в сценарии. Для этого в сценарии используйте метод $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

В данном примере одна фраза бота разбита на три и для каждой определен путь перехода.


Примеры использования

  1. Рассмотрим сценарий обработки места прерывания:
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, то есть бота можно перебить в любой момент фразы.

Для вариативности сценария мы использовали вложенные стейты. Бот при перебивании переходит в указанный стейт, далее согласно намерению пользователя сценарий направляется в один из вложенных стейтов.


  1. Рассмоторим сценарий отладки сценария бота с прерыванием:
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() можно проверить, был ли прерван бот или нет.