Инженер-программист и робототехник Скотт Лоусон рассказал о своём проекте светодиодных лент, которые реагируют на музыку, учитывая паттерны человеческого зрительного восприятия.

В 2016 году я купил светодиодную ленту и решил заставить её реагировать на музыку в реальном времени. Я думал, что это займёт несколько недель, но в итоге задача превратилась в настоящую головоломку. Десять лет спустя у проекта 2,8 тыс. звёзд на GitHub, о нём писали на Hackaday, и он стал одним из самых популярных проектов визуализаторов на основе светодиодных лент. Люди встраивали его в ночные клубы, интегрировали с Amazon Alexa и использовали в качестве своего первого электронного проекта.

Я всё ещё не удовлетворён результатом.

Регулировка громкости — это просто

Я начал с неадресуемых светодиодных лент, где я мог независимо управлять яркостью красного, зелёного и синего цветовых каналов, но не отдельных светодиодных пикселей. Сначала я попробовал самое очевидное: считать аудиосигнал, измерить громкость и сделать светодиоды ярче, когда громкость выше. Всё это были относительно простые методы обработки во временной области. Считать короткий фрагмент аудиосигнала длительностью около 10-50 мс, отфильтровать его низкочастотным фильтром, сопоставить интенсивность с яркостью.

Я назначил каждому цветовому каналу разную постоянную времени, чтобы получить своего рода цветовой эффект. Один цвет быстро реагировал на изменения громкости, другой — медленно, а третий — со средней скоростью. Можно добиться подобного результата за один день, и на светодиодной ленте или лампе с одним RGB-светодиодом это выглядит неплохо.

Но быстро становится скучно. Вся интересная информация о частоте теряется, и лучше всего это работает с энергичной электронной музыкой. Во многих других жанрах музыки, где громкость не является самым важным параметром, это выглядит ужасно. Система не понимает, на какой звук она реагирует, а только — насколько он громкий.

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

Хотя визуализатор во временной области был неплох, я обнаружил, что ограниченное количество выходных каналов делает результат неудовлетворительным. На трёх цветовых каналах можно отобразить лишь определённое количество информации. В конце концов, я перешёл на адресуемые светодиоды WS2812, чтобы получить гораздо больше возможностей для вывода.

Наивное БПФ

Очевидным следующим шагом было использование методов частотной области. Собрать короткий фрагмент аудио, вычислить преобразование Фурье (математический инструмент, который разбивает аудио на отдельные частоты), получить частотные интервалы и сопоставить их со светодиодами. У меня было 144 пикселя на метровой ленте, поэтому я подумал: 144 интервала, по одному на каждый светодиод. Затем отобразить спектр.

Это сработало. Я сразу понял, что захватывается больше аудиосигнала по сравнению с методом объёмного анализа. Но результат оказался крайне неудовлетворительным. Почти вся энергия была сосредоточена в нескольких светодиодах, и большая часть ленты была тёмной.

Я попытался обрезать частотный диапазон, чтобы использовать большую часть ленты. Это немного помогло, но я всё ещё чувствовал, что многие светодиоды используются недостаточно эффективно, а метод БПФ несбалансирован. Я долго с этим боролся.

Большинство людей, пытающихся создавать светодиодные ленты, реагирующие на звук, в итоге приходят к чему-то подобному, используя наивный метод БПФ. Он достаточно хорошо работает на экране, где миллионы пикселей, и можно отобразить полную спектрограмму с большим запасом деталей. Но на 144 светодиодах ограничения просто ужасающие. На светодиодной ленте нельзя позволить себе «тратить» пиксели, и отображаемые элементы должны быть более значимыми с точки зрения восприятия.

Пиксельная бедность

Пиксельная бедность, дефицит функций, проклятие сжатия — как бы вы это ни называли, это главный урок, который я усвоил, и причина, по которой визуализация с помощью светодиодных лент так сложна. Вы можете подумать, что светодиодные ленты проще, чем визуализаторы на основе экрана, но верно обратное. Визуализатор на основе экрана имеет миллионы пикселей, а светодиодная лента — максимум сотни. Можно вычислить множество аудиохарактеристик и отобразить их все на экране, и если большинство из них неинтересны, это не имеет значения. Пока хотя бы некоторые характеристики соответствуют тому, что человек воспринимает как интересное, визуализация работает. На светодиодной ленте нужно точно определить, какие характеристики стоит отображать.

