柔術サボりがちだけど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 というシステム。これが今一番面白い。

コンセプト

会場にいる全員のデバイスを同期させて、一つの巨大なスピーカーにする。

  1. 会場にいる人がスマホやデバイスでチャンネルに参加
  2. 全デバイスがNTP時刻同期で同じタイミングで音を鳴らす
  3. 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 + WebAudiokoe.live
iPhone / iPadSwift, Network.frameworkKoe-iOS
MacSwift (iOS版共有)Koe-macOS
WindowsRust, cpal, tray-iconKoe-Windows
AndroidKotlin, AudioRecord/TrackSoluna 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 Hawaiisolun.art
Chatweb.aichatweb.ai
teai.ioteai.io
Elioelio.love
StayFlowstayflowapp.com
JiuFlowjiuflow.art
パシャpasha.run

柔術仲間の皆さん、練習サボってすみません。でもまたすぐ出ます。