Приложения для управления звуком и взаимодействием с пользователем - Asterisk и FreePBX: От GUI к Глубокому Администрированию и Оптимизации - Qpel.AI

Приложения для управления звуком и взаимодействием с пользователем

В прошлом разделе мы разобрали базовые приложения диалплана для управления звонками: 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. Это позволит тебе создавать свои уникальные сценарии, не теряя удобства графического интерфейса.