Голосовое меню не реагирует на нажатие цифр: настройка DTMF в Asterisk
Проблема: клиент нажимает «1», а автоответчик повторяет меню по кругу
Клиент звонит в компанию с мобильного телефона. Приветственное голосовое меню (IVR) бодро произносит: «Нажмите 1 для связи с отделом продаж, нажмите 2 для техподдержки...». Клиент нажимает кнопку «1» на экране своего смартфона, слышит в динамике писк тонального набора, но АТС никак не реагирует, ждет таймаут и сбрасывает звонок.
Сравнение методов передачи тонального набора DTMF
| Режим DTMF | Как передается сигнал | Плюсы и минусы | Где используется |
|---|---|---|---|
| RFC 2833 / RFC 4733 (telephone-event) | Специальными цифровыми RTP-пакетами | Самый надежный метод (не портится сжатием кодеков) | Стандарт по умолчанию в 98% сетей |
| In-Band (внутриполосный) | Звуковым писком прямо в голосовой дорожке | Ломается и искажается при сжатии кодеками (G.729) | Аналоговые линии PSTN, кодек G.711 |
| SIP INFO | Текстовыми служебными SIP сообщениями | Не зависит от аудиокодеков, но поддерживается не всеми | Специфические провайдеры |
Почему IVR не слышит нажатия кнопок простыми словами?
Сигналы нажатия кнопок на телефоне называются DTMF (Dual-Tone Multi-Frequency). Если ваш оператор связи отправляет сигналы нажатия цифр в цифровом стандарте RFC 2833, а на вашем сервере Asterisk или в софтфоне включен режим inband (слушать звук в микрофоне), сервер просто не понимает пришедшие пакеты и считает, что клиент ничего не нажал.
Пошаговая настройка DTMF в Asterisk
- Шаг 1. Настройка режима DTMF в PJSIP (pjsip.conf):
Откройте файл конфигурации конечных точек и пропишите стандартный режим rfc4733 (современный аналог rfc2833) для всех транков и абонентов:
[my-trunk-endpoint] type = endpoint dtmf_mode = rfc4733 ; Рекомендуемый стандарт для всех операторов РФ! ; Для внутренних номеров сотрудников: [101] type = endpoint dtmf_mode = rfc4733 - Шаг 2. Настройка в старом драйвере chan_sip (sip.conf):
[general] dtmfmode = rfc2833 ; Глобальная настройка DTMF [provider] type = peer dtmfmode = rfc2833 - Шаг 3. Проверка настроек в софтфонах и шлюзах:
В настройках IP-телефонов (Yealink, Grandstream, MicroSIP) найдите раздел Account → Advanced → DTMF Type и выберите: RFC2833 (или RFC2833 + SIP INFO).
- Шаг 4. Диагностика в консоли Asterisk:
Включите логирование сигналов DTMF, чтобы видеть нажатия в реальном времени:
asterisk -rvvv # Включаем вывод событий DTMF в консоль: set debug 1 core set debug 1 # Либо специализированная команда: logger add channel console dtmfПри нажатии кнопки «1» в консоли должна появиться строчка:
DTMF end '1' duration 100 ms on PJSIP/...
Ловушка кодека G.729: Если ваш транк работает по сжатому кодеку G.729, режим DTMF In-Band категорически работать не будет, так как алгоритм сжатия вырезает тональные частоты из голоса. При использовании G.729 используйте только rfc2833 / rfc4733.
Частые вопросы (FAQ)
Что делать, если одна цифра срабатывает дважды (дабл-клик, например нажал «1», а сработало «11»)?
Это происходит, когда в телефоне включена одновременная отправка DTMF и через RFC2833, и через In-Band (дублирование сигнала). Оставьте включенным только один метод <b>RFC2833</b>.
Как настроить длительность приема тонального сигнала в FreePBX?
В меню <i>Settings → Asterisk SIP Settings</i> проверьте параметр <code>DTMF Signaling = rfc2833</code> и увеличьте время ожидания в IVR (Digit Timeout) до <b>3 секунд</b>.
Почему при звонках с мобильных телефонов конкретного оператора (например, Tele2) кнопки не работают?
Некоторые мобильные операторы передают DTMF с нестандартным Payload Type (например, 101 вместо 96). Убедитесь, что в Asterisk параметр <code>telephone-event</code> настроен в Auto.
Как проверить работу DTMF без входящего звонка?
Создайте тестовый номер в extensions.conf с вызовом приложения <code>Read()</code> или <code>SayDigits()</code>: АТС попросит набрать цифры и повторит их голосом обратно.