Настройка голосового меню (IVR) в Asterisk: многоуровневая маршрутизация и распознавание DTMF
- Абонент нажимает цифры на клавиатуре телефона в голосовом меню, но Asterisk не реагирует на нажатия (DTMF ignored).
- Зацикливание IVR-меню или обрыв звонка при неправильном вводе добавочного.
- Двойное срабатывание цифр при однократном нажатии (DTMF Bounce / Duplication).
- Аудиофайл приветствия прерывается с задержками или воспроизводится с металлическим скрежетом.
1. Настройка согласования DTMF в PJSIP
Убедитесь, что в pjsip.conf для всех эндпоинтов выставлен режим rfc4733 (RFC 2833):
[endpoint-template](!)
type=endpoint
dtmf_mode=rfc4733
use_callerid=yes2. Создание многоуровневого IVR в extensions.conf
; --- Главное меню компании ---
[ivr-main]
exten => s,1,NoOp(Starting IVR Main Menu)
same => n,Answer(500)
same => n,Set(TIMEOUT(digit)=3)
same => n,Set(TIMEOUT(response)=7)
same => n,Set(IVR_TRIES=0)
same => n(play_menu),Background(/var/lib/asterisk/sounds/custom/ivr-welcome-menu)
same => n,WaitExten()
; Варианты выбора
exten => 1,1,NoOp(Selected: Sales Department)
same => n,Queue(sales_queue,tTkK,,,60)
same => n,Hangup()
exten => 2,1,NoOp(Selected: Support Department)
same => n,Goto(ivr-support-submenu,s,1)
exten => 3,1,NoOp(Selected: Accounting)
same => n,Dial(PJSIP/301,25)
same => n,Hangup()
; Прямой донабор внутреннего трехзначного номера
exten => _[1-8]XX,1,NoOp(Direct Extension Dialing: ${EXTEN})
same => n,Dial(PJSIP/${EXTEN},30)
; Обработка неверного ввода
exten => i,1,NoOp(Invalid Option Selected)
same => n,Playback(/var/lib/asterisk/sounds/custom/invalid-choice)
same => n,Goto(s,play_menu)
; Обработка таймаута бездействия
exten => t,1,NoOp(Timeout waiting for DTMF)
same => n,Set(IVR_TRIES=$[${IVR_TRIES} + 1])
same => n,GotoIf($[${IVR_TRIES} >= 2]?operator:retry)
same => n(retry),Goto(s,play_menu)
same => n(operator),Playback(/var/lib/asterisk/sounds/custom/transferring-operator)
same => n,Dial(PJSIP/100,30)
same => n,Hangup()
; --- Вложенное подменю техподдержки ---
[ivr-support-submenu]
exten => s,1,NoOp(Starting Support Submenu)
same => n,Background(/var/lib/asterisk/sounds/custom/ivr-support-options)
same => n,WaitExten(5)
exten => 1,1,Queue(hardware_support,t,,,60)
exten => 2,1,Queue(software_support,t,,,60)
exten => 0,1,Goto(ivr-main,s,play_menu) ; Возврат в главное меню3. Подготовка качественных аудиофайлов приветствия
# Конвертация в нативный формат Asterisk (8kHz, 16bit, Mono PCM WAV)
ffmpeg -i raw_welcome.mp3 -ar 8000 -ac 1 -ab 16 -c:a pcm_s16le /var/lib/asterisk/sounds/custom/ivr-welcome-menu.wav Частые вопросы (FAQ)
В чем разница между командами Playback и Background в IVR?
Playback полностью блокирует выполнение диалплана до окончания воспроизведения аудиофайла, игнорируя нажатия клавиш. Background воспроизводит аудио в фоновом режиме и мгновенно перехватывает нажатия цифр DTMF, прерывая воспроизведение.
Почему при нажатии цифры 1 срабатывает ввод 11?
Это эффект дублирования DTMF (DTMF Duplication), возникающий, когда шлюз/провайдер передает сигнал одновременно и как RFC4733 событие, и как звук внутри полосы (Inband). Убедитесь, что на всех узлах выбран единый метод RFC2833/RFC4733.
Как разрешить звонящему сразу набрать добавочный номер без прослушивания IVR?
Используйте шаблоны экстеншенов (например, _[1-8]XX) прямо внутри контекста IVR. Функция WaitExten() или Background() сопоставит введенную комбинацию с шаблоном.
Что делают экстеншены 'i' и 't' в контексте голосового меню?
Экстеншен 'i' (Invalid) срабатывает, если абонент нажал клавишу, которой нет в меню. Экстеншен 't' (Timeout) срабатывает по истечении времени ожидания ответа TIMEOUT(response).