1С + asterisk (автоматический обзвон) часть 2. Распознавание речи

Публикация № 1022878

Администрирование - Торговое оборудование - Телефония, SIP

asterisk автообзвон ami python agi распознавание речи

Пример реализации автообзвона (с распознаванием речи ответа отвечающей стороны) с использованием ami asterisk. Данная статья может быть полезна программистам, интеграторам, администраторам. Версия и релиз технологической платформы не имеет значения.

Продолжение предыдущей статьи. (//1kat.ru/public/954564/)

Пример применения распознавания речи в исходящих звонках asterisk.

 

Задача:

Получить (не) подтверждение о приезде клиента на определенный момент.

 

Общая логика решения задачи:

1. Дозвониться

2. Прочитать текст

3. Записать речь отвечающей стороны в файл

4. Выполнить распознавание речи

5. Попрощаться

6. В зависимости от результата распознавания принять решение

7. В зависимости от принятия решения выполнить некие действия в 1С(двинуть бп дальше, оповестить ответственных лиц, закрыть задачи, освободить занятое время, и тд)

8. Сохранить историю событий asterisk

 

Технологии:

1. 1С (выборка данных, инициализация вызова, обработка завершения, бизнес логика)

2. asterisk (ami сервер) (телефония)

3. python (бэк, прокси сервер между фронтом и телефонией, ami клиент)

4. Yandex.SpeechKit (распознавание речи)

5. php (agi)

 

Общая принцип работы:

Средствами 1С регламентное задание делает выборку по предварительно сформированным задачам, уведомление клиента за 24 часа. Из выборки берется телефон для набора, и определяется путь к файлу, который будет в дальнейшем воспроизводится. 1С делает гет запрос в бэк, передавая параметры (телефон, путь к файлу). Бэк получает запрос, парсит параметры, подключается к ами asterisk, вызывает действие "Originate" с указанием параметров(телефон, путь к файлу, контекс диалплана, канала вызывающей стороны), подписывается на события ами, подключается к kafka для отправки событий(на самом деле подключается при старте и держит соединение). Asterisk после успешного поднятия трубки на отвечающей стороне читает файл, где в конце файла будет что-то вроде "скажите да если вы приедете, скажите нет если не приедете" (ну условно). Asterisk записывает в файл разговор отвечающей стороны. Делает пост запрос в бэк, передавая файл и ид звонка(каллер ид), затем прощается, завершает вызов. Бэк получает файл, передает его на asr.yandex. asr.yandex распознает возвращает xml. Бэк парсит xml генерирует событие в kafka. kafka при получении событий отправляет в http сервис 1С, для дальнейшей обработки. 1С обрабатывает состояние, реализует бизнес логику.

Синтез речи (генерация файлов для воспроизведения) был описан в предыдущей статье.

В отличии от предыдущей статьи по астериску, здесь код:

1. будет адаптирован под работу в микросервисе (kafka, предыдущая статья по kafka)

2. web часть будет перенесена на flask

 

Шаг 1. диалплан

Инициализация исходящего звонка будет происходить через asterisk ami, далее звонок идет в dial plan.

Для реализации задачи был добавлен контекст и макрос.(да, снова не ari)

 
 extensions.conf

Так как в первой части

 
 macro.conf

Воспроизводим файл.

Пишем ответ в файл.

Передаем в agi.

 
 speech_to_text.php (agi)

Парсим параметры из STDIN (поток ввода).

Делаем пост запрос в бэк с передачей в теле аудио файла, и передачей параметров для определения звонка(ид звонка).

Получаем ответ распознавания.

Устанавливаем переменную(опционально).

Пишем в поток вывода.

 

Шаг 2. бэк

 
 runserver.py

Стартер бэк енда.

 
 server/conf.py

Конфиги.

 
 server/__init__.py

Подключение к ами астериск:

client = AMIClient(address=AMI_ADDRESS, port=AMI_PORT)
AutoReconnect(client) - для переподключения при потерях связи

future = client.login(username=AMI_USER, secret=AMI_SECRET)

client.add_event_listener(event_listener)

Подключение к кафка:

producer = KafkaProducer(bootstrap_servers=['192.168.555.666:9092'])

Подписка на события ами:

def event_listener(event, **kwargs):

Отправка в кафка для серверного вызова 1с:

def auto_call_event(jdata):

...

 #producer.send(f'ones_ws_event', key=key, value=value) - событие для web сервиса 1с, я кстати ухожу от него в пользу 1с http сервисов
producer.send(f'ones_http_event', key=key, value=value) - событие http сервиса 1c

...

как это реализуется  и что это такое в плане кода (обработка события и отправка в 1с, можно посмотреть здесь )

Отправка в кафка для вызова клиентского метода 1с (например фонер(звонилка) 1с):

def ami_client_event(jdata, user):

Обработка, докручивание событий астериск:

def do_handle_event(event):

Остальное здесь логика.

 
 server/views.py

Енд поинты.

Ами команды:

def do_call_with_oper(adapter, channel, exten, caller_id, caller_id_name, action_id, timeout='', context=CONTEXT_LOCAL, priority=1, callback_response=None):

def do_call_without_oper(adapter, channel, data, app, action_id, variable = '', exten='', timeout=TIMEOUT_AUTO_DIAL, context=CONTEXT_AUTO_DIAL, callback_response=None):

Апи:

def make_call(): - вызывает 1с, из фонера

парсит параметры, устанавливает клинское соединение с астериск, делает action originate, добавляет в соответствие пользователя для дальнейшего отслеживания, для последующей генерации событий в кафка.

def make_call_auto(): - вызывает 1с из регламентого задания, старт автообзвона

парсит параметры, устанавливает клинское соединение с астериск, делает action originate(по другому контексту и передает туда параметры), добавляет в соответствие ид звонка (ид задачи) для дальнейшего отслеживания, для последующей генерации событий в кафка, генерирует событие в кафка init, которое приезжает в 1с, там оно пишется в регистр сведений, типа задача зарегистрирована на обзвон. от прямой вставки в бд, отказался, в коде коммент остался.

def speech_to_text(): - вызывает аги астериск для распознавания речи

Парсит параметры, вытягивает из тела запроса файл, делает пост на asr.yandex передавая файл, токен. Получает ответ от аср, парсит иксмл, проверяет строку по таблице ответов (ANSWERS_POSITIVE, ANSWERS_NEGATIVE, ANSWERS_RE_RECORD), генерирует в кафка событие "speech_to_text" для 1с, передавая числовое значение(0, 1,2,3)

0 - ответ не распознан

1 - ответ позитивный

2 - ответ негативный

3 - прочее

Web admin:

def index(): - возвращает статичную html страницу(пока что, далее будет статистика, отчеты, админ фронт)

 
 server/templates/index.html

Статика, админка в будущем.

 
 start.sh

Запуск в срине.

 

Шаг 3. 1C

Серверная часть:

Енд поинт 1с.

 
 gate

Далее идет бизнес логика средствами 1с.

Примеры работы:

Клиентская часть фонер 1с:

 
 общая форма

Сюда приезжает через Оповестить из события в ОбработкаВнешнегоСобытия из модуля приложения кодом:

 
 общий модуль

туда прилетает через вк 1с тисипи клиента от кафки (статья про кафку выше ссылка), в кафку отправляет бэк описанный в данной статье.

Так как данная статья написана все таки про автообзвон, делать описание реализации фонера 1с здесь не буду(реализаций на сайте(и не только) много, как делать звонки, подписываться на события, и обработку в контексте 1с показано выше).

 

Отступление:

Про методы распознавание речи. К использованию спич кита яндекса, пришел не сразу.

Были попытки использовать:

Локальные:

1.CMU Sphinx https://cmusphinx.github.io, сфинкс очень крутой!, может работать локально. Есть моменты в плане потребления ресурсов (оно и понятно почему), завести как нужно его у меня не хватило мозгов. Точность распознавания у меня получилась не достаточная.

2. Напедалить свою поделку ПО-БЫСТРОМУ на тему оцифровки и принятия решений (ML, буст деревья яндекса, нейронка, обучение) у меня тоже не хватило мозгов(возможно позже) (вся проблема будет в обучении нейронки)(как мне кажется)

3. Использовать голосовой движок дот нет стэка мс. Тут проблема в том что dev-машина мс windows 10, оттуда поддержка русского языка выехала(может подвезут позже) я об Microsoft.CognitiveServices.Speech возможно я что не понял или не так сделал но при указании региона ру(RU-ru) там была бага что типа не найдено установленного региона или что-то в этом духе.

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

Он-лайновые:

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

2. Распознавание он лайн от гугла. Руки не дошли до него(дошли бы остановился на яндекс спич кит). Вероятно, тоже невероятное качество распознавания. (Платный)

3. Прочие он-лайн сервисы. Руки не дошли до них(дошли бы, если бы не п1-п2)(вообще рассматривал читал маны по ним)

 

Отступление:

Да, автообзвон натыкался на ивр. Мило пообщались 2 робота, ничего страшно. Нам прилетел (с бэка) ответ: не распознан, люди далее обработали инцидент самостоятельно. Все, что прилетает со статусом "ответ не распознан", разбирают люди, прослушав запись ответа.

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. capitan 1622 18.03.19 10:11 Сейчас в теме
2. dmarenin 253 18.03.19 16:48 Сейчас в теме
3. user1400383 28.04.20 12:12 Сейчас в теме
Добрый день.

Простите, я только начал разбираться с работой астериска.

Есть немного вопросов:
- не совсем понятна структура variable = FILE_NAMES[file], я так понимаю, variable - это аудио файл? Если да, то в каком виде данные содержаться? Если нет, то хотелось бы узнать подробно: что это и какова структура и для чего?

- не совсем понятна структура channel = f'Local/{exten}*ng_ext_autodial_speech_to_text', я так понимаю, что exten - это номер внутренний, а *ng_ext_autodial_speech_to_text - это переменная какого - то скрипта?! или это относится к астериску и он будет там всегда?

- в res_call = do_call_without_oper(adapter, channel, DATA, APP, action_id, variable, exten) непонятно что такое DATA и APP?
4. dmarenin 253 28.04.20 13:04 Сейчас в теме
(3) п1, п3 смотреть в conf.py там все ответы. п2 f'Local/{exten}*ng_ext_autodial_speech_to_text' не *, a "*" (собачка) это раз. два это означает в каком контексте(куда будет тыкать вызов в астер, в плане в какой диал план) то что всё описано в статье
Оставьте свое сообщение

См. также

1С-Asterisk. Не заставляйте клиентов слушать IVR Промо

Телефония, SIP Россия Бесплатно (free)

"Ваш звонок очень важен для нас..." или как уберечь постоянных клиентов от прослушивания IVR (голосовых меню)

21.01.2012    25776    0    oleg.rizvanov    15    

Доработка подсистемы телефонии УНФ при использовании MANGO OFFICE

Телефония, SIP v8 УНФ Бесплатно (free)

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

29.04.2020    1006    0    malikov_pro    0    

1c + kafka.apache

Практика программирования v8 Россия Абонемент ($m)

Пример построения микросервисов с использованием apache kafka. Данная статья будет полезна интеграторам, программистам. Версия и релиз технологической платформы не имеет значения.

1 стартмани

27.01.2019    12514    17    dmarenin    69    

1C + Телефония = /dev/hands + мозг (HowTo + FeedBack)

Телефония, SIP v8 1cv8.cf Россия Бесплатно (free)

FeedBack по интеграции 1С + Телефония. Что сработало. Что не понравилось.

15.01.2019    5535    0    rdbkzn    3    

1С + asterisk (автоматический обзвон) часть 1

WEB Практика программирования Телефония, SIP Россия Бесплатно (free)

Пример реализации автообзвона (с обработкой ответа на отвечающей стороне) с использованием ami asterisk. Данная статья может быть полезна программистам, интеграторам, администраторам. Версия и релиз технологической платформы не имеет значения.

29.11.2018    10716    0    dmarenin    9    

Настройка Рарус: СофтФон с SIP телефонией на примере оператора Телфин

Управление взаимоотношениями с клиентами (СRM) Телефония, SIP Управление взаимоотношениями с клиентами (СRM) v8 1С:CRM Бесплатно (free)

Описание настройки Рарус СофтФон для работы с SIP телефонией на примере конфигурации Управление торговлей и взаимоотношениями с клиентами (CRM), редакция 2.0.

26.02.2018    14582    0    de0nis    0    

Как мы научили 1С генерировать IVR меню для Asterisk

Телефония, SIP Практика программирования v8 1cv8.cf Бесплатно (free)

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

15.12.2015    20958    0    jorikfon    7    

Что можно получить от интеграции 1С:CRM 8 и телефонии Asterisk

Телефония, SIP v8 Бесплатно (free)

Мы более года тесно занимаемся разработкой решений по интеграции телефонии на базе Asterisk и программ 1С. В первую очередь мы испытываем решения на себе, и я хочу поделиться опытом о том, что можно получить от такой интеграции. У нас используется терминальная схема работы с 1С:CRM. На столе у каждого сотрудника IP телефон, который подключен по локальной сети к IP ATС Askozia, развернутой вместе с терминальным 1С сервером внутри VMware инфраструктуры в ближайшем ЦОДе.

04.03.2013    38025    0    jorikfon    19    

Интеграция 1С:CRM и Asterisk с помощью PHP-AGI и веб-сервисов 1C

Управление взаимоотношениями с клиентами (СRM) Телефония, SIP Управление взаимоотношениями с клиентами (СRM) v8 1cv8.cf ИТ-компания Россия Бесплатно (free)

Давно зрел вопрос, можно ли встроить в диалплан Asterisk обращение к 1С:CRM системе для выполнения каких-либо управляющих действий и можно ли из 1С управлять IP АТС? Схема работы простейшая — при входящем звонке спросить у 1С что с ним делать, и если 1С ответила, то выполнить команду или продолжить стандартное выполнение маршрута вызова.

08.02.2013    31547    0    boffart    6    

ROM-Asterisk в высоконагруженных проектах интеграции

Телефония, SIP v7.7 v8 Бесплатно (free)

Хочу поделиться опытом, нажитым непосильным трудом при реализации больших проектов по интеграции 1С и Asterisk. ROM-Asterisk неплохо себя проявил под большими нагрузками. Выделю основные рекомендации, которые следует выполнять при интеграции с высоконагруженными Asterisk

13.01.2013    31250    0    oleg.rizvanov    22    

Клаксон менеджера [CLQSN] v3.0.

Телефония, SIP Рабочее место Управление взаимоотношениями с клиентами (СRM) Управление взаимоотношениями с клиентами (СRM) v7.7 1cv7.md Бесплатно (free)

Звонилка. Дозванивается из конфигураций 1С по телефонным номерам из справочников.

19.03.2007    13496    0    Delon    7