artem
15.03.2018
5651

Распознавание речи в Asterisk

Вы наверняка встречались с вызовом абонента через распознавание речи. Это сделано для удобства. Вам не приходится переводить телефон в тоновый режим и донабирать внутренний номер. Достаточно сказать фамилию или номер и вызов произойдет. В данной статье будет описано такое решение.

Сначала определим план действий для такой функции:

 

1. Определиться с сервисом, который будет распознавать речь. (Для этого использовался wit.ai).

2. Производить запись речи клиента и помещать во временное хранилище.

3. Отослать запись на выбранный сервис и получить результат обработки.

4. Сравнить с текущими фамилиями сотрудников.

5. Совершить вызов на сотрудника, если таковой нашелся.

 

Все описанные действия в статье на сервере телефонии необходимо выполнять от имени суперпользователя (root). Установка и настройка производилась на предустановленной системе CentOS 6.9 + Asterisk 11.25.1 + FreePBX 13. 

Сервис распознавания речи

Про сервис Wit.ai было рассказано тут. Так же в той статье описано получение API ключа, для дальнейшей работы.

Запись речи клиента.

Как известно в астериске есть стандартное приложение для записи голоса. Record. Для начала надо предупредить клиента о произнесении нужной информации. Для этого используем приложение Playback.

exten=>s,1,Set(QW=${CALLERID(num)})
        same => n,Playback(custom/second_name)
        same => n,Record(/tmp/${CDR(uniqueid)}.wav,,5)

second_name – имя файла записи, которое будет воспроизводиться для клиента.

/tmp/${CDR(uniqueid)}.wav — файл куда будет записываться сообщение клиента

5 — Таймаут записи в секундах. (Для произнесения добавочного или фамилии будет достаточно 5 секунд)

Wait – даем немного времени для освобождения файла от записи.

Обработка записи

Для побработки записи будем использовать скрипт. (Будет использоваться php.)

 

#!/usr/bin/php -q
<?php
require (‘phpagi.php’);
        $agi = new AGI();
$recname = strval($agi->request[‘uniqueid’]);
$url = ‘https://api.wit.ai/speech?v=20160526&access_token=API_wit_ai’;
 
$data = file_get_contents(‘/tmp/’.$recname.’.wav’);
 
$headers = array();
$headers[] = ‘X-Requested-With: JSONHttpRequest’;
$headers[] = ‘Content-Type: audio/wav’;
$resource = curl_init();
 
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HTTPHEADER,$headers);
curl_setopt($resource, CURLOPT_POST,1);
curl_setopt($resource, CURLOPT_BINARYTRANSFER, true);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_POSTFIELDS,$data);
 
$result= curl_exec($resource);
$result= json_decode($result);
 
curl_close($resource);
 
$result = serialize($result);
 
preg_match_all(‘/[а-я А-Я]+/u’,$result,$matches);

Подключаем библиотеку phpagi. Она нужна для передачи параметра uniqueid в скрипт. Т.к. Мы сохраняем файл голоса клиента с именем UNIQUEID звонка. (см. выше).

recname – имя нашей записи.

url – урл к сервису распознавания речи

API_wit_ai — АПИ ключ, который мы ранее получили в ЛК wit.ai.

Далее методами CURL отправляем содержимое файла $data к сервису wit. На что, через некоторое время получаем JSON ответ, с содержанием в поле _text нашей распознанной речи:

{s:5:»_text»;s:12:»Зайцев»;s:8:»entities»;O:8:»stdClass»:0{}s:6:»msg_id»;s:17:»0I2OngrCjdKXb3cHA»;}

Сравнение с текущими фамилиями

Распознавание речи не всегда бывает точным. Бывают случаи, когда человек кортавит или же шипилявит, поэтому точно распознать речь не получится. И не всегда присылаемый текст совпадает с нашими ожиданиями, поэтому был применен алгоритм Левенштейна.

 

// введенное слово с опечаткой
$input = $matches[0][0];
// массив сверяемых слов
$words  = array(‘Зайцев’ => 105,’Иванов’ => 201,’Петров’ => 220,’Сидоров’ => 216,
                ‘Грачев’ => 217);
                                //Массив вызываемых абонентов
// кратчайшее расстояние пока еще не найдено
$shortest = -1;
// проходим по словам для нахождения самого близкого варианта
foreach ($words as $word => $ext) {
    // вычисляем расстояние между входным словом и текущим
    $lev = levenshtein($input, $word);
    // проверяем полное совпадение
    if ($lev == 0) {
        // это ближайшее слово (точное совпадение)
        $closest = $word;
        $shortest = 0;
        // выходим из цикла — мы нашли точное совпадение
        break;
    }
    // если это расстояние меньше следующего наименьшего расстояния
    // ИЛИ если следующее самое короткое слово еще не было найдено
    if ($lev <= $shortest || $shortest < 0) {
        // устанивливаем ближайшее совпадение и кратчайшее расстояние
        $closest  = $word;
        $shortest = $lev;
    }
}

Далее нам надо передать в диалплан необходимый номер телефона (указан в словаре $words)

 

$agi->set_variable(«VOICE_NUM»,$words[$closest]);
$agi->set_variable(«VOICE_NAME»,$closest);
?>

 

VOICE_NUM – номер клиента

VOICE_NAME – Фамилия клиента (для дебага в консоле)

Совершить вызов на сотрудника

        same => n,AGI(voice.php)
        same => n,Goto(ext-local,${VOICE_NUM},1)

AGI(voice.php) – вызов нашего скрипта для дальнейшей передачи переменных в диалплан

Goto — переходим в необходимый контекст для вызова распознанного номера (в FreePBX по умолчанию это ext-local).

Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments

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

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

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

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

ближайшие Вебинары

ONLINE

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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.