Конвертация записей разговоров в mp3 — Elastix 2.5 (FreePBX 2.11)

  • Tutorial

В данной статье я дам небольшое описание как сохранять записи разговоров в формате mp3 но с расширением .wav, тем самым уменьшив размер файлов и сохранив возможность прослушивать файлы из панели управления (имена файлов не будут меняться). А также дам пару советов, как уменьшить нагрузку на дисковую подсистему, избавившись от лишних логов (при нагруженной системе уменьшение нагрузки достаточно заметно).

В старых версиях файлы записей хранились по умолчанию в одной папке, создавая тем самым проблемы при их большом количестве. В Elastix 2.5 перешли на FreeBPX 2.11, а там, как известно, записи телефонных разговоров раскладываются по папкам на каждый день.
Соответственно изменились (добавились) переменные для использования со скриптом конвертации записей после звонка.

Причем, в старых версиях, добавить параметр “Run after record” можно было прямо через панель управления Elastix, в разделе “General Settings”. В новой версии, для того чтобы добавить это параметр (кстати, параметр тоже поменял название — “Post Call Recording Script”), нужно воспользоваться панелью управления FreePBX.

Итак, в чем суть: мы будем конвертировать файл после разговора в формат mp3 с помощью lame, потом, с помощью ffmpeg мы добавим заголовок к файлу записи и сменим расширение обратно на .wav. В итоге все останется для самой системы неизменным, однако существенно уменьшится размер хранимых файлов, по моей оценке в 7-10 раз.

В первую очередь необходимо установить в систему пакеты ffрmpeg и lame:
# rpm -Uhv http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm
# yum --disablerepo=commercial-addons install ffmpeg lame


Параметр --disablerepo=commercial-addons необходим потому что, в репозитории commercial-addons присутствует пакет ffmpeg, который нам не подходит.

Создаем папку для нашего скрипта:
# mkdir -p /etc/asterisk/scripts; chown asterisk. /etc/asterisk/scripts


Забираем скрипт с github:
# wget https://raw.githubusercontent.com/andrey0001/fpbx-elastix/master/mixmon-mp3-2.sh -O /etc/asterisk/scripts/mixmon-mp3-2.sh


Устанавливаем права на файл
# chown asterisk. /etc/asterisk/scripts/mixmon-mp3-2.sh
# chmod a+x /etc/asterisk/scripts/mixmon-mp3-2.sh


Сам репозиторий на github.

Выполняем команду visudo и добавляем в конец файла:
asterisk ALL = NOPASSWD: /bin/nice
asterisk ALL = NOPASSWD: /usr/bin/ionice
asterisk ALL = NOPASSWD: /bin/chown

asterisk ALL = NOPASSWD: /bin/chmod
asterisk ALL = NOPASSWD: /bin/rm
asterisk ALL = NOPASSWD: /bin/touch


Вот теперь, мы выполнили все необходимые действия в консоли, и можем спокойно переходить к панели управления FreePBX:
Идем в раздел “Settings -> Advanced Settings” и включаем 2 параметра (Display Readonly Settings, Override Readonly Settings)


Применяем изменения. У нас теперь появилась возможность редактировать дополнительные параметры.
В параметр “Post Call Recording Script” вставляем значение:

/etc/asterisk/scripts/mixmon-mp3-2.sh ^{YEAR} ^{MONTH} ^{DAY} ^{CALLFILENAME} ^{MIXMON_FORMAT} ^{MIXMON_DIR}

В параметр “Override Call Recording Location” вставляем значение:

/var/spool/asterisk/monitor/


Применяем все изменения.
Всё, теперь все записи телефонных разговоров, после разговора, будут конвертированы в формат mp3, с сохранением расширения .wav.

Для старых версий файл скрипта mixmon-mp3.sh, а парамерт “Run after record”:

/etc/asterisk/scripts/mixmon-mp3.sh ^{MIXMON_DIR} ^{CALLFILENAME} ^{MIXMON_FORMAT}


