一日中こちらを見つめるカメラに監視されることなく、デスクの上で楽しくおしゃべりしたり、作業タイマーを管理したり、厄介なバグの相談に乗ってくれたりする、レトロゲームのキャラクターのような愛嬌のある「デスクの上の小さな相棒」がいたらいいなと思ったことはありませんか?

その問いかけから生まれたのが、私たちのレゴ恐竜AIコンパニオンロボット DinoDesk AI です。

dinodesk

私と同僚のシャマ(Shama)は、8ビットのサウンドやビジュアルの懐かしさとレゴ テクニック(LEGO Technic)のメカニックに、最新の ハイブリッドLLMスイッチングアーキテクチャ(ローカル ↔ クラウド) を融合させた、スマートで省電力なデスクトップロボットを作ることにしました。デスク上の Raspberry Pi と、Gemma 4 および Gemini Flash が稼働するローカルPCゲートウェイを組み合わせることで、100%の視覚的プライバシー(カメラ非搭載)、瞬時かつコストゼロのローカルチャット、そして必要な時にいつでも呼び出せる高度なクラウド推論を兼ね備えた相棒が誕生しました。

ここでは、私たちが DinoDesk AI をゼロからどのように設計し、配線し、プログラミングしたのか、その舞台裏を余すところなくご紹介します。


1. ハイブリッドな頭脳:ローカル Gemma 4 ↔ クラウド Gemini#

AIハードウェアの相棒を作るときに直面する最大のジレンマのひとつが、「頭脳をどこに置くか」という問題です。すべてをクラウドで処理すると、「今何時?」 といった何気ない雑談のたびにAPIトークンを消費し、ネットワーク遅延が発生し、音声データがインターネット上に送信されてしまいます。かといってデバイス上の小さなモデルだけに限定してしまうと、巨大なコードベースに新機能を追加したり、複雑なトピックを解説してもらったりしようとした瞬間に限界が来てしまいます。

そこで私たちは、ユーザーのメインPC上でホストされる 統合LLMゲートウェイ(ルーター) を備えた ハイブリッドLLMアーキテクチャ を構築しました。デスク上の Raspberry Pi は、どちらのエンジンがアクティブであるかに関わらず、Wi-Fi経由で同一のOpenAI互換リクエストを送信します。

 ┌─────────────────────────────────────────────────┐
 │          [ メインPC / ローカルゲートウェイ ]        │
 │                                                 │
 │   ┌─────────────────────────────────────────┐   │
 │   │       動的モデルルーター / スイッチ         │   │
 │   └────────────────────┬────────────────────┘   │
 │                        │                        │
 │     ┌──────────────────┴──────────────────┐     │
 │     v                                     v     │
 │  [ ローカルエンジン ]            [ クラウドエンジン ]│
 │  LM Studio / Gemma 4         Gemini Flash /     │
 │  (ゼロ遅延・プライベート)       Gemini Live        │
 └────────────────────────┬────────────────────────┘
                          │
                          │ Wi-Fi (統合OpenAI互換ストリーム)
                          v
 ┌─────────────────────────────────────────────────┐
 │           [ DinoDesk AI (RPi) ]                 │
 │  - Pirate Audio LCD & I2Sビープスピーカー         │
 │  - プッシュボタン & オプションセンサー               │
 └─────────────────────────────────────────────────┘

3つのインテリジェンスモード#

モードアクティブモデル強みと主な用途切り替え方法
🟢 ローカルモード (デフォルト)Gemma 4(LM Studio経由)コストゼロ、オフライン、100%プライベート。 日常の雑談、デスクタイマー、簡単なステータス確認などを約200msの初回トークン遅延で即座に応答します。Pirate Audio ボタンX のダブルクリック、静電容量タッチセンサーの3秒長押し、または音声コマンド(「クラウドモードに切り替えて」)
🟡 クラウドモードGemini Flash / Gemini Live高度な推論と複雑な問題解決。 コーディング支援、複雑な数学、深い解説、語学チュータリングなどに最適(初回トークン遅延は約800ms)。同上
⚡ 自動ハイブリッドモード自動ルーティングデフォルトは ローカルの Gemma 4。複雑度分類器が多段階の推論キーワード(「説明して」、「比較して」、「コードを書いて」)を検出すると、自動的に Gemini Flash へとプロンプトをエスカレーションします。システムによる自動ルーティング

自動ハイブリッドモードで質問がクラウドにエスカレーションされると、応答中はロボットのインジケーターが一時的に 🟢 緑色 から 🟡 ゴールド に変わり、応答が終わると緑色に戻ります。そのため、今どちらの頭脳が答えているのかが一目でわかります。


2. ハードウェア&メカニカルな手触り:レゴとPirate Audioの融合#

