Asterisk™: будущее телефонии Второе издание
Шрифт:
В данной главе мы хотим дать вам почувствовать вкус некоторых диковинок, которые Asterisk приберегла для вас. Практически каждый раздел этой главы мог бы стать отдельной книгой (и они станут книгами, если Asterisk добьется того успеха, который мы ей предвещаем).
Festival
Festival - популярный механизм речевого воспроизведения текста с открытым исходным кодом. Основная идея использования Festival с Asterisk заключается в том, что диалплан может передавать тело текста в Festival, который будет «читать» этот текст вызывающему абоненту. Вероятно, самое очевидное применение Festival - чтение электронной почты вслух, когда вы в дороге1.
Настройка
В настоящее время существует два способа использования Festival с Asterisk. Первый (самый простой) метод, без доработки и повторной компиляции Festival, - загрузить в конфигурационный файл Festival следующий текст (festival.scm обычно располагается в папке /etc/ или /usr/share/festival/):
(define (tts_textasterisk string mode) "(tts_textasterisk STRING MODE)
Apply tts to STRING. This function is specifically designed for use in server mode so a single function call may synthesize the string. This function name may be added to the server safe functions." [130]
130
Применяем tts к STRING. Эта функция специально разработана для использования в режиме сервера, чтобы можно было синтезировать строку одним вызовом функции. Это имя функции может быть добавлено в список безопасных функций сервера.
– Примеч. перев.
(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: [root@asterisk ~]# festival --server Убедившись в том, что сервер Festival работает и не отклоняет ваших соединений, можно запустить Festival, введя следующее: [root@asterisk ~]# 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, должен появиться такой вывод:[root@asterisk ~]# 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 , который является недорогой коммерческой производной 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 не был добавлен хост, вследствие чего соединение было отклонено:
[root@asterisk ~]# 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 (максимальное число попыток) опущен, выполняется только одна попытка вызова:
131
Речь здесь идет о миллисекундах. Не верите? Проверьте сами!
WaitTime: число RetryTime: число MaxRetries: число
Если ответ на звонок получен, здесь мы определяем, где он должен обрабатываться:
Context: имя-контекста Extension: добавочный номер Priority: приоритет
В качестве альтернативы можно задать только приложение и передавать аргументы в него:
Application: Playback Data: hello-world
Далее задаем Caller ID (ID звонящего) исходящего звонка: