Raspberry piのスマートスピーカー化 (Amazon Alexaの公式インストールシェルが利用できないのでソースからインストールしてみた)

#本記事の内容
- Raspberry Piをスマートスピーカーとして利用してみたかったので、Amazon Alexaの導入にチャレンジしました。本記事はその試行錯誤をまとめたものです。

公式提供されているインストールスクリプトを用いて、楽々インストールするつもりでしたが、Alexa開発者ページの公式ドキュメントに記載(2021/10/25時点)の通り、ツールが正しく動作しない状況の様です。

赤字枠で囲った箇所にある記載の通りで、ワード検知に用いられるSensoryが使えなくなった影響だそう。
[Set Up the AVS Device SDK on Raspberry Pi with a Script](https://developer.amazon.com/ja-JP/docs/alexa/avs-device-sdk/raspberry-pi-script.html)
![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/97725a0e-f689-4692-83e0-699918a1aad6.png)

なので、公式サイトの案内"[Set Up the AVS Device SDK on Raspberry Pi from Source](https://developer.amazon.com/ja-JP/docs/alexa/avs-device-sdk/raspberry-pi.html)"に沿ってソースからコンパイルとインストールを実施してみました。
公式ドキュメントの通りやってもうまくいかないことはよくありますよね。
先人の皆様の経験をいろいろと参考にさせて頂き、トライ＆エラーを繰り返すことでインストールを完了できました。
この記事がこれから実施する方たちの役に立てばと思います。

#実施環境
- Windows 10
- TeraTarm Version 4.9.4
- Raspberry Pi 2 Model B
- PLANEX 無線LAN子機 GW-USNANO2A ※Raspberry Pi 2はWi-Fi通信モジュールがないため、無線LAN子機をUSBに接続しWi-Fi通信を行う。
- 家庭内の無線LANネットワーク環境にて実施
- 音声認識マイク
-- [MM-MC23](https://www.amazon.co.jp/gp/product/B007WSKGIE/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&th=1)
- マイクをUSBに接続する変換機
-- [AU-MMSA](https://www.amazon.co.jp/gp/product/B00IRVQ0F8/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1)
- スピーカ
-- [SP-PBLV2-BK](https://www.amazon.co.jp/gp/product/B07XF2SRSS/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&th=1)
- Python 3.9.7
- Alexa Voice Service (AVS) Device SDK 1.24.0
- Snowboy 1.3.0

![alexa_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/13c42cc6-bd50-1b40-c1ad-3b467ff0fc83.jpeg)


#手順の流れ 
1.AWSアカウントの作成・AWS Developerアカウントの作成
2.Alexa製品の登録
3.Raspberry piでのAlexaのインストール
　3.1 TeraTarmでsshログインする
　3.2 パッケージリストの更新
　3.3  インストール用のディレクトリの作成
　3.4 必要なライブラリーのインストール
　3.5 インストールを快適にすすめるためにswap領域の拡張 (任意)
　3.6 avs-sdkのインストール
　3.7 音声操作のためのライブラリーをインストールする
　3.8 HTTP通信のためのcurlをインストールする
　3.9 ウェイクワード用のライブラリーであるsnowboyをインストールする
　3.10 Amazon Alexaのサンプルアプリのインストール
　3.11 Amazon Alexaのサンプルアプリの設定ファイルの配置 (config.json)
　3.11 Amazon Alexaのサンプルアプリの設定ファイルの編集 (AlexaClientSDKConfig.json)
　3.12 オーディオ関係の設定ファイルの編集
　3.13 Alexaサンプルアプリの起動と認証
　3.14 言語・通知音・タイムゾーン設定
　3.15 Alexa サンプルアプリの動作確認


## 1. AWSアカウントの作成・AWS Developerアカウントの作成

こちらのサイト"[失敗しないAlexa開発者アカウントの作り方](https://dev.classmethod.jp/articles/how-to-safety-create-alexa-developers-account/)"を参考にして、AWSアカウントの作成と、AWS Developerアカウントの作成を実施する。

## 2. Alexa製品の登録

こちらの[Amazonの開発者ポータル](https://developer.amazon.com/login.html)にアクセスし、先程作成したAWS Developerアカウントの認証情報を入力しログインする。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/a8e131a9-b874-8f5e-f2e8-2688012b111b.png)

ダッシュボードに表示されている`Alexa Voice Service`をクリックする
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/b1315acf-e674-4617-3782-4cec146d0413.png)

`製品`をクリックする
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/340f73aa-89dd-17f7-8f09-0977426c2942.png)

`新しい商品を追加`をクリックする
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/a8f6d80b-33ca-bb3d-2faf-b7a6665c8eda.png)

製品情報の入力画面が表示されるので情報を入力し、`次へ`をクリックする。

![08-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/50ed7656-5649-eb4c-b368-b9b75574ec79.png)
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/25971c5e-1dcf-ee81-ddd8-f3acf349aa48.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/abbabcba-f377-efeb-713b-9dc4fd6bd0e0.png)


`プロフィールを新規作成する`をクリックする。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/aceb5375-34ae-eb43-c73f-97846edf9783.png)

