Raspberry PiでAlexaを動かそう
居間の TV で Abema 等を観たくて Fire TV Stick の Alexa 対応版を購入しました。使ってみると Alexa が意外と楽しく、そういやラズパイで Alexa 動かしている方達がいっぱいいるなぁと、しばらく眠っていたラズパイ2(3はまだ買ってません…)を可動させようと思い、あちこちで情報を拾い集めてみたものの躓いて傷だらけになったのでまとめておこうかと。
せっかくなのでブログに書こうかということで今更ブログ始めてみました。
※基本的にSnowboy 変更、改良以外は下記に書いてありますよ。
Raspberry Pi Quick Start Guide · alexa/avs-device-sdk Wiki · GitHub
1.環境
・Raspberry Pi 2 Model B
・ステレオピンジャックのスピーカ(100均で300円だったやつ)
・マイクはUSBヘッドセットのマイクで代用(別途USBマイク購入予定)
OSは下記からRaspbian NOOBSを入れましょう。
Raspberry Pi Downloads - Software for the Raspberry Pi
ネット接続は有線で、操作はPCからTeraTermでSSH接続して行ないました。
まずはアップデートを。
$ sudo apt-get upgrade $ sudo apt-get update
次に初期フォルダを作成します。
$ mkdir ~/alexa-avs-sdk $ cd ~/alexa-avs-sdk
2.デバイス登録
PCから下記のAmazon開発者コンソールにて製品登録します。
開発者コンソール>Alexa>Alexa Voice Service>ログイン>製品>製品を作成する
>情報
・製品名 適当(raspi_alexa)
・製品ID 適当(raspi_alexa)
・製品タイプ Alexa内蔵の端末
・コンパニオンアプリ いいえ
・商品カテゴリ その他 Raspberry Pi
・製品概要 適当(raspi hands on)
・タッチで開始 チェック
・ハンズフリー チェック
・ファーフィールド チェック
・画像 変更しない
・残り いいえ
>セキュリティプロファイル
・セキュリティプロファイル Alexa Voice Service on Raspberry Pi
・セキュリティプロファイルの説明 Alexa Voice Service on Raspberry Pi
クライアントIDをコピーして他のデバイスやプラットフォーム選択
・クライアントID 名 クライアントIDをペースト
・ダウンロードをクリックし config.json を保存する
・config.json をラズパイの初期フォルダにコピーする
ファイル転送はWinSCPにて行いました。
3.Build準備
4.Sensory→Snowboy
ウェイクワードのエンジンを Sensory から Snowboy に変更します。
これやっとかないと何度「Alexa」と言っても認識してくれません。いや女性は認識率高かった気がするけど…
$ sudo apt install swig
$ sudo apt install libatlas-base-dev
pi.sh を変更
$ sudo vi pi.sh
23行目
CMAKE_PLATFORM_SPECIFIC=(-DSENSORY_KEY_WORD_DETECTOR=ON \
を下記に変更
CMAKE_PLATFORM_SPECIFIC=(-DKITTAI_KEY_WORD_DETECTOR=ON \
27~28行目
-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)
を下記に変更
-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)
71~72行目
git clone git://github.com/Sensory/alexa-rpi.git
bash ./alexa-rpi/bin/license.sh
を下記に変更
git clone git://github.com/Kitt-AI/snowboy.git
cd snowboy
python ./setup.py build
79行目
./SampleApp "$OUTPUT_CONFIG_FILE" "$THIRD_PARTY_PATH/alexa-rpi/models" DEBUG9
を下記に変更
./SampleApp "$OUTPUT_CONFIG_FILE" "$THIRD_PARTY_PATH/snowboy/resources" DEBUG9
5.Build
6.ホットワードリストファイルコピー
ホットワードリストファイルを Snowboy のファイルで置き換える
$ cd ~/alexa-avs-sdk/third-party/snowboy/resources/
$ sudo cp alexa/alexa_02092017.umdl alexa.umdl
7.アプリ実行
$ sudo bash startsample.sh
初回起動時は認証作業が必要です。
起動時に出る下記ログにあるURLをブラウザで開いて code (XXXX部)を入力することで認証されます。
###################################################### # > > > > > NOT YET AUTHORIZED < < < < < # ###################################################### ############################################################################################ # To authorize, browse to: 'https://amazon.com/us/code' and enter the code: {XXXX} # ############################################################################################
認証は一度行えば以降は自動で認証されるので気にする必要はありません。
8.日本語化
アプリ実行後、i を入力すると help が見れます。
c、1、6 の順に入力することで日本語化されます。
自信を持って「アレクサ、今何時?」と言ってみましょう!
9.改良
このままだとコンソール画面がないと「アレクサ」に反応したか分からないので音を鳴らします。
先人達に習って system() から aplay で Snowboy にある dong.wav を鳴らすことに。
$ sudo vi ~/alexa-avs-sdk/avs-device-sdk/SampleApp/src/UIManager.cpp
575行目に追加
case DialogUXState::LISTENING: system("aplay /home/pi/alexa-avs-sdk/third-party/snowboy/resources/dong.wav 1>/dev/null 2>/dev/null"); ConsolePrinter::prettyPrint("Listening..."); return;
たったこれだけなんですが、system() 引数の aplay に渡すパスをホームからのパス(~/alexa-avs-sdk/third-party/snowboy/resources/dong.wav)にすると鳴ってくれません…。
aplay を直接実行しても鳴るし、これだけやる.cpp 作って単独実行しても鳴るので鳴らない理由は良くわかりません。
ま、鳴ってくれたので OK ということで。
これで無事アレクサで遊べるところに漕ぎ着けました。
10.その他
うまくいかない人は…下記コマンドの結果(カード番号の扱い)に矛盾がないかチェックすると良いかも
$ cat /proc/asound/modules
$ arecord -l
$ aplay -l
$ cat ~/.asoundrc