Запись входящих разговоров в Asterisk 20+

Запись входящих разговоров в Asterisk 20+

В этой статье рассмотрим как осуществить запись входящих разговоров в Asterisk 20+ в очередях без старого параметра membermacro.

Начиная с Asterisk 20, модуль app_macro.so был полностью удалён. Это означает, что старый параметр membermacro в очередях больше не работает. Вместо него нужно использовать membergosub и контексты с Gosub. В этой статье я покажу, как настроить запись входящих разговоров в MP3.

Что изменилось?

Старые версии (Asterisk 16 и ниже) Новые версии (Asterisk 20+)
membermacro=record-answ membergosub=record-answ,s,1
Macro(record-answ) Gosub(record-answ,s,1)
MacroExit() Return()

Шаг 1: Установка необходимых пакетов

Для записи и конвертации аудио потребуется установить lame — консольный MP3-кодек.

bash
apt update
apt install lame -y

Также убедитесь, что в системе установлен сам Asterisk 20 или новее, а также модуль MixMonitor (обычно идёт в комплекте).

bash
asterisk -V
asterisk -rx "module show like MixMonitor"

Шаг 2: Создание скрипта конвертации WAV в MP3

Asterisk записывает разговоры в формате WAV (или SLIN). Чтобы экономить место и получать MP3-файлы, нужно после завершения звонка конвертировать запись.

Создайте скрипт /usr/local/bin/convert-wav-to-mp3.sh:

bash
cat > /usr/local/bin/convert-wav-to-mp3.sh << 'EOF'
#!/bin/bash
# Скрипт конвертации WAV в MP3 с последующим удалением WAV

WAV_FILE="$1"
MP3_FILE="${WAV_FILE%.wav}.mp3"

# Небольшая пауза, чтобы файл точно освободился
sleep 1

# Конвертируем, если файл существует
if [ -f "$WAV_FILE" ]; then
    /usr/bin/lame --preset standard "$WAV_FILE" "$MP3_FILE" && rm -f "$WAV_FILE"
fi
EOF

chmod +x /usr/local/bin/convert-wav-to-mp3.sh

Что здесь происходит:

  • --preset standard — качество MP3 (можно заменить на --preset voice для речи)

  • sleep 1 — задержка, чтобы MixMonitor успел завершить запись

  • && rm -f — удаляет WAV только после успешной конвертации

Шаг 3: Создание контекста записи в extensions.conf

В файл /etc/asterisk/extensions.conf добавьте следующий контекст:

ini
[record-answ]
exten => s,1,NoOp(=== Запуск записи разговора ===)
	same => n,Set(LIMIT_PLAYAUDIO_CALLER=yes)
	same => n,Set(LIMIT_PLAYAUDIO_CALLEE=yes)
	same => n,Playback(/usr/local/etc/asterisk/ivr/rec_ru)   ; Предупреждение о записи
	
	; Формируем имя файла: дата_время_IDзвонка_номерзвонящего.mp3
	same => n,Set(REC_DATE=${STRFTIME(${EPOCH},,%Y%m%d_%H%M%S)})
	same => n,Set(REC_PREFIX=${REC_DATE}_${UNIQUEID}_${CALLERID(num)})
	same => n,Set(WAV_FILE=/home/records/${REC_PREFIX}.wav)
	
	; Запускаем запись с автоматической конвертацией после звонка
	same => n,MixMonitor(${WAV_FILE},b,/usr/local/bin/convert-wav-to-mp3.sh ${WAV_FILE})
	same => n,Return()

Пояснение параметров MixMonitor:

  • Первый аргумент — путь к WAV-файлу

  • b — запустить пост-процессор в фоне (не дожидаясь завершения)

  • Третий аргумент — скрипт конвертации

Шаг 4: Настройка очереди в queues.conf

В файле /etc/asterisk/queues.conf найдите нужную очередь и измените (или добавьте) параметр:

ini
[inbox4]
musicclass = default
strategy = wrandom
timeout = 7
setinterfacevar=yes
context = office_rules
joinempty=no
leavewhenempty=yes
membergosub=record-answ,s,1          ; Вместо старого membermacro
member=>Local/123@minsk-sip

Важно: параметр membergosub указывает на контекст и экстеншен, который будет вызван при подключении оператора к звонящему.

Шаг 5: Создание директории для записей

Создайте папку, где будут храниться записи, и назначьте права для пользователя Asterisk:

bash
mkdir -p /home/records
chown asterisk:asterisk /home/records
chmod 750 /home/records

Шаг 6: Перезагрузка конфигурации

После всех изменений нужно применить их в Asterisk:

bash
# Перезагружаем конфиги очередей
asterisk -rx "queue reload all"

# Перезагружаем диалплан
asterisk -rx "dialplan reload"

# Проверяем, что очередь использует membergosub
asterisk -rx "queue show inbox4"

# Проверяем синтаксис контекста
asterisk -rx "dialplan show record-answ"

Проверка работы

  1. Позвоните в очередь

  2. Дождитесь соединения с оператором

  3. После разговора проверьте наличие файла в /home/records/:

bash
ls -la /home/records/

Вы должны увидеть файл с именем типа 20250528_143022_1234567890.0_1234567890.mp3

Дополнительные советы

Ротация записей

Чтобы записи не заполнили весь диск, добавьте задачу в cron:

bash
cat > /etc/cron.daily/clean-records << 'EOF'
#!/bin/bash
# Удаляем записи старше 90 дней
find /home/records -name "*.mp3" -mtime +90 -delete
EOF

chmod +x /etc/cron.daily/clean-records

Настройка качества записи

В файле /etc/asterisk/asterisk.conf можно указать формат записи по умолчанию:

ini
[options]
; Формат записи (wav, slin, gsm)
internal_timing = yes
; Максимальная длина файла (в секундах)
maxfilesize = 2G

Альтернативный способ (без внешнего скрипта)

Если не хотите использовать bash-скрипт, можно запускать конвертацию через System():

ini
same => n,MixMonitor(${WAV_FILE})
same => n,System(/usr/bin/lame --preset standard ${WAV_FILE} ${MP3_FILE} && rm -f ${WAV_FILE})

Но этот способ менее надёжен, так как может запустить конвертацию до завершения записи.

Заключение

Миграция с membermacro на membergosub — обязательное условие для работы Asterisk 20 и новее. Описанная схема позволяет:

  • Записывать входящие разговоры из очередей

  • Конвертировать записи в MP3

  • Хранить файлы с удобной структурой имён

  • Экономить дисковое пространство

Главное изменение — замена membermacro=record-answ на membergosub=record-answ,s,1 и создание соответствующего контекста с Gosub/Return вместо Macro/MacroExit.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *


Другие проекты SKILX


UNLIX © Все права защищены 2015 - 2026 | SKILX

Копирование материалов с сайта UNLIX без указания полной ссылки на источник ЗАПРЕЩЕНО!