img

Синтез речи из диалплана Asterisk

21 ноября
20:00
Бесплатный вебинар
Введение в Docker
Ведущий — Филипп Игнатенко.
Руководитель центра разработки
Записаться
img
img

Друзья, сегодня речь пойдет о синтезе речи в Asterisk. Этот простой способ позволит вам озвучивать требуемое голосовое сообщение в структурах IVR или обычных приветствиях. Да где угодно. Профит этого решения:

  1. Единый голос для всех аудио – файлов;
  2. Кэширование и сохранение озвученных текстов, фраз в виде медиа - файлов, для последующего использования на Asterisk;

Получаем токен

Приступим. Прежде всего нужно получить API - токен на использование сервиса от Яндекс. Этот процесс расписан в статье по ссылке ниже (раздел Получение API - токена Yandex.SpeechKit):

Возвращайтесь с токеном и будем приступать к коду :)


Кодим!

Для начала создадим директорию /var/lib/asterisk/tts/ и дадим права. Там мы будем хранить текстовый файл, благодаря которому, сможем идентифицировать аудио – файлы по совпадению MD5 названия. Внутри файла будет фраза:

mkdir /var/lib/asterisk/tts/
chown asterisk:asterisk /var/lib/asterisk/tts/
chmod 775 /var/lib/asterisk/tts/

В зависимости от дистрибутива и вариантов установки IP – АТС Asterisk, звуковые файлы могут располагаться в другой директории. Вы можете самостоятельно поправить это в скрипте.

Использовать будем AGI приложение. Традиционно, комментарии к коду прикладываются:

#!/usr/bin/php -q
<?php
error_reporting(0); // выключаем ошибки, необязательно, нужно в процесcе дебага скрипта

require('phpagi.php'); 
$agi = new AGI();
$str = $agi->request['agi_arg_1']; //записываем в переменную текст, который необходимо озвучить
$str = iconv('cp1251', 'utf-8', $str); // конвертируем в кириллическую кодировку
$md5 = md5($str); //вычисляем md5 - хэш от переменной $str
$prefix = '/var/lib/asterisk/sounds/ru/custom/'; //устанавливаем директорию для файлов. Мы ее создавали по ходу движения
$filename = $prefix.$md5; //устанавливаем название файла(оно будет равно md5 текста)
$format = 'wav'; //устанавливаем формат получаемого файла от Яндекс
$quality = 'hi'; //устанавливаем качество

$speaker = 'oksana'; //выбираем голос. На момент написания статьи доступны женские голоса: jane, oksana, alyss и omazh и мужские голоса: zahar и ermil.
$emotion = 'evil'; // выбираем интонацию голоса, good — радостный, доброжелательный, evil — раздраженный, neutral — нейтральный (используется по умолчанию). Будем злее :)
$speed = '0.9'; // данный параметр отвечает за скорость (темп) речи, подбирается опытным путем на слух, в данном случае оптимальный
$key = 'Ваш_токен'; //ваш токен, который вы получили ранее.

if (!file_exists($filename.'.wav')) {

$qs = http_build_query(array("format" => $format,"quality" => $quality,"lang" => "ru-RU","speaker" => $speaker,"speed" => $speed,"key" => $key,"emotion" => $emotion, "text" => $str)); //формируем строку запроса
$ctx = stream_context_create(array("http"=>array("method"=>"GET","header"=>"Referer: 
")));
$soundfile = file_get_contents("https://tts.voicetech.yandex.net/generate?".$qs, false, $ctx); //запрашиваем файл
$file = fopen("file1.wav", "w"); //открываем файл для записи 
fwrite($file, $soundfile); // пишем в файл данные
fclose($file); //закрываем файл
shell_exec('sox -t raw -r 48k -e signed-integer -b 16 -c 1 file1.wav -t wav -r 8k -c 1 '.$filename.'.wav'); //конвертируем файл под требования Asterisk и закидываем в директорию для аудио
shell_exec('chown asterisk:asterisk '.$filename.'.wav');
shell_exec('chmod 775 '.$filename.'.wav'); // даем файлу нужные пермишны;
shell_exec('rm -f file1.wav'); // удаляем  файл, который создали в процессе обращения к API; 
shell_exec('echo '.$str.' > /var/lib/asterisk/tts/'.$md5.'.txt'); // добавляем магии ;-) о ней ниже в тексте статьи.
}
$agi->exec('Playback',"custom/$md5"); //проигрываем файл звонящему.

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

Сохраняем скрипт как texttospeech.php и закидываем его в директорию /var/lib/asterisk/agi-bin. После, даем последовательность следующих команд:

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

Как вы могли заметить, скрипт настраивается. Голос, интонация, скорость речи, качество получаемого файла – подлежат корректировке для вашей задачи.

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

  1. Скрипт получает из диалплана текст по AGI и сохраняет в переменной;
  2. Если у нас уже существует аудио – файл для заранее записанной фразы, мы отдаем в диалплан команду на воспроизведение. Если нет – обращаемся к API;
  3. Скрипт отправляет запрос в сторону API Яндекса;
  4. Происходит конвертация полученного аудио – файла в нужный формат;
  5. Даем права файлу для воспроизведения на Asterisk и удаляем временный файл;
  6. Делаем отметку о создании файла в служебный текстовый файл;
  7. Воспроизводим файл;

А как заставить скрипт работать?

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

[text_to_speech]
exten => s,1,Answer()
exten => s,2,AGI(texttospeech.php,"Привет! Это Мерион Нетворкс. Если ты слышишь это сообщение, значит все сделал правильно!")

Сохраняем изменения и прыгаем в FreePBX. Будем вызывать кастомный контекста из FreePBX. Для этого воспользуемся модулем Custom Destinations. Переходим по пути AdminCustom Destinations и нажимаем Add Destination:

Custom Destination FreePBX для синтеза речи

Настроили и сохранили. Наша задумка такова – человек звонит на наш номер, набирает 13 и попадает на синтезированное сообщение. Переходим в главный IVR и в секции IVR Entries добавляем следующее:

Синтез речи из диаплана Asterisk

Звоним, проверяем. Работает :) Если хотите заменить фразу, которую нужно озвучить, просто поправьте ее в файле /etc/asterisk/extensions_custom.conf.

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
DevOps
Скидка 25%
DevOps-инженер с нуля
Научитесь использовать инструменты и методы DevOps для автоматизации тестирования, сборки и развертывания кода, управления инфраструктурой и ускорения процесса доставки продуктов в продакшн. Станьте желанным специалистом в IT-индустрии и претендуйте на работу с высокой заработной платой.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Привет, дорогой читатель! В повседневной работе зачастую не хватает автоматизации. Поэтому, мы решили создать калькулятор инстал
img
Мы подумали, а почему бы не консолидировать все знания по Cisco VoIP продуктам и их настройке в единый документ? Добавить в них
img
Привет! Для удобства, мы структурировали все материалы по графическому интерфейсу FreePBX в нашей базе знаний в единый файл. Сам
img
Вам, как сетевому инженеру, крайне важно разбираться в том, каким образом вызовы VoIP влияют на пропускную способность канала в
img
В этой статье расскажем как отправлять различные СМС сообщения пользователям, позвонившим в контакт-центр Октелл и запросившим т
img
Всем современным кампаниям, производящим товары и оказывающим услуги, необходимо иметь специалистов, работающих с потенциальными
21 ноября
20:00
Бесплатный вебинар
Введение в Docker