В начале целью этого домашнего проекта было создание интернет-радиоприемника из Raspberry Pi. Мне хотелось найти или восстановить какой-нибудь старый деревянный приемник, или, хотя бы, корпус, поставить туда Raspberry, аккумулятор, блэкджек, и чтобы он раздавал вайфай. Из-за нехватки времени все это было благополучно отложено в долгий ящик, но, может быть, со временем реализую. Зато сделал программную часть проекта, о которой и хочу рассказать.
Делать старое радио, чтобы из него звучали кристально чистые современные битрейты – не комильфо, на мой взгляд. То есть, пусть они тоже звучат, но для меня было бы вдвойне приятно из старого радио слышать аутентичный звук тех времен, когда ещё не было импульсных преобразователей, а по улицам беспечно разгуливали единороги. Рецепт, как состарить звук я представляю себе так:
- 1...10 мкВ полезного сигнала,
- 0.3 мкВ эха, той же передачи на той же частоте, но из другого места,
- 0.2 мкВ сигнала другой станции, вещающей на той же частоте,
- капля интерференционного свиста, больше не надо, ибо напрягает,
- 0.1 мкВ шума входных цепей,
- секретный ингредиент – фединги, то есть замирания всех перечисленных сигналов, кроме шума входных цепей, они сделают своё дело вместе с АРУ – автоматической регулировкой услиения, в результате чего один из фоновых сигналов переодически будет выходить на передний план, как это бывает в настоящем радио,
- ну и по вкусу срезать верхние частоты.
Подразумевается, что радио работает на средних волнах, время вечернее, и сигнал проходит далеко. Список можно продолжить до бесконечности, но ресурсы у малинки ограничены, а хочется запустить много потоков и переключаться между ними. Поэтому ограничился выше перечисленным. Оформил все это в виде сервера на основе Icecast и ряда других полезных утилит. Этот сервер помогает мне создать праздничную атмосферу в новогодние праздники. Возможно, пригодится кому-нибудь ещё.
Принцип работы сервера такой: два входных аудиопотока, взятых из интернета, конвертируются в wav при помощи ffmpeg, здесь же снижается частота оцифровки, для того, чтобы убрать верхние частоты, а также облегчить работу процессору.
Далее потоки проходят через импровизированный звуковой процессор, написанный на си. Прошу спецов по системному программированию сильно меня не пинать за возможные ошибки, в обычной жизни я веб-разработчик, а си для меня – что-то вроде быстрой версии bash. Здесь каждому сигналу присваивается значение уровня с учетом замираний, сигналы суммируются с учетом уровней, затем суммарный сигнал делится на значение суммарного уровня, таким образом имитируется АРУ, и громкость полученного звука будет примерно постоянной.
Выходной поток кодируется oggenc и при помощи ezstream отправляется на Icecast сервер, где становится доступным для прослушивания.
Склонировать проект можно можно отсюда, там же инструкция по установке. Устанавливать сначала лучше не на Raspberry, а на обычные, настольные линуксы, так как, возможно, на малинке придется повозиться с ручной сборкой некоторых компонентов. Вместо скрипта stream-template-1206am, был скрипт с моими любимыми радиостанциями, чтобы уберечь их от возможного хабраэффекта, а совесть от угрызений, заменил заглушками. Поставьте вместо них аудиопотоки на ваш вкус и да пребудет с вами теплый ламповый звук.
Всем добра и с праздниками!
Автор: PereNoel