Распознавание речи в 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).
Остались вопросы?
Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.
Добрый день! Это все еще работает?