Приложения для управления звуком и взаимодействием с пользователем
В прошлом разделе мы разобрали базовые приложения диалплана для управления звонками: Dial, Answer и Hangup. Теперь углубимся в то, как Asterisk общается с пользователем: воспроизводит звуки, собирает информацию и строит интерактивные сценарии. Эти приложения — фундамент для IVR-систем (голосовых меню) и других фишек, которые делают общение приятнее.
Воспроизводим звук
Звук — это основа любого голосового взаимодействия. Asterisk предлагает несколько инструментов для этого.
Playback: просто проиграть
Playback проигрывает один или несколько звуковых файлов. Это самый простой способ озвучить заранее записанное сообщение.
Синтаксис:
Playback(filename[&filename2...][,options])
Примеры:
exten => s,1,Playback(welcome)– Воспроизведётwelcome.gsm(или другой формат) из/var/lib/asterisk/sounds/.exten => s,1,Playback(custom/greeting&please-wait)– Сначалаcustom/greeting.gsm, потомplease-wait.gsm.
Важно: Не указывай расширение файла в диалплане. Asterisk сам найдёт нужный формат (
.gsm,.wav,.ulawи т.д.) в указанной директории.
Background: проиграть с возможностью прервать
Background работает как Playback, но с важным отличием: пользователь может прервать воспроизведение, нажав любую клавишу на телефоне. Это суперудобно для голосовых меню: если человек уже знает, что ему нужно, он не будет слушать все опции до конца.
Синтаксис:
Background(filename[&filename2...][,options])
Примеры:
exten => s,1,Background(main-menu)– Проигрываетmain-menu.gsm. Если пользователь нажмёт цифру, воспроизведение остановится, и Asterisk обработает нажатие.exten => s,1,Background(silence/1&press-one-for-sales)– Сначала секунда тишины, потом сообщение.
SayDigits, SayNumber, SayAlpha, SayPhonetic: озвучиваем динамические данные
Эти приложения синтезируют речь из цифр, чисел, букв или фонетических слов. Пригодится, когда нужно озвучить что-то, что меняется: номер в очереди, сумму заказа.
SayDigits(number): Озвучивает каждую цифру отдельно. Например,SayDigits(123)скажет "один", "два", "три".SayNumber(number): Озвучивает число целиком. Например,SayNumber(123)скажет "сто двадцать три".SayAlpha(string): Озвучивает каждую букву.SayPhonetic(string): Озвучивает каждую букву по фонетическому алфавиту (например, "Альфа", "Браво").
Пример:
exten => s,1,Answer()
exten => s,2,SayNumber(${CALLERID(num)}) ; Озвучит номер звонящего
exten => s,3,Hangup()
Собираем информацию от пользователя
Чтобы создать интерактивное меню, нам нужно получать ввод от пользователя.
Read: проиграть и ждать ввода
Read проигрывает звуковой файл, а затем ждёт DTMF-сигналов (нажатий клавиш) от пользователя.
Синтаксис:
Read(variable[,filename][,maxdigits][,options][,timeout][,offset])
variable: Переменная, куда запишется ввод пользователя.filename: Звуковой файл, который прозвучит перед ожиданием ввода.maxdigits: Максимальное количество цифр для ввода.timeout: Время ожидания ввода в секундах.
Пример:
exten => s,1,Answer()
exten => s,2,Read(PIN,enter-pin,4,,5) ; Проиграть enter-pin, ждать 4 цифры, таймаут 5 секунд
exten => s,3,NoOp(Пользователь ввел: ${PIN})
exten => s,4,Hangup()
WaitExten: просто ждём ввода
WaitExten просто ждёт ввода от пользователя заданное время, не проигрывая ничего. Часто используется после Background или Playback, чтобы дать пользователю ещё немного времени на ввод.
Синтаксис:
WaitExten([timeout])
Пример:
exten => s,1,Answer()
exten => s,2,Background(main-menu)
exten => s,3,WaitExten(5) ; Ждём 5 секунд, если пользователь ничего не нажал после меню
exten => s,4,Playback(goodbye)
exten => s,5,Hangup()
exten => 1,1,Playback(sales)
exten => 1,2,Hangup()
exten => 2,1,Playback(support)
exten => 2,2,Hangup()
В этом примере, если пользователь нажмёт 1 или 2 во время Background(main-menu) или в течение 5 секунд после него, звонок пойдёт на соответствующий экстеншен. Если ничего не нажать, Asterisk проиграет goodbye.
Кстати:
PlaybackAndRead(илиReadExten) объединяетPlaybackиRead. Он проигрывает файл и одновременно ждёт ввода. Если пользователь нажмёт клавишу, воспроизведение прервётся. В современных Asterisk и FreePBX чаще используютBackgroundс контекстами — это гибче. Но знать проPlaybackAndReadполезно.
Практический пример: Простое голосовое меню (IVR)
Давайте соберём всё вместе и создадим простое голосовое меню, которое предлагает выбрать отдел.
Предположим, у нас есть такие звуковые файлы:
welcome.gsm: "Добро пожаловать в нашу компанию."main-menu.gsm: "Для отдела продаж нажмите один. Для технической поддержки нажмите два. Для повтора меню нажмите ноль."sales-transfer.gsm: "Соединяем с отделом продаж."support-transfer.gsm: "Соединяем с технической поддержкой."invalid-option.gsm: "Вы нажали неверную опцию."goodbye.gsm: "До свидания."
Файл extensions_custom.conf:
[custom-ivr]
exten => s,1,Answer()
exten => s,n,Playback(welcome)
exten => s,n,Goto(custom-ivr,menu,1) ; Переходим к метке 'menu'
exten => menu,1,Background(main-menu)
exten => menu,n,WaitExten(5) ; Ждём 5 секунд на ввод
; Обработка ввода
exten => 1,1,Playback(sales-transfer)
exten => 1,n,Dial(SIP/sales_ext) ; Предположим, есть внутренний номер sales_ext
exten => 1,n,Hangup()
exten => 2,1,Playback(support-transfer)
exten => 2,n,Dial(SIP/support_ext) ; Предположим, есть внутренний номер support_ext
exten => 2,n,Hangup()
exten => 0,1,Goto(custom-ivr,menu,1) ; Повтор меню
; Обработка неверного ввода (i - invalid)
exten => i,1,Playback(invalid-option)
exten => i,n,Goto(custom-ivr,menu,1) ; Возвращаемся в меню
; Обработка таймаута (t - timeout)
exten => t,1,Playback(goodbye)
exten => t,n,Hangup()
Совет: Чтобы проверить диалплан и отладить его, используй команду
dialplan show <context>в CLI Asterisk. Например,dialplan show custom-ivrпокажет тебе весь диалплан для этого контекста.
Этот пример показывает, как, комбинируя Playback, Background, WaitExten и специальные экстеншены (i, t), можно создать полноценное интерактивное голосовое меню.
Теперь ты понимаешь, как Asterisk взаимодействует с пользователем через звуки и DTMF-сигналы. Мы готовы двигаться дальше и посмотреть, как эти ручные настройки диалплана интегрируются с FreePBX. Это позволит тебе создавать свои уникальные сценарии, не теряя удобства графического интерфейса.