Дмитрий Кайдаш
08.06.2021
42125

Настройка сервера IP АТС на базе Asterisk для интеграции с сервисом Speech2Sales

Описание: в этой статье будет описана последовательность действий для интеграции с сервисом речевой аналитики speech2sales. Сервис аналитики может принимать данные в двух режимах: На собственный, индивидуальный для каждого клиента, FTP-сервер. Через REST-API. Рассмотрим подробнее наиболее часто используемый – FTP. При работе в этом режиме файл записи загружается на выделенный хостинг, как и сопроводительные мета-данные, обёрнутые […]

Описание: в этой статье будет описана последовательность действий для интеграции с сервисом речевой аналитики speech2sales.

Внимание! Все действия проводились на следующем оборудовании: CentOS Linux release 7.5.1804; FreePBX 13; Asterisk 13.22.0.; PHP 5.6. На других работа не гарантируется или потребуются корректировки.

Сервис аналитики может принимать данные в двух режимах:

  • На собственный, индивидуальный для каждого клиента, FTP-сервер.
  • Через REST-API.

Рассмотрим подробнее наиболее часто используемый – FTP. При работе в этом режиме файл записи загружается на выделенный хостинг, как и сопроводительные мета-данные, обёрнутые в xml-файл. Но перед отправкой нам предстоит выполнить запись, в нужном формате, а также собрать данные о звонке. Для этого нам потребуется:

  1. Изменить режим записи – из одной дорожки сделать две, а затем склеить их в одну не объединяя каналы
  2. Подключиться к внутренней БД, собрать данные о звонке и сформировать *.xml файл с необходимой разметкой
  3. Подключиться к FTP и загрузить оба файла

Изменение режима записи

Как правило сервисы распознавания работают с записями в стерео-режиме. Это значит, что канал клиента и оператора находятся отдельно друг от друга и их анализ можно производить поочерёдно не накладывая.

Стерео-режим записи
Стерео-режим записи
Внимание! Файл записи лучше предоставлять в формате *.wav, поскольку конвертация в *.mp3 может ухудшить качество записи и, как следствие, качество распознаваемой речи.

Минимальные настройки для сохранения в стерео заключаются в замене оператора MixMonitor на Monitor с последующим вызовом приложения Sox. Пример показан ниже:

; change begin
; before
;exten => recordcheck,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT},a${MONITOR_REC_OPTION}i(LOCAL_MIXMON_ID)${MIXMON_BEEP},${MIXMON_POST})
; after
exten => recordcheck,n,Set(MONITOR_EXEC_ARGS=&& /bin/rm -f /var/spool/asterisk/monitor/${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}-*)
exten => recordcheck,n,Set(MONITOR_EXEC=/usr/bin/sox -M)
exten => recordcheck,n,Monitor(${MON_FMT},${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME},m)
; change end
Внимание! Пути к приложениям sox, rm и базовой директории записей могут отличаться

Подробнее процесс описан в статье об интеграции с аналогичным сервисом speech analytics.

Таким образом, мы подготовили файл записи.

Подключение к внутренней БД

Для работы с MySQL был выбран класс с открытым исходным кодом под PHP: safemysq.class.php. Подробности о нём можно узнать по ссылке. Нас же интересует его возможность подключения к БД и выполнение инъективно-безопасных запросов.

Для создания файла будем использовать встроенную функцию php – file_put_contents.

Внимание! Использование встроенной функции OUTFILE в mysql требует root-прав от пользователя.

Итак, создадим на АТС, в веб-директории новую:

# mkdir /var/www/html/s2s

А в неё перенесём файлы из архива и немного скорректируем settings.php:

$mysql_account = array(
	// 'host' 		=> 'localhost',
	// 'port' 		=> '3306',
	// 'charset'	=> 'utf8',
	'user' 		=> 'freepbxuser',
	'password' 	=> 'a01b********************948',
	'database' 	=> 'asteriskcdrdb'
);

Секции, стоящие за комментариями – не следует менять, если используемые значения соответствуют указанным по-умолчанию. Логин и пароль можно получить из файла: /etc/<dist_name>.conf, например:

Доступы в БД
Доступы в БД

Если доступы указаны корректно, основной скрипт сможет подключиться к базе данных и выполнять запросы, а значит и файл *.xml с метаданными будет сформирован.

Внимание! В обязательном порядке проверить при первом запуске создание файла в нужной директории. Возможно у PHP не хватит прав и её придётся заменить, или сбросить ограничения

Подключение к FTP и загрузка

Для работы с FTP был разработан примитивный класс ftpupload.class.php.

Рассмотрим его методы:

Конструктор получает данные подключения, к удалённому серверу:

  • Хост.
  • Порт.
  • Логин.
  • Пароль.

getState() — это проверка соединения с FTP. Не принимает аргументов, возвращает true\false – статус соединения.

