Raspberry Piで最強の防犯カメラを作ってみる(動画記録・配信、動体検知・Line通知、顔検知・顔認証、Alexa搭載)[5/6]

スマートホーム
スポンサーリンク
このエントリーをはてなブックマークに追加

やりたいこと(再掲)

最終的にやりたいことは、以下の5つの機能を持つ「最強の防犯カメラ」を作ることです。機能①〜機能③は、市販されている多くの防犯カメラでも持っている機能ですが、機能④や機能⑤の顔認証機能を持つ監視カメラはまだ多くないと思います。

 機能①.動画を24時間撮影し、カメラ本体に動画で記録する
 機能②.動画をWebブラウザや他の機器から参照できるようにライブ配信する
 機能③.動体を検知したら、静止画をLineに通知する
 機能④.家族の顔を認証したら、静止画をLineに通知する
 機能⑤.家族の顔を認証したら、◯◯さんおかえり!と喋る

家に帰ると、顔を見て「○○さん、おかえり!」と言ってくれる辺りが、スマートハウスに一歩づ近づいている気がします。

実現に向けた連載

最強の「防犯カメラ」を作成するために、以下のように少しずつに記事を書いていきます。
 1回目:カメラの設定と動画記録
 2回目:カメラ映像のライブ配信
 3回目:動体検知機能とLineへの通知
 4回目:顔認証機能とLineへの通知
 5回目:Raspberry PiへのAlexaの搭載 ←この記事
 6回目:顔認証後にAlexaで音声通知

5回目:Raspberry PiへのAlexaの搭載

前回は顔認証機能を作って、カメラが顔を認証した時にLineに通知するようにしてみました。今回は、Raspberry PiにAlexaを搭載していきたいと思います。

1.Alexa製品の登録

Raspberry PiにAlexaを搭載するためには、まずはAlexa Voice Service(AVS)搭載のデバイスとして登録する必要があります。

①Amazon Developerサイトにアクセス

まずは、PCのブラウザからAmazon Developerサイト「https://developer.amazon.com/login.html」にアクセスします。既にAmazon Echoに紐づいているAmazonアカウントを持っている人はそのアカウントでログインしましょう。

Echoに紐づいたアカウントを持っていない人は、一点注意点があります。ここでログインするアカウントはAmazon.co.jpのアカウントでのログインが必要です。AWSなどで利用しているAmazon.com(アメリカ)のアカウントではダメです。

②Alexa Voice Serviceを選択

画面の中から「Alexa Voice Service」を探し、クリックします。

③製品を選択

「製品」をクリックします。

④製品を作成する

次に、画面右上の「製品を作成する」ボタンをクリックします。

⑤製品情報の入力

製品情報の入力画面では、以下のように入力して「次へ」ボタンをクリックします。

 ・製品名:防犯カメラ ※なんでもOKです
 ・製品ID:SecCamera ※なんでもOKです
 ・製品タイプ:Alexa内蔵の端末
 ・コンパニオンアプリを使用するか:いいえ
 ・製品カテゴリ:スマートホーム ※なんでもOKです
 ・製品概要:Alexa搭載の防犯カメラ ※なんでもOKです
 ・どのようにやり取りするか:ハンズフリー
 ・商品として配信するか:いいえ
 ・Alexa for Businessのために使用:いいえ
 ・AWS IoTコアアカウントに関連付け:いいえ
 ・13歳以下の子供向け:いいえ

⑥LWAセキュリティプロファイルの作成

LWAセキュリティプロファイルの選択画面が表示されたら「プロフィールを新規作成する」を選択します。

⑦プロファイル名の入力

セキュリティプロファイル名とプロファイル記述の入力欄が表示されるので、以下のように入力して「次へ」ボタンをクリックします。

 ・プロファイル名:防犯カメラのセキュリティプロファイル ※なんでもOKです
 ・プロファイル記述:防犯カメラのセキュリティプロファイル ※なんでもOKです

⑧クライアントIDの作成