Светодиодная лента бедна пикселями. На метровой ленте может быть 144 светодиода. И всё, скрыть это негде. Практически каждый пиксель должен выполнять функцию, которую человек воспринимает как музыкально значимую. Погрешность невероятно мала.

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

Шкала Мела

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

Человек воспринимает высоту звука нелинейно. Перцептивное расстояние между 200 Гц и 400 Гц ощущается гораздо больше, чем расстояние между 8000 Гц и 8200 Гц, хотя оба диапазона составляют 200 Гц. Наш мозг сильно настроен на речевой диапазон примерно от 300 Гц до 3000 Гц и гораздо меньше интересуется частотами, выходящими далеко за пределы этого диапазона.

Шкала Мела преобразует частоты из Гц в перцептивное пространство, где высота звука одинаково удалена для человеческого слушателя. Вместо того чтобы отображать необработанные бины БПФ на пиксели, что распределяет перцептивно важные частоты только по нескольким светодиодам, я отобразил бины, масштабированные по шкале Мела, на пиксели.

Разница была колоссальной. Вся лента загорелась. Каждый светодиод выполнял какую-то значимую функцию. Это был прорыв. Всё остальное строилось на этом.

Аудиовизуализатор реализует большую часть фронтенда традиционного конвейера распознавания речи. Распознавание речи продолжается далее с использованием логарифмического преобразования энергии и дискретного косинусного преобразования, но светодиодный визуализатор останавливается на выходе банка мел-фильтров и подает его непосредственно в три эффекта визуализации
Аудиовизуализатор реализует большую часть фронтенда традиционного конвейера распознавания речи. Распознавание речи продолжается далее с использованием логарифмического преобразования энергии и дискретного косинусного преобразования, но светодиодный визуализатор останавливается на выходе банка мел-фильтров и подает его непосредственно в три эффекта визуализации

Я понял, что визуализатор аудио-светодиодов использует во многом тот же интерфейс, что и традиционный конвейер распознавания речи. Фильтровый банк Мела, который системы распознавания речи применяют для извлечения перцептивно значимых признаков перед передачей их в распознаватель, — это именно то, что оживляет светодиодную ленту. Я беру выходные данные фильтрового банка Мела и подаю их непосредственно в три визуализации.

Сглаживание, мерцание и свёртки

Шкала Мела решила проблему частотного отображения, но исходный выходной сигнал всё ещё сильно мерцал. Признаки менялись слишком быстро, и лента выглядела дрожащей и неприятной. Мне нужна была визуализация, которая ощущалась бы плавной и целенаправленной, а не шумной.

Я применил экспоненциальное сглаживание на уровне каждого частотного интервала, так что каждый кадр сливается с предыдущим. Признаки меняются постепенно, а не скачкообразно. Это устранило мерцание без добавления заметной задержки.

Затем я обнаружил, что свёртки (математическая операция, которая смешивает соседние значения) идеально подходят для пространственного сглаживания. Светодиодные ленты представляют собой одномерные векторы, что делает их идеальной основой для операций свёртки. В университете я изучал математику свёрток, но их применение казалось абстрактным. На светодиодной ленте наконец-то всё стало ясно. Разные ядра давали разные эффекты: узкое ядро ​​для операции, подобной операции max, над соседними пикселями, более широкие ядра для размытия по Гауссу. Я мог сглаживать спектр, смягчать переходы и контролировать пространственное смешивание элементов. Я до сих пор думаю о свёртках в контексте светодиодных лент.

Обе стороны восприятия

На этом этапе я понял, что визуализатору необходимы модели восприятия с обеих сторон конвейера. На входе модель мел-шкалы моделирует то, как люди воспринимают звук. На выходе мне нужно было смоделировать, как люди воспринимают свет.

