やりたいこと
2020年に以下の記事で、Raspberry PiにAmazon Alexaをインストールする記事を掲載しました。あれから3年、Raspberry PiのOSはRaspbianからRaspberry Pi OSへ進化し、AlexaのベースとなるAlexa Voice Service(AVS) SDKもVersion 3.0が公開され、大きく環境が変化しました。
我が家では、今日も変わらずAlexaが元気に振る舞ってくれているので気づいていませんでしたが、当ブログの読者の方から「ブログの通りにやってもうまくいかない」とのコメントをいただきました。
そこで最新のRaspberry Pi OSに最新のAVS SDK v3.0をインストールしてみることにしました。最初は「バージョンが違うだけで少し手順を見直せば大丈夫!」と思っていましたが、実際にやってみるとすごく大変でした💦試行錯誤すること2ヶ月、ようやく動くようになったので、記録として残しておきたいと思います。
用意するモノ
①Raspberry Pi
まずは、今回のキーとなるRaspberry Piです。今回は手元にあった4B(4GB)を利用します。
②スピーカ
Alexaが喋るためのスピーカです。今回は「300円の割りに音質が良い」と評判のダイソーの300円スピーカを利用します。電源をUSBから取れるので、ACアダプタが不要で電源周りをスッキリできるのもポイントです。
③マイク
Alexaに話しかけるためのマイクです。今回は、集音性が高い(?)との噂の「pc USBマイク」を利用します。なお、Raspberry Piでもバッチリ動きました!!
Raspberry PiへのAlexaのインストール手順
それでは、Raspberry PiにAlexa(AVS)をインストールしていきます。
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」をダウンロードします。この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へのRaspberry Pi OSのインストール手順は省略するので、他のサイトなどを参考にインストールして、SSHとVNCでログインできるようにしておいて下さい。
当記事では以下の「2023年2月版の Raspberry Pi OS 32bit」を使っています。
1 2 3 4 |
$ cat /etc/debian_version 11.6 $ uname -a Linux raspberrypi 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr 3 17:24:16 BST 2023 aarch64 GNU/Linux |
①マイクとスピーカの接続
Raspberry PiのUSBポートに、USBマイクとスピーカの電源用USBケーブルを接続します。また、イヤホンジャックにスピーカーの入力ジャックを接続します。以下の写真の感じです。
②マイクデバイスの確認
次に「cat /proc/asound/modules」コマンドでUSBマイクが有効になっているか確認します。「snd_usb_audio」というものが表示されていればOKです。また「arecord -l」コマンドで、デバイス名を確認します。私の場合は「USB PnP Sound Device」でした。カード番号とデバイス番号は後で使うのでメモしておきましょう。
1 2 3 4 5 6 7 8 9 10 |
$ cat /proc/asound/modules 0 snd_bcm2835 1 snd_usb_audio 2 vc4 3 vc4 $ arecord -l **** ハードウェアデバイス CAPTURE のリスト **** カード 1: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio] サブデバイス: 1/1 サブデバイス #0: subdevice #0 |
③スピーカデバイスの確認
「aplay -l」コマンドを実行して、スピーカデバイスを確認します。Raspberry Pi 4はHDMIポートが2つ付いているので「vc4hdmi0」と「vc4hdmi1」というものが表示されますが、今回はイヤホンジャックに接続したスピーカから音声を出力したいので「Headphones」が対象になります。ここでもカード番号とデバイス番号は後で使うのでメモしておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ aplay -l **** ハードウェアデバイス PLAYBACK のリスト **** カード 0: Headphones [bcm2835 Headphones], デバイス 0: bcm2835 Headphones [bcm2835 Headphones] サブデバイス: 8/8 サブデバイス #0: subdevice #0 サブデバイス #1: subdevice #1 サブデバイス #2: subdevice #2 サブデバイス #3: subdevice #3 サブデバイス #4: subdevice #4 サブデバイス #5: subdevice #5 サブデバイス #6: subdevice #6 サブデバイス #7: subdevice #7 カード 1: vc4hdmi0 [vc4-hdmi-0], デバイス 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0] サブデバイス: 1/1 サブデバイス #0: subdevice #0 カード 2: vc4hdmi1 [vc4-hdmi-1], デバイス 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0] サブデバイス: 1/1 サブデバイス #0: subdevice #0 |
④.asoundrcの作成
Alexa(AVSで利用するマイクとスピーカーを指定するために「.asoundrc」ファイルをホームディレクトリ直下に作成します。ファイル名の先頭の「.」も必要なので注意しましょう。
1 |
$ vi ~/.asoundrc |
「.asoundrc」の記載内容は以下の通りです。「playback.pcm」セクションの「hw:0,0」の2つの数字は、aplay -lコマンドで確認したカード番号とデバイス番号になります。今回は「Headphones」から音声を出力したいので「hw:0,0」を指定します。また「capture.pcm」セクションの「hw:1,0」の2つの数字は、arecord -lコマンドで確認したカード番号とデバイス番号になります。今回は「USB PnP Sound Device」から音声を入力したいので「hw:1,0」となります。
1 2 3 4 5 6 7 8 9 10 11 |
pcm.!default { type asym playback.pcm { type plug slave.pcm "hw:0,0" } capture.pcm { type plug slave.pcm "hw:1,0" } } |
⑤入出力デバイスの確認
念の為VNCでRaspberry Piにログインして、右上のスピーカーのアイコンを”右”クリックして「AV Jack」が選択されていることを確認します。
同様にマイクーのアイコンを”右”クリックして「USB PnP Sound Device」が選択されていることを確認します。
⑥録音テスト
次に、接続されたマイクで録音できるか確認してみます。以下のように「arecord」コマンドを実行して、マイクに何か話しかけてください。その後「Ctrl+C」を押して録音を中止します。
1 2 3 4 5 |
$ arecord -D plughw:1,0 test.wav 録音中 WAVE 'test.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル ^Cシグナル 割り込み で中断... arecord: pcm_read:2145: 読込エラー: システムコール割り込み |
⑦再生テスト
次に「aplay」コマンドで、先ほど録音した声を再生してみます。スピーカから声が聞こえない場合は、マイクやスピーカーのボリュームを調整してみて下さい。
1 2 |
$ aplay test.wav 再生中 WAVE 'test.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル |
これで、マイクとスピーカの設定は完了です。
Alexa Voice Serviceのビルド
ここからは、Raspberry PiでAVS(Alexa Voice Service)のビルドを行っていきます。基本的には、AmazonのWebサイト「Quick Start: Set Up the AVS Device SDK on Raspberry Pi for Voice-Only Devices」の手順に従って作業を進めますが、一部カスタマイズしています。
①ビルド用のディレクトリの作成
まずは、ビルド用のディレクトリ「sdk-folder」と、その配下に「sdk-build」「sdk-source」「sdk-install」「db」の4つのフォルダを作成します。
1 2 3 4 |
$ cd $HOME $ mkdir sdk-folder $ cd sdk-folder $ mkdir sdk-build sdk-source sdk-install db |
②必要なライブラリのインストール
AVSに必要なライブラリをインストールします。インストールには10分程度かかるので、トイレにでも行って待ちましょう😄
1 2 3 4 |
$ sudo apt-get -y install \ git gcc cmake build-essential libsqlite3-dev libcurl4-openssl-dev libfaad-dev \ libgtest-dev libssl-dev libsoup2.4-dev libgcrypt20-dev libgstreamer-plugins-bad1.0-dev \ libnghttp2-dev nghttp2 gstreamer1.0-plugins-good libasound2-dev doxygen portaudio19-dev |
③AVS SDKのダウンロード
次に今回の大本命であるAVSのSDKを「sdk-folder/sdk-source」フォルダにダウンロード(git clone)します。
1 2 3 4 5 6 7 8 9 10 11 |
$ cd $HOME/sdk-folder/sdk-source $ git clone --single-branch https://github.com/alexa/avs-device-sdk.git alexa/avs-device-sdk.git Cloning into 'avs-device-sdk'... remote: Enumerating objects: 20053, done. remote: Counting objects: 100% (2288/2288), done. remote: Compressing objects: 100% (1549/1549), done. remote: Total 20053 (delta 493), reused 2274 (delta 492), pack-reused 17765 Receiving objects: 100% (20053/20053), 24.17 MiB | 1.34 MiB/s, done. Resolving deltas: 100% (10070/10070), done. Updating files: 100% (3804/3804), done. |
④Snowboyラッパーの退避
後でKWD(Key Word Detector ※アレクサと呼びかけて反応するためのもの)であるSnowboy用の古いAVSラッパーを利用するために、AVS v1.24.0に含まれるSnowboy用のラッパー(KWD/KittAi)をコピーしておきます。ここが今回のポイントの一つ目です‼️‼️
1 2 3 4 5 6 7 8 9 10 |
$ cd $HOME/sdk-folder/sdk-source/avs-device-sdk $ git checkout 'v1.24.0' ・・・省略・・・ HEAD is now at e40477e9 Version 1.24.0 alexa-client-sdk $ cp -r KWD/KittAi ../ $ ls ../ KittAi avs-device-sdk $ git checkout master ・・・省略・・・ Your branch is up to date with 'origin/master'. |
⑤CMakeLists.txtの編集
次に「avs-device-sdk」ディレクトリにある「CmakeLists.txt」に一行を追加します。
1 2 3 |
$ cd $HOME/sdk-folder/sdk-source/avs-device-sdk $ cp CMakeLists.txt CMakeLists.txt.org $ vi CMakeLists.txt |
変更内容は、以下の通り「# Set project information」のセクションに「set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0)」の行を追加します。
1 2 3 4 |
# Set project information project(AlexaClientSDK VERSION 3.0.0 LANGUAGES CXX) set(PROJECT_BRIEF "A cross-platform, modular SDK for interacting with the Alexa Voice Service") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0") #この行を追加 |
ここが2つ目のポイントです‼️‼️この後の手順の4章でsnowboyというKWDを利用しますが、このライブラリのバージョンが古く最新のglibCxxライブラリでは利用できないので、あえて旧バージョンのライブラリを利用するように指定します。私はここに辿り着くのに2週間を要しました😂😂😂
⑥ビルド用ファイルの作成
次にAVSのビルドを行うシェルスクリプト「cmake.sh」を「sdk-folder/sdk-build/」に作成します。Amazonの公式手順では、単にコマンドを打ち込むだけですが、後で何回か使うので、シェルスクリプトにしておきます。
1 2 |
$ cd $HOME/sdk-folder/sdk-build $ vi cmake.sh |
「cmake.sh」の中身は以下をコピペしましょう。
1 2 3 4 5 6 7 |
cmake $HOME/sdk-folder/sdk-source/avs-device-sdk \ -DGSTREAMER_MEDIA_PLAYER=ON \ -DPORTAUDIO=ON \ -DPKCS11=OFF \ -DPORTAUDIO_LIB_PATH=/usr/lib/arm-linux-gnueabihf/libportaudio.so \ -DPORTAUDIO_INCLUDE_DIR=/usr/include \ -DCMAKE_BUILD_TYPE=DEBUG |
⑦CMAKEの実行
作成した「cmake.sh」を実行して、Makefileを作成しましょう。
1 |
$ bash cmake.sh |
すると、ずらずらと大量の文字が表示されて、Makefileが作成されていきます。
1 2 3 4 |
・・・省略・・・ -- Configuring done -- Generating done -- Build files have been written to: /home/pi/sdk-folder/sdk-build |
上記のように「Build files have been written to・・・」と表示されれば完了です。
⑧スワップサイズの変更
この後、AVSをビルドしますが、ビルド時にメモリが不足し、Raspberry Piがフリーズしてしまうことが度々ありました。そこで、以下のようにスワップメモリのサイズを大きくしておきます。
1 2 |
$ sudo dphys-swapfile swapoff $ sudo vi /etc/dphys-swapfile |
「dphys-swapfile」の「CONF_SWAPSIZE=」の数字を「2048」に書き換えます。
1 2 |
#CONF_SWAPSIZE=100 CONF_SWAPSIZE=2048 |
書き換えたら保存して、スワップ領域を再作成してONにします。
1 2 |
$ sudo dphys-swapfile setup $ sudo dphys-swapfile swapon |
⑨ビルドの実行
そこでは「make SampleApp -j3」と入力してAVSをビルドしましょう。Raspberry Piは4つCPUを搭載しているので、「-j」オプションを使って複数のCPUを使うとビルドが早く完了します。ただ、4つ全部を使ってしまうと、発熱がすごいので私は3つにしました。
1 |
$ make SampleApp -j3 |
ずらずらと文字が表示されビルドが進んでいきます。進捗状況はパーセントで表示されるので分かりやすいですね。私の場合は15分ぐらいかかったので、コーヒでも飲みながら待ちましょう☕️
1 2 3 4 5 6 7 8 |
Scanning dependencies of target acsdkCryptoInterfaces Scanning dependencies of target acsdkCodecUtils Scanning dependencies of target AVSCommon [ 2%] Building CXX object core/CodecUtils/src/CMakeFiles/acsdkCodecUtils.dir/Base64Common.cpp.o ・・・省略・・・ [100%] Building CXX object SampleApplications/ConsoleSampleApplication/src/CMakeFiles/SampleApp.dir/main.cpp.o [100%] Linking CXX executable SampleApp [100%] Built target SampleApp |
最後に「Built target SampleApp」と表示されたらビルド完了です!!!
SampleAppの起動
ここからはビルドしたSampleAppを起動するための準備と動作テストを行なっていきます。
①config.jsonの配置
上記の「3-1-⑨クライアントIDのダウンロード」でダウンロードした「config.json」を「/sdk-folder/sdk-source/avs-device-sdk/tools/Install」ディレクトリへ配置します。
1 2 3 |
$ cd $HOME/sdk-folder/sdk-source/avs-device-sdk/tools/Install $ ls android.sh androidConfig.txt config.json genConfig.sh mingw.sh pi.sh setup.sh |
②設定ファイルの作成
以下のコマンドを入力してAVSのSampleAppのための設定ファイル「AlexaClientSDKConfig.json」を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ ./genConfig.sh \ config.json \ 12345 \ $HOME/sdk-folder/db \ $HOME/sdk-folder/sdk-source/avs-device-sdk \ $HOME/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json \ -DSDK_CONFIG_MANUFACTURER_NAME="raspberrypi" \ -DSDK_CONFIG_DEVICE_DESCRIPTION="raspberrypi" Completed generation of config file: /home/pi/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json $ls /home/pi/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json /home/pi/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json |
③起動用シェルスクリプトの作成
次にAVSのSampleAppを起動するためのシェルスクリプト「startup.sh」を作成します。
1 2 |
$ cd $HOME/sdk-folder/sdk-build $ vi startup.sh |
「startup.sh」の内容は以下を記載します。
1 2 3 |
export PA_ALSA_PLUGHW=1 cd $HOME/sdk-folder/sdk-build/ ./SampleApplications/ConsoleSampleApplication/src/SampleApp -C ./Integration/AlexaClientSDKConfig.json -L INFO |
④startup.shの実行
それでは「startup.sh」を実行しましょう!すると、ログが沢山表示されるので、以下のような「Authorization Code」の表示を探して、そのコード(下では「EQHEL7」の部分)をメモします。画面がどんどん流れていくので、上の方にスクロールして探して下さいね。
1 2 3 4 5 |
$ bash startup.sh ・・・省略・・・ ################################################################################### #To authorize, browse to: 'https://amazon.com/us/code' and enter the code: EQHEL7 # ################################################################################### |
⑤端末の認証
次にhttps://amazon.com/us/codeにアクセスすると、ログイン後に認証コードを入力する画面が表示されるので、上でメモしたコードを入力して「Continue」ボタンをクリックします。
次に、Amazonでテストされていないデバイスに関する確認画面が表示されるので「Continue」ボタンをクリックします。
最後にセキュリティプロファイルが表示され、許可するか聞かれるので「許可」ボタンをクリックします。
「成功です!」と表示されれば、Raspbery Pi上で動作するAVSのアプリとAmazonのAlexaサービスとの接続が完了します。
Raspberry Piの画面にも、以下のように「Authorized!」と表示されます。これで、Raspberry PiからAlexaが利用できるようになりました!!
1 2 3 |
########################### # Authorized! # ########################### |
⑥言語の設定
次に、Alexaの言語を日本語に変更します。画面上で「c」を入力して設定メニューを表示させます。「1」を入力して言語の選択画面を表示させます。次に「15」を入力して、日本語(ja-JP)に変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
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 network options. | | Press '7' 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 ar-SA | Press '2' followed by Enter to change the locale to de-DE | Press '3' followed by Enter to change the locale to en-AU | Press '4' followed by Enter to change the locale to en-CA | Press '5' followed by Enter to change the locale to en-GB | Press '6' followed by Enter to change the locale to en-IN | Press '7' followed by Enter to change the locale to en-US | Press '8' followed by Enter to change the locale to es-ES | Press '9' followed by Enter to change the locale to es-MX | Press '10' followed by Enter to change the locale to es-US | Press '11' followed by Enter to change the locale to fr-CA | Press '12' followed by Enter to change the locale to fr-FR | Press '13' followed by Enter to change the locale to hi-IN | Press '14' followed by Enter to change the locale to it-IT | Press '15' followed by Enter to change the locale to ja-JP | Press '16' followed by Enter to change the locale to pt-BR | Press '17' followed by Enter to change the locale combinations to ["de-DE","en-GB"] | Press '18' followed by Enter to change the locale combinations to ["de-DE","en-US"] | Press '19' followed by Enter to change the locale combinations to ["en-CA","fr-CA"] | Press '20' followed by Enter to change the locale combinations to ["en-GB","de-DE"] | Press '21' followed by Enter to change the locale combinations to ["en-GB","es-ES"] | Press '22' followed by Enter to change the locale combinations to ["en-GB","fr-FR"] | Press '23' followed by Enter to change the locale combinations to ["en-GB","it-IT"] | Press '24' followed by Enter to change the locale combinations to ["en-IN","hi-IN"] | Press '25' followed by Enter to change the locale combinations to ["en-US","de-DE"] | Press '26' followed by Enter to change the locale combinations to ["en-US","es-ES"] | Press '27' followed by Enter to change the locale combinations to ["en-US","es-MX"] | Press '28' followed by Enter to change the locale combinations to ["en-US","es-US"] | Press '29' followed by Enter to change the locale combinations to ["en-US","fr-FR"] | Press '30' followed by Enter to change the locale combinations to ["en-US","hi-IN"] | Press '31' followed by Enter to change the locale combinations to ["en-US","it-IT"] | Press '32' followed by Enter to change the locale combinations to ["en-US","ja-JP"] | Press '33' followed by Enter to change the locale combinations to ["en-US","pt-BR"] | Press '34' followed by Enter to change the locale combinations to ["es-ES","en-GB"] | Press '35' followed by Enter to change the locale combinations to ["es-ES","en-US"] | Press '36' followed by Enter to change the locale combinations to ["es-MX","en-US"] | Press '37' followed by Enter to change the locale combinations to ["es-US","en-US"] | Press '38' followed by Enter to change the locale combinations to ["fr-CA","en-CA"] | Press '39' followed by Enter to change the locale combinations to ["fr-FR","en-GB"] | Press '40' followed by Enter to change the locale combinations to ["fr-FR","en-US"] | Press '41' followed by Enter to change the locale combinations to ["hi-IN","en-IN"] | Press '42' followed by Enter to change the locale combinations to ["hi-IN","en-US"] | Press '43' followed by Enter to change the locale combinations to ["it-IT","en-GB"] | Press '44' followed by Enter to change the locale combinations to ["it-IT","en-US"] | Press '45' followed by Enter to change the locale combinations to ["ja-JP","en-US"] | Press '46' followed by Enter to change the locale combinations to ["pt-BR","en-US"] | Press '0' followed by Enter to quit. +----------------------------------------------------------------------------+ 15 2023-05-02 04:33:55.823 [ 1] I LocaleWakeWordsSetting:setLocales:locales=["ja-JP"] ################################### # Locale is ["ar-SA"] # ################################### 2023-05-02 04:33:55.824 [ e:17] I LocaleAssetsManager:changeAssets:Locale=["ja-JP"],WakeWords=[] ################################### # Locale is ["ja-JP"] # ################################### |
⑦応答音の設定
次にもう一度「c」を入力し、「3」を選択して応答音のメニューを表示させます。次に「E」を入力して応答音が鳴るようにします。Amazon Echoの場合は「アレクサ」と話しかけると、上部のライトが青色に光るので音声コマンド待ちになったことが分かるのですが、Raspberry Piの場合にはライトがないので分かりません。この設定を行うことで、音で「ポーン!」と教えてくれるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 2023-05-02 04:35:01.024 [ e:13] I Setting:handleSetValue:value="TONE"3990065800 ############################################## # WakeWordConfirmation is "NONE" # ############################################## ############################################## # WakeWordConfirmation is "TONE" # ############################################## |
⑧タイムゾーンの設定
次に、ブラウザから「https://alexa.amazon.co.jp」にアクセスします。ログインして、画面左側の「設定」メニューを選択します。すると、先ほど認証した「RaspiAlexa」がリストに出てくるので、これを選択します。
そして、デバイスのタイムゾーンを「アジア」「日本標準時(東京)」に変更します。
⑨テスト1
それではAlexaの動作を確認してみましょう!「t」を入力して「ポーン!」とスピーカから音が鳴ったら、マイクに向かって「今日の天気は?」と話しかけてみて下さい。スピーカから天気は聞こえてきましたか?ちなみに画面は以下のように表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 |
t ############################ # Listening... # ############################ ・・・省略 ########################### # Thinking... # ########################### ・・・省略 ########################### # Speaking... # ########################### |
⑩テスト2
次に、「アレクサ、今日の天気は?」とウェイクワード付きで話しかけてみて下さい。しかし、いくら「アレクサ」「アレクゥサ」と話かけても応答してくれません。実はAVS version 3からは、KWD(Key Word Detector)が標準でインストールされず、ウェイクワードに反応しないのです💦💦
しかも、Amazonのドキュメントにある「KEY_WORD_DETECTOR」のCMAKEオプションを使ってもダメ(正確にはSENSORY自体の提供が終了、かつAVS SDK側の実装も削除)な状態で、海外のサイトなども使って情報を集めましたが、有力な情報には辿り着けませんでした。
KWD(Key Word Detector)の設定
ここからは、KWDを自力で設定していきます。AVSから利用できるKWDには、SENSORYとsnoboyという2つのものがありましたが、SENSORYは開発終了と共にGitリポジトリも非公開になっておりダウンロードできなくなりました。一方、snowboyも開発は終了していますが、こちらはGitリポジトリは公開されたままになっており、ダウンロードも可能です。
また、SENSORYやsnowboyを利用するAVS SDK側のソースコードも削除されているので、実装しなおす必要があります。そこで、この章では以下を行なっていきます。
・snowboyのインストール
・Snowboy用のAVSラッパーの作成
・AVSへのSnowboyの組み込み
・AVSの再ビルドとテスト
これができるようになるのに、私は1ヶ月程試行錯誤を繰り返してやっとできるようになりました💧
Snowboyのインストール
まずはsnowboyをインストールして動作確認を行なっていきます。
①必要なライブラリのインストール
まずは、snowboyに必要なライブラリをインストールします。
1 2 |
$ sudo apt-get -y install swig python3-pyaudio sox python3-pip libatlas-base-dev portaudio19-dev libatlas-base-dev $ pip3 install pyaudio |
②snowboyのダウンロード
次にsnowboyをダウンロード(git clone)します。
1 2 |
$ cd $HOME/sdk-folder/sdk-source $ git clone https://github.com/Kitt-AI/snowboy.git |
③snowboyのビルド
次に、以下のようにしてsnowboyをビルド(正しくは共有ライブラリの作成)します。
1 2 |
$ cd snowboy/swig/Python3 $ make |
ビルドが正しく完了すると「_snowboydetect.so」という共有ライブラリが作成されていることがわ分かります。
1 2 3 4 5 6 7 |
$ ls -l -rw-r--r-- 1 pi pi 2912 5月 2 14:25 Makefile -rwxr-xr-x 1 pi pi 1033280 5月 2 14:55 _snowboydetect.so <--これが作成される -rw-r--r-- 1 pi pi 179813 5月 2 14:27 snowboy-detect-swig.cc -rw-r--r-- 1 pi pi 525 5月 2 14:25 snowboy-detect-swig.i -rw-r--r-- 1 pi pi 440324 5月 2 14:27 snowboy-detect-swig.o -rw-r--r-- 1 pi pi 4942 5月 2 14:27 snowboydetect.p |
④snowboyのデモプログラムの修正
それではsnowboyが正しくキーワードを認識するかデモプログラムを実行してテストしてみましょう。ただし、デモプログラムに一箇所修正を加える必要があります。
1 2 3 |
$ cd ../../examples/Python3 $ cp snowboydecoder.py snowboydecoder.py.org $ vi snowboydecoder.py |
「snowboydecoder.py」の5行目あたりにある「from . import snowboydetect」を「import snowboydetect」に修正します。
1 2 |
#from . import snowboydetect import snowboydetect |
⑤テスト1
それではテストしてみましょう。以下のようにデモプログラムを起動して「スノーボーイ」とマイクに向かって話してみてください。
1 2 |
$ python3 demo.py resources/models/snowboy.umdl Listening... Press Ctrl+C to exit |
正しくキーワードを認識すると、以下のように「Keyword 1 detected」と表示されます。キーワードを認識してもらうためには英語っぽい発音で話すことがポイントです(笑)終了する時は「Ctrl+C」(Ctrlキーを押しながらCキーを押す)です。
1 2 |
INFO:snowboy:Keyword 1 detected at time: 2023-05-07 16:53:13 INFO:snowboy:Keyword 1 detected at time: 2023-05-07 16:53:44 |
⑥テスト2
次に、デモプログラムの第一引数に渡すumdlをAlexaのものに変更しましょう。このumdlファイルが音声のパターンを学習したファイルであり、このumdlファイルを切り替えることで認識するキーワードを変更することができます。
1 2 3 4 |
$ python3 demo.py resources/alexa/alexa_02092017.umdl Listening... Press Ctrl+C to exit INFO:snowboy:Keyword 1 detected at time: 2023-05-07 16:56:13 INFO:snowboy:Keyword 1 detected at time: 2023-05-07 16:56:17 |
ではマイクに向かって「アレクサ」と話かけてみてください。テスト1と同様に「Keyword 1 detected」と表示されればOKです。ちなみに「resources/alexa/alexa-avs-sample-app」フォルダにも「alexa.umdl」がありますが、こちらでは私の発音ではうまく認識してもらえませんでした。
Snowboy用のAVSラッパーの作成
ここからはAVSからSnowboyを利用するためのラッパーを作成していきます。上の手順「1-3-④Snowboyラッパーの退避」で退避したAVS v1.24.0に含まれる古いソースコードを使って作成します。
①AbstractKeywordDetector.hの修正
まずは「AbstractKeywordDetector.h」の修正を行います。修正箇所は以下の2箇所です。
1 2 3 4 |
$ cd $HOME/sdk-folder/sdk-source/KittAi $ cd include/KittAi/ $ cp KittAiKeyWordDetector.h KittAiKeyWordDetector.h.org $ vi KittAiKeyWordDetector.h |
1箇所目:30行目の「#include “KWD/AbstractKeywordDetector.h”」を「#include <acsdkKWDImplementations/AbstractKeywordDetector.h>」へ名前空間を変更。
1 2 |
/*#include "KWD/AbstractKeywordDetector.h"*/ #include <acsdkKWDImplementations/AbstractKeywordDetector.h> |
2箇所目:36行目の「class KittAiKeyWordDetector : public AbstractKeywordDetector {」を「class KittAiKeyWordDetector : public alexaClientSDK::acsdkKWDImplementations::AbstractKeywordDetector {」へ名前空間を追加。
1 2 |
/*class KittAiKeyWordDetector : public AbstractKeywordDetector {*/ class KittAiKeyWordDetector : public alexaClientSDK::acsdkKWDImplementations::AbstractKeywordDetector { |
2箇所変更したら保存しましょう。
②KittAiKeyWordDetector.cppの修正
次に「KittAiKeyWordDetector.cpp」の修正を行います。
1 2 3 |
$ cd ../../src/ $ cp KittAiKeyWordDetector.cpp KittAiKeyWordDetector.cpp.org $ vi KittAiKeyWordDetector.cpp |
「#include “KittAi/KittAiKeyWordDetector.h”」の次の行に以下の1行を追加。
1 |
#include <acsdkKWDImplementations/AbstractKeywordDetector.h> |
変更したら保存しましょう。
③ビルドファイルの作成
修正したSnowboy用のAVSラッパーをビルドするためにビルドファイルを作成します。
1 2 |
$ cd ../ $ vi build.sh |
「build.sh」の内容は以下を記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
AVS_DIR=$HOME/sdk-folder/sdk-source/avs-device-sdk SDK_BUILD=$HOME/sdk-folder/sdk-build gcc src/KittAiKeyWordDetector.cpp src/SnowboyWrapper.cpp\ -I$AVS_DIR/AVSCommon/Utils/include \ -I$AVS_DIR/AVSCommon/AVS/include \ -I$AVS_DIR/AVSCommon/SDKInterfaces/include \ -I$AVS_DIR/shared/KWD/acsdkKWDImplementations/include \ -I$AVS_DIR/shared/KWD/acsdkKWDInterfaces/include \ -I$AVS_DIR/shared/NotifierInterfaces/include \ -I$AVS_DIR/ThirdParty/rapidjson/rapidjson-1.1.0/include \ -I$SDK_BUILD/AVSCommon/Utils/include \ -I$HOME/sdk-folder/sdk-source/snowboy/include \ -I./include \ -L$SDK_BUILD/AVSCommon/ \ -L$SDK_BUILD/shared/KWD/acsdkKWDImplementations/src/ \ -L$HOME/sdk-folder/sdk-source/snowboy/lib/rpi/ \ -lAVSCommon \ -lacsdkKWDImplementations \ -latomic \ -lstdc++ \ -lpthread \ -lsnowboy-detect \ -lm \ -lcblas \ -D_GLIBCXX_USE_CXX11_ABI=0 \ --shared -o libsnowboywrapper.so |
記載したら保存します。
④Snowboy用ラッパーのビルド
作成したビルドファイルを実行して、Snowboy用のAVSラッパーの共有ライブラリ「libsnowboywrapper.so」を作成します。
1 2 3 4 5 6 7 8 9 10 11 |
$ bash buid.sh ・・・省略・・・ $ ls -l 合計 1072 -rw-r--r-- 1 pi pi 177 5月 5 15:19 CMakeLists.txt -rw-r--r-- 1 pi pi 971 5月 5 16:02 buid.sh -rw-r--r-- 1 pi pi 949 5月 5 16:00 buid.sh~ drwxr-xr-x 3 pi pi 4096 5月 5 15:19 include -rwxr-xr-x 1 pi pi 1069992 5月 5 16:04 libsnowboywrapper.so <--これが作成される drwxr-xr-x 2 pi pi 4096 5月 5 15:47 src drwxr-xr-x 2 pi pi 4096 5月 5 15:19 test |
「libsnowboywrapper.so」が無事に作成されました。
AVSへのSnowboyの組み込み
ここからはKWDとしてSnowboyを利用するようにAVSのソースコードを修正していきます。
①KeywordDetectorProvider.cppの修正
KWDとしてSnowboyを利用するために「KeywordDetectorProvider.cpp」の3箇所を変更します。
1 2 3 |
$ cd $HOME/sdk-folder/sdk-source/avs-device-sdk/shared/KWD/acsdkKWDProvider/src $ cp KeywordDetectorProvider.cpp KeywordDetectorProvider.cpp.org $ vi KeywordDetectorProvider.cpp |
1箇所目:19行目の「#include “KWDProvider/KeywordDetectorProvider.h”」の次の行に「#include “KittAi/KittAiKeyWordDetector.h”」を追加
1 2 |
#include "KWDProvider/KeywordDetectorProvider.h" #include "KittAi/KittAiKeyWordDetector.h" /*この行を追加*/ |
2箇所目:27行目辺りに以下の3行を追加します。
1 2 3 4 5 |
#define TAG "KeywordDetectorProvider" double KITT_AI_SENSITIVITY = 0.6; /*この行を追加*/ float KITT_AI_AUDIO_GAIN = 2.0; /*この行を追加*/ static const bool KITT_AI_APPLY_FRONT_END_PROCESSING = true; /*この行を追加*/ |
3箇所目:54行目あたりの「if (m_kwdCreateFunction)」からの6行をコメントアウトし、その代わりに上で作成したKittAiKeyWordDetectorを利用するように以下を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/*if (m_kwdCreateFunction) { return m_kwdCreateFunction(stream, audioFormat, keyWordObservers, keyWordDetectorStateObservers); } else { ACSDK_ERROR(LX(__func__).m("KeywordDetector create not found")); return nullptr; }*/ std::cout << "KITT_AI_SENSITIVITY=" << KITT_AI_SENSITIVITY << std::endl; std::cout << "KITT_AI_AUDIO_GAIN=" << KITT_AI_AUDIO_GAIN << std::endl; std::string pathToInputFolder="./Integration"; return alexaClientSDK::kwd::KittAiKeyWordDetector::create( stream, audioFormat, keyWordObservers, keyWordDetectorStateObservers, pathToInputFolder + "/common.res", {{pathToInputFolder + "/alexa.umdl", "ALEXA", KITT_AI_SENSITIVITY}}, KITT_AI_AUDIO_GAIN, KITT_AI_APPLY_FRONT_END_PROCESSING); |
修正したら保存します。
②CMakeLists.txtの修正1
次に「CMakeLists.txt」の修正を行います。
1 2 |
$ cp CMakeLists.txt CMakeLists.txt.org $ vi CMakeLists.txt |
1箇所目:11行目の「target_link_libraries(KeywordDetectorProvider ${TARGET_KWD_LIB})」の次に「target_include_directories」と「target_link_directories」の2行を追加します。
1 2 3 |
target_link_libraries(KeywordDetectorProvider ${TARGET_KWD_LIB}) target_include_directories(KeywordDetectorProvider PUBLIC ${TARGET_KWD_INCLUDE_DIR}) target_link_directories(KeywordDetectorProvider PUBLIC ${TARGET_KWD_LIB_PATH}) |
こちらも修正したら保存しましょう。
③CMakeLists.txtの修正2
次にメインの「CMakeLists.txt」も修正します。
1 2 |
$ cd $HOME/sdk-folder/sdk-source/avs-device-sdk/ $ vi CMakeLists.txt |
修正箇所は、上で修正した「-D_GLIBCXX_USE_CXX11_ABI=0」の最後に「 -DKWD」を追記します。「-」の前のスペースも必要なので気をつけて追記しましょう。この修正を加えることで、AVSのコード内のKWD部分を有効にすることができます。
1 2 |
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0 -DKWD") |
こちらも修正したら保存しましょう。
④cmake.shの修正
最後に「cmake.sh」を修正して、上記で修正したパラメータに値を設定するようにします。
1 2 |
$ cd $HOME/sdk-folder/sdk-build/ $ vi cmake.sh |
修正箇所は以下の通り「KWD」「TARGET_KWD_INCLUDE_DIR」「TARGET_KWD_LIB_PATH」「TARGET_KWD_LIB」の4つのパラメータを設定します。なお、「CMAKE_BUILD_TYPE」の行の最後に「 \」を追記するのも忘れないようにしましょう。
1 2 3 4 5 6 7 8 9 10 11 |
cmake $HOME/sdk-folder/sdk-source/avs-device-sdk \ -DGSTREAMER_MEDIA_PLAYER=ON \ -DPORTAUDIO=ON \ -DPKCS11=OFF \ -DPORTAUDIO_LIB_PATH=/usr/lib/arm-linux-gnueabihf/libportaudio.so \ -DPORTAUDIO_INCLUDE_DIR=/usr/include \ -DCMAKE_BUILD_TYPE=DEBUG \ -DKWD=ON \ -DTARGET_KWD_INCLUDE_DIR=$HOME/sdk-folder/sdk-source/KittAi/include \ -DTARGET_KWD_LIB_PATH=$HOME/sdk-folder/sdk-source/KittAi/ \ -DTARGET_KWD_LIB=snowboywrapper |
AVSの再ビルドとテスト
それでは、Snowboyを有効にしたAVSを再ビルドして、KWDが使えるかテストしましょう。
①cmakeと再ビルド
上記で修正した「cmake.sh」を実行したのちに「make SampleApp -j3」コマンドを実行してKWDを組み込んだAVSを再ビルドしましょう。ビルドには、初回同様に約15分かかるので気長に待ちましょう。
1 2 3 4 5 6 7 8 9 10 |
$ bash cmake.sh ・・・省略・・・ ConsoleSampleApplication build enabled. -- Configuring done -- Generating done -- Build files have been written to: /home/pi/sdk-folder/sdk-build $ make SampleApp -j3 ・・・省略・・・ [100%] Linking CXX executable SampleApp [100%] Built target SampleApp |
②必要ファイルの配置
次にSnowboyに必要な「common.res」「alexa.umdl」の二つのファイルを「Integration」ディレクトリ直下に配置します。この二つのファイルは「snowboy/resources」にあります。
1 2 3 4 5 |
$ cd Integration/ $ cp ../../sdk-source/snowboy/resources/common.res ./ $ cp ../../sdk-source/snowboy/resources/alexa/alexa_02092017.umdl ./alexa.umdl $ ls AlexaClientSDKConfig.json alexa.umdl common.res |
③テスト
それでは、いよいよテストしてみましょう。起動は上で作成した「startup.sh」の実行です。
1 2 3 4 5 6 |
$ cd ../ $ bash startup.sh ・・・省略・・・ ######################################## # Alexa is currently idle! # ######################################## |
「Alexa is currently idle!」と表示されたら「アレクサ」とマイクに向かって呼びかけてみてください‼️アレクサが反応したら「今何時?」など、問いかけてみてください。どうでしょう?ちゃんとアレクサは回答してくれましたか❓アレクサが反応してくれると、少し感動します😭😭
自動起動の設定
ここからは、Raspberry Pi起動時にAlexaが自動起動するように設定します。上でテストしたように、SampleAppはキーボードからの入力を受け付けて、各種設定ができるようになっています。しかし、SampleAppを自動起動(systemdから起動)する場合、標準入力は「/dev/null」にマッピングされるので、キー入力待ちが無く無限ループが発生し、CPUを100%使ってしまいます。
SampleAppの修正
まずは、SampleAppのソースコードを修正しsystemdから起動できるようにします。ついでに、KWDの感度もコマンドライン引数から設定できるようにします。
①キー入力の無効化設定1
まず、SampleAppのソースコードである「UserInputManager.cpp」を変更します。
1 2 3 |
$ cd $HOME/sdk-folder/sdk-source/avs-device-sdk/SampleApplications/Common/LibSampleApp/src $ cp UserInputManager.cpp UserInputManager.cpp.org $ vi UserInputManager.cpp |
変更内容は28行目に「IS_SYSTEMD」変数を追加します。namespace宣言の前に書くのがポイントです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
変更前 #ifdef MODE_CONTROLLER #include "acsdk/Sample/PeripheralEndpoint/PeripheralEndpointModeControllerHandler.h" #endif namespace alexaClientSDK { namespace sampleApp { 変更後 #ifdef MODE_CONTROLLER #include "acsdk/Sample/PeripheralEndpoint/PeripheralEndpointModeControllerHandler.h" #endif bool IS_SYSTEMD=false; /*これを追加*/ namespace alexaClientSDK { namespace sampleApp { |
②キー入力の無効化設定2
同様に「UserInputManager.cpp」の276行目に、IS_SYSTEMDがtrueだった場合に、1時間待った後にwhileループの先頭に戻る処理を、以下のように追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
変更前 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)) { |
追記したら保存しましょう。
③コマンドライン引数の受け取り処理の変更
次に、コマンドライン引数で受け取った値を、グローバル変数にセットする処理を「main.cpp」へ追加します。
1 2 3 |
$ cd $HOME/sdk-folder/sdk-source/avs-device-sdk/SampleApplications/ConsoleSampleApplication/src $ cp main.cpp main.cpp.org $ vi main.cpp |
変更内容は74行目にコマンドライン引数の受け取り処理に、以下を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
} 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> " + " -L <log_level>"); return SampleAppReturnCode::ERROR; } |
上記を追記したら保存しましょう。
④再ビルドの実行
再度「make SampleApp -j」を実行します。今回のビルドは変更箇所のみのため、すぐに終わります。
1 2 3 4 5 |
$ cd $HOME/sdk-folder/sdk-build/ $ make SampleApp -j3 ・・・省略・・・ [100%] Linking CXX executable SampleApp [100%] Built target SampleApp |
⑤startup.shの修正
最後にstartup.shを変更し、コマンドライン引数でマイク感度を設定するように変更します。
1 |
$ vi startup.sh |
以下のように書き換えます。KITT_AI_SENSITIVITYとKITT_AI_AUDIO_GAINの値は、私の環境ではこれぐらいがちょうど良かったので、一旦2.0と0.4にしておきます。
1 2 3 4 5 |
変更前 ./SampleApplications/ConsoleSampleApplication/src/SampleApp -C ./Integration/AlexaClientSDKConfig.json -L INFO 変更後 ./SampleApplications/ConsoleSampleApplication/src/SampleApp -C ./Integration/AlexaClientSDKConfig.json -L INFO -KITT_AI_SENSITIVITY 2.0 -KITT_AI_AUDIO_GAIN 0.4 |
⑥テストと調整
それでは、再度「startup.sh」を実行して「アレクサ」と話しかけてみましょう!周りの雑音や使っているマイクによっても、反応の感度が違うので「startup.sh」の「KITT_AI_SENSITIVITY」と「KITT_AI_AUDIO_GAIN」の値を書き換えて、最もよく反応する値に調整してみて下さい。
1 |
$ bash startup.sh |
Systemdの設定
ここからはRaspberry Pi起動時に自動的にSampleAppが起動するようにSystemdの設定を行なっていきます。
①alexa-service.shの作成
まずは、startup.shをコピーして、自動起動用の「alexa-service.sh」を作成し、実行権限を付けます。
1 2 |
$ cp startup.sh alexa-service.sh $ chmod 755 alexa-service.sh |
次にalexa-service.shを開き、環境変数を設定すると共に、最終行のプログラム実行部分の引数に「-SYSTEMD」を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/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 export PA_ALSA_PLUGHW=1 cd $HOME/sdk-folder/sdk-build/ ./SampleApplications/ConsoleSampleApplication/src/SampleApp -C ./Integration/AlexaCli\ entSDKConfig.json -L INFO -KITT_AI_SENSITIVITY 2.0 -KITT_AI_AUDIO_GAIN 0.4 -SYSTEMD |
②alexa-service.shの実行確認
次に「alexa-service.sh」を実行して確認します。startup.shと同様に「Alexa is currently idle! 」となりますが、ここでキーボードの「t」キーを入力してみて下さい。startup.shでは「ポーン!」と鳴ってウェイク状態になりましたが、alexa-service.shではキー入力を受け付けないため何も起こりません。終了させるには「Ctrl+C」キーを押します。
1 |
$ ./alexa-service.sh |
③alexa.serviceファイルの作成
Systemd用の設定ファイルを「/etc/systemd/system/alexa.service」に以下のように作成します。
1 |
$sudo vi /etc/systemd/system/alexa.service |
「alexa.service」への記載内容は以下の通りです。ユーザ名の「/home/pi/」部分は適宜お使いの環境に合わせて修正してくださいね。
1 2 3 4 5 6 7 8 9 10 |
[Unit] Description = Alexa for Raspberry Pi [Service] Restart = always WorkingDirectory=/home/pi/sdk-folder/sdk-build/ ExecStart = /home/pi/sdk-folder/sdk-build/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) 」となっていれば、起動しています。
1 2 3 4 5 6 |
$ sudo systemctl start alexa.service $ sudo systemctl status alexa.service alexa.service - Alexa for Raspberry Pi Loaded: loaded (/etc/systemd/system/alexa.service; disabled; vendor preset: enabled) Active: active (running) since Sun 2023-05-07 14:22:14 JST; 6s ago ・・・省略・・・ |
⑤自動起動の設定
最後に「systemctl enable alexa.service」コマンドを実行して、Raspberry Pi起動時に自動的にAlexaが起動するようにしておきます。以上で全ての設定は完了です。お疲れ様でした!!
1 2 |
$ sudo 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を作ってみました。AVSのバージョンが上がったり、KWDの開発が停止してしまったりなど、以前と比べて難易度がかなり上がりましたが、どうにか動かすことができるようになりました。
コメント