画面の下半分あたりに「プラットフォーム情報」の欄がありますので、そこで「他のデバイスやプラットフォーム」のタブを選択します。次に「クライアントID」に「SecCamera」など適当に入力して「一般ID」のボタンをクリックします。

⑨クライアントIDのダウンロード

クライアントIDが発行されるので、「ダウンロード」ボタンをクリックして「config.json」をダウンロードします。

⑩規約への同意

最後に、規約への同意のチェックをつけて「完了」ボタンをクリックします。

11.セキュリティプロアイルの有効化

次に、作成したセキュリティプロファイルを有効化するために「 https://developer.amazon.com/lwa/sp/overview.html」にアクセスし、先ほど作成したセキュリティプロファイルを選択します。そして「確認する」ボタンをクリックします。

12.プライバシー規約同意書URLの入力

「プライバシー規約同意書URL」に「https://example.com/privacy.html」など適当に入力して「保存」ボタンをクリックします。このURLにはアクセスしないので、今回のように自分だけで使う場合には、適当でOKです。

以上で、Amazonのサイト上での操作は完了です。

マイクの接続と確認

ここからは、Raspberry PiにUSBマイクとスピーカを接続してちゃんと録音・再生できるか試してみます。

①マイクとスピーカの接続

Raspberry PiのUSBポートに、USBマイクとスピーカの電源用USBケーブルを接続します。また、イヤホンジャックにスピーの入力ジャックを接続します。以下の写真の感じです。

②マイクデバイスの確認

次に「cat /proc/asound/modules」コマンドでUSBマイクが有効になっているか確認します。「snd_usb_audio」というものが表示されていればOKです。また「arecord -l」コマンドで、デバイス名を確認します。私の場合は「iTalk-02」でした。

③入出力デバイスの選択

VNCでログインして、右上のスピーカーのアイコンを”右”クリックして、Audio Outputsの欄から「Analog」を選択します。

同様にAudio Inputsの欄からUSBマイクを選択します。私の場合には「iTalk-02」がUSBデバイスなので、これを選択します。

④録音テスト

次に、接続されたマイクで録音できるか確認してみます。以下のように「arecord」コマンドを実行して、マイクに何か話しかけてください。その後「Ctrl+C」を押して録音を中止します。

⑤再生テスト

次に「aplay」コマンドで、先ほど録音した声を再生してみます。スピーカから声が聞こえない場合は、マイクやスピーカーのボリュームを調整してみて下さい。

⑥防犯カメラサービスの停止

最後に、Alexa Voice Serviceのビルドに備えて、防犯カメラサービスを停止しておきましょう。

これで、マイクとスピーカの設定は完了です。

Alexa Voice Serviceのビルド

ここからは、Raspberry PiでAlexa Voice Serviceのビルドを行っていきます。

①ビルド用のディレクトリの作成

まずは、ビルド用のディレクトリを作成しておきます。

②必要ファイルのダウンロード

Amazon Developerの公式サイトにある、以下の3つのシェルスクリプトをダウンロードします。

③config.jsonの配置

上でダウンロードしたconfig.jsonファイルを同じディレクトリに配置します。準備が整うと以下の4つのファイルがフォルダにあるはずです。

④setup.shの実行

それでは、以下のように「setup.sh」を実行しましょう。第一引数はconfig.jsonです。実行すると規約への同意を求められますので「AGREE」と入力してエンターを押します。

すると、必要なパッケージのダウンロードが開始されまます。パッケージのダウンロードとインストールに50分ぐらいかかるので、夜ご飯でも食べてゆっくり待ちましょう。

必要なパッケージがインストールされるとビルドが開始されます。すると、Sensoryのライセンスが表示されるのでエンターでスクロールして行き、「yes」を押して回答します。ここからビルドにさらに90分程度かかるので、デザートでも食べてゆっくり待ちましょう。

上記のように「Completed Configuration/Build」と表示されれば完了です。

⑤startsample.shの編集

