- 本体: RaspberryPi4 ModelB 4GB
- パンチルトハット: Pimoroni Pan-Tilt HAT
- カラーLEDスティック: Adafruit NeoPixel Stick 8
- 熱対策(オプション) GeeekPi Fan Hat for Raspberry Pi 4 Model B
- 気温・湿度・照度・水分計測(オプション): WioNode
- USBマイク・USBスピーカー: RaspberryPiで使用可能なものを適宜使用してください
- OS: Raspberry Pi OS (64-bit) / Raspberry Pi 設定チートシート
- Python3.9.2: requirements
- 音声認識: Vosk / vosk-model-small-ja-0.22
- 音声発話: Aques Talk Pi / AquesTalk Installer
- 画像処理: OpenCV 64bit 4.5.5 / Install OpenCV on Raspberry 64 OS
- 顔認識モデル: yunet.onnx
- 顔識別モデル: face_recognizer_fast.onnx
- 性別識別モデル: gender_net.caffemodel / gender_deploy.prototxt
- 年令識別モデル: age_net.caffemodel / age_deploy.prototxt
- 物体識別モデル: frozen_inference_graph.pb / ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt / coco.names
- モーター制御・LED制御: pantilt-hat
Note Voskモデルはリンク先よりダウンロードしてください。
AquesTalkPiは利用許諾を確認の上ダウンロードしてください。
OpenCVは
yunet.onnx
を使用する場合、バージョン4.5.4以上が必要です。また4.8以降は別のモデルが必要になります。Raspberry Pi OSにOpenCVを入れる際、ソースからビルドが必要です。リンク先のサイトに行き、指示に従って進めてください。サイトの運営者がインストール用のスクリプトを提供しているので、そちらを活用してください。
画像認識用のDNNモデルは各リンク先よりダウンロードしたものです。
リビングの気温・湿度・照度・鉢植えの水分データの取得にはSeeed日本法人が用意した日本のサーバーを使用しています(日本にWioサーバーを設置しました)。サーバーのアクセストークンは
.env
ファイルに記述しています。
ユーザーの音声発話は、RaspberryPiに接続したUSBマイクから得た音声をPythonのオーディオライブラリPyAudioを使ってストリーミングします。
ストリーミングデータを音声認識エンジンVoskを使いテキストに変換します。
独自関数analize()
により、入力されたテキストが事前に登録されたコマンドと一致するか、条件分岐により振り分けを行います。
実験用に登録した実行コマンドは以下の通りです
- 日時データ取得(
datetime
モジュール) - WioNodeからのデータ取得(
requests
モジュールを利用したGETメソッド) - 顔認証・物体認識(OpenCVとDNNモデルを使ったリアルタイム顔認識、物体認識)
- サーボモーター・LEDライト制御(PanTiltHATライブラリを使用)
コマンドの実行と合わせて、ロボットの回答は事前に記述しておきます。
各コマンドの回答テキストはAques Talk Piを使って音声合成を行います。Pythonのsubprocess
を使い、合成音声されたwavファイルをパイプでつなぎaplay
で再生出来るようになっており、記述がシンプルに行えます。
aplay
で再生されたwavファイルをスピーカーで再生します。
各ライブラリをインポート後、必要なモデルをダウンロードしディレクトリに配置します。ユーザー情報の登録は
python bot_face_data_creator.py
を実行し、ユーザーID、ユーザー名、興味のあることを登録し、顔認証用の写真を撮影してください。年令・性別は自動で判別されますが、かけ離れている場合はdata/user_data.json
を手動で修正することも可能です。
data/command_data.json
でウェイクワードを設定できますので、好みのものに変更可能です。同様に終了ワードやコマンドワードも自由に変更できます。
python main.py
で実行してください。ctrl + c
でウェイクワード待機のループが終了します。