{
    "componentChunkName": "component---src-templates-doc-page-js",
    "path": "/docs/ru/telephony/bargein/",
    "result": {"data":{"site":{"siteMetadata":{"title":"Gatsby-doc-engine"}},"markdownRemark":{"id":"0b232044-0272-55fe-abfd-a54480a31bbb","excerpt":"Перебивание бота Перебивание (англ. barge-in) — возможность телефонного канала, позволяющая абонентам прерывать речь собеседника, не дожидаясь, пока тот…","html":"<h1>Перебивание бота</h1>\n<hr>\n<p><strong>Перебивание</strong> (англ. <em>barge-in</em>) — возможность телефонного канала, позволяющая абонентам прерывать речь собеседника, не дожидаясь, пока тот закончит говорить.</p>\n<p class='warn'>Использование перебивания в проектах голосовых ботов позволяет им воспринимать запросы клиентов в реальном времени и оперативно на них реагировать.\r\nЭто делает разговор более живым и стимулирует вовлеченность клиента в диалог.</p>\n<h2>Параметры перебивания</h2>\n<p>Для того чтобы включить перебивание, вызовите в нужном стейте метод <a href=\"/1.11.7/docs/ru/JS_API/built_in_services/dialer/bargeInResponse\"><code class=\"language-text\">$dialer.bargeInResponse</code></a> с нужными настройками перебивания.</p>\n<p>Если произойдет перебивание, ответ бота будет прерван, а запрос клиента будет обработан в контексте данного стейта.\r\nРассмотрим пример:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Offer\r\n    <span class=\"token variableParameter\">a:</span> Новое предложение только для вас!\r\n    <span class=\"token variableParameter\">a:</span> Только сегодня и только у нас на все тарифы линейки «Живи» скидка 20%!\r\n    <span class=\"token variableParameter\">a:</span> Хотите воспользоваться нашим предложением?\r\n    <span class=\"token variableParameter\">script:</span>\r\n        $dialer.bargeInResponse({\r\n            bargeIn: \"phrase\", <span class=\"token comment\">// Режим перебивания, в котором бот договорит фразу, прежде чем прерваться</span>\r\n            bargeInTrigger: \"final\", <span class=\"token comment\">// Перебивание произойдет после окончательного результата распознавания</span>\r\n            noInterruptTime: 1000 <span class=\"token comment\">// В течение 1 секунды после начала ответа бота нельзя перебить</span>\r\n        });\r\n\r\n    <span class=\"token keyword\">state:</span> What || noContext = true\r\n        <span class=\"token storageType\">q:</span> * что [что] *\r\n        <span class=\"token variableParameter\">script:</span>\r\n            log($dialer.isBargeInInterrupted()); <span class=\"token comment\">// => true</span>\r\n        <span class=\"token variableParameter\">a:</span> Сегодня для вас персональная скидка — скидка 20% на все тарифы линейки «Живи»!\r\n        <span class=\"token variableParameter\">a:</span> Желаете попробовать?</code></pre></div>\n<p>Если клиент не дослушает и перебьет бота вопросом «Что?», бот прервется и отреагирует на вопрос.</p>\n<blockquote>\n<p>Метод <a href=\"/1.11.7/docs/ru/JS_API/built_in_services/dialer/isBargeInInterrupted\"><code class=\"language-text\">$dialer.isBargeInInterrupted</code></a> позволяет определить, был ли прерван ответ бота.</p>\n</blockquote>\n<h2>Контекстное перебивание</h2>\n<p class='warn'>При зачитывании длинных последовательностей фраз вы можете настроить перебивание так,\r\nчтобы контекст перебивания отличался в зависимости от того, на какой фразе клиент перебил бота.</p>\n<p>Для настройки <strong>контекстного перебивания</strong> используются параметры тегов реакций <a href=\"/1.11.7/docs/ru/JAICP_DSL/tags/reaction_tags/a\"><code class=\"language-text\">a</code></a> или <a href=\"/1.11.7/docs/ru/JAICP_DSL/tags/reaction_tags/audio\"><code class=\"language-text\">audio</code></a>, которые передаются через разделитель <code class=\"language-text\">||</code> после тела тегов.\r\nРассмотрим синтаксис на следующем примере.</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Offer\r\n    <span class=\"token variableParameter\">a:</span> Новое предложение только для вас! || bargeInTransition = /Offer/NotDone<span class=\"token entityNameClass\">, bargeInLabel =</span> firstReply\r\n    <span class=\"token variableParameter\">a:</span> Только сегодня и только у нас || bargeInTransition = /Offer/NotDone<span class=\"token entityNameClass\">, bargeInLabel =</span> secondReply\r\n    <span class=\"token variableParameter\">a:</span> на все тарифы линейки «Живи» скидка 20%! || ignoreBargeIn = true\r\n    <span class=\"token variableParameter\">a:</span> Хотите воспользоваться нашим предложением? || bargeInTransition = /Offer/Done<span class=\"token entityNameClass\">, bargeInLabel =</span> thirdReply\r\n    <span class=\"token variableParameter\">script:</span>\r\n        $dialer.bargeInResponse({\r\n            bargeIn: \"forced\",\r\n            bargeInTrigger: \"interim\",\r\n            noInterruptTime: 0\r\n        });\r\n    <span class=\"token variableParameter\">go:</span> /Offer/Done\r\n\r\n    <span class=\"token keyword\">state:</span> NotDone\r\n\r\n        <span class=\"token keyword\">state:</span> No\r\n            <span class=\"token storageType\">intent:</span> /Нет\r\n            <span class=\"token variableParameter\">a:</span> Постойте, вы ведь еще не знаете, о чем речь! Это уникальное предложение!\r\n            <span class=\"token variableParameter\">go!:</span> /Offer\r\n\r\n        <span class=\"token keyword\">state:</span> CatchAll\r\n            <span class=\"token storageType\">event:</span> noMatch\r\n            <span class=\"token storageType\">event:</span> speechNotRecognized\r\n            <span class=\"token variableParameter\">a:</span> Прошу прощения, я вас не поняла. Позвольте мне продолжить.\r\n            <span class=\"token variableParameter\">script:</span>\r\n                log($dialer.getBargeInTransition()); <span class=\"token comment\">// => \"/Offer/NotDone\"</span>\r\n            <span class=\"token variableParameter\">go!:</span> /Offer\r\n\r\n    <span class=\"token keyword\">state:</span> Done\r\n\r\n        <span class=\"token keyword\">state:</span> No\r\n            <span class=\"token storageType\">intent:</span> /Нет\r\n            <span class=\"token variableParameter\">a:</span> Я поняла вас. Спасибо, что уделили мне время. Всего доброго!\r\n            <span class=\"token variableParameter\">script:</span>\r\n                $dialer.hangUp();\r\n\r\n        <span class=\"token keyword\">state:</span> CatchAll || noContext = true\r\n            <span class=\"token storageType\">event:</span> noMatch\r\n            <span class=\"token storageType\">event:</span> speechNotRecognized\r\n            <span class=\"token variableParameter\">script:</span>\r\n                if ($dialer.isBargeInInterrupted()) {\r\n                    log($dialer.getBargeInLabel()); <span class=\"token comment\">// => \"thirdReply\"</span>\r\n                }\r\n            <span class=\"token variableParameter\">a:</span> Не совсем поняла. Вы согласны воспользоваться предложением?</code></pre></div>\n<h3>bargeInTransition</h3>\n<p>Параметр <code class=\"language-text\">bargeInTransition</code> задает путь до стейта, в который будет перенаправлен бот при перебивании.\r\nПуть задается в том же формате, что и после тега реакции <a href=\"/1.11.7/docs/ru/JAICP_DSL/tags/reaction_tags/go\"><code class=\"language-text\">go</code></a>.</p>\n<p>Например, если клиент откажется от предложения во время произнесения первой или второй фразы, когда бот не успел полностью озвучить условия предложения,\r\nбудет совершен переход в стейт <code class=\"language-text\">/Offer/NotDone</code>. После этого бот обработает преждевременный отказ в стейте <code class=\"language-text\">/Offer/NotDone/No</code> и вернется к предложению.</p>\n<p>Если же перебивание отказом произойдет на последней фразе, запрос будет обработан в контексте стейта <code class=\"language-text\">/Offer/Done</code>.\r\nВ данном случае бот прервется, чтобы попрощаться с клиентом и завершить звонок.</p>\n<blockquote>\n<p>Путь к стейту для обработки перебивания, установленный для ответа, можно получить из сценария при помощи метода <a href=\"/1.11.7/docs/ru/JS_API/built_in_services/dialer/getBargeInTransition\"><code class=\"language-text\">$dialer.getBargeInTransition</code></a>.</p>\n</blockquote>\n<h3>bargeInLabel</h3>\n<p>Параметр <code class=\"language-text\">bargeInLabel</code> задает метку перебивания с какой-либо необходимой справочной информацией — например, о номере фразы, на которой произошло перебивание.</p>\n<blockquote>\n<p>Метод <a href=\"/1.11.7/docs/ru/JS_API/built_in_services/dialer/getBargeInLabel\"><code class=\"language-text\">$dialer.getBargeInLabel</code></a> позволяет получить в стейте для обработки перебивания значение установленной метки.</p>\n</blockquote>\n<h3>ignoreBargeIn</h3>\n<p>Если для фразы указан параметр <code class=\"language-text\">ignoreBargeIn</code> со значением <code class=\"language-text\">true</code>, то перебивание на такой фразе не сработает, даже если для стейта перебивание включено.</p>\n<p class='warn'>Используйте игнорирование перебивания для фраз с важной информацией, которую клиент не должен пропустить, дослушав до одной из таких фраз.</p>\n<h2>Перебивание по условию</h2>\n<p>Способы обработки перебивания, рассмотренные выше, имеют следующий недостаток:\r\nпри получении <em>любого</em> результата распознавания речи от ASR-провайдера бот обязан прерваться и обработать фразу клиента.</p>\n<p>Такой подход может быть неэффективен, например, в условиях фонового шума либо если клиент при прослушивании активно использует речевые маркеры восприятия речи («ага», «ясно», «понятно»).\r\nОни не требуют ответной реакции, однако бот вынужден прерываться, чтобы обработать такие фразы.</p>\n<p>Для решения этой проблемы используйте возможность <strong>перебивания по условию</strong>, которая позволяет определить из сценария, в каких случаях бот должен обработать перебивание, а в каких нет.\r\nРассмотрим пример ниже.</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Yes\r\n    <span class=\"token storageType\">intent:</span> /Да\r\n    <span class=\"token variableParameter\">a:</span> Спасибо! Опция будет добавлена в течение дня. Всего доброго, до свидания! || bargeInIf = beforeHangup\r\n    <span class=\"token variableParameter\">script:</span>\r\n        $dialer.bargeInResponse({\r\n            bargeIn: \"forced\",\r\n            bargeInTrigger: \"final\",\r\n            noInterruptTime: 0\r\n        });\r\n        $dialer.hangUp();\r\n\r\n    <span class=\"token keyword\">state:</span> BargeInIntent || noContext = true\r\n        <span class=\"token storageType\">event:</span> bargeInIntent\r\n        <span class=\"token variableParameter\">script:</span>\r\n            var bargeInIntentStatus = $dialer.getBargeInIntentStatus();\r\n            log(bargeInIntentStatus.bargeInIf); <span class=\"token comment\">// => \"beforeHangup\"</span>\r\n            var text = bargeInIntentStatus.text;\r\n\r\n            if (text.indexOf(\"оператор\") > -1) {\r\n                $dialer.bargeInInterrupt(true);\r\n            }\r\n\r\n    <span class=\"token keyword\">state:</span> Switch\r\n        <span class=\"token storageType\">intent:</span> /Оператор\r\n        <span class=\"token variableParameter\">a:</span> Прошу прощения, если я неправильно вас поняла. Перевожу ваш звонок на оператора.\r\n        <span class=\"token variableParameter\">script:</span>\r\n            $response.replies = $response.replies || [];\r\n            $response.replies.push({\r\n                type: \"switch\",\r\n                <span class=\"token comment\">// ...</span>\r\n            });</code></pre></div>\n<h3>bargeInIf</h3>\n<p>Параметр <code class=\"language-text\">bargeInIf</code> после тега <a href=\"/1.11.7/docs/ru/JAICP_DSL/tags/reaction_tags/a\"><code class=\"language-text\">a</code></a> или <a href=\"/1.11.7/docs/ru/JAICP_DSL/tags/reaction_tags/audio\"><code class=\"language-text\">audio</code></a> включает условное перебивание для фразы.\r\nЗначением параметра является метка условного перебивания — строка с любой необходимой справочной информацией.</p>\n<h3>bargeInIntent</h3>\n<p>Если клиент перебьет бота во время произнесения фразы, для которой задан параметр <code class=\"language-text\">bargeInIf</code>,\r\nв сценарии сработает <a href=\"/1.11.7/docs/ru/bot_answers/events_table#%D0%A2%D0%B5%D0%BB%D0%B5%D1%84%D0%BE%D0%BD%D0%B8%D1%8F\">событие</a> <code class=\"language-text\">bargeInIntent</code>, которое необходимо обработать в отдельном стейте.</p>\n<p class='warn'>Само по себе возникновение этого события не заставит бота прерваться — бот продолжит ответ и <em>одновременно</em> запустит обработчик события.\r\nВ результате выполнения обработчика бот должен определить, действительно ли ему нужно прерваться или же проигнорировать попытку его перебить.</p>\n<p>Для решения этой задачи в обработчике события <code class=\"language-text\">bargeInIntent</code> доступны следующие методы:</p>\n<ul>\n<li><a href=\"/1.11.7/docs/ru/JS_API/built_in_services/dialer/getBargeInIntentStatus\"><code class=\"language-text\">$dialer.getBargeInIntentStatus</code></a> — метод для получения метки условного перебивания и текста запроса, которым клиент пытался перебить бота.</li>\n<li><a href=\"/1.11.7/docs/ru/JS_API/built_in_services/dialer/bargeInInterrupt\"><code class=\"language-text\">$dialer.bargeInInterrupt</code></a> — метод для задания поведения бота: должен ли бот прерваться, чтобы обработать запрос, или нет.</li>\n</ul>\n<p>Таким образом, в примере выше клиент сможет перебить прощание бота, только упомянув в запросе слово «оператор».</p>\n<p class='warn'>Используйте метод <a href=/1.11.7/docs/ru/JS_API/built_in_services/nlp/matchPatterns  ><code class=\"language-text\">$nlp.matchPatterns</code></a> для динамического сопоставления текста запроса паттернам,\r\nчтобы задать более сложную логику классификации запросов на перебивание бота.</p>\n<h3>Зависимость от bargeInTrigger</h3>\n<p>Обратите внимание, что условия срабатывания события <code class=\"language-text\">bargeInIntent</code> отличаются в зависимости от того, какое значение присвоено полю <a href=\"/1.11.7/docs/ru/JS_API/built_in_services/dialer/bargeInResponse#bargeInTrigger\"><code class=\"language-text\">bargeInTrigger</code></a> при настройке перебивания.</p>\n<p class='tip'>При использовании значения <code class=\"language-text\">interim</code> событие срабатывает при <em>каждом</em> промежуточном результате распознавания.\r\nБольшое число вызовов обработчика события могут существенно увеличить потребляемые ресурсы и замедлить работу бота.</p>\n<p>Рекомендуется использовать для перебивания по условию только значение <code class=\"language-text\">final</code>, при котором событие возникает после получения окончательного результата распознавания.</p>","frontmatter":{"title":"","description":null},"headings":[{"value":"Перебивание бота"}]}},"pageContext":{"slug":"/docs/ru/telephony/bargein/","previous":{"fields":{"slug":"/docs/ru/telephony/call_tasks/"},"frontmatter":{"title":"","description":null}},"next":{"fields":{"slug":"/docs/ru/telephony/call_detail/"},"frontmatter":{"title":"","description":null}}}},
    "staticQueryHashes": ["1209419333"]}