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」でした。

root@raspberrypi:/home/pi# cat /proc/asound/modules 
 0 snd_bcm2835
 1 snd_usb_audio
root@raspberrypi:/home/pi# arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: iTalk02 [iTalk-02], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

③入出力デバイスの選択

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

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

④録音テスト

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

root@raspberrypi:/home/pi# arecord -D plughw:1,0 test.wav
録音中 WAVE 'test.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル

^Cシグナル 割り込み で中断...
arecord: pcm_read:2145: 読込エラー: システムコール割り込み

⑤再生テスト

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

root@raspberrypi:/home/pi# aplay test.wav 
再生中 WAVE 'test.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル

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

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

root@raspberrypi:/home/pi# systemctl stop flask.service

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

Alexa Voice Serviceのビルド

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

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

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

root@raspberrypi:/home/pi# mkdir alexa
root@raspberrypi:/home/pi# cd alexa

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

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

root@raspberrypi:/home/pi/alexa# wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/setup.sh

root@raspberrypi:/home/pi/alexa# wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/genConfig.sh

root@raspberrypi:/home/pi/alexa# wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/pi.sh

③config.jsonの配置

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

root@raspberrypi:/home/pi/alexa# ls
config.json  genConfig.sh  pi.sh  setup.sh

④setup.shの実行

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

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

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

root@raspberrypi:/home/pi/alexa# bash setup.sh config.json
################################################################################
################################################################################
AVS Device SDK Raspberry pi Script - Terms and Agreements

