Raspberry PiにAlexaをインストールしてみる(ウェイクワードエンジン変更・感度調整・systemd設定)

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

やりたいこと

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

③入出力デバイスの選択

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」にアクセスします。ログインして、画面左側の「設定」メニューを選択します。すると、先ほど認証した「RaspiAlexa」がリストに出てくるので、これを選択します。

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

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が起動するようにしておきます。以上で全ての設定は完了です。お疲れ様でした!!

おわりに

今回は、Raspberry PiにAlexa Voice Serviceをインストールして、Raspberry PiでAmazon Echoを作ってみました。SampleAppは単体でも良くできていますが、このプログラムを変更することで、Alexaを活用したデバイスを作ることができます!

関連記事

記事が参考になったら、ブログランキングに協力(クリック)して貰えると嬉しいです。
ブログランキング・にほんブログ村へ
スポンサーリンク
naka-kazz

昼間はIT企業に勤めてますが、プライベートでは「育児×家事×IoT」をテーマに家のスマートホーム化に取り組んでいます。Androidアプリも作っているので使って下さい。
E-mail:naka.kazz.d@gmail.com

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

コメント

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