この記事は古くなっています。以下の2023年版の記事を参照ください。
やりたいこと
Amazon Alexaを利用したければ、Amazon Echoを購入するのが手取り早いのですが、Alexaの機能をいろいろカスタマイズしたい場合にはEchoではできません。そこで、今回はRaspberry PiにAlexa Voice Serviceをインストールして、Raspberry PiでAmazon Echoを作ってみようと思います。
用意するモノ
①Raspberry Pi
まずは、今回のキーとなるRaspberry Piです。RaspberryPi 4Bも販売されていますが、今回は手元にあった3B+を利用します。新規に購入するのであれば、Raspberry 4Bをお勧めします!
②スピーカ
Alexaが喋るためのスピーカです。今回は「300円の割りに音質が良い」と評判のダイソーの300円スピーカを利用します。電源をUSBから取れるので、ACアダプタが不要で電源周りをスッキリできるのもポイントです。
③マイク
Alexaに話しかけるためのマイクです。今回は、集音性が高い(?)との噂の「PLOY pc USBマイク」を利用します。なお、このマイクはRaspberry Piをサポートしていない旨がAmazonのページにも書かれているのですが、搭載しているチップは「iTalk-02」というものであり、Raspberry Piでの動作が確認されています。私もバッチリ動きました!!
Raspberry PiへのAlexaのインストール手順
それでは、Raspberry PiにAlexaを搭載していきたいと思います。
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」を探し、クリックします。
③製品を選択
「製品」をクリックします。
④製品を作成する
次に、画面右上の「製品を作成する」ボタンをクリックします。
⑤製品情報の入力
製品情報の入力画面では、以下のように入力して「次へ」ボタンをクリックします。
・製品名:RaspiAlexa ※なんでもOKです
・製品ID:RaspiAlexa※なんでもOKです
・製品タイプ:Alexa内蔵の端末
・コンパニオンアプリを使用するか:いいえ
・製品カテゴリ:スマートホーム ※なんでもOKです
・製品概要:Alexa搭載のRaspberryPi ※なんでもOKです
・どのようにやり取りするか:ハンズフリー
・商品として配信するか:いいえ
・Alexa for Businessのために使用:いいえ
・AWS IoTコアアカウントに関連付け:いいえ
・13歳以下の子供向け:いいえ
⑥LWAセキュリティプロファイルの作成
LWAセキュリティプロファイルの選択画面が表示されたら「プロフィールを新規作成する」を選択します。
⑦プロファイル名の入力
セキュリティプロファイル名とプロファイル記述の入力欄が表示されるので、以下のように入力して「次へ」ボタンをクリックします。
・プロファイル名:RaspiAlexaのセキュリティプロファイル ※なんでもOKです
・プロファイル記述:RaspiAlexaのセキュリティプロファイル ※なんでもOKです
⑧クライアントIDの作成
画面の下半分あたりに「プラットフォーム情報」の欄がありますので、そこで「他のデバイスやプラットフォーム」のタブを選択します。次に「クライアントID」に「RaspiAlexa」など適当に入力して「一般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へのRasbianのインストール手順は、省略するので、他のサイトなどを参照してインストールして、SSHとVNCでログインできるようにしておいて下さい。
①マイクとスピーカの接続
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」にアクセスします。ログインして、画面左側の「設定」メニューを選択します。すると、先ほど認証した「RaspiAlexa」がリストに出てくるので、これを選択します。
そして、デバイスのタイムゾーンを「アジア」「日本標準時(東京)」に変更します。
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.
おわりに
今回は、Raspberry PiにAlexa Voice Serviceをインストールして、Raspberry PiでAmazon Echoを作ってみました。SampleAppは単体でも良くできていますが、このプログラムを変更することで、Alexaを活用したデバイスを作ることができます!
コメント