
2026/04/07 22:55
「オーディオリアクティブ LED ストリップは極めて難しい」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
概要:
2016–2017 年に、著者はリアルタイム音楽反応 LED ビジュアライザを構築しました。最初は単純な音量ベースの明るさ制御から始まり、後にメルスケール(音声認識で使われる周波数マッピング)を適用した高度なスペクトラム表示へと進化しました。このプロジェクトは非アドレス可能 LED で開始され、その後 WS2812 アドレス可能ストリップに切り替え、ピクセル単位の制御が可能になりました。メルスケールを導入することで「ピクセル貧困」問題を解決し、各 LED が知覚上重要な周波数で駆動されるようになりました。ビンごとの指数平滑化と一次元畳み込みカーネルの適用により、視覚表現がさらに安定しました。
ビジュアライザは主に二つのプラットフォームで動作します:音声を取得し GPIO 経由で LED を描画する Raspberry Pi と、PC(Python)で音声を処理しピクセルデータをマイクロコントローラへストリームする ESP8266/ESP32。実装された三つの主要ビジュアライゼーションは スペクトラム(メルスケール化された周波数内容)、スクロール(中心から外側に向かう時間的エネルギー波)および エネルギーパルス です。リアルタイム制約のため、音声チャンクごとに重複するローリングウィンドウを使用し、解像度とレイテンシのバランスを取っています。
このプロジェクトはコミュニティから注目され、2017 年 1 月に Hackaday に取り上げられました。現在では GitHub のスターが 2.8k、フォーク数が 640 を超えています。クラブの照明セットアップで使用され、Amazon Alexa と連携してビジュアライザ経由でライトを制御することも可能です。また ESP32 / Home Assistant へのポートも存在します。将来的な作業では、パンク調のエレクトロニック音楽やジャズ/クラシックといった多様なジャンルにわたる性能向上とリズミック応答の取得を目指し、ジャンル別専門システムやボディモーションデータで訓練されたニューラルネットワークの導入を検討しています。
本文
2016年にLEDストリップを購入し、リアルタイムで音楽に反応させることに挑戦しました。
数週間かかると思っていたのですが、結局は一連の「うんざりするほど」な作業へと発展します。10年後にはGitHubで2.8 k星を獲得し、Hackadayにも取り上げられ、最も人気のあるLEDストリップ・ビジュアライザーの1つとなっています。
ナイトクラブに組み込まれ、Amazon Alexaと連携され、初めての電子工作プロジェクトとして使われるまでに至りました。
しかし私はまだ満足していません。
スクロール効果
色は中心から発生し、外側へスクロールします。音楽にリアルタイムで反応します。
音量の扱いは簡単
最初はアドレス指定できないLEDストリップを使用しました。この場合、赤・緑・青チャンネルごとに明るさを制御できますが、個々のピクセルを制御することはできませんでした。
まず行ったのは基本的な手法:オーディオ信号を読み取り音量を測定し、音量が大きいほどLEDを明るくするというものです。これらは時間領域で比較的簡単に処理できます。
- 短いオーディオチャンク(10〜50 ms)を読み取り、ローパスフィルタリングして強度を明るさにマッピング
- 各色チャンネルごとに異なる時間定数を割り当て:1つは高速応答、1つは遅い、もう1つは中間
これらを午後のうちに動かせばLEDストリップや単一RGB LED付きランプで見た目はある程度良くなります。しかしすぐに退屈になり、興味深い周波数情報が失われてしまいます。しかも電子音楽のようなパンクの効いたサウンドに最適化されます。
そこで即座にアダプティブゲイン制御を実装せざるを得ませんでした。固定された音量閾値は、騒がしい部屋では飽和し、静かな場所ではほとんど点滅しません。私のお気に入りの手法は指数的スムージングで、コード全体で使われているシンプルかつ効果的なフィルタです。
時間領域ビジュアライザーはある程度機能しましたが、出力チャンネルが限られていたため結果には満足できませんでした。3色チャンネルに表示できる情報量は限られています。結局WS2812のようなアドレス指定可能LEDへ切り替え、多くの出力機能を利用することにしました。
単純なFFT
次なるステップは周波数領域手法です:短いオーディオチャンクを収集し、FFTを計算して周波数ビンを得て、それらをLEDへマッピングします。
1メートルのストリップに144ピクセルあるため、144ビン(1つずつLED)でスペクトラムを描画することにしました。
それは「ある程度」動きました。音量法より多くのオーディオ情報を取得できましたが、ほとんどのエネルギーが数ピクセルに集中し、残りは暗いままでした。
周波数範囲を切り捨てると多少改善しますが、多くのLEDは未使用であり、FFT手法はバランスが悪く感じられました。
多くの音楽反応型LEDストリップはここで「単純なFFT」メソッドに終わります。スクリーン上では数百万ピクセルを使ってフルスペクトログラムを描けますが、144 LEDだと制限が厳しいです。ピクセルを「無駄にしてはいけない」ので、表示される機能は知覚的に意味のあるものでなければなりません。
ピクセル貧困
ピクセル貧困(Feature famine, Compression curseなど)という概念が、このLEDストリップビジュアライゼーションを難しくする中心的な教訓です。
- 1メートルのストリップに144 LEDある場合、ほぼすべてのピクセルは「人間が音楽として認識できる」何かを行わなければならない。誤差余地は極めて狭い。
このためLEDストリップビジュアライザーは画面ベースよりも本質的に難しいのです。人間が音楽をどのように知覚するかを理解し、パイプラインに知覚モデルを組み込む必要がありました。
メルスケール
話題の「メルフィルタバンク」を読むために音声認識分野の論文を調べ始めました。メルスケールはHzから人間が感じる周波数空間へ変換し、ピッチを等距離にマッピングします。
- 人間は線形ではピッチを知覚しません。200 Hzと400 Hzの差は8 kHzと8.2 kHzよりも大きく感じられます(両方とも200 Hz幅ですが)。
- メルフィルタバンクは生FFTビンを感覚的に関連する帯域へマッピングします。
これが「夜と昼」の違いでした。全LEDが点灯し、すべてのピクセルが意味ある動きをしています。この突破口が他のすべてを支えました。
メルフィルタバンクの出力をそのまま3つのビジュアライゼーションに供給します。
スムージング・フリッカリング・畳み込み
メルスケールは周波数マッピング問題を解決しましたが、原始的な出力はまだひびきます。特徴が急激に変化し、ストリップ全体がジッタリングして見えました。
- 指数的スムージング:各周波数ビンレベルでフレームを前のフレームとブレンドします。これにより特徴は跳ねるのではなく徐々に変化し、遅延がほぼ感じられないままフリッカリングが除去されます。
- 畳み込み:隣接する値をブレンドして空間的スムージングを行います。LEDストリップは1Dベクトルであるため、畳み込み操作に最適です。狭いカーネルはmaxのような演算になり、広いカーネルはガウシアンブラーになります。スペクトラムをスムージングし、遷移を柔らかくし、空間的に特徴がどの程度混ざるかを制御できます。
知覚の両側
ビジュアライザーには2つの知覚モデルが必要です:
- 入力側:メルスケールは人間が音をどう知覚するかをモデル化しています。
- 出力側:明るさも線形に知覚されません。オーディオエネルギーをLEDの明るさに線形マッピングすると、目には不自然に見えます。これがガンマ補正と色理論(RGB, HSV, LAB, sRGB, 補色)への道を開きました。周波数内容を色へマッピングすることは別のウサギの穴であり、パレットを適切に設定すると「音楽的」なビジュアライゼーションが大きく変わります。
3つの効果
最終的に以下の3種類のビジュアライザーを作成しました:
- スペクトラム – メルスケールで処理した周波数内容を直接描画。各LEDは感覚的な周波数帯域に対応します。
- スクロール – 中心から始まる時間軸のエネルギーウェーブが外側へスクロールし、周波数情報が色にマッピングされます。
- エナジーパルス – 音量が増大すると中心から外側へ向かってパルスが発生します。
これら3つは相互補完的で、単独ではなく組み合わせて使うと最も効果的です。
レイテンシトレードオフ
すべてをリアルタイムで動作させる必要があります。次に来る音を知らない状態で処理するため、長いオーディオチャンクは高品質の周波数データを提供しますが遅延が増えます。短いチャンクは高速で応答性が高いですがノイズが多くなります。私は「ローリングウィンドウ」を使って連続するチャンクを重ねることで、ほとんどレイテンシを増やさずに周波数分解能を向上させました。適切なウィンドウサイズは大量の微調整が必要でした。
アーキテクチャ
このプロジェクトは主に2つのプラットフォームで動作します:
- Raspberry Pi – Pi自体がオーディオ処理とGPIO経由でLEDレンダリングを担当。
- ESP8266 – オーディオ処理はPythonでPC上で行い、ピクセルデータをリアルタイムでマイクロコントローラへストリーミング。
全プロジェクトはgithub.com/scottlawsonbc/audio‑reactive‑led‑strip で無料公開されています。
システムの実演
オーディオはコンピュータ側で処理され、ピクセルデータがリアルタイムでLEDストリップへ送られます。
私のリビングルームでは天井近くに設置したLEDストリップが上向きに光を投げ、テーブル上には別のLEDマトリクスが追加ビジュアライゼーションとして配置されています。ノートパソコンは3つすべてへピクセルデータをリアルタイムで送信します。
自己成長
-
初版 – 2017年にUBCのEngineering Physicsクラブホールに設置。パーティーで使用され、粗いものですが人々は好きでした。紙管から作ったディフューザーをストリップ上に配置して柔らかな光を実現しました。
-
卒業後、コードを磨き、ドキュメントを書き、プロジェクトを完成させGitHubへ公開。2017年1月にHackadayで取り上げられ、Redditでも人気を博しました。現在は2 800以上のスターと640フォークを持っています。
-
Joey Babcock – 最初に試した人で、早期にプルリクエストを送信し、コミット権限を付与されました。私以外の最初のメンテナーになりました。
-
Richard Birkby – Amazon Echoと連携させ、「Alexa, show kitchen lights energy」などと言わせるようにしました。
-
ナイトクラブDJ – ストリップをステージ上部に設置し、ライブバンドの音楽にリアルタイムで反応。数十人が踊っていました。
-
中国の開発者 – プロジェクトをフォークし、ESP32とHome Assistantへのサポートを追加、中国語ドキュメントを書き、カスタムマイクロホンシールドPCBを作成しました。
世界中からビット検出、新エフェクト、コード改善のプルリクエストが寄せられました。最も報われる瞬間は、人々がこのプロジェクトを初めての電子工作として使っていると知った時です。
まだ足りないもの
最大の未解決問題は、あらゆる音楽ジャンルで優秀に動作させることです。ビジュアライザーはパンク感のあるエレクトロニックミュージックや明確なビートと対比が強い曲に最適ですが、ボーカル中心の音楽、ジャズ、クラシックピアノ、ギター、バイオリンなどは異なる周波数・時間領域特性を持ちます。1つのコードで全てに対応できるわけではありません。
また、人間が足踏みしたくなる「本質的なクオリティ」を捉えたいと考えています。その反応を模倣するコードを書くことができれば、ビジュアライザーは劇的に向上します。リアルタイムで信頼性の高い方法をまだ見つけていません。
将来的にはジャンルごとに調整された専門家(エキスパート)やニューラルネットワークを組み合わせる方向も考えています。音楽を聴きながら加速度計を持ち、オーディオと身体反応の関係でAIベースのビジュアライザーを訓練するデータセットを作成することも検討中です。
学んだこと
私はLEDプロジェクトとして始めましたが、人間がピッチをどのように知覚し、ノイズの多い信号をどうスムージングし、目が明るさにどのように反応するか、そしてピクセル不足というボトルネックで音を光へマッピングする難しさを学びました。
私が見たほとんどの商用音楽反応LEDストリップは、単純な音量検出や単純FFTで済ませているだけです。入力側も出力側も人間知覚をモデル化していないため、すべて同じように見えてしまいます。
メルスケールが調整され、フィルタが最適化され、色が正しい周波数帯域へマッピングされると、ストリップは生き生きとします。世界中のナイトクラブから動画を送られてくるほどです。
これは私が作った中で最も難しく、そしてまだ終わっていない作品なのです。