The AVS Device SDK is dependent on several third-party libraries, environments, 
and/or other software packages that are installed using this script from 
third-party sources ("External Dependencies"). These are terms and conditions 
associated with the External Dependencies 
(available at https://github.com/alexa/avs-device-sdk/wiki/Dependencies) that 
you need to agree to abide by if you choose to install the External Dependencies.

If you do not agree with every term and condition associated with the External 
Dependencies, enter "QUIT" in the command line when prompted by the installer.
Else enter "AGREE".
################################################################################
################################################################################
AGREE
// To enable DEBUG, build with cmake option -DCMAKE_BUILD_TYPE=DEBUG. By default it is built with RELEASE build.
// And run the SampleApp similar to the following command.
// e.g. ./SampleApp /home/ubuntu/.../AlexaClientSDKConfig.json /home/ubuntu/KittAiModels/ DEBUG9"
 **** Completed Configuration/Build ***

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

⑤startsample.shの編集

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

#PA_ALSA_PLUGHW=1 ./SampleApp "/home/pi/alexa/build/Integration/AlexaClientSDK\
Config.json" "/home/pi/alexa/third-party/alexa-rpi/models" DEBUG9

PA_ALSA_PLUGHW=1 ./SampleApp "/home/pi/alexa/build/Integration/AlexaClientSDK\
Config.json" "/home/pi/alexa/third-party/alexa-rpi/models" INFO

⑥startsample.shの実行

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

root@raspberrypi:/home/pi/alexa# bash startsample.sh
・・・・省略
###################################################################################
#To authorize, browse to: 'https://amazon.com/us/code' and enter the code: EQHEL8 #
###################################################################################

⑦端末の認証

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

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

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

###########################
#       Authorized!       #
###########################

⑧言語の設定

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

c
+----------------------------------------------------------------------------+
|                          Setting Options:                                  |
|  Press '1' followed by Enter to see language options.                      |
|  Press '2' followed by Enter to see Do Not Disturb options.                |
|  Press '3' followed by Enter to see wake word confirmation options.        |
|  Press '4' followed by Enter to see speech confirmation options.           |
|  Press '5' followed by Enter to see time zone options.                     |
|  Press '6' followed by Enter to see the Alarm Volume Ramp options.         |
|  Press 'q' followed by Enter to exit Settings Options.                     |
+----------------------------------------------------------------------------+
1
+----------------------------------------------------------------------------+
|                          Language Options:                                  
|
| Press '1' followed by Enter to change the locale to de-DE
| Press '2' followed by Enter to change the locale to en-AU
| Press '3' followed by Enter to change the locale to en-CA
| Press '4' followed by Enter to change the locale to en-GB
| Press '5' followed by Enter to change the locale to en-IN
| Press '6' followed by Enter to change the locale to en-US
| Press '7' followed by Enter to change the locale to es-ES
| Press '8' followed by Enter to change the locale to es-MX
| Press '9' followed by Enter to change the locale to es-US
| Press '10' followed by Enter to change the locale to fr-CA
| Press '11' followed by Enter to change the locale to fr-FR
| Press '12' followed by Enter to change the locale to hi-IN
| Press '13' followed by Enter to change the locale to it-IT
| Press '14' followed by Enter to change the locale to ja-JP
| Press '15' followed by Enter to change the locale to pt-BR
| Press '16' followed by Enter to change the locale combinations to ["en-CA","fr-CA"]
| Press '17' followed by Enter to change the locale combinations to ["fr-CA","en-CA"]
| Press '0' followed by Enter to quit.
+----------------------------------------------------------------------------+
14
2020-02-03 10:05:11.803 [  1] I LocaleWakeWordsSetting:setLocales:locales=["ja-JP"]
###################################
#       Locale is ["en-US"]       #
###################################

2020-02-03 10:05:11.805 [  f] I LocaleAssetsManager:changeAssets:Locale=["ja-JP"],WakeWords=["ALEXA"]
###################################
#       Locale is ["ja-JP"]       #
###################################

⑨応答音の設定

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

3
+----------------------------------------------------------------------------+
|                 Wake Word Confirmation Configuration:                      |
|                                                                            |
| Press 'E' followed by Enter to enable this configuration.                  |
| Press 'D' followed by Enter to disable this configuration.                 |
| Press 'q' followed by Enter to quit this configuration menu.               |
+----------------------------------------------------------------------------+
E
##############################################
#       WakeWordConfirmation is "NONE"       #
##############################################

2020-02-03 10:09:40.029 [  c] I Setting:handleSetValue:value="TONE"
##############################################
#       WakeWordConfirmation is "TONE"       #
##############################################

⑩タイムゾーンの設定

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

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

11.テスト1

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

t
############################
#       Listening...       #
############################
・・・省略
###########################
#       Thinking...       #
###########################
・・・省略
###########################
#       Speaking...       #
###########################

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のものに書き換えます。

変更前
CMAKE_PLATFORM_SPECIFIC=(-DSENSORY_KEY_WORD_DETECTOR=ON \
    -DGSTREAMER_MEDIA_PLAYER=ON -DPORTAUDIO=ON \
    -DPORTAUDIO_LIB_PATH="$THIRD_PARTY_PATH/portaudio/lib/.libs/libportaudio.$LIB_SUFFIX" \
    -DPORTAUDIO_INCLUDE_DIR="$THIRD_PARTY_PATH/portaudio/include" \
    -DSENSORY_KEY_WORD_DETECTOR_LIB_PATH=$THIRD_PARTY_PATH/alexa-rpi/lib/libsnsr.a \
    -DSENSORY_KEY_WORD_DETECTOR_INCLUDE_DIR=$THIRD_PARTY_PATH/alexa-rpi/include)


変更後
CMAKE_PLATFORM_SPECIFIC=(-DKITTAI_KEY_WORD_DETECTOR=ON \
    -DGSTREAMER_MEDIA_PLAYER=ON -DPORTAUDIO=ON \
    -DPORTAUDIO_LIB_PATH="$THIRD_PARTY_PATH/portaudio/lib/.libs/libportaudio.$LIB_SUFFIX" \
    -DPORTAUDIO_INCLUDE_DIR="$THIRD_PARTY_PATH/portaudio/include" \
    -DKITTAI_KEY_WORD_DETECTOR_LIB_PATH=$THIRD_PARTY_PATH/snowboy/lib/rpi/libsnowboy-detect.a \
    -DKITTAI_KEY_WORD_DETECTOR_INCLUDE_DIR=$THIRD_PARTY_PATH/snowboy/include)

②Snowboyのダウンロード設定

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

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

変更前
  #get sensory and build
  echo
  echo "==============> CLONING AND BUILDING SENSORY =============="
  echo

  cd $THIRD_PARTY_PATH
  git clone git://github.com/Sensory/alexa-rpi.git
  bash ./alexa-rpi/bin/license.sh


変更後
  #get snowboy and build 
  echo
  echo "==============> CLONING AND BUILDING SNOWBOY =============="
  echo

  cd $THIRD_PARTY_PATH
  git clone https://github.com/Kitt-AI/snowboy.git

③マイク感度の変更設定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に設定されています。

変更前
  /// The sensitivity of the Kitt.ai engine.
  static const double KITT_AI_SENSITIVITY = 0.6;

  /// The audio amplifier level of the Kitt.ai engine.
  static const float KITT_AI_AUDIO_GAIN = 2.0;


変更後
  /// The sensitivity of the Kitt.ai engine.
  double KITT_AI_SENSITIVITY = 0.6;

  /// The audio amplifier level of the Kitt.ai engine.
  float KITT_AI_AUDIO_GAIN = 2.0;

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

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

変更前
    const std::string& pathToInputFolder) {
#if defined(KWD_KITTAI)
    return alexaClientSDK::kwd::KittAiKeyWordDetector::create(


変更後
    const std::string& pathToInputFolder) {
#if defined(KWD_KITTAI)
    std::cout << "KITT_AI_SENSITIVITY=" << KITT_AI_SENSITIVITY << std::endl;
    std::cout << "KITT_AI_AUDIO_GAIN=" << KITT_AI_AUDIO_GAIN << std::endl;
    return alexaClientSDK::kwd::KittAiKeyWordDetector::create(

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

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

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

変更前
  #ifdef RANGE_CONTROLLER
  #include "SampleApp/ModeControllerHandler.h"
  #endif

  namespace alexaClientSDK {
  namespace sampleApp {

変更後
  #ifdef RANGE_CONTROLLER
  #include "SampleApp/ModeControllerHandler.h"
  #endif

  bool IS_SYSTEMD=false;

  namespace alexaClientSDK {
  namespace sampleApp {

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

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

変更前
    while (true) {
        char x;
        if (!readConsoleInput(&x)) {

変更後
    while (true) {
        if(IS_SYSTEMD == true){
            std::this_thread::sleep_for(std::chrono::hours(1));
            continue;
        }
        char x;
        if (!readConsoleInput(&x)) {

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

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

} else if (strcmp(argv[i], "-L") == 0) {
    if (i + 1 == argc) {
        ConsolePrinter::simplePrint("No debugLevel specified for -L option");
        return SampleAppReturnCode::ERROR;
    }
    logLevel = std::string(argv[++i]);
}
//---------ここから追加---------------------------
  else if (strcmp(argv[i], "-KITT_AI_SENSITIVITY") == 0) {
    if (i + 1 == argc) {
        ConsolePrinter::simplePrint("No KITT_AI_SENSITIVITY specified for -KITT_AI_SENSITIVITY option");
        return SampleAppReturnCode::ERROR;
    }
    extern double KITT_AI_SENSITIVITY;
    KITT_AI_SENSITIVITY = std::stod(argv[++i]);
} else if (strcmp(argv[i], "-KITT_AI_AUDIO_GAIN") == 0) {
    if (i + 1 == argc) {
        ConsolePrinter::simplePrint("No KITT_AI_AUDIO_GAIN specified for -KITT_AI_AUDIO_GAIN option");
        return SampleAppReturnCode::ERROR;
    }
    extern float KITT_AI_AUDIO_GAIN;
    KITT_AI_AUDIO_GAIN = std::stof(argv[++i]);
} else if (strcmp(argv[i], "-SYSTEMD") == 0) {
    extern bool IS_SYSTEMD;
    IS_SYSTEMD = true;
}
//---------ここまで追加---------------------------
else {
    ConsolePrinter::simplePrint(
        "USAGE: " + std::string(argv[0]) + " -C <config1.json> -C <config2.json> ... -C <configN.json> " +
        " -K <path_to_inputs_folder> -L <log_level>");
    return SampleAppReturnCode::ERROR;
}

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

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

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

変更前
  PA_ALSA_PLUGHW=1 ./SampleApp "$OUTPUT_CONFIG_FILE" "$THIRD_PARTY_PATH/alexa-rpi/models" DEBUG9

変更後
  PA_ALSA_PLUGHW=1 ./SampleApp -C "$OUTPUT_CONFIG_FILE" -K "$THIRD_PARTY_PATH/snowboy/resources" -L INFO -KITT_AI_SENSITIVITY 0.8 -KITT_AI_AUDIO_GAIN 0.4

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

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

root@raspberrypi:/home/pi/Alexa# apt install libatlas-base-dev

⑩再ビルドの実行

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

root@raspberrypi:/home/pi/Alexa# mv build build-1
root@raspberrypi:/home/pi/alexa# bash setup.sh config.json

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

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

root@raspberrypi:/home/pi/alexa# cd third-party/snowboy/resources
root@raspberrypi:/home/pi/alexa/third-party/snowboy/resources# cp alexa/alexa-avs-sample-app/alexa.umdl ./

12.テストと調整

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

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

root@raspberrypi:/home/pi/alexa# bash startsample.sh

Alexaの自動起動の設定

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

①startsample.shのコピー

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

root@raspberrypi:/home/pi/alexa# cp startsample.sh alexa-service.sh
root@raspberrypi:/home/pi/alexa# chmod 755 alexa-service.sh 

②alexa-service.shの編集

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

#!/bin/bash

export SHELL=/bin/bash
export LANGUAGE=ja_JP.UTF-8
export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

cd "/home/pi/alexa/build/SampleApp/src"

  PA_ALSA_PLUGHW=1 ./SampleApp -C "/home/pi/alexa/build/Integration/AlexaClientSDKConfig.json" -K "/home/pi/alexa/third-pa\
rty/snowboy/resources" -L INFO -KITT_AI_SENSITIVITY 2.0 -KITT_AI_AUDIO_GAIN 0.8 -SYSTEMD

③alexa-service.shの実行確認

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

root@raspberrypi:/home/pi/alexa# ./alexa-service.sh

④alexa.serviceファイルの作成

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

[Unit]
Description = Alexa for SecCameraServer
[Service]
Restart = always
WorkingDirectory=/home/pi/alexa/
ExecStart = /home/pi/alexa/alexa-service.sh
ExecReload = /bin/kill -s HUP ${MAINPID}
ExecStop=/bin/kill -s TERM ${MAINPID}
[Install]
WantedBy = multi-user.target

⑤systemdからの起動

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

root@raspberrypi:/home/pi/alexa# systemctl start alexa.service
root@raspberrypi:/home/pi/alexa# systemctl status alexa.service
● alexa.service - Alexa for SecCameraServer
   Loaded: loaded (/etc/systemd/system/alexa.service; disabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-02-04 10:46:27 JST; 4s ago
 Main PID: 17787 (alexa-service.s)
    Tasks: 23 (limit: 2077)
   Memory: 11.3M
   CGroup: /system.slice/alexa.service
           ├─17787 /bin/bash /home/pi/alexa/alexa-service.sh
           └─17788 ./SampleApp -C /home/pi/alexa/build/Integration/AlexaClientSDKConfig.json -K /home/pi/alexa/third-party/

⑥自動起動の設定

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

root@raspberrypi:/home/pi/alexa# systemctl enable alexa.service
Created symlink /etc/systemd/system/multi-user.target.wants/alexa.service → /etc/systemd/system/alexa.service.

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で音声通知 ←次はこれ

関連記事

記事が参考になったら、ブログランキングに協力(クリック)して貰えると嬉しいです。

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

naka-kazzをフォローする
スマートホーム開発者向け
スポンサーリンク
naka-kazzをフォローする
スマートホーム×DIY

コメント

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

    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. ちなみに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. sudo apt upgradeを実行したらエラーはでなくなりました。

  4. 以下の指定で設定メニューが出ません。
    >⑩タイムゾーンの設定
    >次に、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. 設定メニューが出ません。