私たちは DinoDesk AI を、冷たいスマートスピーカーではなく、手触りのある物理的なおもちゃのように感じられる存在にしたいと考えました。密閉されたプラスチックケースを3Dプリントする代わりに、誰でもカスタマイズや修理ができるよう、基本的なレゴブロックとテクニックのレバー機構 でボディを組み立てました。

主な部品構成(BOM)#

  1. メインコントローラー: Raspberry Pi + 32GB MicroSD
  2. ディスプレイ&オーディオシールド: Pimoroni Pirate Audio Speaker(1.3インチ 240×240 ST7789 IPS液晶 + I2S 1Wスピーカー + タクトボタン4個)
  3. 赤いボタン: 心地よいクリック感で音声キャプチャを開始・停止できるミニプッシュボタンスイッチ
  4. 音声入力: コンパクトなUSBミニマイク
  5. モーションシステム: 首の動きと尻尾振りを駆動するモーター

フルボディを組み立てる前に、まずは Raspberry Pi とシンプルなレゴセットを使ってロジックのプロトタイプを作成しました。

Early prototype 1 Early prototype 2

物理ボタンによる操作#

音声やセンサーによるトリガーがあっても、即座に物理的な操作ができる専用ハードウェアボタンには心地よさがあります。

  • ボタンA (GPIO 5) — キャンセル / ミュート: アクティブな応答ストリームを即座に停止し、音声をミュートにしてロボットを Idle(待機) 状態に戻します。
  • ボタンB (GPIO 6) — ホーム位置リセット: 現在の状態を中断することなく、すべてのサーボを中央のニュートラル位置にリセットします。
  • ボタンX (GPIO 16) — 表情&エンジンの切り替え: シングルクリックで顔の表情を手動で切り替え、ダブルクリックで ローカル ↔ クラウドモード を切り替えます。
  • ボタンY (GPIO 24) — 尻尾テスト&音量調整: 1回押すと機構の位置合わせを確認するための尻尾振りシーケンスが作動し、2秒間の長押しでビープ音の音量(低 → 中 → 高 → ミュート)が切り替わります。

3. 恐竜に命を吹き込む:5状態の有限状態機械(FSM)#

コンパニオンロボットは、目、声、そして体の動きが連動して初めて「生きている」ように感じられます。私たちは240×240液晶の目の表情、8ビットのビープ音、そしてモーターの動きを協調させる5段階の 有限状態機械(FSM: Finite State Machine) を設計しました。

┌──────────┐  ボタン     ┌───────────┐   離す      ┌──────────┐  ストリーム┌──────────┐
│ Sleeping │──────────> │   Idle    │───────────>│Listening │─────────>│ Thinking │
└──────────┘  (起動)     └───────────┘  (トリガー) └──────────┘   (送信)  └──────────┘
                             ^                                                  │
                             │              ┌──────────┐                        │
                             └──────────────│ Speaking │<───────────────────────┘
                                (完了)       └──────────┘      (トークン到着)
状態遷移条件Pirate Audio 液晶の表情8ビット音声フィードバックモーター動作(首 / 尻尾)
1. Sleeping(睡眠)3分間無操作、または部屋が暗い(- _ -)
閉じた目 + zzz
無音(またはオプションで静かな寝息)モーター脱力、頭を少し下に向ける
2. Idle(待機)デフォルトの待機状態(• •)
自律的なまばたき
時折鳴る起床/まばたきチャイム頭を中央へ、首をゆっくり揺らす
3. Listening(聴取中)ボタンクリックまたはセンサートリガー(O O)
目を大きく輝かせる
「ピポッ!」 という上昇音ユーザーに向かって頭を15°傾ける
4. Thinking(思考中)音声送信完了、ルーターが推論中(º º)
ぐるぐる回る瞳 + モードバッジ
不規則な処理音(チクタク・ポッ)首を左右にゆっくり揺らす
5. Speaking(発話中)SSEトークンストリームを受信中表情豊かなまばたき + スクロール字幕トークンごとの8ビットタイプライター音テキストの長さに合わせて尻尾を振る

DinoDesk AI の開発を通じて、AIはブラウザのタブやクラウドのデータセンターの中に閉じ込められている必要はないのだと改めて実感しました。Gemma 4 のようなオープンモデルにピクセルの瞳、8ビットの声、フリフリと揺れるレゴの尻尾を与え、難しい場面では Gemini に助けを求められるようにすると、いつものデスクが一気ににぎやかで楽しい場所に変わります。🦖✨

まだ開発中のため完璧ではありませんが、近いうちに音声会話機能までしっかりと実装してまたお知らせに伺います!それまでは、ボタンを押すたびに鳴るちょっとした8ビットの効果音をお楽しみください。ピポッ!

リポジトリはこちらからクローンできます:https://github.com/google-gemma/dinodesk-ai-companion/

皆さんがこれからどんなものを作ろうとしているのか、ぜひコメントで教えてください!