RaspberryPi ラズパイ(Python) ラズパイでこんなのできるよ

ラズパイでSiri風スマートスピーカー作ってみた

どうも。まっきーです!ラズパイで、Siri風のスマートスピーカーを作成してみました。

とりあえずどんなものか説明するのは大変なので、完成したものをご覧ください。

こんな感じで、言った言葉に反応して何かしらのアクションをするという仕組みです。実際、Siriの足元にも及ばないですが、何かを作った!という達成感は得られるのではないでしょうか。

この記事を見るだけで実装できるように説明していきます!詳しく知りたい方は、各機能の参考リンクも貼っておくのでそちらを参考にしてください!

目的

作成する前に立てた目的は、

話しかけたことに反応して写真撮影などをしてくれる機能

の実装です。

今まで学習してきた様々な機能を使用したいと考えました。

学習してきた内容
  • Juliusを用いた音声認識
  • OpenJtalkによる音声発信
  • OpenCvによる顔認識
  • LED点灯・消灯
  • DHT11 を用いた温湿度測定

音声認識を主軸とし、これらの機能全てを盛り込みました(笑)

使用したもの

今回使用したものを以下に記載します。基本的にはAmazonで手に入ります。スピーカーは100均で買いました。

  • RaspberryPi 3B+
  • ラズパイカメラモジュール
  • USBマイク
  • USBスピーカー(100均で300円で買えます)
  • LED1つ
  • DHT11 温湿度センサー
  • ジャンパー線5本(オス・メス)
  • 抵抗(1kΩ)

全体フロー図

全体のフロー図です。

特定の言葉に反応して各機能を開始する仕組みにしました。では実際に作成していきます!

スマートスピーカー作成の手順

ディレクトリ構想

ディレクトリの階層は以下のようになっています。

少し複雑ですが簡単に言うと、「SiriPJT」というディレクトリの中に

  • FacialRecognition 顔認識のためのディレクトリ
  • Julius Juliusを使用するためのディレクトリ
  • dht11 温湿度のためのディレクトリ
  • その他機能ごとのスクリプトファイル

が入っているということです。それぞれのソースコードは後述します。

回路図

LEDとDHT11で簡単な回路を作成します。

必要なモジュール・ライブラリ等のインストール

ディレクトリ移動があるのはJuliusのみです。その他はpi直下で行ってください。

音声発信・音声認識はマイクやスピーカーの設定も必要ですので、以下の2つを参照することをおすすめします。

Julius

OpenJTalk

OpenCV

カスケード分類器のインストールは図を使って説明していますので「ラズパイ OpenCVインストール方法」をご覧ください。

GPIO・DHT11

ソースコード一覧

全て表示すると長くなるので、main.py以外のファイルは折りたたんであります。クリックしたら見ることができます。

julius.py

julius.py

Juliusのモジュールモードを起動するための関数です。

詳しくは「音声認識を使ってラズパイと会話をする(Julius,OpenJtalk使用)」を参考にしてください。

voice.py

voice.py

音声を出力する関数です。引数にt(テキスト)をとり、そのテキストの文字を読み上げます。

詳しくは「ラズパイで音声を出力する方法(OpenJTalkとAquesTalk)」を参考にしてください。

led.py

led.py

LEDを点灯・消灯させるためのクラスです。ただ光らせたり、消したりするだけなのでクラスにする必要は0ですが、自分の練習のためにクラスにしてみました。

LEDの点灯消灯については「ラズパイでLチカをやってみよう(Python)」を参考にしてください。

temp_humi.py

temp_humid.py

温度と湿度をリアルタイムで取得する関数です。

戻り値は温度と湿度の入ったテキストです。

温湿度センサーについて詳しく知りたい方は「ラズパイとDHT11で温湿度測定 with Python」を参考にしてください。

date.py

date.py

今日の日付と時間を返す関数です。

戻り値は月、日付、時間、分の書いてあるテキストです。

camera.py

camera.py

カメラを撮影する関数です。撮影するまでに3,2,1という音声を発信するためにvoice.pyをインポートして使用しています。

撮影された画像はSiriPJTの下に「pi日付.jpg」という形で保存されます。

facedetect.py

face_detect.py

知っている顔か、知らない顔かを判別して、その人の名前を返す関数です。

戻り値は、名前の入ったテキストと、信頼度を表す数字の2つです。(id:名前,conf:信頼度)

今回は私まっきーと千鳥のノブ、小池徹平をnamesリストに格納しています。

idと対応付けて名前を設定する必要があります。

顔を識別するためには

  • 写真撮影(face_cap.py)
  • 訓練データの作成(train.py)

の操作が必要です。少しだけ他のものと比べて難易度が上がりますので「ラズパイカメラとOpenCvを使って女優の顔認識してみた」を参照することをおすすめします。

main.py

メイン関数の流れは以下の通りです

  1. 上記で作成した関数やクラスをインポートする
  2. 音声認識データを取得するため、Juliusのモジュールモードとの接続を行う
  3. 認識した音声に特定に文字が含まれているかを確認し、実行
  4. ループ

コードが複数あり、ごちゃごちゃしていますがifを使ってそれぞれ分岐させているだけです。

上記のコマンドを実行すると初めの動画のように動いてくれると思います。

動かない!という方はディレクトリが違ったりする可能性が高いです。カメラやUSBなどの物理的接続なども、エラーコードを見ながら確認していきましょう!

一番CPU占有率の高いと思われる「顔認識」は以下のような結果になりました。

結構使用していることがわかると思います。音声認識などは40%ほどの使用率でした。

反省点

それらしいものを作ることができたので、個人的には満足です!

改善点・問題点として

  • コードがぐちゃぐちゃなので、クラスなどを用いてまとめる必要がある
  • 顔認識の精度が低い(良くて40%)
  • あまり実用的ではない(連続で話しかけたパターンのテストを忘れた)

などが考えられます。

もし、「ここを直すと良い」などのご意見がありましたらコメントで教えて頂けると嬉しいです。

関連サイト

これらの記事に記載されていることを参照していただければ、コードの理解が深まると思います。

【音声認識(Julius)・音声発信(OpenJTalk)】

【顔認識(OpenCV)】

【LED、温湿度】

最後までありがとうございました!

次は実用的な監視カメラの作成をしていきたいと思っています!

-RaspberryPi, ラズパイ(Python), ラズパイでこんなのできるよ

© 2020 まきろぐ Powered by AFFINGER5