Мы также не воспринимаем яркость линейно. Необработанное линейное отображение энергии звука на яркость светодиода выглядит неправильно, потому что наши глаза имеют логарифмическую характеристику. Это привело меня к гамма-коррекции (настройке значений яркости в соответствии с тем, как наши глаза фактически воспринимают свет) и теории цвета: RGB, HSV, LAB, sRGB, дополнительные цвета. Я понял, что сопоставление частотного содержимого с цветом — это целая отдельная тема, и что правильный подбор цветовой палитры удивительно сильно влияет на то, насколько «музыкальной» кажется визуализация.

Три эффекта

В итоге у меня получилось три визуализации. Spectrum напрямую отображает частотное содержимое в масштабе Мела, по одному светодиоду на каждый воспринимаемый частотный диапазон. Scroll создаёт волну энергии, которая прокручивается во времени, исходя из центра и распространяясь наружу, при этом частотное содержимое сопоставляется с цветом. Энергия пульсирует от центра с увеличением звуковой энергии. Хотелось бы больше вариантов, но эти три хорошо работают вместе.

Компромисс задержки

Всё это должно работать в реальном времени, без предопределённости относительно того, что будет дальше. Более длинные аудиофрагменты дают более качественные частотные данные, но добавляют задержку. Более короткие фрагменты быстрые и отзывчивые, но шумные. В итоге я использовал скользящее окно, которое перекрывает последовательные фрагменты, что обеспечивает лучшее разрешение частоты без значительной задержки. Поиск правильного размера окна потребовал много доработок.

Архитектура

Проект поддерживает две основные платформы. На Raspberry Pi обработка звука и рендеринг светодиодов осуществляются через GPIO. На ESP8266 обработка звука выполняется на ПК с использованием Python, а данные пикселей передаются на микроконтроллер в реальном времени. Весь проект доступен бесплатно по адресу github.com/scottlawsonbc/audio-reactive-led-strip.

Система в действии. Аудио обрабатывается на компьютере, а пиксельные данные передаются на светодиодную ленту в режиме реального времени
Система в действии. Аудио обрабатывается на компьютере, а пиксельные данные передаются на светодиодную ленту в режиме реального времени

Собственная жизнь

Первая версия этого проекта была установлена ​​в клубе инженерно-физического факультета Университета Британской Колумбии. Мы использовали её на вечеринках. Она была примитивной, но людям нравилась. Чтобы уменьшить блики от открытых светодиодов, я вручную изготовил рассеиватели из листов бумаги, склеенных в трубки поверх ленты, что обеспечило более мягкое, рассеянное свечение.

После окончания университета у меня появилось немного свободного времени, и я потратил несколько недель на доработку кода, написание подробной документации и завершение проекта, прежде чем разместить его на GitHub.

Проект получил совершенно неожиданный отклик. О нём писали на Hackaday в январе 2017 года, и он стал популярен на Reddit. На сегодняшний день у него более 2800 звёзд и 640 форков на GitHub. Им пользуются тысячи людей.

Одним из первых, кто попробовал проект, был Джои Бэбкок. Он связался с нами на раннем этапе и в итоге отправил запрос на слияние (pull request). Я вспомнил пост в блоге, написанный несколько лет назад, под названием «Хак с запросами на слияние» (The Pull Request Hack), где основная идея заключалась в следующем: всякий раз, когда кто-то отправляет вам запрос на слияние, предоставьте ему доступ к вашим коммитам. Я подумал: «А почему бы и нет, попробую». И я предоставил Джои доступ к коммитам. Он стал первым сопровождающим проекта, помимо меня, и я бесконечно благодарен ему за его усилия по реагированию на проблемы и поддержанию проекта в рабочем состоянии. Я не мог поверить, что этот совет действительно так хорошо сработал.

Люди начали присылать мне видео своих проектов. Ричард Биркби интегрировал проект со своим Amazon Echo. В своем видео он говорит: «Алекса, скажи кухонным светильникам, чтобы они показывали энергию», и его комната освещается.

Я был поражён тем, что люди брали мой проект и использовали его способами, которых я не ожидал. Другой пользователь, который занимается аудио-видео техникой в ​​клубе, прислал мне видео работы светодиодной ленты во время диджейской вечеринки, когда десятки людей танцевали перед живой группой. Он написал: «Люди были очень счастливы... Если бы они только знали, что это уже шестой Raspberry Pi, который делает что-то в баре для них». Светодиодная лента была установлена ​​над сценой, чтобы все могли её видеть, и загоралась в реальном времени во время игры группы. 