情報を入力し、`次へ`をクリックする。
![13-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/3a034ce8-730a-1a15-36b1-5e98cd98f141.png)

`他のデバイスやプラットフォーム`のタブをクリックする。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/c8727dee-c6fb-b3a0-f257-5e07eb0bc07a.png)

"クライアントID名","クライアントID"を入力し、`ダウンロード`をクリックする。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/6b1ad568-cf43-61e3-dbfb-4a5f97210da1.png)
※ここで取得したconfig.jsonファイルは、後ほどの"3.11 Amazon Alexaのサンプルアプリの設定ファイルの配置 (config.json)"で利用します。

規約同意のチェックを行い、`完了する`をクリックする。
![18-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/753e8c35-4590-0783-0bf3-f6789f19d3a9.png)

`OK`をクリックする。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/c3d2c8f7-c08f-67eb-f4da-849160146bf2.png)

これにてこれからラズパイにインストールするAlexaの情報が登録された。


作成したセキュアプロファイルを有効にするために[こちらのLogin With Amazonコンソールサイト](https://developer.amazon.com/lwa/sp/overview.html)にアクセスする。

`Select a Security Profile`のプルダウンから先程作成したセキュリティプロファイルを選択する。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/2143d66d-00f0-5675-fd5d-ca4d652e4649.png)

`確認する`をクリックする。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/a2f52499-9747-4a93-78c1-a7d5b49c0fbd.png)

プライバシー利用規約同意書URLの情報を入力する。
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/6d231716-ff04-ccb4-bf2f-57ced2f3d6e2.png)
例として、https://example.com/privacy.htmlとしている。プロダクション利用の場合は正しいURLが必要となる。

`保存`をクリックする。
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/25afb61a-e7dd-40c2-19f1-cfb557f44f55.png)

セキュリティプロファイルが正常に保存されたメッセージが表示された。
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/d3453a60-9005-c695-0343-cbc6811942af.png)

AWSのコンソールにおけるAlexaの登録操作はこれで完了です。


## 3. Raspberry piでのAlexaのインストール

ここからはRaspberry piにAlexaをインストールしていく。
基本的には公式ガイド"[Set Up the AVS Device SDK on Raspberry Pi from Source](https://developer.amazon.com/ja-JP/docs/alexa/avs-device-sdk/raspberry-pi.html)"に沿って進めるが、途中でトライ＆エラーで得たノウハウも手順に加えています。

### 3.1 TeraTarmでsshログインする

WindowsにてTeraTarmを起動して、ラズパイにSSH接続する。

### 3.2 パッケージリストの更新
パッケージリストを最新化する。

	sudo apt-get update

### 3.3 インストール用のディレクトリの作成

公式ドキュメントに記載のある通りにディレクトリを作成する。

	cd /home/pi/;pwd
	mkdir sdk-folder
	ls -ld sdk-folder

	cd sdk-folder;pwd
	ls -l
	mkdir sdk-build sdk-source third-party sdk-install db
	ls -l

### 3.4 必要なライブラリーのインストール

公式ドキュメントに記載のあったライブラリーをインストールする。

	sudo apt-get -y install \
	 git gcc cmake build-essential libsqlite3-dev libcurl4-openssl-dev libfaad-dev \
	 libssl-dev libsoup2.4-dev libgcrypt20-dev libgstreamer-plugins-bad1.0-dev \
	 gstreamer1.0-plugins-good libasound2-dev doxygen


### 3.5 インストールを快適にすすめるためにswap領域の拡張 (任意)

Raspberry Pi 2Bはメモリが1Gでswapも初期設定100Mしかないので、
少しでもインストールが進むようにswap領域を大きくする。

