GPT-Live-1とCodexで私のLEDディスプレイを生き生きとさせる
Raspberry Pi 5 と 128×64 の HUB75 パネルで音声アシスタント Jack を作った。会話は GPT-Live-1 が担い、別のモデルが調べ物と画像選びを、レンダラが画素への変換を受け持つ。
日本語
コピー

ルームメイトの誕生日に、窓の外を飛んでいく飛行機を表示する小さなLEDディスプレイを贈った。悪くない贈り物だったが、画面に飛行機が次々と現れるのを見ているうちに考え始めた。このディスプレイは飛行機の追跡以外に何かできないだろうか?天気や自分のカレンダーを表示できないか?外出するときに「次の電車は何時?」と聞けば、答えが画面に出るようにできないか?
お使いのブラウザはvideoタグに対応していません。
これがすぐに副業プロジェクトになった。使ったのはRaspberry Pi、128 × 64のHUB75 LEDパネル、Codex、そして後にJackと名付けるアシスタントだ。会話はGPT-Live-1上で動いている。最近APIで公開した全二重音声モデルだ。別のモデルがリサーチを担当し、レンダラーがピクセルを処理する——とはいえ、最初からここまで整理された構想があったわけではない。この記事はその過程の記録だ。
CodexはHUB75 RGB LEDパネルをどう動かすのに役立ったか
まずCodexと一緒に、画面に意味のあるものをどうやって表示するかを解明する必要があった。手元にあるのは128 × 64のHUB75 RGBパネルだが、コントローラーや配線、そして本来表示する内容以外にどうやってデータを送り込めるのかについてはほとんど何も知らなかった。
Codexに写真を送り、見えているものを説明してもらうことから始めた。主要なインターフェースを特定し、ESP32ベースのコントローラーを理解し、HUB75パネルが表示データをどう受け取るのかを解明するのを手伝ってくれた。写真に注釈を付けて重要な部分を教えてくれたことすらある——自分一人では、基板と、間違える余地しか見えていなかっただろうから、これは助かった。
ハードウェアの基本が把握できると、Codexの助けでコントローラー上でWLED-MMを動かし、パネル設定の解像度が正しい128 × 64であることを確認した。ここまで来れば、カスタム画像を送り込み、こんな小さな画面で何が映えるかを試し始められる。Codexは調査とトラブルシューティングを担当し、私は配線を担当し、期待と違う動きがあればフィードバックを返した。
Mac上で音声制御LEDディスプレイをプロトタイピングする
最初の動くバージョンは最終形よりずっと単純だった。コントローラーでWLED-MMが動くようになると、Codexがレンダラーとカスタムskillを書いてくれ、私はChatGPTデスクトップアプリのVoiceを使って画面に何を表示するかを伝えた。
これだけでこの画面は一味違うものになった。天気、カレンダー、地下鉄の到着時刻、金融チャート、メッセージ、カウントダウン、写真、絵、あるいはカスタムアニメーションのシーンを表示できる。あるアイデアがこんな小さな画面に合わなければ、レンダラーを直せばいい。
音声インタラクションは依然としてCodex内で行われ、カスタムskillがこの壁に何を表示すべきかを更新する手段を与えていた。さらに先では、Mac上のレンダラーがレイアウトを128 × 64のRGBフレームに変換し、DDPでローカルネットワーク経由で送信し、WLED-MMを動かすESP32コントローラーがそのフレームをパネルに届ける。
Codexが助けてくれたのは、これらの要素をつなぐことだけではない。128 × 64の画面にはほとんど余裕がないので、文字、画像、天気、カレンダーの予定、地下鉄の到着情報を、見苦しく潰れないように詰め込む方法を何度も練った。どこがおかしいかをCodexに伝え、Codexがレンダラーやレイアウトを調整し、また試す。これを繰り返して、待機画面が本当にずっと飾っておきたいと思えるものになっていった。
問題は、全体が依然として私のMacに依存していたことだ。レンダラーはそこで動き、音声インタラクションもそこから始まる。ノートPCがスリープするか、持ち出せば、この壁はもう私が望む役に立つ姿ではなくなる。理想的には、仕事からアパートに帰って、壁に何か見せてと直接頼みたい。
音声アシスタントとレンダラーをRaspberry Piに移す
ノートPCをこの経路から外したいとCodexに伝え、常時動いている必要のある部分をRaspberry Piに移し、コードをプライベートリポジトリに入れ、壊しても戻せるようバックアップを確保した。Piを接続すると、Codexがコードを動かし、ログを見て、あちこちで起きるエラーに対処し、私はやりたいことを説明し続けた。
今では2つの小さなサービスが動いている:
- 音声サービスはマイク、PipeWireオーディオ、WebRTCエコーキャンセリング、ウェイクとスリープの挙動、割り込み、GPT-Live-1接続、クライアントへの委譲を担当する。
- レンダリングサービスはアニメーションの待機画面を動かし続け、天気とMTAの地下鉄到着情報を更新し、個人情報を除いたカレンダーデータを使い、シーン記述を検証し、フレームを壁へストリーミングする。
マイクとスピーカーをPiに接続したことで、部屋に入って「Hey Jack」と言えば、コンピューターを開かずに何かを頼めるようになった。ウェイクの挙動と応答の仕方の改善にはかなり時間をかけたが、ノートPC上のデモではなく、ずっとつけっぱなしにできるものになったのは、Macから降ろしたからだ。
GPT-Live-1とRaspberry Piはどう連携するか
最終的な役割分担はこうだ。GPT-Live-1は私と会話する部分であり、壁に何かを描く部分ではない。GPT-Live-1は会話を開いたままにし、話している間も聞き続け、割り込みを許し、あるリクエストが会話そのものの外側の何かを必要とするかどうかを判断する。
必要になれば、Raspberry Piが委譲を受け取り、低い推論強度でGPT-5.6 Lunaによるクライアント側のResponses APIリクエストを発行する。Lunaは公開ウェブを検索し、自分のカレンダーの読み取り専用接続を確認し、Wikimedia Commonsから再利用可能な画像を探し、そのリクエストにどんなシーンが必要かを判断できる。
あるとき、Jack に壁へ写真を出してくれと頼んだら、できないと言われた。レンダラーはとっくに画像に対応していた。ただ、音声アシスタントに画像を探して送るツールを渡していなかっただけだ。Codex が Wikimedia Commons につないでくれて、条件に合う画像を探し、そのライセンスとクレジットを確認できるようになった。画像の収まり方も変えた。Pi がアスペクト比を保ったまま 128 × 64 ピクセル以内に縮小するので、画面いっぱいに引き伸ばされることはない。
機能を足していくにつれて、各部分が絡まり合わないようにするのにも Codex が役立った。Pi 上のコードが Luna の使えるツールを決め、Luna がどんな情報やシーンが必要かを判断し、レンダラーがシーン JSON を検証してから、ちょうど 128 × 64 の RGB ピクセルに変換する。あとはそのフレームを DDP で WLED-MM コントローラーに送り、コントローラーが HUB75 パネルを駆動する。