ビルドが完了したら「startsample.sh」の内容を書き換えます。デフォルドではデバックレベルが高すぎて大量のデバックログが表示されてしまうので「DEBUG9」を「INFO」に書き換えます。

⑥startsample.shの実行

それでは「startsample.sh」を実行しましょう!すると、ログが沢山表示されるので、以下のような「Authorization Code」の表示を探して、そのコードをメモします。画面がどんどん流れていくので、上の方にスクロールして探して下さいね。

⑦端末の認証

次にhttps://amazon.com/us/codeにアクセスすると、ログイン後に認証コードを入力する画面が表示されるので、上でメモしたコードを入力します。

次に「防犯カメラのセキュリティプロファイル」が表示され、許可するか聞かれるので「Allow」ボタンをクリックします。

すると、Raspberry Piの画面に、以下のように「Authorized!」と表示されます。これで、Raspberry PiからAlexaが利用できるようになりました。

⑧言語の設定

次に、Alexaの言語を日本語に変更します。画面上で「c」を入力して設定メニューを表示させ、「1」を入力して言語の選択画面を表示させます。次に「14」を入力して、日本語(ja-JP)に変更します。

⑨応答音の設定

次にもう一度「c」を入力し、「3」を選択して応答音のメニューを表示させます。次に「E」を入力して応答音が鳴るようにします。Amazon Echoの場合は「アレクサ」と話しかけると、上部のライトが青色に光るので音声コマンド待ちになったことが分かるのですが、Raspberry Piの場合にはライトがないので分かりません。この設定を行うことで、音で「ポーン!」と教えてくれるようになります。

⑩タイムゾーンの設定

次に、PCのブラウザから「https://alexa.amazon.co.jp」にアクセスします。ログインして、画面左側の「設定」メニューを選択します。すると、先ほど認証した「防犯カメラ」がリストに出てくるので、これを選択します。

そして、デバイスのタイムゾーンを「アジア」「日本標準時(東京)」に変更します。

11.テスト1

それではAlexaの動作を確認してみましょう!「t」を入力して「ポーン!」とスピーカから音が鳴ったら、マイクに「今日の天気は?」と話しかけてみて下さい。スピーカから天気は聞こえてきましたか?ちなみに画面は以下のように表示されます。

12.テスト2

次に、「アレクサ、今日の天気は?」とウェイクワード付きで話しかけてみて下さい。うまく行けば、上と同じように天気を教えてくれます。

しかし、私の場合はいくら「アレクサ」「アレクゥサ」と話かけても応答してくれません。上で確認したように、「今日の天気は?」は聞き取れているので、マイクの問題ではなく、ウェイクワードを認識するエンジンの問題のようです。デフォルトでは「Sensory」というものが入っているのですが、これは日本語の「アレクサ」を全然認識してくれない上に、3ヶ月間のお試しライセンスなので、使えません。

AVSのカスタマイズ

とりあえずAlexaは動くようになりましたが、以下をカスタマイズして実用レベルにしていきます。

 ・ウェイクワードエンジンを「snowboy」に入れ替え
 ・マイクの感度を調整できるようにする
 ・Systemdから起動できるようにする。

①CMAKEオプションの変更

ウェイクワードエンジンを「snowboy」に入れ替えるために「pi.sh」の23行目辺りのCMAKEのオプション定義を以下のように変更します。

変更点は「DSENSORY_KEY_WORD_DETECTOR」となっている箇所を「DKITTAI_KEY_WORD_DETECTOR」に変更するのが3箇所です。1行目の変更を忘れやすいので気をつけて下さい。

また、最後の2行の「DKITTAI_KEY_WORD_DETECTOR_LIB_PATH」と「DKITTAI_KEY_WORD_DETECTOR_INCLUDE_DIR」のパスをsnowboyのものに書き換えます。

②Snowboyのダウンロード設定

Snowboyを自動的にダウンロードするために「pi.sh」の65行目辺りのウェイクワードエンジンのダウンロード部分を以下のように変更します。