swapを拡大しないままでインストールした場合は、
後半に出てくる`make SampleApp`のコマンド実行時の93%辺りで以下のエラーが発生することが多かった。

	[ 93%] Building CXX object ApplicationUtilities/DefaultClient/src/CMakeFiles/DefaultClient.dir/DefaultClientComponen	t.cpp.o
	                ^[[C^[[D        c++: fatal error: 強制終了 signal terminated program cc1plus
	compilation terminated.
	make[3]: *** [ApplicationUtilities/DefaultClient/src/CMakeFiles/DefaultClient.dir/build.make:89: ApplicationUtilitie	s/DefaultClient/src/CMakeFiles/DefaultClient.dir/DefaultClientComponent.cpp.o] エラー 1
	make[2]: *** [CMakeFiles/Makefile2:14769: ApplicationUtilities/DefaultClient/src/CMakeFiles/DefaultClient.dir/all] 	エラー 2
	make[1]: *** [CMakeFiles/Makefile2:14616: SampleApp/src/CMakeFiles/SampleApp.dir/rule] エラー 2
	make: *** [Makefile:3698: SampleApp] エラー 2
	pi@raspberrypi:~/sdk-folder/sdk-build $


現在のswap領域の容量をfreeコマンドで確認する。

	pi@raspberrypi:~/sdk-folder/sdk-build $ free -h
	              total        used        free      shared  buff/cache   available
	Mem:          871Mi        72Mi       715Mi       7.0Mi        83Mi       741Mi
	Swap:          99Mi        96Mi       3.0Mi
	pi@raspberrypi:~/sdk-folder/sdk-build $

swapを止める。

	sudo dphys-swapfile swapoff

swapが止まり、領域が0になったことを確認する。

	pi@raspberrypi:~/sdk-folder/sdk-build $ free -h
	              total        used        free      shared  buff/cache   available
	Mem:          871Mi       148Mi       631Mi        12Mi        92Mi       660Mi
	Swap:            0B          0B          0B
	pi@raspberrypi:~/sdk-folder/sdk-build $

swapファイルのバックアップを取り、変更後には差分を確認する。

	cp -p /etc/dphys-swapfile /home/pi/dphys-swapfile
	sudo vi /etc/dphys-swapfile
※dphys-swapfileファイル内のCONF_SWAPSIZEの項目を変更する
	
変更前後の差分が以下。swapとして2048MB割り当てた。

	pi@raspberrypi:~/sdk-folder $ diff /etc/dphys-swapfile /home/pi/dphys-swapfile
	16c16
	< CONF_SWAPSIZE=2048
	---
	> CONF_SWAPSIZE=100

swapを有効化し再起動する。

	sudo dphys-swapfile swapon
	sudo reboot

再起動後に、ラズパイにログインし、swap領域が2G割り当てられていることを確認する。

	pi@raspberrypi:~ $free -h
	              total        used        free      shared  buff/cache   available
	Mem:          871Mi       145Mi       486Mi       6.0Mi       240Mi       667Mi
	Swap:         2.0Gi          0B       2.0Gi
	
★注意：インストールが完了したら、必要に応じてswapサイズを元に戻すこと。

### 3.6 avs-sdkのインストール

最新のavs-sdk 1.25.0だと音声認識ライブラリであるsnowboyとの連携が上手くいかなかったので、
最新版からひとつ前のブランチの1.24.0をインストールすることにする。

	cd /home/pi/sdk-folder/sdk-source
	git clone --single-branch git://github.com/alexa/avs-device-sdk.git -b v1.24.0
	ls -ld avs-device-sdk

### 3.7 音声操作のためのライブラリーをインストールする

alexaが音声操作に必要なportaudioというライブラリーをインストールする。

	cd /home/pi/sdk-folder/third-party
	wget -c http://www.portaudio.com/archives/pa_stable_v190600_20161030.tgz
	ls -l pa_stable_v190600_20161030.tgz
	tar zxvf pa_stable_v190600_20161030.tgz
	cd portaudio
	./configure --without-jack
	make

### 3.8 HTTP通信のためのcurlをインストールする

with-nghttp2の有効化には必要なパッケージをインストールする

	sudo apt-get -y install libnghttp2-dev

curlをインストールする。configureの結果として、HTTP2が有効(enable)となっていることが大事。

	cd /home/pi/sdk-folder/third-party
	wget https://github.com/curl/curl/releases/download/curl-7_67_0/curl-7.67.0.tar.gz
	ls -l curl-7.67.0.tar.gz
	tar zxvf curl-7.67.0.tar.gz
	cd curl-7.67.0
	./configure --with-nghttp2 --prefix=/home/pi/sdk-folder/third-party/curl-7.67.0 --with-libssl
	
	(出力結果 途中略)
	
	 HTTP2:            enabled (nghttp2)  ★★HTTP2がenableとなっていて、有効になっているのを確認する
	 HTTP3:            disabled (--with-ngtcp2, --with-quiche)

	(出力結果 途中略)

	make


### 3.9 ウェイクワード用のライブラリーであるsnowboyをインストールする

snowboyの前提ライブラリーのインストール

	sudo apt-get install -y gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly

	sudo apt-get -y install swig3.0 python-pyaudio python3-pyaudio sox python-pip libatlas-base-dev portaudio19-dev
	pip install pyaudio

snowboyのgitリポジトリからのダウンロード

	cd /home/pi/sdk-folder/third-party
	git clone https://github.com/Kitt-AI/snowboy.git

設定ファイルの編集を行うためにバックアップファイルを取得する。

	ls -ld snowboy
	cd /home/pi/sdk-folder/third-party/snowboy/swig/Python3

	cp -p Makefile /home/pi/Makefile
	ls -l /home/pi/Makefile

Makefileは、ひとつ下の差分の結果のように「swig」の記載が「swig3.0」となるように編集する。

	vi Makefile
	
編集後と編集前の差分結果

	pi@raspberrypi:~/sdk-folder/third-party/snowboy/swig/Python3 $ diff Makefile /home/pi/Makefile
	5c5
	< SWIG := swig3.0
	---
	> SWIG := swig

設定ファイルの編集を行うためにバックアップファイルを取得する。

	cd ~/sdk-folder/third-party/snowboy/examples/Python3
	cp -p snowboydecoder.py /home/pi/snowboydecoder.py
	ls -l /home/pi/snowboydecoder.py


snowboydecoder.pyは、ひとつ下の差分の結果のように「from . import snowboydetect」の記載が「import snowboydetect」となるよう編集する。

	vi snowboydecoder.py


編集後と編集前の差分結果

	※snowboydecoder.pyは、以下のように「from . import snowboydetect」の記載を「import snowboydetect」と編集する。誤記？
	pi@raspberrypi:~/sdk-folder/third-party/snowboy/examples/Python3 $ diff snowboydecoder.py /home/pi/snowboydecoder.py
	5c5
	< import snowboydetect
	---
	> from . import snowboydetect


snowboyをmakeする

	cd ~/sdk-folder/third-party/snowboy/swig/Python3
	make

snowboyの動作確認を行う

	cd ~/sdk-folder/third-party/snowboy/examples/Python3
	python demo.py resources/models/snowboy.umdl

	
マイクに向かってsnowboyと呼び掛けてみる。
音が鳴り以下のログが出力されれば、動作確認OKです。

	pi@raspberrypi:~/sdk-folder/third-party/snowboy/examples/Python3 $ python demo.py resources/models/snowboy.umdl
	Listening... Press Ctrl+C to exit
	INFO:snowboy:Keyword 1 detected at time: 2021-10-21 09:13:54
	INFO:snowboy:Keyword 1 detected at time: 2021-10-21 09:13:58


アレクサ用のウェイクワードファイルの配置

	cp -p ~/sdk-folder/third-party/snowboy/resources/alexa/alexa-avs-sample-app/alexa.umdl ~/sdk-folder/third-party/snow	boy/resources
	ls -l ~/sdk-folder/third-party/snowboy/resources/alexa.umdl

### 3.10 Amazon Alexaのサンプルアプリのインストール

ビルド用設定ファイルを編集する前に、バックアップを取得。

	cd /home/pi/sdk-folder/sdk-source/avs-device-sdk/cmakeBuild/cmake/
	cp -p BuildOptions.cmake /home/pi/BuildOptions.cmake
	ls -l /home/pi/BuildOptions.cmake

設定ファイルの編集。

	sed -E -i "s:CXX_PLATFORM_DEPENDENT_FLAGS_MINSIZEREL\s+\"(.*)\":CXX_PLATFORM_DEPENDENT_FLAGS_MINSIZEREL \"\1 -D_GLIB	CXX_USE_CXX11_ABI=0 -pg\":" BuildOptions.cmake
	diff /home/pi/sdk-folder/sdk-source/avs-device-sdk/cmakeBuild/cmake/BuildOptions.cmake /home/pi/BuildOptions.cmake
	※置換対象の文字列が期待通り変更されていることを確認する。

ここで編集する内容は、avs-kittai.patchの中から実施が必要だと判断した物を抽出しています。
avs-kittai.ptachは、snowboyから提供されているパッチです。こちらの[snowboyのREADME](https://github.com/Kitt-AI/snowboy/blob/master/README.md)の"Kittai KWD Engine"の章に記載があります。

元々、[Set Up the AVS Device SDK on Raspberry Pi with a Script](https://developer.amazon.com/ja-JP/docs/alexa/avs-device-sdk/raspberry-pi-script.html)の手順で登場するインストールシェルは、音声認識ライブラリーとしてSensoryを使う前提で作られていますが、
avs-kittai.patchを適用することで、インストールする音声認識ライブラリーをsnowboyに変更することができます。
今回はインストールシェルを使わず手動インストールするので、avs-kittaiパッチが実施している内容から必要と考えた箇所のみ手順に組み込むようにしています。

avs-sdkをコンパイルする

	cd /home/pi/sdk-folder/sdk-build
	cmake /home/pi/sdk-folder/sdk-source/avs-device-sdk \
	 -DGSTREAMER_MEDIA_PLAYER=ON \
	 -DPORTAUDIO=ON \
	 -DPORTAUDIO_LIB_PATH=/home/pi/sdk-folder/third-party/portaudio/lib/.libs/libportaudio.a \
	 -DPORTAUDIO_INCLUDE_DIR=/home/pi/sdk-folder/third-party/portaudio/include \
	 -DCURL_INCLUDE_DIR=/home/pi/sdk-folder/third-party/curl-7.67.0/include/curl \
	 -DCURL_LIBRARY=/home/pi/sdk-folder/third-party/curl-7.67.0/lib/.libs/libcurl.so \
	 -DKITTAI_KEY_WORD_DETECTOR=ON \
	 -DKITTAI_KEY_WORD_DETECTOR_LIB_PATH=/home/pi/sdk-folder/third-party/snowboy/lib/rpi/libsnowboy-detect.a \
	 -DKITTAI_KEY_WORD_DETECTOR_INCLUDE_DIR=/home/pi/sdk-folder/third-party/snowboy/include
それぞれのオプションの意味は、こちらの[AVS Device SDK CMake Parameters - Amazon Developer](https://developer.amazon.com/en-US/docs/alexa/avs-device-sdk/cmake-parameters-1-16.html)のサイトで確認できます。

Alexaサンプルアプリをmakeする

	make SampleApp 
	
### 3.11 Amazon Alexaのサンプルアプリの設定ファイルの配置 (config.json)


config.jsonを/home/pi/sdk-folder/sdk-source/avs-device-sdk/tools/Installディレクトリに置く。

TeratarmにてラズパイにSSH接続し、`ファイル > SSH SCP`とメニューを辿る。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/c49072ce-1aba-33a3-558a-2570dd8a97aa.png)

Fromにアップロードする対象のファイルを指定し、Toにアップロード後格納するディレクトリを指定する。ここでは、/home/piとする。"Send"をクリックする。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/7fcb823d-cd15-e6a9-c56d-d8acdcb6d4d2.png)

ラズパイの/home/pi直下に転送できたことを確認し、正しい場所にファイルを配置する。

	ls -l /home/pi/config.json
	cp -p /home/pi/config.json /home/pi/sdk-folder/sdk-source/avs-device-sdk/tools/Install
	ls -l /home/pi/sdk-folder/sdk-source/avs-device-sdk/tools/Install/config.json


### 3.11 Amazon Alexaのサンプルアプリの設定ファイルの編集 (AlexaClientSDKConfig.json)

genConfig.shを用いてAlexaClientSDKConfig.jsonの設定ファイルにパラメータを書き込む。

	cd /home/pi/sdk-folder/sdk-source/avs-device-sdk/tools/Install
	bash genConfig.sh config.json 12345 \
	 /home/pi/sdk-folder/db \
	 /home/pi/sdk-folder/sdk-source/avs-device-sdk \
	 /home/pi/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json \
	 -DSDK_CONFIG_MANUFACTURER_NAME="raspberrypi" \
	 -DSDK_CONFIG_DEVICE_DESCRIPTION="raspberrypi"

こちらのパラメータ名に関しても公式ドキュメント "[Set Up the AVS Device SDK on Raspberry Pi from Source](https://developer.amazon.com/ja-JP/docs/alexa/avs-device-sdk/raspberry-pi.html)"の"Step 5: Set up your configuration file"あたりに説明があります。

設定ファイルに対してオーディオ関連の設定を追記する

	vi /home/pi/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json

以下を追記すること。"cblAuthDelegate"のブロックの上に挿入する。

	     "gstreamerMediaPlayer":{
	         "audioSink":"alsasink"
	     },


以下が変更後のファイルのイメージ

	(～途中省略～)

	/// to learn more about configuration options and default behaviours.
	{
	     "gstreamerMediaPlayer":{
	         "audioSink":"alsasink"
	     },
	    "cblAuthDelegate":{
	        "databaseFilePath":"/home/pi/sdk-folder/db/cblAuthDelegate.db"
	    },
	    "deviceInfo":{

	(～途中省略～)


### 3.12 オーディオ関係の設定ファイルの編集

.asoundrcファイルを作成する必要があるため、ここからはラズパイのHW環境について確認を行う。
以下のコマンドでラズパイに認識されているオーディオ関連のHWを確認する。

	pi@raspberrypi:~ $ cat /proc/asound/pcm
	00-00: bcm2835 HDMI 1 : bcm2835 HDMI 1 : playback 4
	01-00: bcm2835 Headphones : bcm2835 Headphones : playback 4
	02-00: USB Audio : USB Audio : playback 1 : capture 1
	

録音で利用するUSBマイクのカード番号とデバイス番号を確認する。
	
	pi@raspberrypi:~ $ arecord -l
	**** ハードウェアデバイス CAPTURE のリスト ****
	カード 2: Device [USB Audio Device], デバイス 0: USB Audio [USB Audio]
	  サブデバイス: 1/1
	  サブデバイス #0: subdevice #0

カード番号が2、デバイス番号が0であった。

ヘッドホン端子で音を再生したいので、ヘッドホンスピーカーのカード番号とデバイス番号を確認する。

	pi@raspberrypi:~ $ aplay -l
	**** ハードウェアデバイス PLAYBACK のリスト ****
	カード 0: b1 [bcm2835 HDMI 1], デバイス 0: bcm2835 HDMI 1 [bcm2835 HDMI 1]
	  サブデバイス: 4/4
	  サブデバイス #0: subdevice #0
	  サブデバイス #1: subdevice #1
	  サブデバイス #2: subdevice #2
	  サブデバイス #3: subdevice #3
	カード 1: Headphones [bcm2835 Headphones], デバイス 0: bcm2835 Headphones [bcm2835 Headph
	  サブデバイス: 4/4
	  サブデバイス #0: subdevice #0
	  サブデバイス #1: subdevice #1
	  サブデバイス #2: subdevice #2
	  サブデバイス #3: subdevice #3
	カード 2: Device [USB Audio Device], デバイス 0: USB Audio [USB Audio]
	  サブデバイス: 1/1
	  サブデバイス #0: subdevice #0

カード番号が1、デバイス番号が0であった。


設定ファイルを作成する。

	sudo vi ~/.asoundrc
	=========================
	pcm.!default {
	   type asym
	    playback.pcm {
	      type plug
	      slave.pcm "hw:1,0" #← スピーカーの"hw:カード番号,デバイス番号"で設定する
	    }
	    capture.pcm {
	      type plug
	      slave.pcm "hw:2,0" #← マイクの"hw:カード番号,デバイス番号"で設定する
	    }
	 }
	=========================

録音のテストを実施する。

	cd /home/pi
	arecord rectest.wav
	※マイクに向かってしゃべり音を録音する。録音の停止は、「Ctrl + C」を入力する。

再生のテストを実施する。録音した音声が再生されればOKです。

	aplay rectest.wav

### 3.13 Alexaサンプルアプリの起動と認証

サンプルアプリを起動して、Alexaアプリの初回認証を行う。

	cd /home/pi/sdk-folder/sdk-build
	PA_ALSA_PLUGHW=1 ./SampleApp/src/SampleApp ./Integration/AlexaClientSDKConfig.json ../third-party/snowboy/resources 	DEBUG9

問題なければ以下の様なログが出力されるはずなので、URLと認証コード(enter the code)をメモする。

	pi@raspberrypi:~/sdk-folder/sdk-build $ PA_ALSA_PLUGHW=1 ./SampleApp/src/SampleApp ./Integration/AlexaClientSDKConfig.json DEBUG9
	configFile ./Integration/AlexaClientSDKConfig.json
	##################################
	#       NOT YET AUTHORIZED       #
	##################################
	
	################################################################################################
	#       To authorize, browse to: 'https://amazon.com/us/code' and enter the code: FDANYG       #
	################################################################################################
	
	#################################################
	#       Checking for authorization (1)...       #
	#################################################
	
	#################################################
	#       Checking for authorization (2)...       #
	#################################################
	
	～ 途中省略 認証のチェックが繰り返される～


認証にはラズパイのコンソールにてブラウザ認証が必要なので、VNC設定をしていなければこちらの記事"[CUI運用しているラズパイでVNC接続できるようにする](https://qiita.com/kanamekun/items/100b815741c8eefaa5ec)"を参考にして、VNCログインを行ってください。
ラズパイのブラウザでメモしたURLにアクセスし、開発者アカウントのメールアドレスとパスワードを入れて認証を行います。

認証コードを入力して、認証を行う。
![42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/f4eab2e9-09c7-07fd-722e-8550dd6b6ef9.png)

このようなページが出るので、下の方へスクロールして、`CONTINUE`をクリックする。
![43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/cea818df-2fb1-27f5-787f-745888cbc09b.png)
![44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/54ad69ba-1545-7027-080f-f86f8708de58.png)

`許可`をクリックする。
![45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/aafbfb96-d07d-dc8d-027f-46f3613983f7.png)


認証が完了したメッセージが表示された。これで認証は完了。
![46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/19b3c9b9-b3c3-208e-6680-82a93c3f092d.png)


コンソールのログに以下のメッセージが表示されているはず。

	###########################
	#       Authorized!       #
	###########################
	

### 3.14 言語・通知音・タイムゾーン設定

#### 3.14.1 言語・通知音の設定

	cd /home/pi/sdk-folder/sdk-build
	PA_ALSA_PLUGHW=1 ./SampleApp/src/SampleApp ./Integration/AlexaClientSDKConfig.json ../third-party/snowboy/resources INFO

以下の様に変更を行った。ログはDEBUG9だと大量に出ているので、必要箇所のみ抜粋しています。

	                  #    #     #  #####      #####  ######  #    #              
	                 # #   #     # #     #    #     # #     # #   #               
	                #   #  #     # #          #       #     # #  #                
	               #     # #     #  #####      #####  #     # ###                 
	               #######  #   #        #          # #     # #  #                
	               #     #   # #   #     #    #     # #     # #   #               
	               #     #    #     #####      #####  ######  #    #              
	                                                                              
	       #####                                           #                      
	      #     #   ##   #    # #####  #      ######      # #   #####  #####      
	      #        #  #  ##  ## #    # #      #          #   #  #    # #    #     
	       #####  #    # # ## # #    # #      #####     #     # #    # #    #     
	            # ###### #    # #####  #      #         ####### #####  #####      
	      #     # #    # #    # #      #      #         #     # #      #          
	       #####  #    # #    # #      ###### ######    #     # #      #          
	
	       SDK Version 1.24.0
	
	
	+----------------------------------------------------------------------------+
	|                                  Options:                                  |
	| Wake word:                                                                 |
	|       Simply say Alexa and begin your query.                               |
	| Tap to talk:                                                               |
	|       Press 't' and Enter followed by your query (no need for the 'Alexa').|
	| Hold to talk:                                                              |
	|       Press 'h' followed by Enter to simulate holding a button.            |
	|       Then say your query (no need for the 'Alexa').                       |
	|       Press 'h' followed by Enter to simulate releasing a button.          |
	| Stop an interaction:                                                       |
	|       Press 's' and Enter to stop an ongoing interaction.                  |
	| Privacy mode (microphone off):                                             |
	|       Press 'm' and Enter to turn on and off the microphone.               |
	| Playback Controls:                                                         |
	|       Press '1' for a 'PLAY' button press.                                 |
	|       Press '2' for a 'PAUSE' button press.                                |
	|       Press '3' for a 'NEXT' button press.                                 |
	|       Press '4' for a 'PREVIOUS' button press.                             |
	| Settings:                                                                  |
	|       Press 'c' followed by Enter at any time to see the settings screen.  |
	| Speaker Control:                                                           |
	|       Press 'p' followed by Enter at any time to adjust speaker settings.  |
	| Firmware Version:                                                          |
	|       Press 'f' followed by Enter at any time to report a different        |
	|       firmware version.                                                    |
	| Info:                                                                      |
	|       Press 'i' followed by Enter at any time to see the help screen.      |
	| Reset device:                                                              |
	|       Press 'k' followed by Enter at any time to reset your device. This   |
	|       will erase any data stored in the device and you will have to        |
	|       re-register your device.                                             |
	|       This option will also exit the application.                          |
	| Reauthorize device:                                                        |
	|       Press 'z' followed by Enter at any time to re-authorize your device. |
	|       This will erase any data stored in the device and initiate           |
	|       re-authorization.                                                    |
	| Device Setup Complete:                                                     |
	|       Press 'v' followed by Enter at any time to indicate that device      |
	|       setup is complete.                                                   |
	|                                                                            |
	| Quit:                                                                      |
	|       Press 'q' followed by Enter at any time to quit the application.     |
	+----------------------------------------------------------------------------+
	
	########################################
	#       Alexa is currently idle!       #
	########################################
	
	c ★設定(Settings)である、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)である、1を入力する
	+----------------------------------------------------------------------------+
	|                          Language Options:                                  
	|
	| Press '1' followed by Enter to change the locale to de-DE
	| Press '2' followed by Enter to change the locale to en-AU
	| Press '3' followed by Enter to change the locale to en-CA
	| Press '4' followed by Enter to change the locale to en-GB
	| Press '5' followed by Enter to change the locale to en-IN
	| Press '6' followed by Enter to change the locale to en-US
	| Press '7' followed by Enter to change the locale to es-ES
	| Press '8' followed by Enter to change the locale to es-MX
	| Press '9' followed by Enter to change the locale to es-US
	| Press '10' followed by Enter to change the locale to fr-CA
	| Press '11' followed by Enter to change the locale to fr-FR
	| Press '12' followed by Enter to change the locale to hi-IN
	| Press '13' followed by Enter to change the locale to it-IT
	| Press '14' followed by Enter to change the locale to ja-JP
	| Press '15' followed by Enter to change the locale to pt-BR
	| Press '16' followed by Enter to change the locale combinations to ["en-CA","fr-CA"]
	| Press '17' followed by Enter to change the locale combinations to ["en-IN","hi-IN"]
	| Press '18' followed by Enter to change the locale combinations to ["en-US","es-US"]
	| Press '19' followed by Enter to change the locale combinations to ["es-US","en-US"]
	| Press '20' followed by Enter to change the locale combinations to ["fr-CA","en-CA"]
	| Press '21' followed by Enter to change the locale combinations to ["hi-IN","en-IN"]
	| Press '0' followed by Enter to quit.
	+----------------------------------------------------------------------------+
	
	14 ★日本語設定である、14を入力する

	###################################
	#       Locale is ["en-US"]       #
	###################################
	
	###################################
	#       Locale is ["ja-JP"]       #
	###################################

日本語である「ja-JP」となった。


次にalexaと呼び掛けた際に、反応するように通知音の設定を行います。

	c ★設定(Setting)である、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.                     |
	+----------------------------------------------------------------------------+
	
	3 ★通知音設定(wake word confirmation options)である、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 ★有効(enable)である、Eを入力する
	##############################################
	#       WakeWordConfirmation is "NONE"       #
	##############################################

	##############################################
	#       WakeWordConfirmation is "TONE"       #
	##############################################

"TONE"となり、通知音が設定された。


同じ手順で、Alexaが話すときの通知音設定(speech confirmation options)である、4も同様に有効化します。


#### 3.14.2 Timezoneの設定

[Alexaの管理コンソールのログイン画面](https://alexa.amazon.co.jp)から認証情報を入力しログインを実施する。
この管理コンソールを開く際は、ローカルのPC画面で良く、ラズパイのブラウザーから行う必要はないです。
![60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/d257fd83-8b1e-92cd-2758-d4c7b476fe55.png)

`設定`をクリックする。
![61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/e804014d-84cc-e55b-9910-8acd5fa76f08.png)

デバイスメニューの`〇〇's ラズパイの登録名`をクリックする。
![62.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/2312a477-8394-10a2-b672-183ebe1e9a22.png)

デバイスのタイムゾーンから`アジア > 日本標準時 (東京)`をクリックし、タイムゾーンを日本に変更する。
![63.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/8c4be6e0-ef11-dc65-0cb2-0e510a1a2dca.png)


### 3.15 Alexa サンプルアプリの動作確認

	cd /home/pi/sdk-folder/sdk-build
	PA_ALSA_PLUGHW=1 ./SampleApp/src/SampleApp ./Integration/AlexaClientSDKConfig.json ../third-party/snowboy/resources INFO
	
マイクに向かって、アレクサと呼び掛けて、音がしたら「今何時？」と聞いてみましょう。
返答があればインストール完了です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Raspberry PiにAmazon alexaをインストールして、ホームスピーカー化してみた！思っていたよりAIとスムーズに会話できて面白い！ <a href="https://t.co/lyliZWLlJS">pic.twitter.com/lyliZWLlJS</a></p>&mdash; kaname kun (@kanamekunkun) <a href="https://twitter.com/kanamekunkun/status/1453341884563144707?ref_src=twsrc%5Etfw">October 27, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


手順は以上です。

これでalexaのサンプルアプリが利用できるようになりました。
amazonからの購入品ではないため、音楽の再生やラジオの再生はできないようでした。

# 参考文献
本記事の作成に当たり、以下の情報を参考にさせて頂きました。

- [Set Up the AVS Device SDK on Raspberry Pi with a Script](https://developer.amazon.com/ja-JP/docs/alexa/avs-device-sdk/raspberry-pi-script.html)

- [Set Up the AVS Device SDK on Raspberry Pi from Source](https://developer.amazon.com/ja-JP/docs/alexa/avs-device-sdk/raspberry-pi.html)

- [Configure AlexaClientSDKConfig.json](https://developer.amazon.com/en-US/docs/alexa/avs-device-sdk/alexa-client-sdk-config-json.html)

- [Snowboy](https://github.com/Kitt-AI/snowboy/releases/tag/v1.3.0)

- [失敗しないAlexa開発者アカウントの作り方](https://dev.classmethod.jp/articles/how-to-safety-create-alexa-developers-account/)
- [Raspberry PiでAlexa Voice Service(AVS)を利用する方法](https://qiita.com/zono_0/items/2c485b4176d349964876)
- [【Raspberry Pi】USBマイクを接続する方法](https://hellobreak.net/raspberry-pi-usb-microphone/)
- [Raspberry Pi を Alexaにする](https://www.ukeyslabo.com/raspberry-pi/rspi-to-alexa/)
- [Ubuntu 16.04 TLS (WSL) に HTTP/2 に対応した curl コマンドをインストールする](https://laboradian.com/install-curl-with-http2-on-ubuntu-wsl/)
- [RaspberryPiでAmazonEcho(Alexa)を自作しながら筋トレ](https://saikoro-house.com/raspberry-pi-alexa-diy/)
- [【RaspberryPi】Hot Word検出SnowboyでオリジナルのHot Wordを検知してみる（前編：設定）](https://uepon.hatenadiary.com/entry/2020/10/26/022159)
- [Raspberry pi3 avs Build Fail 93%](https://github.com/alexa/avs-device-sdk/issues/1856)