578 профессионалов IT в этом Telegram чате. “ы с нами?

ћерион Ќетворкс

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

—егодн€ у нас действительно крута€ стать€ о том, как настроить распознавание речи на IP Ц ј“— Asterisk. ¬ качестве комплекса (платформы) распознавани€ мы будем использовать Yandex SpeechKit. √отовы сделать шаг вперед?

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

 ак это будет работать?

” нас будет следующий любопытный сценарий: на наш Asterisk приходит звонок. «вон€щему, мы озвучим примерно следующее сообщение: Ђ«дравствуйте! —пасибо за звонок. „тобы узнать статус заказа, скажите заказ, чтобы св€затьс€ с секретарем, скажите секретарь, дл€ св€зи с оператором скажите оператор после короткого сигнала. ї. ѕосле этого, будет выполнен звонок на нужный extension.

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

—хема интеграции Asterisk и Yandex SpeechKit

ѕолучаем API - ключ

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

ѕолучить ключ Yandex SpeechKit

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

¬ыбор сервиса дл€ API Yandex

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

“окен дл€ распознавани€ речи ASR
—крипт интеграции

≈ще немного и наш 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

—охраните скрипт под именем tts.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:

Custom Destinations дл€ распознавани€ речи в FreePBX

Ќастройке аналогичным образом, как показано на скриншоте выше. Ќажимаем Submit и Apply Config. ѕрыгаем в свое IVR Ц меню (или это может быть просто вход€щий маршрут). ” себ€ мы настроим распознавание при нажатии 1 в главном интерактивном голосовом меню:

Yandex ASR в FreePBX

√отово. ¬ будущем мы попробуем рассказать про верификацию (аутентификацию) звон€щего по голосу на базе open Ц source решений.


ѕолезна ли ¬ам эта стать€?