変更点はSENSORYとなっている箇所をSNOWBOYと書き換える(2箇所)のと、git cloneするURLを変更します。また、最終行のライセンス表示のためのシェルスクリプト実行は不要なので削除します。

③マイク感度の変更設定1

オリジナルのAVSでは、ウェイクワードのマイク感度はハードコードされているので、マイク感度をパラメータで変更できるようにします。この変更を行うために「avs-device-sdk/KWD/KWDProvider/src/KeywordDetectorProvider.cpp」の26行目辺りを以下のように変更します。

変更点は「KITT_AI_SENSITIVITY」と「KITT_AI_AUDIO_GAIN」の「static const」を削除して定数を変数に変更しています。

ちなみに「KITT_AI_SENSITIVITY」はマイク感度の設定で、「KITT_AI_AUDIO_GAIN」はウェイクワードの大きさの設定とのことです。デフォルドでは、0.6と2.0に設定されています。

④マイク感度の変更設定2

同様に「avs-device-sdk/KWD/KWDProvider/src/KeywordDetectorProvider.cpp」の46行目辺りに2行追加し、「KITT_AI_SENSITIVITY」と「KITT_AI_SENSITIVITY」の値をコンソールに表示するように変更します。

⑤キー入力の無効化設定1

次に、systemdから起動できるように変更します。上で確認したように、オリジナルのサンプルアプリケーションはキーボードからの入力を受け付けて、各種設定ができるようになっています。しかし、systemdから起動する場合、標準入力は「/dev/null」にマッピングされるので、キー入力待ちが無く無限ループが発生し、CPUを100%使ってしまいます。

これを回避するために「avs-device-sdk/SampleApp/src/UserInputManager.cpp」の29行目に「IS_SYSTEMD」変数を追加します。namespace宣言の前に書くのがポイントです。

⑥キー入力の無効化設定2

同様に「avs-device-sdk/SampleApp/src/UserInputManager.cpp」の250行目に、IS_SYSTEMDがtrueだった場合に、1時間待った後にwhileループの先頭に戻る処理を、以下のように追加します。

⑦コマンドラインパラメータ受け取り処理の変更

次に、コマンドラインパラメータで受け取った値を、上で変更した3つのグローバル変数にセットする処理を追加します。「avs-device-sdk/SampleApp/src/main.cpp」の77行目に3つのコマンドラインパラメータの受け取り処理を、以下のように追加します。

⑧startsample.sh書き込み処理の変更

最後に「pi.sh」のstartsample.shを生成している箇所を変更し、コマンドラインパラメータでマイク感度とsystemdからの起動有無を渡すように変更します。

再度「pi.sh」を開き、78行目を以下のように書き換えます。KITT_AI_SENSITIVITYとKITT_AI_AUDIO_GAINの値は、私の環境ではこれぐらいがちょうど良かったので、一旦2.0と0.4にしておきます。また「-C」「-L」などのオプションも追加しているので、お忘れなく。

⑨snowboyに必要なライブラリのインストール

snowboyをビルドするためには、libatlasが必要なのでインストールしておきます。

⑩再ビルドの実行

念のためオリジナルのbuildフォルダをバックアップし、再度「setup.sh」を実行します。また、ビルドに1時間ぐらいかかるのでゆっくり待ちましょう。

11.alexa.umdlファイルの配置

次にsnowboy用のalexa.umdlファイルが深い場所にあるので、これを「third-party/snowboy/resources」にコピーします。

12.テストと調整

それでは、再度「startsample.sh」を実行してみましょう!今度は「アレクサ」と話かけると「ポーン!」と鳴ってウェイクワードに反応かと思います。

周りの雑音や使っているマイクによっても、反応の感度が違うので「startsample.sh」の「KITT_AI_SENSITIVITY」と「KITT_AI_AUDIO_GAIN」の値を書き換えて、調整してみて下さい。

Alexaの自動起動の設定

それでは、最後にRaspberry Piの起動時にAlexaも自動的に起動するように設定します。

①startsample.shのコピー

