Как собрать радио для коллег без единого разрыва

    Привет, Хабр! Вот уже почти 5 из 10 лет я совмещаю работу сетевиком с любимым хобби — подкастом про ИТ. За это время наш сервер для аудиотрансляций развивался, менялся и оказался полезен не только нам, но и коллегам. Недавно я правильно клонировал нашу сборку на базе Linux для радио ЦОД.fm в DataLine и решил поделиться своими наработками со всем сообществом.

    Сегодня покажу, из чего я собирал новогоднее радио для создания праздничного настроения перед онлайн-корпоративом.

    Для начала определимся с задачами

    Чтобы радио радовало коллег качеством звука, стоит учесть несколько компонентов для разных задач: 

    • сам сервер трансляции, с которого будем раздавать аудиопоток;

    • интерфейс для ведущих и гостей: распределенное вещание сегодня новая норма, участники шоу должны подключаться из разных мест без лагов и бубна;

    • инструменты для обработки звука: выравнивания громкости из разных источников, удаления шумов и наложения фоновой музыки на финальный трек;

    • служебный канал для бесшумной синхронизации действий во время эфира;

    • клиентская часть для подключения слушателей с любого устройства;

    • опционально можно добавить доп. фичи для общения со слушателями (чат в Телеграмме).

    Кроме того, если вы такой же энтузиаст и собираете радио как pet-project в свободное время, скорее всего, ваш бюджет ограничен. Так что я не буду останавливаться на дорогих проприетарных продуктах для этих задач, а покажу решения на свободно распространяемом и условно-бесплатном ПО.

    Сервер трансляции с TeamSpeak’oм и постобработкой

    Свой сервер я собирал на базе Xubuntu 20.04 с lowlatency-ядром. Расскажу, какие компоненты на нем установлены, а потом покажу, как выставляю для них приоритеты.

    OBS для обработки на лету. Под капотом сервера у меня Open Broadcaster Software (OBS). С помощью этого софта можно моментально обрабатывать аудио: поднимать громкость до нужного уровня, добавить компрессию, убрать пики, добавить джинглы и фоновую музыку:

    Во время эфира я запускаю джинглы, музыку и голос на микшере в OBS.
    Во время эфира я запускаю джинглы, музыку и голос на микшере в OBS.

    У OBS есть фильтры, которые можно навесить на каждую аудиодорожку перед ее отправкой в эфир. У меня настроены 5 фильтров в таком порядке: 

    1. Limiter срезает все пиковые частоты звука, предотвращает клиппинг и перегрузки.

    2. Noise Suppression удаляет с дорожки фоновый шум, так как шипящие дорожки нам ни к чему.

    3. Усилитель Gain повышает громкость звука до заданного значения.

    4. Compressor сглаживает перепады громкости звука, например, если кто-то начинает очень бурную дискуссию или, наоборот, начинает шептать на ушко.

    5. В конце еще раз использую Limiter, чтобы убрать возможные пики от фильтра Compressor.

    С помощью OBS мы запускаем и тестовые трансляции: стримим все по локальной ссылке, проверяем настройки, — а потом настроенный стрим отправляется по боевому урлу. 

    Tigervnc-standalone-server для управления сервером. Мы подключаемся к серверу любым SSH-клиентом, не забывая про туннелирование порта 5901. Получаем стандартную связку SSH +VNC. Кто не хочет туннелировать SSH, может воспользоваться любым VPN на свой выбор: его можно терминировать непосредственно с сервера или с роутера.

    Virtual Audio Cable (и никакой магии), чтобы забирать звук с клиента TeamSpeak в OBS.

    Icecast в связке с nginx и OBS для раздачи. OBS позволяет одновременно стримить радио в несколько мест, например, наш подкаст параллельно идет на Youtube. 

    Для раздачи по протоколу https на сервере установлен Icecast: он принимает потоки голосовых данных от OBS и раздает потоки исходящего трафика на слушателей. 

    TeamSpeak для синхронизации действий и записи. В нашем подкасте мы используем TeamSpeak для боевого канала и записи эфира. На сервере установлен TeamSpeak Server и TeamSpeak Client. Ведущие подключаются к  TeamSpeak Server с помощью своих клиентов. К серверу через локального клиента  подключен podbot — некая немая сущность, которая всегда живет в канале и только слушает. Она нужна, чтобы на сервер приходил стрим от всех остальных, который можно перенаправить в Virtual Audio Cable.

    Так выглядит рабочее окружение для ведущего. Справа боевой канал в TeamSpeak, который потом уходит в OBS (слева):

    На тестовой трансляции мы используем TeamSpeak как микшер, чтобы выровнять всех гостей:

    Во время боевой трансляции звук в служебном канале уже настроенный и ровный, можно записать стрим и потом выложить запись с минимальным редактированием:

    Записываем дорожки всех участников. Полезно, когда через TeamSpeak идет продовая трансляция, как это сделано у меня в linkmeup.
    Записываем дорожки всех участников. Полезно, когда через TeamSpeak идет продовая трансляция, как это сделано у меня в linkmeup.

    Чтобы бесшумно синхронизироваться друг с другом по организационным моментам, есть несколько способов. Мы в linkmeup используем чат в TeamSpeak. Создали систему специальных сигналов, наподобие этого:

    Также пробовали Zoom, где можно видеть друг друга и обмениваться жестами. 

    Еще один способ посинкаться — это «шептать» друг другу в служебном канале (за наводку спасибо @KorDen32).

    Для этого запрещаем podbot'у слышать «шепот», чтобы в эфир не летело ничего лишнего. Для ведущих делаем небольшую настройку: задаем количество лиц для «перешептывания» и горячие клавиши. Лучше использовать именно сочетание клавиш, чтобы во время печати не нажимать команду в эфире случайно и не «шептать» почем зря.

    «Шепот» слышат все пользователи канала Alpha, кроме podbot'a.
    «Шепот» слышат все пользователи канала Alpha, кроме podbot'a.

    Для ЦОД.fm я организовал на базе TeamSpeak служебный аудиоканал, где все слышат комментарии друг друга, но не выводят их в эфир. Получилась такая виртуальная студия, в которой редактор эфира решал технические и организационные вопросы с ведущими.

    Настройка nice-приоритетов на сервере. Я отдаю высший приоритет системным вызовам, затем обрабатываю звук, все остальное потом.

    Видим правильные nice-приоритеты — уже половина успеха:

    Настраиваем правильные лимиты, чтобы не получить лаги в эфире:

    sudo vi /etc/security/limits.conf
    @audio           -       rtprio          99
    @audio           -       memlock         unlimited
    @audio           -       nice            -19
    sudo usermod -a -G audio user

    Отсыплем демону, отвечающему за звук, нужных значений приоритетов:

    sudo vi /etc/pulse/daemon.conf
    high-priority = yes
    nice-level = -11
    realtime-priority = 9

    Создадим виртуальные аудиокабели:

    sudo vi /etc/pulse/default.pa
    load-module module-jack-sink sink_name=vlink1 sink_properties=device.description=vlink1
    load-module module-jack-sink sink_name=vlink2 sink_properties=device.description=vlink2
    load-module module-jack-sink sink_name=vlink3 sink_properties=device.description=vlink3

    Важные мелочи для пользователей

    Для радио ЦОД.fm я завел отдельное доменное имя, настроил nginx, разобрался с шифрованием трафика и сертификатами. Даже любительскую радиостанцию лучше стримить по защищенному соединению, да и слушатели не будут ругаться на отсутствующий https. Позаботился о проксировании, чтобы сотрудник мог открывать стрим с любого удобного устройства с любым плеером. Но, если что, можно организовать стрим с этими инструментами и в локальной сети. 

    Для внешнего домена, само собой, стоит настроить фаервол и защиту от DDoS. На каждый глобальный IP-адрес я ограничивал количество TCP-соединений до 10. Перед запуском всей системы провел нагрузочное тестирование.

    Для наших партнеров и ведущих подготовил инструкцию по запуску сервера и клиентской части: как включать фоновую музыку на OBS и выводить участника в эфир:

    Еще можно создать чат радиостанции в вашем любимом мессенджере и принимать там сообщения в эфир, приветы, заявки на музыку и т. д. Тут уже кто как любит. 

    Будем использовать этот сервер для онлайн-трансляций дружественных подкастов «Поддатой», «Разговоры из-под фальшпола» и «Немного об оружии». Через некоторое время планирую выложить нашу сборку и все подробности по настройке на github для других таких же энтузиастов. Улучшим сервер аудиотрансляций вместе, буду ждать ваших PR =) 

    Кому нужно прямо сейчас, например, в формате OVA\OVF, пишите в личку или в телегу NAT_GTX.

    DataLine
    Экосистема ИТ-сервисов

    Комментарии 17

      +1
      Было время, когда сам делал радио на ShoutCast еще. Первые версии (1.2, вроде). Тогда мало инструкций было. Опыта не у кого было перенять. Годик радио поработало :)
      Спасибо за инструкцию вашу. Сохраню. Сейчас опять есть желание запустить радио как раз на IceCast.
        0
        Пожалуйста =)
        0
        Странно, что комментариев под статьёй мало, ведь на хабре много радиолюбителей, связистов и тех, кто ранее делал своё радио в локальной сети. Ожидал здесь увидеть большую дискуссию о том, кто какой софт использует, кто на какую аудиторию вещает и т.д.
          +1

          Да потому, что все это "детский сад" и баловство! Куча специализированных программ, как платных так и бесплатных! И не нужно огород городить! Конечно если сам процесс не цель!

            +1
            Ну смотрите, мне нужно отдавать на айскаст и на ютуб одновременно.
            Ещё я хотел уйти от винды, так же SAM на тот момент не умел ничего кроме icecast/live365. OBS с этой задачей прекрасно справляется и да та самая бесплатная программа из кучи.
            Сервант прекрасно работает в проде для подкаста linkmeup, я решил поделиться своим «детским садом», вы можете пройти мимо и наслаждаться своим собственным решением =)
              +1

              Я рад за вас а есть дешевые аппаратные кодеры типа "Barix" размером с пачку сигарет, делай что хочешь! За 10 лет ни одного сбоя!
              Но походу вам нужен "процесс"

                0
                Сервант находится в публичном облаке. Аппаратных коробок для этого не нужно.
            0

            del

              0

              Я бы с удовольствием перенял опыт коллег =)

              0
              А почему TeamSpeak? Есть, например, mumble, с, кажется, лучшим качеством звука и производительностью.
                0
                На серванте установлены и настроены TeamSpeak, Mumble и Zoom. Так исторически сложилось, что мы используем TS и при правильной настройке никакой разницы в производительности или качестве звука замечено не было. А вот разница в интерфейсе между TS и Mumble просто вырви глаз. =)
                Если что-то кардинально изменится, мы перейдем на другого клиента.

                +1

                Лимитер после компрессора лишний, если у вас перегруз после него, значит нужно подругому настроить компрессор

                  0
                  Справедливое замечание, можно и убрать второй лимитер. Перегруза после компрессора в принципе нет. Я так сказать, на всякий слушай оставил после прогона множества тестов. Максимально усреднить звук на выходе. Я ещё хочу плагины VST 2.x заставить работать (например под виндой с толтычка всё ок), нужен ещё EQ для полного комплекта. К сожалению, это пока не взлетает никак от слова совсем. Решение через wine не предлагать =) Нативно бы)
                    +1
                    да, по хорошему у вас должен быть на мастере(на всей сумме) эквалайзер и компрессор/лимитер (ну а там дальше энхайзер и т.д.)
                    вообщем виртуальный пульт нужен, кажется это делается по средством севенсора
                    habr.com/ru/post/534348 вот тут как раз про это было

                    к сожалению когда работал по этой професии не работал с линуксом. а теперь наборот, поэтому только такие советы)
                      0
                      Спасибо за ссылку. Первоначально я как раз хотел сделать что-то подобное на винде используя Reaper + что-то ещё. Как мы уже выяснили одну «программу из кучи». Когда раскуривал OBS понял, что это в принципе решается плагинами в него же встроенными и «лишний» софт не нужен, правда пока VST плагины не удалось заставить работать под линуксом. До этого был чистый SAM и в нём всё работало из коробки, только аудиопоток на icecast.
                      Продолжу экспериментировать, цель сделать хорошую сборку и пошарить на всех.

                      Я вот думаю стоит ли описывать в статье где что куда нажать более подробно, скопипастить чтобы собрать с нуля, если плейбук и так будет на гитхабе через некоторое время. А то тут минус прилетел, мол статья недостаточно техническая.
                  +1

                  В TeamSpeak есть "нашептывания" (Whisper), позволяющие сказать что-то человеку в другом канале. Не пробовали их использовать для синхронизации между боевым и техническим в части случаев? Или будет/было много ошибок восприятия с ответом на нашептывания в боевой эфир, поэтому проще текстом, чтобы не отвлекало?

                    0
                    Отличный коммент!) Как-то пока не приходилось использовать данный функционал хотя я и знал о нём.) Так как, это усложняет настройку со стороны гостя может породить ещё больше неловких моментов. Дело практики, короче говоря. Из-за этого чуть на зум не ушли, так как это самое простое для гостя, нажал ссылку, и оно как-то работает))
                    Спасибо за наводку, уже настроил и протестировал на боте (который отдаёт эфир), чтобы он дропал весь шёпот. Добавлю пару строк об этом методе в статью, спасибо!

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое