По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Друзья, сегодня речь пойдет о синтезе речи в Asterisk. Этот простой способ позволит вам озвучивать требуемое голосовое сообщение в структурах IVR или обычных приветствиях. Да где угодно. Профит этого решения:
Единый голос для всех аудио – файлов;
Кэширование и сохранение озвученных текстов, фраз в виде медиа - файлов, для последующего использования на 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
Как вы могли заметить, скрипт настраивается. Голос, интонация, скорость речи, качество получаемого файла – подлежат корректировке для вашей задачи.
Схема работы всего процесса следующая:
Скрипт получает из диалплана текст по AGI и сохраняет в переменной;
Если у нас уже существует аудио – файл для заранее записанной фразы, мы отдаем в диалплан команду на воспроизведение. Если нет – обращаемся к API;
Скрипт отправляет запрос в сторону API Яндекса;
Происходит конвертация полученного аудио – файла в нужный формат;
Даем права файлу для воспроизведения на Asterisk и удаляем временный файл;
Делаем отметку о создании файла в служебный текстовый файл;
Воспроизводим файл;
А как заставить скрипт работать?
Очень просто. Открываем файл /etc/asterisk/extensions_custom.conf для редактирования и добавляем в него следующую запись:
[text_to_speech]
exten => s,1,Answer()
exten => s,2,AGI(texttospeech.php,"Привет! Это Мерион Нетворкс. Если ты слышишь это сообщение, значит все сделал правильно!")
Сохраняем изменения и прыгаем в FreePBX. Будем вызывать кастомный контекста из FreePBX. Для этого воспользуемся модулем Custom Destinations. Переходим по пути Admin → Custom Destinations и нажимаем Add Destination:
Настроили и сохранили. Наша задумка такова – человек звонит на наш номер, набирает 13 и попадает на синтезированное сообщение. Переходим в главный IVR и в секции IVR Entries добавляем следующее:
Звоним, проверяем. Работает :) Если хотите заменить фразу, которую нужно озвучить, просто поправьте ее в файле /etc/asterisk/extensions_custom.conf.
Сразу к делу. На рисунке 1 показана базовая конфигурация STP (Spanning Tree Protocol).
Рис. 1 Базовая конфигурация STP
По умолчанию функция STP коммутатора включена. Если STP отключен, используйте команду stp enable в системном режиме, чтобы включить STP.
# На S1 установите режим работы связующего дерева на STP. Используйте режим stp {mstp | rstp | stp}, с помощью которой вы можете установить режим MSTP, RSTP или STP. По умолчанию установлен режим MSTP.
<Quidway> system-view
[Quidway] sysname S1
[S1] stp mode stp
# На S2 установите режим работы связующего дерева на STP.
<Quidway> system-view
[Quidway] sysname S2
[S2] stp mode stp
# На S3 установите режим работы связующего дерева на STP.
<Quidway> system-view
[Quidway] sysname S3
[S3] stp mode stp
# На S4 установите режим работы связующего дерева на STP.
<Quidway> system-view
[Quidway] sysname S4
[S4] stp mode stp
Даже если STP автоматически выберет корневой мост, мы сначала назначим коммутатор ближе к центру сети. Структура сети показана на рис. 1 простая: S1 и S2 подключены через Интернет, а основные коммутаторы, S3 и S4, являются коммутаторами доступа. Мы можем изменить приоритет моста S1, чтобы гарантировать, что S1 будет выбран в качестве корневого моста. Команда stp priority priority используется для установки приоритета моста устройства; значение приоритета колеблется от 0 до 61440 с шагом 4096. Значение по умолчанию-32 768. Чем меньше приоритет, тем больше вероятность того, что устройство будет выбрано в качестве корневого моста. Вы также можете использовать команду stp root primary для обозначения S1 в качестве корневого моста. После выполнения команды на устройстве значение приоритета моста устройства автоматически устанавливается равным 0. Приоритет моста устройства не может быть изменен после этого с помощью команды stp priority priority.
[S1] stp root primary
Затем мы назначим S2 вторичным корневым мостом, чтобы S2 заменил S1 в качестве нового корневого моста в случае сбоя. После запуска на устройстве команды stp root secondary значение приоритета моста устройства автоматически устанавливается на 4096 и не может быть изменено после этого с помощью команды stp priority priority.
[S2] stp root secondary
На этом базовая конфигурация STP сети завершена. Чтобы проверить состояние и статистику дерева SPT, вы можете запустить display stp [interface interface-type
interface-number] [brief]
На S1 используйте команду display stp brief для отображения основной информации STP.
В выводимых данных видно, что, поскольку S1 является корневым мостом, GE0 / 0/2 и GE0 / 0/1 S1 являются назначенными портами в состоянии normal forwarding.
Следующий вывод - это основная информация STP S4.
Интерфейс GE0/0/2 коммутатора S4 является корневым портом в состоянии normal forwarding. Однако его порт GE0/0/1 является альтернативным портом в состоянии блокировки.
Привет, мир! Сегодня говорим про то, в чем разница между маршрутизатором, коммутатором и хабом.
Для сетевого специалиста это можно объяснить просто - хаб работает на первом уровне модели OSI, коммутатор на втором, а маршрутизатор на третьем. На этом все, спасибо, пока!
Ладно - ладно, шутка, сейчас попробуем перевести это на человеческий язык.
Видеопособие
Хаб
Хаб, или как его еще называют концентратор, самое простое устройство для соединения нескольких девайсов в одну сеть. В хабе есть несколько портов, в которые подключаются устройства и, хаб - это максимально примитивное устройство, без мозгов.
Его задача заключается в том, что когда на вход одного порта приходят данные, он их копирует и рассылает их по всем своим портам. Единственное, что он знает - к каким портам подключены устройства. В итоге все в сети получают эти данные и смотрят на адрес получателя, кому они предназначены. Если ему - то принимают, если не ему, то уничтожают данные.
Это как если бы почту вашего соседа получали все жильцы дома, открывали письмо, а если оно не для них, выкидывали бы. Не самый продуктивный и безопасный способ передачи информации. В современных сетях хабы уже не используются.
Коммутатор
Коммутатор, или как в профессиональной среде его называют свитч, это устройство уже поумнее. К нему также подключаются сетевые устройства в порты для того чтобы образовать сеть, однако, он отличается от хаба тем, что пришедший к нему траффик он высылает уже не на все порты, а непосредственно получателю. Исключения - бродкаст или мультикаст сообщения, которые рассылаются на все порты.
Если кратко, бродкаст - широковещательное сообщение. Его получают все устройства в текущей подсети. Пример из жизни - массовая почтовая рассылка всем клиентам компании или надпись баллончиком на входной двери квартиры "Верни долг". Во втором примере кажется, что, она предназначается только одному человеку, но мы то с вами понимаем.
Мультикаст - отправляется на специальный адрес, который получат те, кто его слушают. Это как настроить свой приемник на определенную радиоволну и слушать только ее.
Откуда он знает куда пересылать данные? У него есть специальная таблица, в которой есть соответствие физического адреса устройства или, как говорят MAC - адреса, (выглядит примерно вот так: 50-46-5D-6E-8C-20) и к какому порту оно подключено. Ориентируясь на эту информацию коммутатор принимает решения о том, куда направить данные.
Хабы и коммутаторы используются для построения своей локальной сети, например, дома или в офисе, а вот для того, чтобы соединять сети и передавать данные наружу из этой сети, как, например, в интернет, нам уже понадобятся маршрутизаторы.
Маршрутизаторы
Маршрутизаторы или роутеры, в отличии от коммутаторов и хабов умеют работать с IP - адресами.
Как понятно из названия, машрутизатор занимается тем, что машрутизирует данные из одной сети в другую, основываясь на IP - адресе приходящих к нему данных. Когда к нему приходит пакет с данными, он смотрит на адрес назначения и затем в свою таблицу маршрутизации и после этого принимает решение, что сделать с данными - перенаправить данные в свою сеть или отправить дальше в другую сеть.
Это самый умный девайс из нашего сегодняшнего списка, так сказать, сын маминой подруги среди активных сетевых устройств, и он знает топологию сети и куда нужно слать данные, чтобы они достигли цели.
Ну и помимо этих основных задач, маршрутизатор также может выступать в качестве DHCP и DNS сервера, иметь настройки безопасности и кучу разных дополнительных функций.