startsample.shをコピーして、自動起動用の「alexa-service.sh」を作成し、実行権限を与えておきます。

②alexa-service.shの編集

alexa-service.shを開き、環境変数を設定すると共に、最終行のプログラム実行部分の引数に「-SYSTEMD」を追加します。

③alexa-service.shの実行確認

次に「alexa-service.sh」を実行して確認します。startsample.shと同様に「Alexa is currently idle! 」となりますが、ここで「t」を入力してみて下さい。startsample.shでは「ポーン!」と鳴ってウェイク状態になりましたが、alexa-service.shではキー入力を受け付けないため何も起こりません。終了させるには「Ctrl+C」キーを押します。

④alexa.serviceファイルの作成

Systemd用の設定ファイルを「/etc/systemd/system/alexa.service」に以下のように作成します。

⑤systemdからの起動

それでは「systemctl start alexa.service」コマンドを実行して、systemdから以下のようにAlexaを起動してみましょう。ちゃんと起動したかは「systemctl status alexa.service」コマンドで確認できます。「Active: active (running) 」となっていれば、起動しています。

⑥自動起動の設定

最後に「systemctl enable alexa.service」コマンドを実行して、Raspberry Pi起動時に自動的にAlexaが起動するようにしておきます。以上で全ての設定は完了です。お疲れ様でした!!

CPU・メモリ使用率

動画配信・記録、動体検知・line通知、顔検知・顔認証機能、Alexaを含む防犯カメラをRaspberry Pi 3B+で実行した時のCPU使用率、メモリ使用率は以下のとおりでした。

・平常時(動画記録・配信+Alexaアイドル)

・繁忙時(動体検知+Alexaがリスニング中)

この結果からも、十分にRaspberry Pi 3B+で動作可能です。

おわりに

今回は防犯カメラにAlexaを搭載し、音声コマンドを受け取っておしゃべりできるようにしてみました。我が家は、Alexaから照明やエアコンが操作できるようになっているので、これで家に帰ってきたら、防犯カメラに「おかえり」というだけで、照明やエアコンが付けれるようになりました。次回は、防犯カメラで家族の顔を認証したら「○○さんおかえり!」とAlexaが喋るようにしてみたいと思います。

間違い・改善点や質問など、あったらコメント欄に書いていただければと思います。

連載記事

 1回目:カメラの設定と動画記録
 2回目:カメラ映像のライブ配信
 3回目:動体検知機能とLineへの通知
 4回目:顔認証機能とLineへの通知
 5回目:Raspberry PiへのAlexaの搭載
 6回目:顔認証後にAlexaで音声通知 ←次はこれ

関連記事

Alexaをしゃべらせる(Node-red編)
やりたいことNode-redでnode-red-contrib-amazon-echoやnode-red-contrib-alexa-home-skillのパレットを使うと、Alexaに音声で話しかけることをトリガーにNode-redの処理
自分のGoogleカレンダーにJWTを使って予定を追加してみる
今回は、JWT(JSON Web Token)を使って、ブラウザからのログイン操作なしで特定のGoogleカレンダーに予定を追加することをやってみます。
Alexaに通知を送る(Node-red編)
今回は、Alexaに「通知」を送ることをやってみたいと思います。ちなみに、この通知を送る機能は「プロアクティブイベントAPI」という物を利用しますが、少々実装が面倒なのが難点です。
Node-redでスマートハウス-LG製テレビを操作してみる(1/5)
はじめに我が家にも有機ELテレビがやってきました。国産メーカのテレビも、有機ELパネルはほとんどがLG製のパネルを利用しているらしく「同じパネルなら安い方がいいんじゃない?」という事でOLED 55C7Pを購入!このLG製のテレビ、内部はw
Node-redでスマートハウス-Gravioで子供用プリキュアボタン
今回は、Gravioのボタンセンサーを使って、2歳の子供でもテレビのアプリをyoutubeにして、プリキュアの動画を再生できる「プリキュアボタン」を作りたいと思います。
Gravioでミルク&オムツ交換記録をGoogleカレンダにつけてみる
子育てをしていると両手が塞がっていたり、手が汚かったりすることが本当多いんです。なので、スマホを手に取って、ロック解除して、記録アプリを開いて、時間・種類などをいちいち入力することはホント面倒です。今回は「赤ちゃんボタン」を作って、ボタンを押すだけでミルク&おむつ交換の記録がワンプッシュで記録することをやってみます。
Node-redだけで簡易Alexaアプリを作ってみる「アレクサ、雨雲きてる?」
今回はASKを使わずNode-redだけを使って、自分用の簡易Alexaアプリを作ることをやってみたいと思います。
HomeAssistantでスマートホームコントローラを作ってみる[1/6]
家の中にIoT機器が増えてくると、スマホのリモコンアプリやHEMSのパネルなど、情報や操作がバラバラになってきます。そこで、今回はHome Assistantを使って家の中のIoT機器を一元管理できるようにしてみたいと思います。
記事が参考になったら、ブログランキングに協力(クリック)して貰えると嬉しいです。
スポンサーリンク
naka-kazz

