+1

Голосовой движок - Wiki

MkBUs 1 год назад 0

Предлагаю разместить на вики статью по интеграции с телефонией.

Класс возвращает в бинарном виде mpeg-3 файл с озвученным текстом, сгенерированным с помощью Яндекс SpeecKit.

Программа умеет проговаривать клиенту о том, что он заморожен, заблокирован, остановлен, ведуться работы и самое главное - аварийная ситуация и восстановим через столько то времени...

В моем случае SIPOUTNET. Подойдет любая СИП, умеющая делать веб запрос и озвучивать полученный wav или ogg или mp3. В моем случае телефония умеет принимать wav, но размер ограничен,

поэтому еще дополнительно проделывается костыль с кодеком lame, чтобы уменьшить размер получаемого файла.

УСТАНОВКА И НАСТРОЙКА

1. В телефонии перед вызовом оператора разместить чтение результата GET-запроса. по адресу https://админка.хост.зона/sipout?login=ваш_логин&cid=сюда_переменная_номер_телефона_кто_звонит.

Параметр login используется для примитивной авторизации(должен совпадать со значением в class.php) - это константа. Параметр cid в моем случае - переменная номера звонящего в интерфейсе телефонии,

выглядит в строковом представлении так %VAR:CID%.

2. Файл index.php разместить в /var/www/mikbill/sipout/. В файле прописать пути до файлов config.xml и class.php относительно редктируемого файла, а лучше указать абсолютно.

3. Установить права на каталог /var/www/mikbill/sipout/ - 0777.

4. Файл class.php разместить в /var/mikbill/sipout/.

5. В файле class.php отредактировать константы под себя. OAUTH_TOKEN_YANDEX - токен в яндекс паспорте, по нему генерируется временный для Яндекс Облака, по которому в свою очередь получается сервис

SpeechKit. FOLDER_ID_YANDEX - католог, используется для идентификации. Выше перечисленные параметры постоянны. Подмените тексты в словарях class.php на свои.

6. Установите утилиту sox и кодек lame.


ЛОГИКА РАБОТЫ

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

1. Проверка авторизации и следующий сценарий, в противном случае возврат NULL.

2. Проверка правильности параметров запроса и следующий сценарий, в противном случае возврат NULL.

3. Проверка наличия записи в таблице usersfreeze - уведомление о замрозке.

4. Проверка наличия записи в таблице usersblok - уведомление о блокировке.

5. Проверка на блокировку по балансу или еще каким то критериям... у кого как... В данном случае, если blocked = 1 - то выполняется настоящий сценарий.

6. Проверка на факт проведения профилактических работ. Для выполнения данного сценария - Клиенту из админки в течении последних суток должна была быть отправлена смс с текстом, содержащим "%профилакт%".

7. Проверка на дефект линии. Смысл следующий по номеру звонящего - если он оффлайн и его последняя авторизация была в течении последних суток и если в +- 15 секунд еще были закончены сессии более 3 клиентов, то

дя данного Клиента это считается дефектом. Т.е вряд ли даже в сети в 1000 клиентов в течении 30 секунд отвалится 4 человека. Это наиболее подходящее решение для частного и многокватирных секторов.

Можете обвязать SQL-запрос - дополнительно, например чтоб эти 4 клиента относились к одному NAS и т.п. Или вообще к одному устройству или сегменту (я не использую на данный момент сегменты и устройств нет в биллинге).

8. Данный пункт выполняется если 3 - 7 не выполнены - и говорит звонящему приветствие по имени отчеству и оставатсья на линии.

9. Данный пункт выполняется если звонит номер, которого нет в базе.


ЗАМЕЧАНИЯ

1. ОС Centos 7.xxxxx

2. Авторизация PPP.

3. Все методы возвращают Имя Отчество из поля `fio`, убирая первое слово и пробел. Для корректной работы пользователи должны храниться как `users`.`fio` = 'Фамилия Имя Отчество'

4. Функция при выполнении пункта 7 - возвраает также улицу и дом клиента. Из улицы также убирается первое слово и пробел. Для корректной работы адреса должны храниться как `lane` = 'ул. Большой переулок'.

5. Логика определения времени устранения неполадок такова: берется DIFF в минутах между суммой (последнего `acctstoptime` клиента и интервалом 60 минут) и меткой NOW(). Если она отрицательна, то

возвращается строка "текущего часа", т.е. оператор не уложился в этот период, а Клиент еще не онлайн. Также, время возвращается десятично и округленно, т.е. если неполадки будут устранены через,

например 38 минут - скажется 40, а если через 23 - то через 20.

5. Позитивные уведомления генерируются с помощью веселой эмоциональной окраски, остальные - нейтральной.

6. Голос диктора выбирается также рандомно из массива yandexVoiceSamples. На данный момент проговорить все записи приемлемо может только oksana, но уже вижу улучшения у одного мужского голоса.


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

Примеры голоса во вложении. Качество mp3 на низком уровне из-за сжатия кодеком, так как используемая мною телефония ограничена в размере получаемого файла.

Если Вы укладываетесь в лимиты своего SIP-оператора - можете использовать wav, или если телефония поддерживает Opus OGG - то SpeechKit умеет возвращать напрямую эти форматы. Всем добра.

https://drive.google.com/file/d/18K5HRHDMQ-fdWft_6ULnP38cZsjwsv8K/view?usp=sharing https://drive.google.com/file/d/1m0FWyLdXre1y-lMdzGdZmPa6bA4Ivi7w/view?usp=sharing https://drive.google.com/file/d/1oY8VUgtFlIOdU-RpIOCCK9rDbSQFez6b/view?usp=sharing https://drive.google.com/file/d/1GIxjUfvC7wVw5jr8GKIC3vETE1O-EKv9/view?usp=sharing https://drive.google.com/file/d/1QotxS6QfdGTKRS8-in_LKXOE2_oL7d0M/view?usp=sharing

Сервис поддержки клиентов работает на платформе UserEcho