Raspberry PiとChatGPTでつくるボイス・アシスタント・ロボット #1
はじめに
Zennで初めての投稿になります、はじめましてポンダッドです。
音声認識や画像認識の分野で飛躍的な進歩を遂げた人工知能ですが、ここ最近の大規模言語モデル(LLM)の登場で更なる進化が起こっていると感じます。
第3次AIブームの到来とともに、かつては熱心に音声チャットボットの個人製作を続けていました。しかしながら、文章理解の分野に関して古典的な人工無能から大きく進歩した仕組みを構築できず、挫折感を抱いていました。
しかし、近年のChatGPTの驚異的な文章理解力を目の当たりにするたびに、これを音声アシスタントに組み込んだらどうなるのかと再び好奇心が沸いてきました。
既にmeganetaaanさんのスタックちゃん[1]など、完成度の高い作品も存在しますが、今回は過去個人制作の成果を活用しながら、RaspberryPiをベースにした音声チャットロボットを作成することにしました。
ロボットにはパン・チルトカメラを取り付けたので、画像認識データを得ることができます。また、温度や湿度などの各センサーのデータも得ることができます。ChatGPTがそれらのデータをどのように理解し、活用するか、非常に興味深いテーマとなりました。
ChatGPT実験ロボット "Voice Assistant Robot_GPT"
最初に、BioErrorLogさんのブログ投稿[2]を参考に、ChatGPTを使用したモーター制御の実験を行いました。ChatGPTからの応答をJSON形式で受け取り、特定の指示に応じた角度をサーボモーターの角度を制御するという内容です。例えば、「右を向いて」と指示されると、サーボモーターを指定された水平-90度の角度に制御します。
実験中試しに「少し右を向いて」と指示したところ、指定した水平-90度の半分である水平-45度でサーボモーターを制御しました。いや本当に驚きました。しかし、実験を繰り返す中で、JSONの出力が安定しないという課題も浮かび上がりました。プロンプトを指定するだけでは、ChatGPTの判断に従ってJSON形式かテキスト形式かが出力されるため、更に工夫が必要だと感じました。
その後、npakaさんやクジラ飛行机さんの書籍[3][4]を参考にして、より良い方法を模索しました。その過程でChatGPT APIに実装されているFunction calling
[5]という関数呼び出しの機能に気づきました。また、ChatGPTを含むLLMのアプリケーション・フレームワークLangChainには「エージェント」[6]という機能があり、Function calling
の実行を自律的に制御出来ることを知りました。
初期の実験ロボットでは、音声コマンドを処理するためのanalyze()
関数を作成しました。この関数を通じて、特定の条件に基づいて処理を分岐し、例えば音声コマンドが「挨拶」であれば「挨拶」関数を呼び出すといった処理を行います。
個人プロジェクトの目的は、自分が作成した関数による条件分岐を、ChatGPT / LangChainの「エージェント」に委ねることになりました。
事例紹介動画
現時点で、ChatGPTを介して音声操作を行える状態を動画で紹介します。まだ改善の余地がありますが、いくつかの事例を抜粋してみます。
0:22 😀USER: 左下を向いてください
ロボットの「エージェント」には、指示された方向に合わせてサーボモーターの水平(pan)および垂直(tilt)角度を変更するようプロンプトに記述されています(右・左・上・下・右上・右下・左上)。動画では、指定されていなかった「左下」の方向へ正確に向きを変えています。
0:37 😀USER: 少し下を向いてください
「少し」や「ちょっと」といった修飾語を使用した指示にも対応し、それに応じて水平(pan)及び垂直(tilt)の角度を調整します。動画では、指示に基づいて垂直-45度移動しています。また、「ほんの少し」などの指示にも対応し、垂直-30度〜-10度の範囲で調整されることもあります。
3:43 😀USER: ユーザー情報を調べて その興味を検索して下さい
この事例では、カメラを使用して顔認証を行い、登録されたユーザー情報から「ユーザーの関心」を抽出します。その後、検索エンジンを使用して回答を生成します。注目すべきは「エージェント」が自律的に行動を選択し、最初の関数でユーザーの関心を調べ、次の関数でそのキーワードを検索していることです。
これらの事例を通じて、ロボットが音声コマンドに応じて外部情報を取得し、自律的に動作する一連のプロセスが分かると思います。まだ完璧ではありませんが、様々な情報と指示の組み合わせにより、更に高度で柔軟な音声アシスタントロボットを開発できる可能性があると考えます。
サンプルコード
以下のリンクから 実験ロボット "Voice Assistant Robot" のサンプルコードを確認出来ます。
また、こちらのリンクから ChatGPT実験ロボット "Voice Assistant Robot_GPT" のサンプルコードを確認できます。
Discussion