昼間はIT企業に勤めてますが、プライベートでは「育児×家事×IoT」をテーマに家のスマートホーム化に取り組んでいます。Androidアプリも作っているので使って下さい。質問・コメントは、↓のコメント蘭でもFacebookメッセンジャーでもどちらでも大丈夫です。
E-mail:naka.kazz.d@gmail.com

naka-kazzをフォローする
スマートホーム 開発者向け
naka-kazzをフォローする
育児×家事×IoT

コメント

  1. ish2207 より:

    以下のエラーで録音できません。
    何がわるいでしょうか?

    root@raspberrypi:/home/pi/camera# arecord -l
    **** ハードウェアデバイス CAPTURE のリスト ****
    カード 3: iTalk02 [iTalk-02], デバイス 0: USB Audio [USB Audio]
    サブデバイス: 1/1
    サブデバイス #0: subdevice #0
    root@raspberrypi:/home/pi/camera# arecord -D plughw:1,0 test.wav
    arecord: main:828: audio open error: そのようなファイルやディレクトリはありません

  2. ish2207 より:

    ちなみにplughw:3,0だとarecord: set_params:1403: hw params のインストールに失敗しました:
    のエラーとなります。

    root@raspberrypi:/home/pi# arecord -D plughw:3,0 mic.wav
    録音中 WAVE ‘mic.wav’ : Unsigned 8 bit, レート 8000 Hz, モノラル
    arecord: set_params:1403: hw params のインストールに失敗しました:
    ACCESS: RW_INTERLEAVED
    FORMAT: U8
    SUBFORMAT: STD
    SAMPLE_BITS: 8
    FRAME_BITS: 8
    CHANNELS: 1
    RATE: 8000
    PERIOD_TIME: 125000
    PERIOD_SIZE: 1000
    PERIOD_BYTES: 1000
    PERIODS: 4
    BUFFER_TIME: 500000
    BUFFER_SIZE: NONE
    BUFFER_BYTES: 4000
    TICK_TIME: 0

  3. ish2207 より:

    sudo apt upgradeを実行したらエラーはでなくなりました。

  4. ish2207 より:

    以下の指定で設定メニューが出ません。
    >⑩タイムゾーンの設定
    >次に、PCのブラウザから「https://alexa.amazon.co.jp」にアクセスします。ログインして、画面左側の「設定」メニューを選択します。
    >すると、先ほど認証した「防犯カメラ」がリストに出てくるので、これを選択します。

    コンソール上は3990065800が出力されています
    ##############################################
    # WakeWordConfirmation is “TONE” #
    ##############################################

    2020-09-27 09:52:24.360 [ 4] I Setting:handleSetValue:value=”TONE”3990065800
                         
    ##############################################
    # WakeWordConfirmation is “TONE” #
    ##############################################

  5. ish2207 より:

    設定メニューが出ません。

タイトルとURLをコピーしました