〜『第一弾』Raspberry PIでAmazon Alexaを動かしてみた 〜
1.はじめに
「小さなものでいいから、自分たちで企画から考えて何か作ってみよう!」という方針のもと、開発部でフリープロジェクトを始動しました。
みんなであれこれと案を出し合った結果、全員一致でIoTをやってみようということになりました。と、いうのも、開発部はみんなソフトウェアエンジニアだったので、ハードウェアに関心を持つスタート地点としては良い題材だと思ったからです。
具体的に何をするのか、いくつか候補があがりましたが、最終的には、「Raspberry PIでAmazon Alexaと繋げて何か喋らせてみよう!」という内容に決まりました。
今回は、大雑把ではありますが、どんなことをしたのか振り返りたいと思います。
2.必要なもの
- Raspberry PI(Raspbian OSインストール済みのもの)
- スピーカー
- マイク
- Amazon Developerのアカウント
必要機材はそれほど多くないので、プロジェクトを始めるのはとても簡単でした。
Raspberry PI(ちなみにRaspberry PI 3のモデルBです)とスピーカーは、以前社内で使用していたものがありましたし、Amazon Developerのアカウントも簡単に取得できました。問題はマイクがないことでした。
幸い、Skypeで使うようなヘッドホンマイクが社内にあったので、それを使用していましたが、やはり不便だったのでUSBマイクを購入しました。マイクと聞くと高価なイメージですけど、実はコレは300円ほどで買えます。
3.Raspberry PIのセットアップ
Raspberry PIのセットアップはとても簡単でした。 ダウンロードしたRaspbian OSをRaspberry PIのメモリカードに書き込むだけです。
最初は、モニターは必要ないと思っていたので、Raspberry PI Stretch Liteを使用しました。
そして、マイクロSDカードをPIに差し込んで、Raspberry PIを起動します。
次に、以下のコマンドで、Alexa Voice Service(AVS)SDKをダウンロードしました。
wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/setup.sh &&
wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/config.txt &&
wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Inst all/pi.sh
次に、Raspberry PIのhome/config.txtにデバイスの情報を記述します。(デバイスの情報とは、AmazonのDeveloper consoleから確認できる、デバイスのIDなどです。)
DEVICE_SERIAL_NUMBER=”123456″
CLIENT_ID=”NNNNNN”
PRODUCT_ID=”MMMMMM”
次に、SDKを以下のコマンドでビルドしようとしました。
sudo bash setup.sh config.txt
表示されたEULAのプロンプトにAGREEと入力します。
インストールが終わったので、次にstartsample.shを試しました。
sudo bash startsample.sh
順調にいくかと思ったのですが、ここでMediaPlayerに関する問題が発生してしまいました。
いくつかのアプローチを試しましたが、最終的には、Raspbian Stretch Liteのインストールでパッケージが見つからないことが原因であることがわかりました。
問題は判明したものの、修復することは難しく、もう一度最初からやり直すことにしました。Raspbian OSをSDカードに書き込み、同じ手順をやり直しました。
4. アプリが起動するまで
次の目的は、1回目で失敗してしまった startsample.sh の実行を成功させることです。
この時点では、リフレッシュトークンを取得しようとgetを試みるも、サーバレスポンスが401を返してきます。
request 情報に誤りがありそうだったので調べてみると、config.txtに情報が足りないことがわかりました。
config.txtを修正し、もう一度getをしてみると、リフレッシュトークンを取得し、Amazonに設定情報が反映されました。
これでRaspberry PIでAmazon Alexaを喋らせる準備が整いました!
5. Amazon AlexaをRaspberry PIの起動と同時に自動起動させる
喋らせることは成功しましたが、Amazon Alexaの起動を毎回手動(startsample.shをコマンドで実行する)で行うのは少々手間です。なので、Raspberry PIの電源ON時に、Amazon Alexaも同時に起動するようにしました。
まず、alexa.shという名称でスクリプトを作成しました。スクリプトは以下のようになっています。
!bin/bash
LOG_FOLDER=”/home/pi/startsample”
ALEXA_FOLDER=”/home/pi”
_psName2Ids(){
ps -aux |grep -i “$1” | awk ‘{print $2}’
}
psKill() {
_psName2Ids $1 | xargs kill -9 > dev/null 2>&1;
}
findError() {
cat ${LOG_FOLDER}/$(ls ${LOG_FOLDER} | tail -1) | grep “$1” | wc | awk ‘{print $1}’
}
check for errors
error1=${findError “AbstractKeywordDetector”}
error2=${findError “RequiresShutdown”}
error3=${findError “Alexa is currently idle”}
processes=($(_psName2Ids “startsample.sh”))
if [ ${#processes[@]} -le 1 || [error1 -gt 10] || [error2 -gt 0] || [error3 -lt 2] ; then
now=$(date -u +”%Y-%m-%fT%H:%M:%SZ”)
sudo touch “$LOG_FOLDER/$now.log”
cd “$ALEXA_FOLDER”
psKill “startsample.sh” screen -L “$LOG/FOLDER/$now.log” -dm sudo bash startsample.sh
fi;
次に、作成したスクリプトを実行可能ファイルにします。
sudo chmod +x /home/pi/alexa.sh
そして、Alexaのスタートアップサービス(alexa.serviceという名称のファイル)を作成しました。
sudo nano /lib/systemd/system/alexa.service
alexa.serviceの中身は以下のようになっています。
[Unit] Description=Amazon Alexa
After=network.target network-online.target
[Service] Type=idle
ExecStart=/home/pi/alexa.sh
WorkingDirectory=/home/pi/build/SampleApp/src
User=pi
[Install]
WantedBy=multi-user.target
次に、ファイルの権限を変更します。
sudo chmod 644 /lib/systemd/system/alexa.service
すると、daemonがリロードされ、サービスが使用可能となり、サービスがスタートします。
sudo systemctl daemon-reload
sudo systemctl enable alexa.service
sudo systemctl start alexa.service
sudo systemctl status alexa.service
6. 日本語に対応させる
Alexaアプリはデフォルトで英語になっているので、日本語に対応させたいところです。
難しいのかなと思いきや、とても簡単でした。画面にしたがって、まずCを押して、次に1、次に6とキーボードを押すだけで日本語化できました。
実際に動いているRaspberry PI Alexaはこんな感じです。とりあえず東京の天気を聞いてみました。
…デフォルトだと摂氏ではなく華氏で教えてくれるので、ちょっとわかりづらいですね…。
他にもなぞなぞを出してくれたりします。
7. 今後の計画
こうして、無事に第1目標のAmazon Alexaの起動までできました!
今後の目標としては、Raspberry PIから電子部品に信号を送ったり、Alexaのスキル開発を視野に入れていますが、それはまたメンバーで話し合っていきたいと思います。
ここまで読んでくださってありがとうございました!