Найти в Дзене
Merion Academy

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

Оглавление

Речевые технологии шагнули далеко вперед. В продвинутых контактных – центрах все чаще можно встретить технологии распознавания речи, а зачастую, и верификации по голосу. Если кратко, то эта технология называется ASR (Automatic speech recognition).

Сегодня у нас действительно крутая статья о том, как настроить распознавание речи на IP – АТС Asterisk. В качестве комплекса (платформы) распознавания мы будем использовать Yandex SpeechKit. Готовы сделать шаг вперед?

Важно! Для использования SpeechKit в коммерческих проектах необходимо заключить договор с Яндексом.

КАК ЭТО БУДЕТ РАБОТАТЬ?

У нас будет следующий любопытный сценарий: на наш Asterisk приходит звонок. Звонящему, мы озвучим примерно следующее сообщение: «Здравствуйте! Спасибо за звонок. Чтобы узнать статус заказа, скажите заказ, чтобы связаться с секретарем, скажите секретарь, для связи с оператором скажите оператор после короткого сигнала. ». После этого, будет выполнен звонок на нужный extension.

Схема работы следующая:

ПОЛУЧАЕМ API - КЛЮЧ

Первое, что необходимо сделать, это необходимо получить токен от Яндекса. Переходим в кабинет разработчика по адресу https://developer.tech.yandex.ru/ и нажимаем Получить ключ:

-2

В поле создание ключа укажите его имя. Выберите сервис SpeechKit Cloud:

-3

Токен готов. Скопируйте его и сохраните его на своем компьютере.

-4

СКРИПТ ИНТЕГРАЦИИ

Еще немного и наш Asterisk начнет распознавать речь. Для работы мы будем использовать PHP – скрипт, который будет вызван через AGI приложение в диалплане. Скрипт следующего содержания (комментарии по коду):

#!/usr/bin/php -q
<?php
require('phpagi.php');
$agi = new AGI(); #подключаем AGI библиотеку;
$audio = $argv[1]; #записываем значение переменной из AGI. Мы передаем аудио - файл, в котором записано сказанное звонящим;
$token = 'ваш_токен';
$theme = "queries"; #языковая модель. queries - это общие запросы на различные тематики;
$lang = "ru-RU"; #язык распознавания;
$uuid = md5(uniqid(rand(), true)); #уникальный идентификатор длиной в 32 символа;
system('sox '.$audio.'.wav -r 16000 -b 16 -c 1 '.$audio.'-conv.wav'); #конвертируем аудио в нужный формат;
$cmd = exec('curl --silent -F "Content-Type=audio/x-pcm;bit=16;rate=16000;" -F "audio=@'.$audio.'-conv.wav"
asr.yandex.net/asr_xml\?key='.$token.'\&uuid='.$uuid .'\&topic='.$theme.'\&lang='.$lang, $result); #генерируем CURL в сторону API Яндекса для распознавания;
$result_asr = implode($result); #делаем из массива строку;
if (preg_match('!!si', $result_asr, $arr)) {
$asr_res = $arr[1];
} else {
$asr_res='';
} #выделяем из результата потенциальные значения распознавания;
if (intval(substr_count($asr_res, 'оператор')) > 0) {
$ress = 1; #если в результатах есть слово "оператор", то в диалплан возвращаем 1;
} elseif (intval(substr_count($asr_res, 'заказ')) > 0) {
$ress = 2; #если в результатах есть слово "заказ", то в диалплан возвращаем 2;
} elseif (intval(substr_count($asr_res, 'секретарь')) > 0) {
$ress = 3; #если в результатах есть слово "секретарь", то в диалплан возвращаем 3;
} else {
$ress = 0; #если совпадения не найдено, то 0;
}
$agi->set_variable("asr", $ress); #возвращаем в диалплан переменную со значение распознавания;
system('rm -f '.$audio.'.wav');
system('rm -f '.$audio.'-conv.wav'); #удаляем временные файлы, в которых содержится запрос звонящего;
?>

Подчеркнем, что у вас могут быть собственные «триггеры» распознавания (слова, которые скажет абонент). Для этого просто поменяйте слова «оператор», «заказ» и «секретарь» внутри скрипта.

Схема работы весьма простая. Кстати, сам скрипт можно скачать по ссылке ниже:

СКАЧАТЬ СКРИПТ ASR

После загрузки файла, сохраните его с расширением .php

Сохраните скрипт под именем asr.php в директории /var/lib/asterisk/agi-bin и дайте следующие команды в консоль сервера:

dos2unix /var/lib/asterisk/agi-bin/asr.php
chown asterisk:asterisk /var/lib/asterisk/agi-bin/asr.php
chmod 775 /var/lib/asterisk/agi-bin/asr.php

ДИАЛПЛАН

Теперь мы адаптируем скрипт в диалплане. Открываем файл /etc/asterisk/extensions_custom.conf и добавляем туда следующее содержимое:

[asr_menu]
exten => s,1,Answer()
exten => s,n,Playback(custom/asr)
exten => s,n,Wait(1)
exten => s,n,Record(/tmp/${UNIQUEID}.wav,3,20)
exten => s,n,AGI(asr.php,/tmp/${UNIQUEID})
exten => s,n,Set(varasr=${asr})
exten => s,n,GotoIf($["${varasr}" = "1"]?dial111:zakazcheck)
same => n(dial111),Dial(SIP/111,15,rt)
same => n,Hangup()
exten => s,n(zakazcheck),GotoIf($["${varasr}" = "2"]?dial222:sekratarcheck)
same => n(dial222),Dial(SIP/222,15,rt)
same => n,Hangup()
exten => s,n(sekratarcheck),GotoIf($["${varasr}" = "3"]?dial333)
same => n(dial333),Dial(SIP/333,15,rt)
same => n,Hangup()

В рамках данного контекста мы приветствуем абонента (рассказываем о голосовых возможностях, файл /var/lib/asterisk/sounds/ru/custom/asr.wav), затем, мы озвучиваем звуковой сигнал для звонящего абонента, после чего, он проговаривает свой запрос, который мы записываем в файл. В случае, если звонящий сказал «оператор», мы позвоним на 111, если звонящий сказал «заказ», то звоним на 222, а если сказал «секретарь», то мы позвоним на 333. Вы можете поменять нумерацию на вашу внутреннюю согласно вашего диалплана.

Мы на финишной прямой. Настроим его через FreePBX. Воспользуемся модулем Custom Destinations. Переходим по пути AdminCustom Destinations и нажимаем Add Destination:

-5

Настройке аналогичным образом, как показано на скриншоте выше. Нажимаем Submit и Apply Config. Прыгаем в свое IVR – меню (или это может быть просто входящий маршрут). У себя мы настроим распознавание при нажатии 1 в главном интерактивном голосовом меню:

-6

Готово. В будущем мы попробуем рассказать про верификацию (аутентификацию) звонящего по голосу на базе open – source решений.