sendFile($sendPathFile) – в качестве аргумента принимает абсолютный или относительный путь к файлу, который нужно отправить на FTP. При наличии корректно установленного подключения и файл находится по указанному пути – выполняется его отправка.

Деструктор класса уничтожает данные, с которыми оперировал класс.

Доступы к FTP сервису мы получаем у представителей speech2sales и указываем в файле settings.php

$ftp_account = array(
	'host' => 'sftp.neurocat.ru',
	'user' => 'fuserApiV',
	'password' => 'MV[sG2p0',
	'ftpPath' => 'data/calls/'
);

Если всё будет указано верно мы получим доступ к FTP-серверу.

Последнее, что нам предстоит выполнить, это навесить корневой скрипт на завершение звонка, с передачей ему двух аргументов: Linkedid и наименование файла записи.

;change begin
exten => s,n,System(/usr/bin/php -f /var/lib/asterisk/agi-bin/send_s2s_calls.php ${CHANNEL(Linkedid)} ${ARG1} & disown -h)
;change end

Далее скрипт будет подключаться к внутренней базе данных asterisk.cel, asterisk.cdr и формировать *.xml файл с мета-данными. По готовности и файл записи разговора и файл с данными будут загружены на FTP-сервер.

Файлы на FTP в очереди на обработку
Файлы на FTP в очереди на обработку

Обратите внимание: файл мета-данных всегда должен быть строго структурирован по следующему шаблонку:

<?xml version='1.0' encoding='UTF-8'?>
<analysisTask>
	<workspace>UNKNOWN</workspace>
	<cc-agent>2103</cc-agent>
	<timestamp>2021-05-28 10:14:49</timestamp>
	<filename>out-4959842499-2103-20210528-101449-1622186089.66738.wav</filename>
	<cc-task>1622186089.66738</cc-task>
	<channel type='a' caller='true'  ccAgentID='2103' value='Зиновьева Кристина' />
	<channel type='c'  disconnect='true' value='84959842499' />
</analysisTask>

Где:

workspace – остаётся без изменений,

cc-agent – внутренний номер оператора компании,

timestamp – время начала звонка,

filename – наименование файла записи (строго должно соответствовать загружаемому файлу записи),

cc-task – уникальный идентификатор звонка, так же используется для индексации на стороне сервиса,

channel type=’a’ – канал агента компании,

caller=’true’ – инициатор вызова,

ccAgentID – внутренний номер оператора компании,

value – ФИО оператора компании,

channel type=’c’ – канал клиента компании,

disconnect=’true’ – источник завершения вызова,

value – номер клиента компании.

В качестве дополнительной опции рассмотрим установку интерфейса управления доступом сервиса к внутренним номерам. Для этого добавляем из архива скрипт index.php в созданную ранее директорию /var/www/html/s2s.

А также выполняем в mysql запросы:

> create table s2sactive(
	id varchar(20) NOT NULL DEFAULT '',
	state varchar(5) NOT NULL DEFAULT 'off',
	KEY `id` (`id`)
);

Первый создаст таблицу для интерфейса с двумя полями внутренний номер и его статус.

> INSERT INTO s2sactive (id, state) SELECT id, 'off' FROM asterisk.devices;

Второй скопирует все внутренние номера операторов из базы asterisk.devices с присвоением им статуса – недоступен.

Теперь если вы перейдёте по локальному адресу сервера и добавите нужную директорию: http://<ip_asterisk> /s2s/

У вас откроется страница настройки.

Интерфейс настройки доступа s2s к внутренним номерам
Интерфейс настройки доступа s2s к внутренним номерам

Принцип его действия сходен с freepbx – отмечаете нужные номера \ фамилии, и нажимаете в правом нижнем углу «сохранить». После этого страница будет обновлена, а выделенные пользователи останутся помеченными.

Если вы не видите нужного пользователя в таблице – возможно его добавили недавно и таблицы не синхронизированы. В этом случае потребуется выполнить синхронизацию вручную через кнопку слева снизу «синхронизировать».

На этом моменте мы получили приложение, которое умеет:

  1. Формировать записи разговоров в стерео-режиме.
  2. Подключаться к внутренней БД.
  3. Формировать *.xml файлы с метаданными о звонке.
  4. Подключаться к FTP-серверу и загружать на него файлы.
  5. Запрещать и разрешать загрузку звонков конкретных операторов.
Книга 101 функция Asterisk
Познакомьтесь с возможностями Asterisk. Найдите инструменты, которые помогут вашей компании развиваться.
Скачать книгу
Подписаться
Уведомить о
guest
1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Александр
Александр
25.06.2021 17:08

«Для этого добавляем из архива скрипт index.php в созданную ранее директорию /var/www/html/s2s.» — а этот архив где-то качаем или получаем от speech2sales?

Остались вопросы?

Я - Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.