И еще, перед тем как Вы включите это всё, несомненно вы захотите конвертировать уже имеющиеся у вас записи телефонных разговоров. Для этого, файл скрипта conv.sh и запускаем команду из консоли:
find /var/spool/asterisk/monitor/ -name '*.wav' -exec ./conv.sh {} \;

Процесс не быстрый.

Теперь, когда вы будете прослушивать файлы записей, формат будет mp3 — обратите внимание на картинку:


Что касается логов:
По умолчанию, Elastix пишет полные логи, и складывает CDR аж в три места (mysql, sqlite и файл csv):
/etc/asterisk/logger.conf и ему сопутствуюшие, оставьте только:
console => notice,warning,error
/etc/asterisk/cdr.conf и ему сопутствуюшие, оставьте только запись в mysql.

Вот и всё!

Удачи в настройках.

UPD: по комменту, убрал sudo из скрипта. Добавлять через visudo достаточно nice, ionice и chown
Share post

Comments 26

    0
    А чем по крону не устраивает делать то же самое? По ночам конвертить спокойно и складывать куда надо.

    И прав не надо давать, лишняя лазейка же, тем более права даются на такое как chown chmod, что равно сильно простому запуску под рутом по возможностям.
      0
      В том то и дело, что многие делают по крону.
      Кого то устраивает. Но, во первых, есть сервисы, которые и по ночам принимают звонки. Во вторых, в данном случае, запись разговора готова сразу, и не на следующий день.
      0
      Лучше бы OPUS использовали, он гораздо сильнее понизил бы битрейт для голоса, без слышимых артефактов.
        0
        тогда встанет вопрос — чем слушать opus. А mp3 поддерживает любой плеер.
          0
          OPUS поддерживается во многих аудиопроигрывателях и почти во всех популярных браузерах.
            0
            ключевое слово «почти».
            Если бы использовался OPUS, то в названии статьи было бы OPUS.
            Как Вы могли прочесть, в названии нет ни слова про opus. Это говорит о том, что о нем рассуждать неуместно. Когда буду использовать opus? напишу про opus — надеюсь ответ ясен.

            В своё время, когда появился OPUS, его представляли как «убийцу mp3», прошло время, и как видим, этого не случилось.

            А что касается поддержки opus в VoIP — смею Вас уверить, огромное количество железок его не поддерживает до сих пор, причем это не SOHO, а промышленные решения. А если брать в расчет софтовые решения, не все бросились обновлять отлаженную систему для поддержка данного кодека. И еще один существенный минус, вытекающий из этого, это то, что конечные решения (телефонные аппараты), в большинстве своём не поддерживают opus, а это ведет к лишнему транскодированию, что чревато лишней нагрузкой.
              0
              Вы, в целом, правы: MP3 будет еще долго использоваться для музыки, т.к. при 320 кбит/с он не так уж и плох, но при низких битрейтах подчистую проигрывает практически всему (OPUS, Vorbis, AAC). Если даже AAC не сказать, чтобы прямо повсеместно используется, то OPUS до этого еще дальше.
              Про железо и VoIP вы опять правы, но поддержка OPUS есть в софтофонах, и он обеспечивает отличное качество речи при 20 кбит/с. Если вы транскодируете PCM в MP3 только для архива, то, по моему мнению, OPUS тут подошел бы больше, чем MP3.

              В качестве примера, послушайте 48 кбит/с MP3 и 48 кбит/с OPUS.
                0
                Поверьте мне, по роду своей деятельности, я достаточно осведомлен о кодеках, и opus в том числе.
                Но, в контексте данной статьи:
                1. opus-tools нет в растпространенных репах
                2. не факт, что накинув заголовок и поменяв расширение на .wav это съедят плееры.

                Что касается прослушки для сравнения, давайте оставим это меломанам. Тем более, здесь речь идет о записи телефонного разговора, в котором качество и так оставляет желать лучшего.
                И самое главное, если в данном примере, заменить mp3 на opus, то не думаю что размеры файлов будут отличаться более чем на 1-2%.
                Тут главная задача была, уменьшить размер. И не создать геморой уменьшив размер еще чуть больше.

        0
        А почему бы не дать право за запуск от рута конкретного скрипта, а в нем уже понижать права там, где это зачем-то нужно?
        Тогда ему можно будет с чистой совестью выставить права типа 700. По-моему, это будет безопаснее, чем выдавать рутовые права на chmod, chown и rm.
          0
          На самом деле вы правы. sudo анохранизм от прошлых версий. на самом деле, sudo можно и не применять в данном случае, так как файлы создаются с владельцем asterisk, и для того чтоб их обработать прав достаточно и без sudo.
            0
            Поправил скрипт, добавил UPD.
              0
              Если вам не обязательно использовать nice и ionice, тогда вообще можно обойтись без sudo.
              если процессор многоядерный, то можно обойтись без nice, так как lame использует только одно ядро, а ffmpeg вообще не грузит, так как не перекодирует.
                0
                Я имел в виду нечто иное. Частичный отказ от sudo — это хорошо, но у вас, к примеру, у пользователя есть рутовый chown, а значит, по сути, есть и полный рутовый доступ. Я же предлагаю разрешить в sudoers запускать от рута только определенный скрипт, в котором вы пропишете все необходимые действия и который, разумеется, не будет доступен для редактирования пользователю asterix.
                  0
                  если не использовать ionice, то sudo можно убрать совсем.
                  ну и Ваш вариант совсем не плох.
                  Или, как вариант, для chown сделать в sudoers:
                  asterisk ALL = NOPASSWD: /bin/chown asterisk. /var/spool/asterisk/monitor/*
              0
              Сделал по инструкции, но для FreePBX 12.0.57 (CentOS 6.5 x64)
              rpmforge установил для своей версии, но почему-то не устанавливалось с опцией --disablerepo=commercial-addons
              [root@pbx ~]# rpm -Uhv pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
              Retrieving pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
              Preparing… ########################################### [100%]
              1:rpmforge-release ########################################### [100%]
              [root@pbx ~]# yum --disablerepo=commercial-addons install ffmpeg lame
              Loaded plugins: fastestmirror, kmod

              Error getting repository data for commercial-addons, repository not found

              вобщем установил ffmpeg по тупому — yum install ffmpeg lame
              в принципе скрипт работает, конвертирует.
              Подскажите, как модифицировать скрипт, чтобы он нормализовал уровень звука?
                0
                Возможно во FreePBX 12 другие репы.
                Подредактируйте строку с lame, чтоб сделать нормализацию.
                  0
                  кстати перестали воспроизводиться записи из веб-интерфейса UCP, ошибка «Media URL could not be loaded.» Вероятно из-за переименовывания исходных файлов. Приходится скачивать и слушать.
                    0
                    это да, это уже надо править в коде панели freepbx.
                      0
                      хотелось бы конкретики
                        0
                        Не понял? что значит «хотелось бы конкретики»?
                        Ищите на предмет «Content-Type» для отдаваемых файлов записи, и меняйте.
                          –1
                          Я хочу чтоб у меня не ломался заложеный функционал freepbx, т.е. воспроизводились файлы из веб-интерфейса. Если вы делаете tutorial, то напишите полные действия, а не то, что вы описываете общими фразами.
                          Ищите на предмет «Content-Type» для отдаваемых файлов записи, и меняйте.

                          Где искать? Что искать? На что менять?
                            0
                            Понятия не имею что Вам надо искать.
                            Почитайте заголовок, где черным по белому написано 2.11. Там нет ни слова про FreePBX 12.
                            Туториал — это не значит, что подойдет каждому. Это значит только то, что в нём написано, а не то, что Вам хочется.
                            Может быть, если бы у Вас стояло 2.11, я бы еще мог посмотреть и подсказать.
                            А так, попробуйте решить сами, а потом отпишитесь об этом — будет польза.
                              0
                              Разобрался, оказывается зависит от браузера. В Фаерфоксе воспроизведение «поломалось», но в Хроме воспроизводится нормально. Извините за назойливость.
                  0
                  Тесты показали, что Opus на 8kbps практически не хуже чем pcm 8Khz/16bit на 128kbsp, и при этом в 16 раз меньше. Достаточно затем его переименовать в .wav и либо напрямую скормить браузеру, либо через тег audio.
                  В самом Asterisk поддержка Opus не нужна, если не нужно гонять голос в этом формате, а достаточно только хранить.

                  FFMpeg изначально не понимает opus, поэтому его необходимо собрать из сырцов ( http://www.betweendots.com/topic/59-install-ffmpeg-on-centos-automated-script/ ) вместе с libopus

                  Скрипт mixmon-opus.sh, который вставить в Post Call Recording Script через /etc/asterisk/scripts/mixmon-opus.sh ^{CALLFILENAME}.^{MIXMON_FORMAT}

                  #!/bin/bash
                  LOWNICE="/bin/nice -n 19 "
                  PATH='/oth/monitor/'
                  PATH2='/var/www/html/monitoropus/'
                  FULLNAME=${1}
                  FULLNAME=${FULLNAME/$PATH/}
                  ORIGINAL=${FULLNAME/.wav/}
                  WAVFILE=${PATH}${FULLNAME}
                  OPUSFILE=${PATH}${ORIGINAL}.opus
                  OPUSFILE2=${PATH2}${ORIGINAL}.wav
                  
                  if [ "$2" ]; then
                  LOWNICE="/bin/nice -n 19 /usr/bin/ionice -c3"
                  echo ${FULLNAME}
                  fi
                  ${LOWNICE} /usr/bin/ffmpeg -loglevel quiet -y -i ${WAVFILE} -acodec libopus -ab 8000 ${OPUSFILE}
                  #${LOWNICE} /usr/bin/ffmpeg -y -i ${WAVFILE} -acodec libopus -ab 8000 ${OPUSFILE}
                  /usr/bin/test -e ${OPUSFILE} && /bin/mv -f ${OPUSFILE} ${OPUSFILE2} && /usr/bin/test -e ${OPUSFILE2} && /bin/rm -f ${WAVFILE}
                  if [ ! "$2" ]; then
                  echo ${ORIGINAL}.wav ${2}>>/var/log/asterisk/opus.txt
                  else
                  echo ${ORIGINAL}.wav >>/var/log/asterisk/opusbatch.txt
                  fi
                  

                  Обратите внимание, что ionice работает только из под root, поэтому используется только когда мы запускаем процесс ручного перекодирования (существует второй аргумент при запуске). При запуске из под пользователя asterisk ionice не используется. Не забудьте поправить пути. Чтобы не запутаться где оригинальный wav, а где в формате opus, перекодированные переносятся в другое место, так что потребуется изменить вашу CDR/CRI систему.

                  Чтобы конвертировать существующие записи, достаточно вызвать
                  find /oth/monitor -name '*.wav' | parallel --gnu /etc/asterisk/scripts/mixmon-opus.sh {} 1 

                  либо чтобы это работало в фоне даже после отключения ssh сессии:
                  nohup find /oth/monitor -name '*.wav' | parallel --gnu /etc/asterisk/scripts/mixmon-opus.sh {} 1 >/dev/null 2>&1 &


                  Обратите внимание, что используется утилита parallel, которую нужно сначала поставить, и которая запускает столько копий, сколько ядре процессора, что ускоряет перекодирование в 4-8 раз.
                    0
                    FreePBX 14 — позволяет скачать, но не позволяет проиграть, ошибка "/bin/sox FAILS: WAV file encoding MP3 is not supported". Есть идеи, как обойти, не влезая в код (они внедрили подпись по GPG и матерятся, если какой-то файл изменился)? Как я понимаю, будет достаточно оторвать вызов перекодировщика при попытке проиграть файл в браузере, а где это сделать?
                      0
                      Разобрался — его скрипты понимают, если бэкенд отдает сразу mp3 (вот только все равно вызывается sox с конвертацией в sln48 — нафига?!), как следствие, оставил от вашего скрипта половину, которая перекодирует, и стащил из соседнего поста вызов mysql с изменением файла в базе. Спасибо.

                    Only users with full accounts can post comments. Log in, please.