🚀

Raspberry PiとChatGPTでつくるボイス・アシスタント・ロボット #2

2023/08/30に公開

voice_assitant_robot_1
ChatGPT実験ロボット "Voice Assistant Robot_GPT"

ハードウェア

ソフトウェア

仕組み

実験用ロボットの仕組みをフローチャートと共に解説します。

実験ロボット "VoiceAssistantRobot"

chart1

音声発話(ユーザー)

ユーザーの音声発話は、RaspberryPiに接続したUSBマイクから得た音声をPythonのオーディオライブラリPyAudioを使ってストリーミングします。

音声認識(Vosk)

ストリーミングデータを音声認識エンジンVoskを使いテキストに変換します。

コマンド実行(analyze関数)

独自関数analize()により、入力されたテキストが事前に登録されたコマンドと一致するか、条件分岐により振り分けを行います。

実験用に登録した実行コマンドは以下の通りです

  • 日時データ取得(datetimeモジュール)
  • WioNodeからのデータ取得(requestsモジュールを利用したGETメソッド)
  • 顔認証・物体認識(OpenCVとDNNモデルを使ったリアルタイム顔認識、物体認識)
  • サーボモーター・LEDライト制御(PanTiltHATライブラリを使用)

コマンドの実行と合わせて、ロボットの回答は事前に記述しておきます。

音声合成(Aques Talk Pi)

各コマンドの回答テキストはAques Talk Piを使って音声合成を行います。Pythonのsubprocessを使い、合成音声されたwavファイルをパイプでつなぎaplayで再生出来るようになっており、記述がシンプルに行えます。

合成音声発話(ロボット)

aplayで再生されたwavファイルをスピーカーで再生します。

ChatGPT実験ロボット "VoiceAssistantRobot_GPT"

chart2

LangChain Agent

上記チャート図のanalizeをLangChainの「エージェント」機能を使って置き換えます。ドキュメントには以下のように書かれています。

アプリケーションによっては、LLM/他のツール(tools)へのあらかじめ決められた呼び出しの連鎖(chain)だけでなく、ユーザーの入力に依存する未知の連鎖を必要とする可能性があります。このような連鎖では、一連のツールにアクセスできる "エージェント(Agent)"を活用できます。ユーザーの入力に応じて、エージェントはこれらのツールのうちどれを呼び出すかを決定することができます。
引用: Agent | 🦜️🔗 LangChain

事前に定義したtoolsの順番や実行を「エージェント」が実行します。名前が似ていて少しややこしいのですが、「エージェント」のToolモジュールを使うことで用途別のツールを利用することができます。例を挙げると、数学の計算を行うllm-mathモジュールやGoogleカスタム検索を行うgoogle-serperなどがあります。

実験用に登録したToolは以下の2つのモジュールです

  • 複雑な計算を行うツール(LLMMathChainモジュール)
  • DuckDuckGoで検索を行うツール(DuckDuckGoSearchRunモジュール)

検索モジュールはGoogle、Microsoftともに利用数に応じてAPIが有料となるため、無料で利用できるDuckDuckGo検索モジュールを選択しました。

「エージェント」はlangchainが用意したモジュールだけでなく、ChatGPTのFunction calling(関数呼び出し)機能をツールとして利用することが出来ます。以下LangChainのドキュメント引用です、

特定のOpenAIモデル(gpt-3.5-turbo-0613やgpt-4-0613など)は、関数が呼び出されるタイミングを検出し、関数に渡されるべき入力を応答するように微調整されています。API呼び出しの中で、関数を記述し、モデルがそれらの関数を呼び出すための引数を含むJSONオブジェクトを出力するようにインテリジェントに選択することができます。OpenAI関数APIのゴールは、一般的なテキスト補完やチャットAPIよりも、より確実に有効で有用な関数呼び出しを返すことです。OpenAI Functions Agentは、これらのモデルで動作するように設計されています。
引用: OpenAI functions | 🦜️🔗 LangChain

ChatGPTのプロンプトを定義する際、ヘルパー関数OpenAIFunctionsAgentを使うことで、ChatGPTのFunction calling機能をツールに指定することが出来ます。Function callingをツールとして指定する際はデコレート関数@toolで定義します。

実験用に定義した@toolは以下の通りです

  • 日時データ取得(datetimeモジュール)
  • WioNodeからのデータ取得(requestsモジュールを利用したGETメソッド)
  • 顔認証・物体認識(OpenCVとDNNモデルを使ったリアルタイム顔認識、物体認識)
  • サーボモーター・LEDライト制御(PanTiltHATライブラリを利用)

テキストに変換された音声データをChatGPT API経由で送信すると、「エージェント」が自律的にに定義したツールを選択し、実行します。その際、ChatGPTの関数呼び出し機能を「エージェント」が適切に活用し、返される関数呼び出し結果を回答します。

この仕組みにより、実験ロボットはユーザーの様々なリクエストに対して柔軟な応答やアクションを行うことが出来ます。

Discussion