Alexa Voice Service(AVS)のサンプルアプリをRaspberry Pi3で動かしてみた作業ログです。
■環境
- Mac (Sierra)
- Raspberry Pi (Jessie) ※Stretchだと失敗したのですぐに試したい方はJessieで(2017.09.12時点)。
■必要なもの
- USBマイク
- スピーカー(今回はジャック挿しの方でやりましたが、HDMIの音声でもできるみたいです。USBスピーカーを使用している場合はそれでも。)
- デベロッパー登録 https://developer.amazon.com/login.html
■チュートルアル
AVSを使えるようにするためにAmazonデベロッパーポータルでの設定から始めます。
■Alexa Voice Service設定
・デベロッパーポータルにログインした状態で
Alexa -> Alexa Voice Service の Get Started
・CREATE PRODUCT で プロダクト作成開始
https://github.com/alexa/alexa-avs-sample-app/wiki/Create-Security-Profile に従って
Product name: My Device
Product ID: my_device
type:Device
use companion app: yes
How will end users interact with your product?: Touch-initiatedとHands-freeにチェック
distribute : nochildren : no
で、next
・Security Profileの作成画面が表示される
Create New Profile をクリック
作成するSecurity Profileのnameとdescriptionを入れる場所が出てくるので、これも例の通りに入れる。
例:
Security Profile Name: Alexa Voice Service Sample App Security Profile
Security Profile Description: Alexa Voice Service Sample App Security Profile Description
すると Client ID と Client Secret が生成される。
・Allowed origins と Allowed return URLsを入力する
Allowed Origins: “Add” をクリックして入力欄を出して https://localhost:3000 と入力する。
Allowed Return URLs: 同様に”Add”をクリックして https://localhost:3000/authresponse と入力する。
例のままです。
finishするとしばらくして
My DeviceClient ID:amzn1.application-oa2-client.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Client secret :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Amazon ID :XXXXXXXXXXXXXX
の値が得られます。
■サンプルアプリをcloneする
https://github.com/alexa/alexa-avs-sample-app.git
https://github.com/alexa/alexa-avs-sample-app/wiki/Raspberry-Pi
・今回はprojects という名前のディレクトリを作ってそこでやってみました
1 2 3 |
cd projects git clone https://github.com/alexa/alexa-avs-sample-app.git |
・automated_install.sh の ProductID,ClientID,ClientSecret を編集する。
1 2 3 |
ProductID: my_device Client ID: さっき取得したもの ClientSecret: さっき取得したもの |
・編集が終わったらスクリプトを実行する。(wake word engin(話しかけて起動させる為のエンジン)が2つインストールされると書いてある。)
1 |
. automated_install.sh |
実行すると、いくつか質問される。
- デベロッパアカウント持ってるか?とか このClientIDとかの情報あってるか?とか。全て y で実行。
- localeを聞かれるので、
>1) en-US>2) en-GB>3) de-DE>>Please select an option [1-3] 1
とりあえず US で。 - オーディオのアウトプットを聞かれる。今回は ジャックで。
1) 3.5mm jack2) HDMI audio output - ウェイクワードの検出を有効にするか?と聞かれるのでとりあえずyes
Do you want to enable “Alexa” Wake Word Detection?[y/n/quit] >>
するとインストールが始まる。ガイドページには30分かかると書いてある。。。ひたすら待つ。
所々deprecatedのwarningが出てるけどとりあえず大丈夫らしい。
■サンプルアプリを起動
terminalを3個立ち上げる
- 認証用のweb serviceを実行する用
- avsと通信するサンプルアプリを実行する用
- wake wordの検出を行う用
1:
1 2 3 |
cd ~/projects/alexa-avs-sample-app/samples cd companionService && npm start |
Listening on port 3000と出たらOK
2:
1 2 3 |
cd ~/projects/alexa-avs-sample-app/samples cd javaclient && mvn exec:exec |
アプリのビルドが始まるのでしばらく待つ。
※余談ですが、最初Stretchでやっていたら、ここで libvlc.so が見つからないとかで止まってしまいました。(2017.09.11時点の)raspbean stretchだとインストール出来ないらしいという記事を見つけ、jessieを焼き直しました。
https://downloads.raspberrypi.org に過去のバージョンがあるので、そこからダウンロードする。
今回使ったのは 2017-06-21-raspbian-jessie.zip
ここまでのrpiでの作業を繰り返し。jessieだとうまく行った。
「デバイスを登録して」と出るので yes を押してアマゾンへ誘導される。(※ブラウザのhttpsがunsafeだと言われるのは気にせずアクセスする)
Amazonにログインして、okayを押す。
device tokens readyという文字列が表示されたらブラウザを閉じて Java application のポップアップに戻ってOKを押す。
3:
1 2 3 4 5 |
cd ~/projects/alexa-avs-sample-app/samples cd wakeWordAgent/src && ./wakeWordAgent -e sensory または、 cd wakeWordAgent/src && ./wakeWordAgent -e kitt_ai を実行 どっちのwakeup エンジンを使うかを指定する。 |
とりあえず、kitt_aiでやってみる。
起動したら、「Alexa」と話しかけるとポンという合図音が聞こえるので、スキルを何か言ってみる。
「Weather in Tokyo」と言ってみると答えてくれます。72 ℉と言ってます。
■raspi起動時に自動でAlexaサンプルアプリが起動するようにしてみる。
raspi起動時にサンプルを自動的に起動するには
~/.config/autostart/
その下に設定ファイルを書く。(autostartディレクトリが無ければ作成)
https://www.raspberrypi.org/forums/viewtopic.php?f=82&t=108958
1 2 3 4 5 6 7 8 9 |
[Desktop Entry] Type=Application Name=launchAlexaSample Exec= sh Alexaサンプルアプリ起動用のシェルファイル名 Terminal=true |
Execの部分は3つのターミナルから実行するコマンドを.shに書いてそれを指定しました。
これで、ラズパイに電源を挿すだけで、しばらく待つと「Alexa」という呼びかけに応答してくれます。
起動したらLEDつけるとかしたいですが、それはまた今度。
■ちなみに、Androidの場合はビルドしてスマホでcompanionAppが起動する所までしかやっていませんが、そこまでの情報をメモ。
パソコンにサンプルアプリをcloneしておく。
デベロッパポータルで先ほど作成したPRODUCTのSecurity ProfileのAndroid/Kindle Settings タブを開いて、
API Key Name: Alexa Voice Service Test Android App
Package: com.amazon.alexa.avs.companion
Signature: 以下のようにして取得する
と入力してGENERATE KEYをクリック。
ここのSignature に入れるMD5を取得するためにはサンプルをcloneしたディレクトリのapp/で
xxx/alexa-avs-sample-app/samples/androidCompanionApp/app
1 |
keytool -genkey -v -keystore keystore.jks -alias androiddebugkey -keyalg RSA -sigalg SHA1withRSA -keysize 2048 -validity 10000 |
パスワードは 適当に android とか。
姓名:XXX
組織単位名:XXX
組織名:XXX
都市:XXX
都道府県:XXX
2文字の国コード:JP
最後によろしいですか[いいえ]:y
これで keystore.jks が作成される。
次にsignatureを取得する
1 |
keytool -list -v -alias androiddebugkey -keystore keystore.jks |
こんなログが出ます。
$ keytool -list -v -alias androiddebugkey -keystore keystore.jks
キーストアのパスワードを入力してください:
証明書のフィンガプリント: MD5: 〜〜〜
SHA256:〜〜〜
署名アルゴリズム名: SHA1withRSA バージョン: 3
フィンガープリントが取得できたので、
さっきから開いてるAndroid/Kindle SettingsのSignatureにMD5とSHA256のフィンガープリントを入れて、GENERATE KEY。
するとAPI keyが生成されるので、このキーをapp/assets/api_key.txtというファイルを作成して保存する。
■証明書を作成
サンプルをcloneしたディレクトリのトップに行って、javaclient/ssl.cnfを開く
1 2 3 4 5 6 |
countryName = YOUR_COUNTRY_NAME C=stateOrProvinceName = YOUR_STATE_OR_PROVINCE ST=localityName = YOUR_CITY L=organizationName = YOUR_ORGANIZATION O=organizationalUnitName = YOUR_ORGANIZATIONAL_UNIT OU= |
このYOUR_で始まる部分をkeystore作成時に入れた、CN, OU, O, L, ST, Cの値で置き換えて、
コマンドを実行可能にして
1 |
chmod +x generate.sh |
1 |
./generate.sh |
で実行
すると色々聞かれるのでデベロッパーポータルで作成した通りに入力する
Product ID: my_device
Serial Number: 今回はプロトタイピングなので123456でOKらしい
Password for Keystores: blankで良いらしいがとりあえず android と入れてみる
■ companionService/config.jsを編集する
sslKey を xxx/alexa-avs-sample-app/samples/javaclient/certs/server/node.key
sslCert を xxx/alexa-avs-sample-app/samples/javaclient/certs/server/node.crt
sslCaCert を xxx/alexa-avs-sample-app/samples/javaclient/certs/ca/ca.crt
に置き換える。
■ /javaclient/config.json.を編集する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "productId":"my_device", "dsn":"", "provisioningMethod":"companionApp", "wakeWordAgentEnabled":false, "locale":"en-US", "companionApp":{ "localPort":8443, "sslKeyStore":"xxx/alexa-avs-sample-app/samples/javaclient/certs/server/jetty.pkcs12", "sslKeyStorePassphrase":"android", "lwaUrl":"https://api.amazon.com" }, "companionService":{ "serviceUrl":"https://localhost:3000", "sslClientKeyStore":"xxx/alexa-avs-sample-app/samples/javaclient/certs/client/client.pkcs12", "sslClientKeyStorePassphrase":"android", "sslCaCert":"xxx/alexa-avs-sample-app/samples/javaclient/certs/ca/ca.crt" } } |
これでAndroid Studioでビルドできるようになる。