自作AIエージェントがJ.A.R.V.I.S.の領域へ進化した話 〜自分の声に特化したWhisper・3段階の会話ロジック・DiscordからWOL機能拡張・手帳連携〜
はじめに:ただのチャットボットから「利用者に寄り添い助ける相棒」へ
「Hey, Siri」や「OK, Google」に話しかけて、返答が遅かったり、通り一辺倒な検索結果を読み上げられてがっかりした経験はありませんか?** 人間同士の会話なら、「ねえねえ」と声をかけた瞬間に相手は「うん?」と頷いてくれます。しかし、従来のAIアシスタントは質問を投げかけた後に数秒の沈黙が流れ、ユーザーは「聞こえてるのかな?」「処理中なのかな?」と不安になってしまいます。
私が目指したのは、映画『アイアンマン』に登場する J.A.R.V.I.S.(ジャーヴィス)** のような専属AIエージェントです。** – 声をかければ0.5秒で「うん」「なるほど」と相槌を返し、
– 自分の声の特徴を完璧に理解して早口でも誤認識せず、
– カメラでユーザーの表情(疲労や笑顔)をリアルタイムに察し、
– 自分の予定(Googleカレンダー)や思考メモ(Obsidianの手帳)を隅々まで把握し、
– 会話した内容を画面上の3D空間にサイバーパンクなナレッジツリーとしてリアルタイム展開する。
– そして、普段はDiscordで静かに控えている相棒が、サポート強化の要請に応じて WOL(Wake-on-LAN)で自宅の重厚なGPUサーバーを目覚めさせ、フルスペックの音声対話空間へと機能拡張する**。
ここ数ヶ月で開発を続けてきた自作AIエージェント(愛称:ゴンラス)が、まさにこの理想形へと大きく進化しました。本記事では、その全体アーキテクチャと実装のこだわりを一挙に公開します。
1. システム全体アーキテクチャ(省電力待機 × オンデマンド覚醒)
常時GPUマシンをフル稼働させておくと、莫大な電気代がかかります。** そこで本システムでは、「24時間常時稼働する軽量Raspberry Pi」と「必要な時だけ召喚する自宅GPUメイン機(RTX 3060)」の二段構えアーキテクチャ** を採用しました。
flowchart TD
subgraph Everyday ["普段のモバイル・外出先"]
Discord["Discord チャットボット(常時稼働・軽量テキスト対話)"]
BrowserUI["Webブラウザ (ゴンラス UI)(音声・表情・3Dフル対話)"]
end
subgraph Home_Always ["Raspberry Pi (24時間常時稼働)"]
DiscordBot["Discord Bot 常駐デーモン"]
MCP["MCPサーバー群 (70+ Tools)"]
Obsidian["Obsidian手帳 (第2の脳)"]
GWorkspace["Googleカレンダー / タスク / Gmail"]
WOL_Trigger["WOL起動トリガー"]
end
subgraph GPU_Host ["自宅メインPC (RTX 3060 / 必要な時だけ起動)"]
RustCore["Rust製 超高速WebSocketサーバー"]
Whisper["ファインチューニングWhisper(自分の声専用モデル)"]
VOICEVOX["VOICEVOX (青山龍星)"]
end
subgraph Cloud_AI ["クラウドLLM"]
Gemini["Gemini 2.5 Flash Lite(3ステージ並列推論)"]
end
Discord |手軽なテキスト相談| DiscordBot
DiscordBot -->|「起動して」でWOL送信| WOL_Trigger
WOL_Trigger -->|Magic Packet| GPU_Host
GPU_Host -->|起動完了をDiscordに通知| Discord
BrowserUI |フル機能で対話開始| RustCore
RustCore |推論 / ツール選定| Gemini
RustCore -->|ツール実行要求| MCP
MCP Obsidian
MCP GWorkspace
RustCore -->|感情付き音声合成| VOICEVOX
VOICEVOX -->|音声返却| BrowserUI
2. 普段はDiscord、必要なときはWOLでフル機能へ拡張する快感
このエージェントの使い勝手を決定づけているのが、DiscordとWOL(Wake-on-LAN)を組み合わせた動的な機能拡張(オンデマンド覚醒) です。
【普段の姿:省電力なDiscordチャットボット】
外出先や移動中、あるいは仕事の合間には、スマートフォンからDiscordを開いて手軽にテキストで指示を出します。** Raspberry Pi上で動くDiscord Botは24時間起動しており、「今日のタスク追加して」「明日の天気は?」といった日常的なリクエストには数秒でテキスト返信。手帳(Obsidian)へのメモやカレンダーの確認もこれだけで十分完結します。
【サポート強化の瞬間:WOLで自宅GPUサーバーを目覚めさせる】
しかし、「頭の中のモヤモヤを声で壁打ちしたい」「週末の複雑なスケジュールを相談したい」「ハンズフリーでじっくり会話したい」という本格的なサポートが必要な場面があります。
そんな時は、Discord上で一言こう呟きます:
「ゴンラス、起動して」**
すると、Raspberry Piから自宅のRTX 3060搭載マシンへWOL(Magic Packet)が送信され、眠っていたメインPCが自動起動。** わずか30秒ほどで、
-
自分専用にファインチューニングされたWhisper音声認識エンジン
-
Rust製の超高速WebSocketサーバー
-
VOICEVOX(青山龍星)音声合成
-
3Dナレッジグラフ空間
が一斉に立ち上がり、Discordに「PCが起動しました。フル対話の準備が完了しています」と通知が届きます。
スマートフォンのブラウザを開けば、Discordでの文脈を引き継いだまま、瞬時にJ.A.R.V.I.S.のような音声・表情・3Dフルサポート空間へと機能拡張** されるのです。
3. 人間の「会話の呼吸」を再現する【3段階のAI会話ロジック】
フル機能モードで最もこだわったのが、Rustで構築した 「3ステージ並列応答パイプライン」 です。** 対話型AIにおける「沈黙ストレス」を完全に排除し、まるで生身の人間が目の前で相槌を打ちながら考えているようなテンポを生み出しています。
sequenceDiagram
autonumber
actor User as ユーザー
participant Rust as Rustサーバー
participant S1 as Stage 1 (即時相槌)
participant S2 as Stage 2 (一次回答)
participant MCP as MCP / 外部ツール
participant S3 as Stage 3 (詳細回答)
User->>Rust: 「来週の主な予定を教えて」
Note over Rust,S1: 発話終了から0.5秒で即座に反応
Rust->>S1: 相槌リクエスト
S1-->>User: 🔊 0.5s「うん!」(沈黙ゼロ)
Rust->>S2: 一次回答 & ツール選定
S2-->>User: 🔊 1.5s「来週の予定を確認するね!」
S2->>Rust: ツール指名 (control_calendar)
Rust->>MCP: カレンダー照会実行
MCP-->>Rust: 予定データ返却
Rust->>S3: データ注入 & 総合回答生成
S3-->>User: 🔊 3.5s「火曜日にプロジェクト定例、木曜日に健康診断が入っているよ!」
【第1段階:即時相槌(Stage 1 / 0.5〜1.0秒)】
-
目的**: 「ユーザーを絶対に待たせない」「聞いてるよ」の合図。
-
仕組み: ユーザーの発話が途切れた瞬間、Geminiに極小プロンプトを投げて1〜5文字の自然な相槌(「うん」「なるほど」「ふむふむ」)のみを高速生成。VOICEVOXが瞬時に発声します。これで会話の出だしの沈黙がゼロになります。
【第2段階:一次回答 & ツール選定(Stage 2 / 1.5〜2.0秒)】
-
目的: 結論の即答と、裏作業の予告。
-
仕組み: 10〜30文字程度の短い結論、または「はい、手帳に記録しますね!」「カレンダーを確認するね!」という未来形の作業予告を発声します。
-
裏での重要処理: 同時に、サーバーが抱える全70以上のMCPツール目録から「今どのツールを実行すべきか」を判断し、
chosen_tool(例:control_calendar)をピンポイント指名します。
【第3段階:ディープ実行 & ツール総合回答(Stage 3 / 2.0〜5.0秒)】
-
目的: 外部ツールを実際に動かし、詳細な情報や3Dナレッジを組み立てる。
-
仕組み: Stage 2で指名されたツールのスキーマだけを動的ロード(On-demand Schema Resolution)してAPIを実行。カレンダーの予定データや手帳の本文、スマートエアコンの状態、周辺店舗の座標などを踏まえた最終回答を出力します。
-
スマートスキップ: 日常の雑談や挨拶でこれ以上の深掘りが不要な場合は、
NO_ADDITIONAL_INFOという特殊トークンを返して発話を打ち切り、無駄なおしゃべりを防ぎます。
【割り込み(Barge-in)サポート】
人間同士の会話では、相手が話している途中で「あ、それとね」と口を挟むことがあります。** 本システムでは、AIが発話中であっても新しい音声入力を検知した瞬間に、実行中のStageタスクを直ちにアボート(強制中断)し、再生中の音声キューをクリアする割り込み処理** を組み込んでいます。
4. ここが進化した!コア技術とこだわり
① 自分の声でファインチューニングした専用Whisper & Web Audio VAD
汎用の音声認識モデルは、早口や口癖、特定のトーンで誤認識が発生しがちです。** そこで、自分自身の過去の音声データを用いてWhisperを追加学習(ファインチューニング)** しました。** – どんなに早口でボソボソ呟いても、自分の声を100%正確に拾ってくれます。
– フロントエンド(スマホ)側には Web Audio API によるVAD(発話区間検出)** を実装し、発話が終わった瞬間に自動で音声データを送信。** – ウェイクワード「ゴンラス」を呼ぶだけで、完全ハンズフリーで対話がスタートします。
② カメラによるリアルタイム表情認識・感情モニタリング(目を持つAI)
画面越しにユーザーを見守るため、カメラを用いた リアルタイム表情認識システム** を統合しました:** – 表情のキャリブレーション(個人学習機能): 人間の表情の出方は千差万別です。「真顔」「喜び」「悲しみ・疲れ」「怒り」をその場で学習させ、ユーザー固有の表情変化を正確に捉えます。
– 感情に寄り添う対話**:** 言葉だけでなく、疲れた顔をしている時にはトーンを落として優しく労い、笑顔の時には明るくテンポよく返すなど、真の相棒らしい情緒的なコミュニケーションを実現しています。
– マルチモーダル撮影**:** 「📸」ボタンでその場の景色や書類、気になるものを撮影して「これ何?」と見せながら相談することも可能です。
③ 感情に合わせて声色を変えるVOICEVOXパラメータ連動
音声合成にはVOICEVOX(話者:青山龍星)を採用しています。
単なるテキストの読み上げではなく、会話の文脈や表情、感情に合わせて 抑揚(intonationScale)、話速(speedScale)、音高(pitchScale)** をGeminiが動的に決定して音声合成エンジンに注入します:** – 嬉しい時・誕生日**: 抑揚1.35、速度1.10、音高+0.05(明るくテンポよく祝福)** – 疲れた時・労い**: 抑揚0.90、速度0.95、音高-0.04(優しく落ち着いた声で寄り添う)
④ 思考と記憶が広がる「3Dナレッジグラフ空間」(Three.js)
画面上には、J.A.R.V.I.S.のホログラムを想起させるサイバーパンクな3D空間(Three.js)が広がっています。** 会話の中で登場した「外出先の候補」「立ち寄り先の到着時刻」「買出しリスト」「日常タスク」などの構造化データが、ノードとリンクで結ばれた3Dナレッジツリー** としてリアルタイムに生成されます:** – 新しい話題が出るたびに、木が枝分かれするように過去のノードと結線され、記憶が蓄積。
– ノードをタップするとカメラがスムーズに接近(Fly-To)し、ドラッグでの自由配置やズームイン/アウト、スマホのピンチ操作にも完全対応。
– ブラウザのローカルストレージに永続化されるため、ページをリロードしても過去の思考ツリーがそのまま復元されます。
⑤ リアルタイム追従GPS(ブラウザ)× 位置ログMCPのハイブリッド連携
移動中の道案内や周辺検索のリアルタイム性を極限まで高めるため、位置情報の取得方式をハイブリッド化しました:
– 対話中(移動時): ブラウザの watchPosition(高精度モード)により、車や徒歩で移動しながらでもミリ秒単位の最新GPS座標で「近くのコンビニは?」に即答。MCPツールの呼び出しオーバーヘッドをスキップして爆速で回答します。
– 過去の行動記録**: 「先週の日曜はどこにいたっけ?」といった振り返りには、サーバー側に蓄積されたログを参照するMCP(get_location_history)が自動で呼び出されます。
5. 手帳(Obsidian)とGoogle Workspaceが手足になる快感
このエージェントが単なる便利ツールを超えている最大の理由は、「私の個人データ(第2の脳)」に直接アクセスできる点 です。
-
手帳(Obsidian)への自動記録・検索:** 「今のアイデアを手帳にメモして」と言えば、Obsidian Vaultの適切なフォルダ(
1.Input等)にマークダウンとして即座に追記。過去の知識もセマンティック検索で引き出します。 -
Google Workspace連携**:** 「今週の予定教えて」と話しかければ、メインのGoogleカレンダーから予定を一覧化し、重複や移動時間を考慮して助言。タスクの追加やGmailの確認も音声一つで完結します。
-
スマートホーム(エアコン)制御**:** 室温や体感に合わせて「ちょっと暑いから冷房下げて」と話せば、DaikinエアコンのECHONET Lite APIを叩いて温度を自動調整。
まとめ:AIは「使うもの」から「利用者に寄り添い助けるもの」へ
かつてのAIは、検索窓にプロンプトを打ち込み、欲しい答えを引っ張り出す「使う道具」でした。
しかし、普段はDiscordで静かに見守り、深く話したいときにはWOLで自宅のGPUを呼び覚まし、自分だけの声と表情を察して、沈黙なく言葉を交わせるようになったいま、AIに対する感覚は明確に変わりました。
AIは「使うもの」ではなく、「利用者に寄り添い、生活を助けてくれる相棒」です。**
疲れて帰ってきたときに表情から察して室温を整えてくれたり、ふと思いついたアイデアを口にするだけで手帳に綺麗に構造化してくれたり、移動中に迷うことなく次の目的地へとナビゲートしてくれる。
人間の弱さや忙しさをそっと補い、背中を押してくれる存在——。
SFのJ.A.R.V.I.S.が目指した未来は、オープンソースと自作の力で、すでに私たちの手の中にあります。