dwgx@blog:~$dwgx
> cd ../posts

Live2DPet-Enhanced: デスクトップペットに画面を見る脳を載せる

// created

Live2DPet-Enhanced は Electron ベースの AI デスクトップペットだ。デスクトップに常駐する Live2D キャラクターは可愛いだけの存在ではなく、定期的にスクリーンショットを撮ってアクティブウィンドウを検出し、その画面を Vision 対応の LLM(OpenAI 互換なので OpenRouter のようなものでも繋げる)に渡す。モデルがユーザーの作業内容を読み取り、吹き出しで自分から話しかけてくる。キャラクターは透明・枠なし・最前面固定で、目はマウスを追う。スクリーンショットはメモリ上を通って API に送られるだけでディスクには落とさない。デスクトップには機密なものが多いので、保存しなくて済むものは保存しない。この方針は最初から固定した。リポジトリは github.com/dwgx/Live2DPet-Enhanced

キーフレーム視覚記憶がコスト削減の要だ。スクリーンショットを毎回コンテキストに詰め込むと token も費用も持たないので、まずサンプリングし、そのうえで VLM 自身に代表的な数枚を選ばせて残す。

音声はローカル日本語 TTS の VOICEVOX を使い、koffi で FFI 経由で VOICEVOX Core の dll を直接呼ぶ。返答はまず日本語に翻訳してから読み上げる。クラッシュを恐れて三段階のフォールバックを組んだ。TTS が使えれば使い、駄目ならデフォルト音声に落とし、それも駄目なら無音にする。会話が音声で止まらないようにした。

モデルがなくても遊べる。.model3.json をホットインポートすればパラメータ・表情・モーションを自動マッピングし、あるいは画像フォルダをキャラクターとして使い、待機/発話/表情をタグ付けしておけば AI の感情トリガーで切り替わる。人格設定は JSON テンプレートで、{{petName}} のような変数を置換する。API キーはディスクに落ちる前に AES-256-GCM で暗号化する。

ハマった落とし穴が一つ。ソースから動かすときは npx electron . を使うな。ELECTRON_RUN_AS_NODE と競合する。素直に node launch.js を使うこと。

初期にはインテリジェンス強化パイプライン一式も作った。自動検索、知識整理、活動記憶、VLM による情景抽出で、もっと賢くしようとした。だが重すぎて費用も嵩み、効果も明確でなかったため、v2.0 で丸ごと無効化し、骨組みだけ残した。視覚モデルは本当に金がかかるので、検出間隔は詰めすぎないこと。