柔術サボりがちだけどAI開発が止まらない
正直に言います。最近、柔術をサボっています。
週一の練習がやっと。試合も出てはいるけど調子がいいとは言えない。理由ははっきりしていて、AIの開発にハマりすぎている。
いくつかのプロジェクトを同時に回していて、横断して作業しているとあっという間に時間が経つ。犬と遊んだり、ストレッチしたり、友達とランチに行ったり、普通の生活はしているんだけど、頭の中のマインドシェアがどうしてもAI開発に寄ってしまう。
最近の柔術
練習は週1回。正直、体が重い。スパーリングでも「あ、前はこの動きもっとスムーズにできたのに」と思う瞬間が増えた。
試合は数回出たけど、結果は微妙。勝ったり負けたり。コンディションが整っていないのは自分でもわかっている。
でも辞めるつもりはないし、試合もまたすぐ出る。柔術は僕にとって「考えることを止める」唯一の時間。マットの上では、次のAPIエンドポイントのことなんて考えられない。それが大事。
AI開発にハマっている
ここ数ヶ月、正直言って開発が楽しすぎる。
Claude Code(今まさにこのブログも一緒に書いているAI)と一緒に開発していると、今まで「3ヶ月かかるな」と思っていたことが3日で終わる。しかもコードの品質が高い。テストも書いてくれる。デプロイまでやってくれる。
その結果、プロダクトが一気に増えた。全部紹介させてほしい。
リリース済み・リリース間近のプロダクト
Chatweb.ai / teai.io — AIチャットプラットフォーム
Rust (axum) 製、AWS Lambda上で動作。複数のAIモデル(Claude、Gemini、Nemotron、Qwen)を自動切替して最適な回答を返す。月間アクティブユーザー数千人。Stripeでのサブスクリプション課金も実装済み。
Elio — iOSのAIアシスタント
App Storeで配信中。P2P分散推論に対応していて、近くのデバイスと計算リソースを共有できる。Solana上のEBRトークンゲートでレジャーサーバーの参加を管理。Swift/SwiftUIで2,920行のP2P推論エンジンを実装。
StayFlow — 民泊・ホテル向けの管理ツール
Beds24連携、自動メッセージ、料金最適化。500以上の施設で利用中、月間1,800以上のユニークビジター。Stripe Liveでスターター月額2,900円、プロ月額7,900円のプランを提供。React + Vite + Supabaseで構築。
JiuFlow — 柔術のテクニックデータベース
100人以上のトップ選手のデータを収集済み。Rust + Axum + SQLiteでSSRサーバーをFly.ioにデプロイ。ダークテーマのガラスカードUIで、選手ごとのテクニック分析が見られる。柔術サボってるのにこういうのは作る。
パシャ — AIレシート記帳アプリ
領収書をカメラで撮るだけで自動記帳。OCR + AI分類 + 電子帳簿保存法対応 + チェーンハッシュ + Solanaアンカリング。7通貨対応、freee/MF互換CSV出力。Swift/SwiftUI + SwiftDataで構築。TestFlight配信中: 参加リンク
Koe — 音声入力ツール + 分散オーディオ
Mac/Windows/iOS/Webで動作。whisper.cpp + llama.cppでローカル音声認識してテキストに変換。そして後述するSolunaプロトコルの母体。
そして、一番大きいプロジェクトが次に紹介するやつ。
ZAMNA Hawaii — 9月4日、ハワイ
2026年9月4日にハワイでZAMNA (ザムナ) というイベントを開催することになった。
ZAMNAは音楽とテクノロジーを融合させたフェスティバル。世界各地で開催されているイベントで、今回ハワイでの開催に関わることになった。
このイベントの準備が、いくつかのプロジェクトを生み出した。
詳細: solun.art
Soluna — 群衆を楽器にするシステム
ZAMNAのために作っているのが Soluna というシステム。これが今一番面白い。
コンセプト
会場にいる全員のデバイスを同期させて、一つの巨大なスピーカーにする。
- 会場にいる人がスマホやデバイスでチャンネルに参加
- 全デバイスがNTP時刻同期で同じタイミングで音を鳴らす
- 1台は記憶、100台はオーケストラ、1000台は波
どうやって動いているのか
Solunaのプロトコルは、かなり技術的に面白いことをやっている。全部自前で実装した。
パケットフォーマット (19バイトヘッダ)
[SL magic 2B][device_hash 4B][seq 4B][channel_hash 4B][ntp_ms 4B][flags 1B]
たった19バイトのヘッダで、デバイスの識別、チャンネルの分離、時刻同期、機能フラグの全てを管理している。音声データはIMA-ADPCM圧縮で4:1に圧縮(16bit PCM → 4bit)されるので、帯域75%削減。
ゴシップP2P — 中央サーバーなしで無限スケール
普通のシステムなら「全員→サーバー→全員」で配信するけど、1万人のフェスでそれをやったらサーバーが死ぬ。
Solunaはゴシッププロトコルを使う:
各デバイスが「近い2-3台」にだけ送信
→ 受け取ったデバイスがまた近い2-3台に転送
→ ウイルスみたいに全体に広がる
→ 1000台でも10ホップ以内で全員に届く
しかも、「近い」の判定に音を使っている。
音響測距 — 音で距離を測る
19.5kHzの超音波チャープ(人間にはほぼ聞こえない)をスピーカーから発信して、他のデバイスのマイクで検出する。音速は343m/s = 34cm/msなので、NTPタイムスタンプとの差から物理的な距離を±10cmの精度で測定できる。
これで何ができるかというと:
- ゴシップの最適化: WiFiのRTTではなく物理距離で「近いデバイス」を選べる
- 空間オーディオ: 遠いデバイスからの音は自動的に小さく、近いデバイスは大きく
- 距離マップ: ダッシュボードでデバイスの物理的な位置関係を2D表示
音声DSPパイプライン
マイクから入った音声は、送信前にこのパイプラインを通る:
マイク → ハイパスフィルタ → エコーキャンセル → ノイズゲート
→ AGC (自動ゲイン制御) → リミッター → ボリューム → ADPCM圧縮 → 送信
全部ゼロアロケーション(ヒープ確保なし)の整数演算で実装している。ESP32の240MHzでも余裕で動く。
NTP同期再生 — なぜ全デバイスが同時に鳴るのか
送信側は音声パケットに「この音をNTP時刻 XX:XX:XX.XXXに再生して」というタイムスタンプを付ける。受信側は自動調整バッファ(20-300ms)に溜めて、指定時刻ぴったりに再生する。
バッファ 100ms = 全員100ms遅れるが完全同期
デバイスAに5msで届こうが、デバイスBに50msで届こうが、
全員同じNTP時刻に再生するので完全同期。
バッファサイズは自動調整。同じ部屋なら20ms、東京↔NYなら200ms。ユーザーは何もしなくていい。
ダッシュボード
koe.live/dashboard.html で全デバイスの状態をリアルタイムに可視化できる。
- デバイス一覧(ID、チャンネル、ピア数、バッテリー、レイテンシ)
- ネットワークトポロジーグラフ(どのデバイスがどれに接続しているか)
- 距離マップ(音響測距ベースの2D位置表示)
- 音声レベルメーター
- OTAファームウェア配信ボタン — ワンクリックで全デバイスを最新版に
マルチキャストOTA — 開演5分前でもアップデート
Solunaの「マルチキャストで全員に同じデータを配る」という仕組みを、ファームウェアのアップデートに転用した。
- ダッシュボードからバイナリをアップロード
- サーバーが1024バイトずつに分割してUDPマルチキャストでループ送信(カルーセル配信)
- 各ESP32デバイスがバックグラウンドで拾い集める
- 欠損したパケットは次のループで補完
- 100%揃ったら自動で再起動して書き換え
1台アップデートするのも1万台アップデートするのも、ネットワーク帯域は完全に同じ。
全プラットフォーム対応
Solunaは特定のデバイスに閉じていない。全部同じプロトコル(19Bヘッダ + IMA-ADPCM + FNV-1a + UDP 239.42.42.1:4242)で通信する:
| プラットフォーム | 技術 | リンク |
|---|---|---|
| ESP32デバイス | Rust (esp-idf), 3,500行 | koe.live |
| Web (ブラウザ) | WebSocket + WebAudio | koe.live |
| iPhone / iPad | Swift, Network.framework | Koe-iOS |
| Mac | Swift (iOS版共有) | Koe-macOS |
| Windows | Rust, cpal, tray-icon | Koe-Windows |
| Android | Kotlin, AudioRecord/Track | Soluna Android |
ブラウザからもチャンネルに参加できるので、アプリのインストールなしで体験可能。koe.live にアクセスしてみてほしい。
Koe Device — 26mmの小さなデバイス
Solunaを動かすための専用ハードウェアも設計している。
COIN — $24で作れる音響デバイス
26mm丸基板のデバイス。ESP32-S3にマイク(INMP441)とスピーカーアンプ(MAX98357A)を載せた最小構成。BOM(部品代)は$24。
ファームウェアはRustで3,500行超。全機能の内訳:
- audio.rs (436行) — VAD, AGC, AEC, ビームフォーミング, ビープ音, ハイパスフィルタ, ノイズゲート, リミッター
- soluna.rs (1,025行) — プロトコル, ADPCM, PLC, ゴシップP2P, 音響測距, 空間オーディオ, SNTP, ChaCha20暗号化
- cloud.rs (160行) — HMAC-SHA256署名, セキュアHTTPクライアント
- led.rs (246行) — WS2812B RMTドライバ, ピア数で色変化
- ble.rs (118行) — NimBLEペアリング
- ota.rs (292行) — マルチキャストOTA + HTTPS OTA
- battery.rs (67行) — ADCバッテリー監視
ボタン操作
物理ボタン1つで全操作:
| 操作 | 動作 |
|---|---|
| 短押し | 録音ON/OFF |
| ダブルタップ | チャンネル巡回 (soluna→voice→music→ambient) |
| 中押し (0.5-3秒) | Koe ↔ Soluna モード切替 |
| 長押し (3秒+) | BLEペアリング |
| 5連打 | ファクトリーリセット |
モード切替時はビープ音でフィードバック(Soluna=高音2回、Koe=低音1回)。
今やっていること
複数のプロジェクトを横断しながら進めていると、コンテキストスイッチが多くて一日があっという間に終わる。
合間に犬と遊んだり、ストレッチしたり、ご飯食べたり、友達とランチ行ったりはしてるけど、正直なところ頭のマインドシェアがAI開発に持っていかれている。歩いてるときも「あのAPIのレスポンスをストリーミングにしたらレイテンシ減るよな…」とか考えてしまう。
Claude Codeと一緒に開発していると、「これ作れたら面白いな」と思った瞬間にプロトタイプが動く。その快感が中毒性ある。今日もこのブログを書きながら裏でSolunaのダッシュボードをデプロイしていた。
今後の予定
- 4月: COIN デバイスのプロトタイプ基板を発注(JLCPCB)、柔術の試合にも出る
- 5-6月: Solunaのベータテスト(東京のどこかで小規模イベント)
- 7-8月: ZAMNA Hawaii準備、デバイス量産
- 9月4日: ZAMNA Hawaii 本番
柔術の試合もまたすぐ出る。サボりがちとはいえ、辞めてはいないし辞めるつもりもない。
まとめ
柔術はサボりがちだけど、AIの開発は人生で一番楽しい時期かもしれない。
ZAMNAをきっかけにSolunaという面白いシステムが生まれて、それがKoeデバイスになって、気づいたらESP32のファームウェアからWebダッシュボード、iOS/Android/Windows/Macアプリまで全部作っていた。7プラットフォームが同じプロトコルで繋がるのは、なかなか気持ちいい。
技術が好きで、音楽が好きで、柔術が好きで、全部混ざってこうなった。
リンクまとめ
| プロダクト | URL |
|---|---|
| Soluna プレイヤー | koe.live |
| Soluna ダッシュボード | koe.live/dashboard.html |
| ZAMNA Hawaii | solun.art |
| Chatweb.ai | chatweb.ai |
| teai.io | teai.io |
| Elio | elio.love |
| StayFlow | stayflowapp.com |
| JiuFlow | jiuflow.art |
| パシャ | pasha.run |
柔術仲間の皆さん、練習サボってすみません。でもまたすぐ出ます。