Разработчик из Китая создал форк проекта, добавил поддержку ESP32 и Home Assistant, написал документацию на китайском языке и разработал специальную плату для микрофона, чтобы упростить настройку. Кто-то снял видео на YouTube о проекте, потому что посчитал, что он заслуживает большего признания. Люди со всего мира отправляли запросы на добавление функций, таких как определение ритма, новые эффекты и улучшения кода.

Самым приятным было узнать, что люди использовали это как свой первый электронный проект. Человек, никогда раньше не занимавшийся пайкой, купил светодиодную ленту и Raspberry Pi, следовал документации и заставил всё работать.

Это единственный проект, над которым я работал, который зажил своей собственной жизнью.

Чего ещё не хватает

Когда человек вручную кодирует анимационную последовательность для конкретной песни, результат ошеломляет. Каждый бит и каждый дроп идеально синхронизированы. Этот результат, созданный вручную, является золотым стандартом, а автоматическая визуализация всё ещё далека от него.

Самая большая нерешённая проблема — заставить его хорошо работать со всеми видами музыки. Визуализатор лучше всего работает с энергичной электронной музыкой с чёткими битами и сильным контрастом. Музыка с большим количеством вокала, джаз, классическое фортепиано, гитара, скрипка — все они имеют разные частотные и временные характеристики. Один фрагмент кода не может хорошо работать со всеми ними. Они требуют разных подходов.

Ещё одна задача, которую я хочу решить, — это передать то самое важное качество музыки, которое заставляет человека притопывать ногой. Когда вы слушаете песню, вы что-то чувствуете, и ваше тело хочет двигаться. Написание кода, имитирующего эту реакцию, значительно улучшило бы визуализатор. Я пока не придумал, как это сделать надёжно в реальном времени.

Думаю, будущее аудиовизуализации на светодиодных лентах будет связано с сочетанием экспертов, специализирующихся на разных жанрах, вероятно, с использованием нейронных сетей. У меня есть идея создать обучающий набор данных, слушая музыку, держа в руках акселерометр, и использовать взаимосвязь между аудиосигналом и физической реакцией моего тела для обучения визуализатора на основе ИИ. Я ещё этого не сделал. У меня много идей и недостаточно времени.

Что я узнал

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

Все коммерческие аудиореактивные светодиодные ленты, которые я видел, делают это плохо. Они используют простое определение громкости или наивные БПФ и на этом останавливаются. Они не моделируют человеческое восприятие ни с одной стороны, поэтому все они выглядят одинаково.

Когда настроена шкала Мела, отрегулированы фильтры, а цвета соответствуют нужным частотным диапазонам, светодиодная лента оживает. Включаешь песню, и кажется, что светодиоды понимают музыку. Люди присылали мне видео из ночных клубов на другом конце света.

Это самая сложная вещь, которую я когда-либо создавал, и я до сих пор не закончил проект.

Комментарии (4)


  1. pwl
    14.04.2026 23:38

    Шкала Мела

    Чья-чья шкала? :)

    The mel scale (after the word melody)[1] is a perceptual scale of pitches judged by listeners to be equal in distance from one another. 

    https://en.wikipedia.org/wiki/Mel_scale


  1. Loco2k
    14.04.2026 23:38

    Кому хочется сделать это на профессиональном уровне и без красноглазия, спросите вашу любимую нейросеть так "ma dot2 on pc audio reactive". Но понадобится контроллер к ленте на artnet или dmx.


  1. Prohard
    14.04.2026 23:38

    Какую цветомузыку не делай, все равно получается дискотека


  1. Pleh64
    14.04.2026 23:38

    Пожалуй, самый известный и массовый проект на адресных светодиодах – WLED. Собран на ESP32 + микрофон I2S.

    https://youtu.be/JcVCsAE4Efo?si=zVlzuf-VVHIFWH9N

    Утерянный в сети проект WSLED, собран на arduino + набор деталей для усилителя микрофона и входного фильтра.

    https://youtu.be/eGjEGSiT5cU?si=UV-LMnr1tdjmzbNq