Asterisk™: будущее телефонии Второе издание - Меггелен Джим Ван
(let ((wholeutt (utt.synth (eval (list 'Utterance 'Text string))))) (utt.wave.resample wholeutt 8000) (utt.wave.rescale wholeutt 5) (utt.send.wave.client wholeutt)))
Этот текст можно поместить в любом месте файла, но только так, чтобы он не попал в другие круглые скобки.
Второй (и более традиционный) способ - скомпилировать Festival со специальным патчем для Asterisk (располагающимся в подпапке contrib/ папки исходного кода Asterisk).
Информация по обоим методам имеется в файле README.festival, который находится в подпапке contrib/ папки исходного кода Asterisk. Для любого метода вам придется изменить список доступа Festival в файле festival.scm. Просто выполните поиск по слову localhost и замените его полным доменным именем своего сервера.
Оба метода настраивают Festival так, чтобы он мог правильно взаимодействовать с Asterisk. Настроив Festival, необходимо запустить сервер Festival. После этого можно вызывать приложение Festival() из диалплана.
Конфигурация Asterisk для работы с Festival
Конфигурационный файл Asterisk, обеспечивающий настройки для работы с Festival, называется festival.conf, что вполне логично. В этом файле задаются имя хоста и порт используемого сервера Festival, а также некоторые настройки для кэширвания речи, генерируемой Festival. Для большинства установок (если вы собираетесь запускать Festival на своем сервере Asterisk) прекрасно подходят настройки по умолчанию.
Запуск сервера Festival
Чтобы запустить сервер Festival для отладки, просто выполните команду festival с аргументом --server: [[email protected] ~]# festival --server Убедившись в том, что сервер Festival работает и не отклоняет ваших соединений, можно запустить Festival, введя следующее: [[email protected] ~]# festival_server 2>&1 >/dev/null &
Вызов Festival из диалплана
Теперь, когда Festival сконфигурирован и сервер Festival запущен, организуем его вызов в простом диалплане:
exten => 123,1,Answer()
exten => 123,2,Festival(Asterisk and Festival are working together)
Перед вызовом Festival() всегда должно быть вызвано приложение Answer(), чтобы гарантировать установление соединения по каналу.
Когда Asterisk соединяется с Festival, на терминале, с которого был запущен сервер Festival, должен появиться такой вывод:
[[email protected] ~]# festival --server
server Sun May 1 18:38:51 2005 : Festival server started on port 1314 client(1) Sun May 1 18:39:20 2005 : accepted from asterisk.localdomain client(1) Sun May 1 18:39:21 2005 : disconnectedЕще один способ использования Festival с Asterisk
Некоторые участники сообщества разработчиков Asterisk сообщают о том, что им удалось передать текст в утилиту Festival text2wave и воспроизвести в Asterisk результирующий WAV-файл. Например, это можно сделать так:
exten => 124,1,Answer()
exten => 124,2,System(echo "Это проверка Festival" | /usr/bin/text2wave -scale 1.5 -F 8000 -o /tmp/festival.wav) exten => 124,3,Playback(/tmp/festival) exten => 124,4,System(rm /tmp/festival.wav) exten => 124,5,Hangup()
Этот метод также позволяет вызывать другие механизмы речевого воспроизведения текста, такие как популярный речевой механизм производства компании Cepstral (http://www.cepstral.com), который является недорогой коммерческой производной Festival с очень приятными голосами. Для этого примера будем считать, что Cepstral установлен в папку /usr/local/cepstral/: exten => 125,1,Answer()
exten => 125,2,System(/usr/local/cepstral/bin/swift -o /tmp/swift.wav
"Это проверка Cepstral")
exten => 125,3,Playback(/tmp/swift)
exten => 125,4,System(rm /tmp/swift.wav)
exten => 125,5,Hangup()
Появление следующего вывода означает, что в список доступа в файле festival.scm не был добавлен хост, вследствие чего соединение было отклонено:
[[email protected] ~]# festival --server
server Sun May 1 18:30:52 2005 : Festival server started on port 1314 client(1) Sun May 1 18:32:32 2005 : rejected from asterisk.localdomain not in access list
Файлы вызовов
Файлы вызовов позволяют создавать вызовы в оболочке Linux. Эти мощные события запускаются путем размещения файла .call в папке /var/spool/asterisk/outgoing/. Фактически имя файла не имеет значения, но хорошей практикой является давать ему информативное имя и заканчивать его расширением .call.
Когда файл вызова появляется в папке исходящих вызовов, Asterisk практически немедленно начинает действовать согласно содержащимся в нем инструкциям[131].
Файлы вызовов записываются в следующем формате. Сначала определяем, куда будем звонить:
Channel: канал
Можно задать время ожидания ответа на звонок (по умолчанию 45 с), время между повторными попытками дозвониться и максимальное число попыток. Если параметр MaxRetries (максимальное число попыток) опущен, выполняется только одна попытка вызова:
WaitTime: число RetryTime: число MaxRetries: число
Если ответ на звонок получен, здесь мы определяем, где он должен обрабатываться:
Context: имя-контекста Extension: добавочный номер Priority: приоритет
В качестве альтернативы можно задать только приложение и передавать аргументы в него:
Application: Playback() Data: hello-world
Далее задаем Caller ID (ID звонящего) исходящего звонка:
CallerID: Asterisk 800-555-1212
Задаем переменные канала следующим образом:
SetVar: john=Zap/1/5551212 SetVar: sally=SIP/1000
и добавляем код учетной записи CDR:
Account: документация
Нельзя создавать файл вызова из папки, в которой находится очередь. Asterisk активно отслеживает подкачку и попытается захватить файл даже еще до того, как он будет закончен! Файлы вызовов должны создаваться в какой-то другой папке, потом в той же папке создается копия этого файла и эта копия с помощью команды mv перемещается в папку подкачки. Заметьте, что мы назвали команду mv, не cp. Это важно, потому что процесс копирования в Linux реализован таким образом, что файл появляется в папке назначения еще до того, как он оказывается там полностью. В противоположность этому, использование операции mv не позволит файлу появиться в папке назначения до полного завершения операции перемещения. При копировании очень велика вероятность того, что Asterisk начнет читать файл до того, как он весь будет перенесен туда, что приведет к непредвиденным результатам.
DUNDi
Если бы возникли опасения, что Марк Спенсер может исчерпать свой запас интересных идей, система Distributed Universal Number Discovery (DUNDi) с легкостью пресекла бы их. DUNDi является такой же революционной разработкой, как и Asterisk. Лучшее определение дано на веб-сайте DUNDi (http://www.dundi.com): «DUNDi™ - это одноранговая система для поиска интернет-шлюзов в сервисы телефонии. В отличие от традиционных централизованных сервисов (таких, как необыкновенно простой и лаконичный стандарт ENUM; http://www.faqs.org/rfc/ rfc2916.txt), DUNDi является полностью распределенным и вообще не имеет никакой централизованной службы». DUNDi - это в некотором роде протокол маршрутизации для VoIP.
Как работает DUNDi
DUNDi можно рассматривать как большую телефонную книгу, которая позволяет запрашивать у равноправных участников сети альтернативный VoIP-маршрут к добавочному номеру или телефонному номеру PSTN.