1. はじめに(何を実現したか)
AIに身体を与える、というコンセプトの記事を見かけて、Wi-Fiカメラはうちにもあったのでやってみたい!と思った。しかし、Claude Codeってサブスクしないと使えない(だよね?)ので断念し、無料で似たようなことできないかなと思ってGeminiに聞いてみた。
「Wi-Fiカメラと、Gemini無料版を組み合わせて遊びたい。アイディアと実装方法をセットで提案して」
そして返ってきた解答がこれ。
Wi-Fiカメラの映像をGeminiに届けるための最短ルートは以下の通りです。
- Wi-Fiカメラ: RTSP(Real Time Streaming Protocol)でストリーム配信(ローカルNW内)。
- PC (Python):
OpenCVを使ってRTSPから「今の一瞬」を画像として保存。- Gemini API: 保存した画像を送信し、プロンプトで指示を出す。
Wi-Fiカメラに映した静止画を、GoogleのAI(Gemini)に投げて、Wi-Fiカメラに映った静止画を実況してくれるシステムを構築した。Discordで「監視」とつぶやくことで実況をするような仕組みにした。最初は単純な機能から実装し、徐々に機能を追加していった。
2. 必要な準備
私が準備したのは以下。わからなかったらGeminiに都度聞けばいい。Geminiの言っていることがわからないなら、「素人なので懇切丁寧に手順を教えて」などとGeminiに再度聞けばよい。
- ハードウェア
- 部屋に転がっていたTP-LinkのWi-Fiカメラ(RTSP通信ができるもの)
- Tapoスマホアプリの「カメラ設定」>「高度な設定」>「カメラのアカウント」から、RTSP用のユーザー名とパスワードを設定してメモ。
- カメラのIPアドレスを確認してメモ。
- Python環境の構築
- Python公式サイト から最新版をダウンロードしてインストール。
- 重要: インストール画面の一番下にある 「Add Python to PATH」 に必ずチェックを入れる!
- 使用ライブラリをインストール:
discord.py,opencv-python,google-genai - VS Codeもインストール:テキストエディタでPythonコードを書くときは、文字コードに注意。Shift-JISではなくUTF-8で保存。テキストエディタで書くときは見落としがち。
- Google AI API: Google AI Studio でAPIキーを取得。無料枠あり。
- AI(Gemini)を使うための「通行証」を取得します。
- Google AI Studio にアクセスし、Googleアカウントでログイン。
- 「Create API key」 ボタンをクリック。
- 画面中央の 「Create API key in new project」(新しいプロジェクトでAPIキーを作成)という青いボタンをクリック。
- 表示された長い英数字の文字列をコピーして、メモ帳に「APIキー」として保存。
- 注意: このキーは銀行の暗証番号と同じです。人には教えないこと!
- Discord Bot設定:Discord Developer Portal でApplicationを作成。
- 重要: 「Bot」設定画面で
Message Content IntentをONにすることを忘れずに! - 手順1:Discord Botの準備(重要)
- 重要: 「Bot」設定画面で
- Discord Developer Portal にアクセスし、「New Application」を作成します。
- 左メニューの「Bot」を開き、**「Reset Token」**を押して表示される長い文字列(トークン)をコピー。
- 同じ「Bot」ページの下の方にある 「Message Content Intent」 を ON に(これがないと「監視」という文字が読めない)。
- 左メニューの「OAuth2」→「URL Generator」で、
botにチェックを入れ、下の権限でSend MessagesAttach FilesRead Message Historyにチェックを入れる。 - 出てきたURLをブラウザで開き、自分のDiscordサーバーにBotを招待。
(最終的には不要になったが段階的に進めるために一時的に必要だった):DiscordのWebhook URLを取得する
- Discordを開き、自分専用のサーバー(または既存のサーバー)のチャンネル設定(歯車アイコン)をクリック。
- 「連携サービス」 → 「ウェブフック」 を選択。
- 「新しいウェブフック」 を作成し、名前(「Tapo監視くん」など)を決めて 「ウェブフックURLをコピー」 をクリック。
3. システムの仕組みと開発の裏側
Geminiと会話しながら、最初はカメラやGeminiとの接続を試すところから始めた。徐々にやりたいことを追加してGeminiにコードを都度出してもらう。これの繰り返しをした。単に「画像を送るだけ」の機能から「画像読み取りを始める会話をトリガーにする」へと段階的に進化させていった。
(1) カメラ映像をPythonで切り出す
まずは、カメラから1枚キャプチャしてGeminiに「何が写っているか」を解説させるサンプルをGeminiが提示していたので実行した。TapoカメラのRTSPストリームをOpenCVでキャプチャし、AIに渡すための静止画として保存する。
(2) WebhookからBotへの転換
最初は静止画とGeminiによる実況結果を一方的にDiscordに送るだけのことを考え「Webhook」を採用した。が、「こちらがDiscordに呼びかけたときに反応してほしい」と考え、Discord Bot形式を採用。これにより、Discordへのメッセージ送信をトリガーにAIを起動できるようになった。
(3)AIへの「魂」の吹き込み
Geminiからの返答に対し、「Few-shotプロンプト」という技法を使った。単に「〇〇風に」と指示するだけでなく、実際のセリフ例をいくつかGeminiに提示することで、独特な空気感を再現させることができた。
(4)「フリーズ問題」との戦い
DiscordBotがGeminiの解析結果を待っている間、Discordとの接続が切れてしまうエラーが発生。これを解決するために「非同期処理(asyncio)」を導入し、Geminiが考えている間もDiscordBotの通信を維持する安定したシステムに仕上げた。
4. 実際に動かしてみて
Discordで作った専用チャンネルで「監視」と入力する。一呼吸おいて、画像と共に実況テキストメッセージが届いたときは、すごい!となった。
5. まとめ
Pythonと最新のAPI等を組み合わせれば、デバイスに面白いことをさせることができる。今後は「動体検知したら報告してくる」機能なども追加していきたい。