最初のバグは、何ということもない会話の中で出た。Jack にニューヨークの天気を聞き、それから「これを壁に出して」と言ったら、「これ」が何を指すのか分からなかった。Codex が突き止めたのは、アプリが最新のリクエストしか画面更新用のモデルに送っていなかったということだ。受け渡しのロジックを直し、直近の会話と以前の結果も一緒に渡すようにした。
「Hey Jack」から LED ディスプレイのピクセルまで
Jack に何かを調べて画面に出してと頼むと、おおよそ次の流れになる。
- Raspberry Pi が 24 kHz の PCM 音声で私の声を取り込み、ローカルで音声処理をする。
- GPT-Live-1 が音声ストリームを受け取り、リクエストを理解し、会話を開いたままにする。だから途中で遮ったり、言葉を足したりできる。
- 調査、カレンダー情報、画像、壁の更新が必要なリクエストなら、GPT-Live-1 がクライアント側で委譲を開始し、Pi が Responses API 経由でタスクを GPT-5.6 Luna に送る。
- Luna はそのリクエスト用に開けたツールを呼び出す。ホスト型のウェブ検索、読み取り専用のカレンダー接続、再利用できる画像クエリ、壁を更新するツールなどだ。
- 合う天気、予定、メッセージ、カウントダウンのシーンがすでにあれば、それをそのまま使う。それまで想定していなかったものを私が言えば、新しいシーンを作る。
- ローカルレンダラーがそのシーンを検証し、128 × 64 の RGB フレームに変換して DDP で壁へ送る。その間、GPT-Live-1 が調べた内容を私に伝える。
気に入っているのは、定型の音声アシスタントのやり取りが一巡するのを待たずに次の一言を言えることだ。Jack を遮って意図をはっきり伝えても、調査とレンダリングは裏で進む。
全体としては、かなり単純な副業プロジェクトだ。HUB75 パネルも ESP32 コントローラーも Raspberry Pi も音声モデルも、私は触ったことがなかった。以前なら、ディスプレイを開いた時点で諦めていただろう。今回は Codex のおかげで手を動かしながら覚えられた。分からないことがあれば、そのまま聞けばいい。
同じようなプロジェクトを考えているけれど、どこから手を付けていいか分からないなら、Codex に聞いてみるといい。どこまで進めるか、自分でも驚くかもしれない。