{
    "componentChunkName": "component---src-templates-doc-page-js",
    "path": "/docs/ru/telephony/script_voice_bot/",
    "result": {"data":{"site":{"siteMetadata":{"title":"Gatsby-doc-engine"}},"markdownRemark":{"id":"819efa9b-f627-531b-999d-fe61b894a7c3","excerpt":"Сценарий бота для голосовой рассылки В голосовых рассылках используются синтез и распознавание речи.?> Синтез речи — процесс генерирования речи по печатному…","html":"<h1>Сценарий бота для голосовой рассылки</h1>\n<hr>\n<p>В голосовых рассылках используются синтез и распознавание речи.</p>\n<p class='warn'>Синтез речи — процесс генерирования речи по печатному тексту.</p>\n<p class='warn'>Распознавание речи — процесс преобразования речи в текст.</p>\n<p>В связи с этим написание сценария бота имеет свои особенности. В этой статье рассмотрим:</p>\n<ul>\n<li><a href=\"#%D0%90%D0%B4%D0%B0%D0%BF%D1%82%D0%B0%D1%86%D0%B8%D1%8F-%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-%D1%82%D0%B5%D0%BB%D0%B5%D1%84%D0%BE%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB%D0%B0\">адаптацию сценария для телефонного канала</a>;</li>\n<li><a href=\"#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%B3%D0%BE%D0%BB%D0%BE%D1%81%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D1%81%D0%B8%D0%BD%D1%82%D0%B5%D0%B7%D0%B0\">настройку голосового синтеза</a>;</li>\n<li><a href=\"#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B0%D1%83%D0%B4%D0%B8%D0%BE%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2\">использование аудиофайлов</a>;</li>\n<li><a href=\"#%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81%D0%BE-%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC-%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%BE%D0%B2\">работу со списком номеров</a>;</li>\n<li><a href=\"#%D0%9F%D0%BB%D0%B0%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B7%D0%B2%D0%BE%D0%BD%D0%BA%D0%B0-%D0%B8%D0%B7-%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D1%8F\">планирование звонка из сценария</a>;</li>\n<li><a href=\"#%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%BE%D0%B2-%D0%BE%D0%B1%D0%B7%D0%B2%D0%BE%D0%BD%D0%B0\">проставление результатов обзвона</a>;</li>\n<li><a href=\"#%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BE%D1%82%D1%87%D0%B5%D1%82%D0%B0-%D0%BF%D0%BE-%D1%80%D0%B0%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B5\">расширение отчета по рассылке</a>;</li>\n<li><a href=\"#%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9-%D0%B7%D0%B2%D0%BE%D0%BD%D0%BA%D0%BE%D0%B2\">получение записей звонков</a>.</li>\n</ul>\n</br>\n<h3>Адаптация сценария для телефонного канала</h3>\n</br>\n<h4>Распознавание</h4>\n<p>При адаптации сценария бота для телефонного канала следует отлавливать и обрабатывать событие <code class=\"language-text\">speechNotRecognized</code>. Событие возникает, если в течение 5 секунд запрос клиента невозможно распознать или на распознавание ничего не пришло.</p>\n<p>Например:</p>\n<ul>\n<li>Бот отлавливает событие и просит клиента повторить фразу ещё раз:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">    <span class=\"token keyword\">state:</span> speechNotRecognized || noContext = true\n        <span class=\"token storageType\">event:</span> speechNotRecognized\n        <span class=\"token variableParameter\">a:</span> Повторите, пожалуйста, Вас плохо слышно.\n        <span class=\"token variableParameter\">go!:</span> <span class=\"token constantCharacter\">{{$session.lastState}}</span></code></pre></div>\n</br>\n<ul>\n<li>Выбирается одна из фраз:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">    <span class=\"token keyword\">state:</span> CatchAll\n        <span class=\"token storageType\">event!:</span> speechNotRecognized\n        <span class=\"token storageType\">q!:</span> *\n        <span class=\"token variableParameter\">random:</span>\n            <span class=\"token variableParameter\">a:</span> Не могли бы вы повторить?\n            <span class=\"token variableParameter\">a:</span> Я не расслышала.\n            <span class=\"token variableParameter\">a:</span> Повторите, пожалуйста.\n            <span class=\"token variableParameter\">a:</span> Извините. я не смогла расслышать ваш ответ.</code></pre></div>\n</br>\n<h5>Автоответчик</h5>\n<p class='tip'>При попадании бота на автоответчик, расходуются минуты телефонии.</p>\n<p>Так как при попадании бота на автоответчик, расходуются минуты телефонии, предусматривайте это в сценарии. Например, бот просит клиента повторить реплику, если в ответ тишина или не удалось распознать фразу. После пяти попыток бот завершит звонок.</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">    <span class=\"token keyword\">state:</span> NoInput || noContext=true\n        <span class=\"token storageType\">event:</span> speechNotRecognized\n        <span class=\"token variableParameter\">script:</span>\n            $session.noInputCounter = $session.noInputCounter || 0;\n            $session.noInputCounter++;\n        \n        <span class=\"token variableParameter\">if:</span> $session.noInputCounter >= 5\n            <span class=\"token variableParameter\">a:</span> Кажется какие-то проблемы со связью. Перезвоню позднее.\n            <span class=\"token variableParameter\">script:</span>\n                $dialer.hangUp('(Бот повесил трубку)');\n        <span class=\"token variableParameter\">else:</span>\n            <span class=\"token variableParameter\">a:</span> Вас плохо слышно, повторите, пожалуйста!</code></pre></div>\n<p class='warn'><a href=/1.10.3/docs/ru/JAICP_DSL/tags/declarative_tags/event  >Другие <code class=\"language-text\">event</code> для телефонного канала</a></p>\n</br>\n<h4>Завершение вызова ботом</h4>\n<p class='warn'>Бот может сам завершать вызов с помощью метода <code class=\"language-text\">$dialer.hangUp('(Бот повесил трубку)')</code>.</p>\n<p>Фраза <code class=\"language-text\">Бот повесил трубку</code> будет отображаться в не голосовом канале, который вы используете для отладки бота.</p>\n<p>Например:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">    <span class=\"token keyword\">state:</span> HangUp\n        <span class=\"token variableParameter\">a:</span> Всего доброго. До свидания.\n        <span class=\"token variableParameter\">script:</span>\n            $dialer.hangUp('(Бот повесил трубку)');</code></pre></div>\n<p>Аргумент для <code class=\"language-text\">$dialer.hangUp()</code> можно не передавать.</p>\n<p class='warn'>Используйте <code class=\"language-text\">event: botHangup</code>, чтобы отследить событие, когда разговор окончен по запросу бота.</p>\n<p>Например:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">  <span class=\"token keyword\">state:</span> BotHangUp\n    <span class=\"token storageType\">event:</span> botHangup\n    <span class=\"token variableParameter\">script:</span>\n        log(\"Got event botHangup\");</code></pre></div>\n</br>\n<h4>Завершение вызова клиентом</h4>\n<p class='warn'>Используйте <code class=\"language-text\">event: hangup</code>, чтобы отследить событие, когда клиент завершил вызов.</p>\n<p>Например, чтобы определять в каком стейте находился клиент, перед тем как был завершен вызов:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">    <span class=\"token keyword\">state:</span> ClientHungUp\n        <span class=\"token storageType\">event!:</span> hangup\n        <span class=\"token variableParameter\">script:</span>\n            getClientHangUpReaction($session.lastState);</code></pre></div>\n<p>При этом, если бот сам завершает вызов, событие <code class=\"language-text\">hangup</code> не возникает.</p>\n<p class='warn'><a href=/1.10.3/docs/ru/telephony/bargein  >Вы можете определить прерывание фразы бота клиентом в сценарии</a>. При этом фраза бота будет прервана сразу при появлении речи клиента.</p>\n</br>\n<h4>Тоновый режим</h4>\n<p>Бот также может запрашивать и обрабатывать отправку dtmf-сообщения (цифры/символы в тоновом режиме).</p>\n<p>Запрос dtmf-сообщения:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token variableParameter\">script:</span>\n    $response.replies = $response.replies || [];\n    $response.replies.push({\n        type: 'dtmf',\n        max: 4,            //максимальное количество цифр, которое ожидается от абонента.\n        <span class=\"token variableParameter\">timeout:</span> 15000     //интервал ожидания ввода от абонента в миллисекундах, число.\n     });</code></pre></div>\n<p>Далее отлавливается запрос, например, с цифрами:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Digits\n    <span class=\"token storageType\">q:</span> $regexp&lt;\\d+>\n    <span class=\"token variableParameter\">a:</span> вы набрали <span class=\"token constantCharacter\">{{$parseTree.text}}</span>!</code></pre></div>\n<p>Событие <code class=\"language-text\">noDtmfAnswerEvent</code> возникает, если абонент не ввел dtmf-сообщение:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">    <span class=\"token keyword\">state:</span> noDTMF || noContext = true\n        <span class=\"token storageType\">event:</span> noDtmfAnswerEvent\n        <span class=\"token variableParameter\">a:</span> Вы ничего не выбрали.\n        <span class=\"token variableParameter\">go!:</span> <span class=\"token constantCharacter\">{{$session.lastState}}</span> </code></pre></div>\n<p class='warn'><a href=/1.10.3/docs/ru/bot_answers/message_types#dtmf  >Подробнее о тоновом режиме</a></p>\n</br>\n<h4>Сессии</h4>\n<p class='warn'><a href=/1.10.3/docs/ru/JS_API/session_lifetime_control  >Подробнее о сессиях в платформе JAICP</a></p>\n<p>В голосовых рассылках сессия стартует в момент, когда клиент поднял трубку либо сам позвонил. Окончание диалога считается завершением сессии.</p>\n<p>При этом, если вы используете этот же сценарий для других каналов, сессия для них будет стартовать в момент первого обращения клиента, когда для него нет другой активной сессии.</p>\n<p class='tip'>Не рекомендуется для голосовых рассылок искусственно разбивать сессии с использованием реакции <a href=/1.10.3/docs/ru/JS_API/built_in_services/reactions/newSession  ><code class=\"language-text\">newSession</code></a>.</p>\n</br>\n<h3>Настройка голосового синтеза</h3>\n<p>При оформлении реплик бота вы можете при помощи разметки тоньше управлять синтезируемыми звуками.</p>\n<ul>\n<li>При необходимости ударные гласные в слове отмечайте символом <code class=\"language-text\">+</code>, например:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">    a: Это система автоматического обзв+она.</code></pre></div>\n<ul>\n<li>Длинные слова можно разбить на короткие и проставлять ударения для каждого из них, например:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">    a: Мн+ого пр+офильный проект.</code></pre></div>\n<ul>\n<li>\n<p>Некоторые слова можно попробовать писать так, как они слышатся. Например, <code class=\"language-text\">«пожалуйста» — пож+алуста</code>.</p>\n</li>\n<li>\n<p>Каждый отделенный пробелом пунктуационный знак преобразуется в паузу длительностью 50-100 мс. Таким образом можно задавать небольшие паузы последовательностью дефисов. Например:</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">    a: Приветствуем {{$dialer.getPayload().name}}! Ответьте на вопрос: - - - - да, нет или наверное</code></pre></div>\n<p class='tip'>Не стоит создавать таким образом большие паузы. Длинная последовательность дефисов может привести к звуковым артефактам при синтезе.</p>\n</br>\n<h3>Использование аудиофайлов</h3>\n<p>Вы можете использовать в качестве ответа бота предзаписанный аудиофайл. Платформа позволяет использовать аудио в формате <a href=\"https://en.wikipedia.org/wiki/Pulse-code_modulation\" target=\"_blank\" rel=\"noopener noreferrer\">PCM</a>, формат файла <code class=\"language-text\">.wav</code>. Настройки PCM:</p>\n<ul>\n<li>постоянный битрейт <code class=\"language-text\">128 кб/c</code>;</li>\n<li>1 канал (моно);</li>\n<li>частота дискретизации <code class=\"language-text\">8000Hz</code>;</li>\n<li>кодирование <code class=\"language-text\">16-bit(PCM) little endian</code>.</li>\n</ul>\n<p>В реплику бота добавьте <a href=\"/1.10.3/docs/ru/JAICP_DSL/tags/reaction_tags/audio\">тег <code class=\"language-text\">audio</code></a> со ссылкой на аудиофайл с расширением <code class=\"language-text\">.wav</code>.</p>\n<p>Например:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">    <span class=\"token keyword\">state:</span> audio\n        <span class=\"token variableParameter\">audio:</span> https://example.wav   <span class=\"token comment\">// ссылка на аудиофайл (любое хранилище)</span></code></pre></div>\n</br>\n<h3>Работа со списком номеров</h3>\n<p class='warn'><a href=/1.10.3/docs/ru/telephony/lists_of_numbers  >Управление списками номеров</a></p>\n<p>При создании списка номеров для голосовой рассылки вы можете добавить в список дополнительные поля. Например <em>Имя</em>, <em>Фамилия</em>, <em>Город</em>. Валидация таблицы будет проводиться только по первому столбцу с номерами, остальные будут загружены как текстовые поля.</p>\n<p>Вы можете использовать информацию из дополнительных полей в сценарии при рассылке.</p>\n<p class='warn'>Метод <code class=\"language-text\">$dialer.getPayload()</code> возвращает <code class=\"language-text\">json</code>-объект с заполненными полями списка номеров.</p>\n<p>Например, мы загружаем список номеров:</p>\n</br>\n<table>\n<thead>\n<tr>\n<th align=\"center\">phone</th>\n<th align=\"center\">name</th>\n<th align=\"center\">address</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"center\">79990000000ᅠᅠ</td>\n<td align=\"center\">Иван ᅠᅠ  ᅠᅠ</td>\n<td align=\"center\">Москва</td>\n</tr>\n</tbody>\n</table>\n</br>\n<p>Вызов метода <code class=\"language-text\">$dialer.getPayload()</code> вернет <code class=\"language-text\">json</code>-объект:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"phone\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"79990000000\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Иван\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"address\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Москва\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n</br>\n<p>Использование в сценарии:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">    <span class=\"token keyword\">state:</span> Hello\n        <span class=\"token variableParameter\">a:</span> Привет!\n        <span class=\"token variableParameter\">if:</span> $dialer.getPayload().name\n            <span class=\"token variableParameter\">a:</span> Вас зовут <span class=\"token constantCharacter\">{{$dialer.getPayload().name}}</span>\n        <span class=\"token variableParameter\">else:</span>\n            <span class=\"token variableParameter\">a:</span> Я не знаю вашего имени.</code></pre></div>\n</br>\n<p>Если список загружен без заголовков, то вызов метода <code class=\"language-text\">$dialer.getPayload()</code> вернет <code class=\"language-text\">json</code>-объект:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span><span class=\"token number\">0</span><span class=\"token operator\">:</span> <span class=\"token string\">\"79990000000\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Иван\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Москва\"</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>В таком случае <code class=\"language-text\">var name = $dialer.getPayload()[1]</code>.</p>\n<p>Если значение в колонке пустое, то при вызове функции <code class=\"language-text\">$dialer.getPayload().address</code> будет возвращено пустое значение.</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"phone\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"79990000000\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Иван\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"address\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n</br>\n<p class='warn'>Метод <code class=\"language-text\">$dialer.getCaller()</code> возвращает строку с телефоном пользователя в том виде, в котором его присылает телефонная станция.</p>\n<p>Использование в сценарии:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">    <span class=\"token keyword\">state:</span> Hello\n        <span class=\"token variableParameter\">a:</span> Привет!\n        <span class=\"token variableParameter\">a:</span> Ваш номер <span class=\"token constantCharacter\">{{getCaller()}}</span>.\n        <span class=\"token variableParameter\">if:</span> $dialer.getPayload().name\n            <span class=\"token variableParameter\">a:</span> Вас зовут <span class=\"token constantCharacter\">{{$dialer.getPayload().name}}</span>\n        <span class=\"token variableParameter\">else:</span>\n            <span class=\"token variableParameter\">a:</span> Я не знаю вашего имени.</code></pre></div>\n</br>\n<h3>Планирование звонка из сценария</h3>\n<p>Во время разговора бота с клиентами может потребоваться запланировать новый звонок. Например, когда клиент просит перезвонить попозже.</p>\n<p class='warn'>При помощи метода <code class=\"language-text\">$dialer.redial()</code> вы можете запланировать новый звонок и переопределить политику звонков на данный номер из сценария.</p>\n<p><a href=\"https://help.just-ai.com/docs/api/calls_api/\" target=\"_blank\" rel=\"noopener noreferrer\">Параметры метода соответствуют параметрам <code class=\"language-text\">CallJobParametersList</code> Calls API</a>.</p>\n</br>\n<table>\n<thead>\n<tr>\n<th align=\"left\">Параметр</th>\n<th align=\"left\">Пример</th>\n<th align=\"left\">Описание</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"left\"><code class=\"language-text\">startDateTime</code></td>\n<td align=\"left\"><code class=\"language-text\">2020-03-23T00:00:00Z</code></td>\n<td align=\"left\">Начальная дата звонка. Принимает объект <a href=\"https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Date\" target=\"_blank\" rel=\"noopener noreferrer\"><code class=\"language-text\">Date</code></a>. </br> </br> Звонок будет совершен в интервале </br>  <code class=\"language-text\">[startDateTime, finishDateTime]</code>.</td>\n</tr>\n<tr>\n<td align=\"left\"><code class=\"language-text\">finishDateTime</code></td>\n<td align=\"left\"><code class=\"language-text\">2020-03-23T00:00:00Z</code></td>\n<td align=\"left\">Конечная дата звонка. Принимает объект <a href=\"https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Date\" target=\"_blank\" rel=\"noopener noreferrer\"><code class=\"language-text\">Date</code></a>. </br> </br> Звонки после <code class=\"language-text\">finishDateTime</code> совершаться не будут.</td>\n</tr>\n<tr>\n<td align=\"left\"><code class=\"language-text\">allowedTime</code></td>\n<td align=\"left\"><code class=\"language-text\">\"mon\": [{\"localTimeFrom\": \"10:00\", \"localTimeTo\": \"11:30\"}]</code></td>\n<td align=\"left\">Для каждого дня недели может быть указан один или несколько рекомендованных интервалов для звонков. </br> </br> <code class=\"language-text\">localTimeFrom</code> — самое раннее время для звонка. Время не абсолютное, для звонка будет учитываться локальное время абонента. </br> </br> <code class=\"language-text\">localTimeTo</code> — самое позднее время для звонка.  Время не абсолютное, для звонка будет учитываться локальное время абонента.</td>\n</tr>\n<tr>\n<td align=\"left\"><code class=\"language-text\">allowedDays</code></td>\n<td align=\"left\"><code class=\"language-text\">[\"sun\"]</code></td>\n<td align=\"left\">Разрешенные дни недели для звонка.</td>\n</tr>\n<tr>\n<td align=\"left\"><code class=\"language-text\">maxAttempts</code></td>\n<td align=\"left\"><code class=\"language-text\">1</code></td>\n<td align=\"left\">Количество попыток дозвониться.</td>\n</tr>\n<tr>\n<td align=\"left\"><code class=\"language-text\">retryIntervalInMinutes</code></td>\n<td align=\"left\"><code class=\"language-text\">120</code></td>\n<td align=\"left\">Пауза между попытками дозвониться, указывается в минутах.</td>\n</tr>\n<tr>\n<td align=\"left\"><code class=\"language-text\">gmtZone</code></td>\n<td align=\"left\"><code class=\"language-text\">\"+03:00\"</code></td>\n<td align=\"left\">Часовой пояс. Принимает значения от <code class=\"language-text\">\"-18:00\"</code> до <code class=\"language-text\">\"+18:00\"</code> или согласно ID часовых поясов, установленных <a href=\"https://docs.oracle.com/middleware/12212/wcs/tag-ref/MISC/TimeZones.html\" target=\"_blank\" rel=\"noopener noreferrer\">IANA TZBD</a>.</td>\n</tr>\n</tbody>\n</table>\n</br>\n<p class='tip'>Обратите внимание, что метод <code class=\"language-text\">$dialer.redial()</code> не используется без параметров. Для корректной работы метода необходимо обязательно задать параметр <code class=\"language-text\">startDateTime</code> или <code class=\"language-text\">allowedTime</code>. Если остальные параметры не будут указаны, то значения будут взяты из настроек голосовой рассылки.</p>\n<p>Например, задаем параметры для повторного звонка:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span>\n    <span class=\"token storageType\">q!:</span> Сall back\n    <span class=\"token variableParameter\">script:</span>\n        $dialer.redial({\n            allowedTime: {\n                \"mon\": [{\"localTimeFrom\": \"10:00\", \"localTimeTo\": \"11:30\"},\n                        {\"localTimeFrom\": \"13:00\", \"localTimeTo\": \"14:30\"}],\n                \"fri\": [{\"localTimeFrom\": \"12:30\", \"localTimeTo\": \"15:00\"}],\n                \"default\": [{\"localTimeFrom\": \"10:00\", \"localTimeTo\": \"18:00\"}]\n            },\n            retryIntervalInMinutes: 120,\n            maxAttempts: 3\n         })\n    <span class=\"token variableParameter\">a:</span> ok</code></pre></div>\n<p class='tip'>Для рекомендуемого интервала должны быть указаны обе границы <code class=\"language-text\">localTimeFrom</code> и <code class=\"language-text\">localTimeTo</code>. Если одна из границ не указана, то возвращается ошибка.</p>\n<p>В данном примере повторный звонок будет совершен в понедельник в промежутках с 10:00 до 11:30 и с 13:00 до 14:30, в пятницу с 12:30 до 15:00. Рекомендации для других не явно указанных дней задаются в параметре <code class=\"language-text\">allowedTime</code> с ключом <code class=\"language-text\">default</code>.</p>\n</br>\n<p>Если в запросе указывается параметр <code class=\"language-text\">allowedDays</code>, то вызов рассылки может состояться только в тот день, который явно указан.</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span>\n    <span class=\"token storageType\">q!:</span> Сall back\n    <span class=\"token variableParameter\">script:</span>\n        $dialer.redial({\n            allowedDays: [\"sat\", \"sun\"],\n            allowedTime: {\n                \"fri\": [{\"localTimeFrom\": \"12:30\", \"localTimeTo\": \"15:00\"}],\n                \"default\": [{\"localTimeFrom\": \"10:00\", \"localTimeTo\": \"18:00\"}]\n            },\n             retryIntervalInMinutes: 120,\n            maxAttempts: 3\n         })\n    <span class=\"token variableParameter\">a:</span> ok</code></pre></div>\n<p>В этом примере, несмотря на то, что для пятницы интервал указан явно, вызов может состояться только в субботу или в воскресенье.</p>\n<p class='tip'>Обратите внимание, что рекомендуемые интервалы внутри одного дня должны быть указаны без пересечений.</p>\n<p>Примеры пересечений:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">\"mon\": [{\"localTimeFrom\": \"10:00\", \"localTimeTo\": \"13:30\"}, \n        {\"localTimeFrom\": \"13:00\", \"localTimeTo\": \"14:30\"}],\n\"tue\": [{\"localTimeFrom\": \"10:00\", \"localTimeTo\": \"18:30\"}, \n         {\"localTimeFrom\": \"13:00\", \"localTimeTo\": \"14:30\"}],</code></pre></div>\n</br>\n<p>Если в заданном интервале параметр <code class=\"language-text\">localTimeFrom</code> больше, чем  <code class=\"language-text\">localTimeTo</code>, то считается, что интервал указан корректно. Он начинается в указанный день, а завершается на следующий день. Повторные звонки в следующем примере будут проходитть с 8 часов вечера в понедельник до 3 ночи во вторник:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">\"mon\": [{\"localTimeFrom\": \"20:00\", \"localTimeTo\": \"03:00\"}],</code></pre></div>\n</br>\n<p>Задаем параметры для повторного звонка из реплики клиента. Для этого используем <a href=\"/1.10.3/docs/ru/NLU_core/slot_filling\">заполненый слот <code class=\"language-text\">$parseTree._Date.timestamp</code></a> для определения начальной даты звонка:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Перезвоните\n        <span class=\"token storageType\">intent!:</span> /Перезвоните\n        <span class=\"token variableParameter\">a:</span> Ок, перезвоню!\n        <span class=\"token variableParameter\">script:</span>\n            $dialer.redial({startDateTime: new Date($parseTree._Date.timestamp)})\n            $dialer.hangUp();</code></pre></div>\n</br>\n<p>Задаем параметры для повторного звонка по просьбе клиента с дополнительными параметрами:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> \n    <span class=\"token storageType\">q!:</span> перезвоните через час \n\t<span class=\"token variableParameter\">script:</span>\n\t   var redialTimeFrom = moment().add(60, \"m\").toDate();\n       var redialTimeTo = moment().add(75, \"m\").toDate();\n\t   $dialer.redial({\n          startDateTime: redialTimeFrom, finishDateTime: redialTimeTo,   <span class=\"token comment\">// будем звонить в интервал [now + 1h, now + 1h 15m]</span>\n          localTimeFrom: \"00:00\", localTimeTo: \"00:00\",                  <span class=\"token comment\">// игнорируем ограничения на время звонков по времени абонента</span>\n          maxAttempts: 2,                                                <span class=\"token comment\">// сделаем 2 попытки дозвониться</span>\n          retryIntervalInMinutes: 5                                      <span class=\"token comment\">// с паузой 5 минут между попытками</span>\n       })\n\t<span class=\"token variableParameter\">a:</span> хорошо, я перезвоню вам через час</code></pre></div>\n</br>\n<p>В рамках одного диалога можно запланировать только один звонок. Например, клиент просит перезвонить бота. При обработке последующих реплик клиента вызовы <code class=\"language-text\">$dialer.redial()</code> игнорируются, так как параметры для повторного звонка были заданы ранее.</p>\n<p>Обратите внимание, что параметры <code class=\"language-text\">$dialer.redial()</code> могут быть переопределены, если не последовало ответа бота. Например, в <code class=\"language-text\">postProcess</code> или в другом стейте, если был совершен переход по <code class=\"language-text\">go!</code> без ответа бота.</p>\n<p>Для одной голосовой рассылки из сценария можно задать максимум 5 повторных звонков для каждого номера.</p>\n<p class='warn'><a href=/1.10.3/docs/ru/telephony/call_policy  >Подробнее о приоритете выполнения и политике звонков</a></p>\n</br>\n<h3>Проставление результатов обзвона</h3>\n<p>Проставляя результаты обзвона в сценарии, вы добавляете пользовательские метрики в статистику.</p>\n<p class='warn'><a href=/1.10.3/docs/ru/telephony/statistics  >Подробнее о статистике</a></p>\n<p class='warn'>Метод <code class=\"language-text\">$dialer.setCallResult</code> позволяет проставлять результат обзвона для более развернутой статистики.</p>\n<p>Например, рассмотрим сценарий:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">        <span class=\"token keyword\">state:</span> Yes\n            <span class=\"token storageType\">q:</span> Да\n            <span class=\"token variableParameter\">a:</span> Спасибо за доверие! До свидания!\n            <span class=\"token variableParameter\">script:</span>\n                $dialer.setCallResult(\"YES\");\n                $dialer.hangUp();\n            \n        <span class=\"token keyword\">state:</span> No\n            <span class=\"token storageType\">q:</span> Нет\n            <span class=\"token variableParameter\">a:</span> Очень жаль, что вы отказались. До свидания!\n            <span class=\"token variableParameter\">script:</span>\n               $dialer.setCallResult(\"NO\");\n               $dialer.hangUp();\n            \n        <span class=\"token keyword\">state:</span> Maybe\n            <span class=\"token storageType\">q:</span> Наверное\n            <span class=\"token variableParameter\">a:</span> Мы вам перезвоним попозже. До связи!\n            <span class=\"token variableParameter\">script:</span>\n                $dialer.setCallResult(\"MAYBE\");\n                $dialer.hangUp();</code></pre></div>\n<p>Теперь в таблице с метриками при попадании в определенный стейт будут отображаться результаты обзвона: <code class=\"language-text\">YES</code>, <code class=\"language-text\">NO</code>, <code class=\"language-text\">MAYBE</code>.</p>\n<p>Если в сценарии не требуются расширенные метрики, используйте методы, проставляющие результаты о принятии или отклонении предложения, но при этом не требующие заполнения названия.</p>\n<p class='warn'>Методы <code class=\"language-text\">$dialer.setCallResultAccepted</code> и <code class=\"language-text\">$dialer.setCallResultRejected</code> позволяют проставлять результаты как <code class=\"language-text\">ACCEPTED</code> и <code class=\"language-text\">REJECTED</code> соответственно.</p>\n<p>Сценарий:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">        <span class=\"token keyword\">state:</span> Yes\n            <span class=\"token storageType\">q:</span> Да\n            <span class=\"token variableParameter\">a:</span> Спасибо за доверие! До свидания!\n            <span class=\"token variableParameter\">script:</span>\n                $dialer.setCallResultAccepted();\n                $dialer.hangUp();\n            \n        <span class=\"token keyword\">state:</span> No\n            <span class=\"token storageType\">q:</span> Нет\n            <span class=\"token variableParameter\">a:</span> Очень жаль, что вы отказались. До свидания!\n            <span class=\"token variableParameter\">script:</span>\n               $dialer.setCallResultRejected();\n               $dialer.hangUp();</code></pre></div>\n<p>В таблице с метриками при попадании в определенный стейт будут отображаться результаты обзвона <code class=\"language-text\">ACCEPTED</code> и <code class=\"language-text\">REJECTED</code>.</p>\n</br>\n<h3>Расширение отчета по рассылке</h3>\n<p class='warn'>Метод <code class=\"language-text\">$dialer.reportData($header, $value, $order)</code> позволяет добавить колонки с произвольными данными в <a href=/1.10.3/docs/ru/telephony/statistics  >отчет <code class=\"language-text\">.xls</code> по рассылке</a>.</p>\n<p>Параметры метода:</p>\n<ul>\n<li><code class=\"language-text\">$header</code> (string) — название колонки в отчете;</li>\n<li><code class=\"language-text\">$value</code> (string) — значение;</li>\n<li><code class=\"language-text\">$order</code> (number) — порядок сортировки колонок в выгружаемом отчете <code class=\"language-text\">.xls</code>.</li>\n</ul>\n<p>Разработчик сценария может добавить колонки в отчет, которые требуются для определенной рассылки, например:</p>\n<ol>\n<li>Для получения данных в ходе звонка:\n<ul>\n<li><code class=\"language-text\">$dialer.reportData(\"ФИО\", \"Иванов Иван\")</code> — в отчете по результатам обзвона будет добавлена колонка <code class=\"language-text\">ФИО</code> со значением <code class=\"language-text\">Иванов Иван</code>.</li>\n</ul>\n</li>\n<li>Для фиксирования фразы и факта прохождения по этапу:\n<ul>\n<li><code class=\"language-text\">$dialer.reportData(\"Этап_Отказ\", \"Нет, не нужно\")</code> — в отчете добавится колонка с названием этапа <code class=\"language-text\">Этап_Отказ</code>, содержащая формулировку отказа <code class=\"language-text\">Нет, не нужно</code>.</li>\n</ul>\n</li>\n</ol>\n<p>Параметр <code class=\"language-text\">$order</code> указывать необязательно, при этом по умолчанию передается значение <code class=\"language-text\">0</code>. Колонки в отчете сортируются по убыванию значений <code class=\"language-text\">$order</code>, а при их совпадении — по алфавиту.</p>\n<p>Рассмотрим сценарий:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">theme:</span> /\n\n    <span class=\"token keyword\">state:</span>\n        <span class=\"token storageType\">q!:</span> *start\n        <span class=\"token variableParameter\">a:</span> Привет! Как тебя зовут?\n\n        <span class=\"token keyword\">state:</span> Name\n            <span class=\"token storageType\">q:</span> *\n            <span class=\"token variableParameter\">a:</span> Здравствуй, <span class=\"token constantCharacter\">{{$parseTree.text}}</span>!\n            <span class=\"token variableParameter\">script:</span>\n                $dialer.reportData(\"Имя\", $parseTree.text);\n            <span class=\"token variableParameter\">a:</span> Как ты относишься к курению?\n\n            <span class=\"token keyword\">state:</span> Smoking\n                <span class=\"token storageType\">q:</span> *\n                <span class=\"token variableParameter\">a:</span> Так и запишем: \"<span class=\"token constantCharacter\">{{$parseTree.text}}</span>\".\n                <span class=\"token variableParameter\">script:</span>\n                    $dialer.reportData(\"Отношение к курению\", $parseTree.text, 1);</code></pre></div>\n</br>\n<p>Здесь колонка <code class=\"language-text\">Отношение к курению</code> будет первой среди пользовательских колонок, так как явно указан <code class=\"language-text\">$order</code>, равный <code class=\"language-text\">1</code>. Колонка <code class=\"language-text\">Имя</code> будет второй, так как здесь <code class=\"language-text\">$order</code> не передан и равен <code class=\"language-text\">0</code>.</p>\n<p>В сценарии с большим числом колонок в зависимости от значений <code class=\"language-text\">$order</code> они будут расположены так:</p>\n<table>\n<thead>\n<tr>\n<th>Пол</th>\n<th>Имя</th>\n<th>Отчество</th>\n<th>Фамилия</th>\n<th>Отношение к курению</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>0</td>\n<td>0</td>\n<td>0</td>\n<td>-1</td>\n</tr>\n</tbody>\n</table>\n<p class='tip'>Обратите внимание, что количество колонок в отчете по рассылке ограничено. Обратитесь к администратору аккаунта за подробной информацией.</p>\n</br>\n<h3>Получение записей звонков</h3>\n<p>Если для <a href=\"/1.10.3/docs/ru/telephony/telephone_channel\">телефонного канала</a> включен параметр <em>Записывать звонки</em>, вы можете формировать в сценарии ссылки на скачивание файлов с записями разговоров. Для этого используйте метод <code class=\"language-text\">$dialer.getCallRecordingPath()</code>.</p>\n<p>Метод возвращает относительный путь следующего вида:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">242829491/2019-06-18/79313365671/16:56:31.55-1P</code></pre></div>\n<p>Ссылка на полный путь соответствует шаблону:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">https://{{host}}/restapi/download/{{projectId}}/recordings/call/{{callRecordingPath}}</code></pre></div>\n<p>Здесь:</p>\n<ul>\n<li><code class=\"language-text\">host</code> — хост, на котором размещен проект, например <code class=\"language-text\">app.jaicp.com</code>;</li>\n<li><code class=\"language-text\">projectId</code> — целочисленный идентификатор проекта, например <code class=\"language-text\">242829491</code>;</li>\n<li><code class=\"language-text\">callRecordingPath</code> — значение, которое возвращает <code class=\"language-text\">$dialer.getCallRecordingPath</code>.</li>\n</ul>","frontmatter":{"title":"","description":null},"headings":[{"value":"Сценарий бота для голосовой рассылки"}]}},"pageContext":{"slug":"/docs/ru/telephony/script_voice_bot/","previous":{"fields":{"slug":"/docs/ru/telephony/recognition_synthesis_settings/"},"frontmatter":{"title":"","description":null}},"next":{"fields":{"slug":"/docs/ru/telephony/own_telephony/"},"frontmatter":{"title":"","description":null}}}},
    "staticQueryHashes": ["1209419333"]}