Amazon Alexaに話しかけるたびに盆栽が踊りだすAmaBon（クリスマスツリー Ver.）を自作してみた

# 2017年様々なAIスマート・スピーカーが出て賑わっていますが、棒や湯飲みでない、自分なりのAIスピーカーを自作して、楽しく話しかけてみませんか？
私ヨシケンは、Google HomeやAmazon Echoなど色々なAIスピーカーを買って遊んでいますが、そのお喋り機能を自作してIoTなモノも作っています。今回はAmazon AlexaをRaspberry Piにインストールして、話しかければ話しかけるほど愛着が湧き、枝ぶりが良くなる(？)盆栽型アマゾンAlexaのアマ・ボンを作っていきたいと思います！
![IMG_8425.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/f5f9b20a-7eec-22d4-6f63-4202aa26e664.jpeg) 
![AmaBon.gif](https://qiita-image-store.s3.amazonaws.com/0/212060/d94b2fd3-da00-c2d7-92b0-e1e785ea0b96.gif)

どうせChristmasのAdvent Calendarですし、LEDも付けてクリスマスツリー風にして、誰かにクリスマス・プレゼントにしたら、喜ばれる事間違いなし！？
![IMG_9319.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/377c8662-873c-d390-eb58-225acb216e95.jpeg)


## アマボンの作り方は、ざっとこんな感じ：
1. AIスピーカーを作るのに必要なもの一覧
2. Raspberry Pi、ハードウェア（スピーカー、マイク）の設定
3. Amazon Alexa機能の導入
4. Alexaをハックして、盆栽を動かすようにする

## 必要なもの：
- [Raspberry Pi 3 Bodel B](http://amzn.to/2AUsdma)
- [USBマイク](http://amzn.to/2ARfcts)
- 又は、[Seeed Respeaker](https://www.seeedstudio.com/ReSpeaker-4-Mic-Array-for-Raspberry-Pi-p-2941.html)
- スピーカー（イヤフォン・ジャックがあるものなら何でもOK）
- サーボモーター
- LED
- バッテリー（必要があれば）
- 外装（皆さんのお好きに。私はなぜか盆栽にしたくて。。）

![IMG_9246.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/a9e2da92-caa4-a377-8535-714494e93ddc.jpeg)


## ハードウェアの設定：

- Raspberry Piの設定
- 
ラズパイのOS Raspbianのインストール、RasPi-configでの設定、Wifi環境、SSH接続など基本的なところは、[こちらのエントリ](https://qiita.com/rubytomato@github/items/07c16a631cee1e9a68be) などによくまとまっていますので、参照してやってみて下さい。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/212060/d83ac94e-c143-3fa8-7e33-5becdb539007.png)

ここでは、Raspbianの最新版Stretch-Desktopを使っていて、ラズパイの基本的な設定が済んでいる事を前提に進めます。


- スピーカー、マイクの設定
- 
それでは、スピーカーとマイクをラズパイに挿し、ちゃんと動いているか確認しましょう。

まずaplay -lでスピーカーが認識されているか確かめます。ここでは Card 0にスピーカーが認識されている状態です。
サンプル・サウンドを流してみて、音が出るか確認します。

```Python:aplay
aplay -l

aplay /usr/share/sounds/alsa/Front_Center.wav

```

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/212060/c9d75888-f4c4-8c10-5515-f5c87cdc5226.png)


次に、arecordでマイクのカード番号を確認します。この場合は Card 1になっています。
自分で音を録音し、それを先ほどのaplayで聞いてみましょう。
最後に、arecordとaplayを繋げて、ファイルにせずに、その場の音がスピーカーから流れる事を確認します。ハウリングするかもしれないので、音量を適当に調整して下さい。

```Python:arecord

arecord -l

arecord -f S16_LE -r 16000 -D 1 test.wav

# 録音を止める時は、CTRL+C

aplay -f S16_LE -r 16000 test.wav

alsamixer  #音量の調整など。止めるときは、Esc

arecord -f cd -Dhw:1 | aplay -Dhw:0
```

## Amazon Alexa (AlexaPi) の導入:

では本題の、ラズパイにAmazon Alexaを入れていきます。

- AlexaPiについて
- 
AlexaはもちろんAmazon自身が公開している[こちらのサンプル版](https://github.com/alexa/alexa-avs-sample-app/wiki/Raspberry-Pi) を入れるのが正統派で、それでももちろんAlexaを動かして遊ぶことができます。ただこちらだとRaspbianのDesktopから幾つかサービスを立ち上げる必要がありますし、ラズパイを立ち上げた時に自動起動させたかったのですがそれが分からなかったり（やっている人いたら教えて下さい！）と、ちょっと面倒だなあ、という印象です。
そんな時に、こちらのAlexaPiといういい感じのパッケージがありますので、ここではこれをインストールしていきます。
（更にサンプル版はJavaとNode.jsベースですが、AlexaPiは名前の通りPythonで書かれているので、そっちの方が慣れていて。。）
[AlexaPiのインストールの仕方サイト](https://github.com/alexa-pi/AlexaPi/wiki/Installation)の通りにやっています！

- Alexa Voice Serviceの登録
- 
まずは[Amazonの開発者コンソール](https://developer.amazon.com)にログインします。
Alexa Voice Serviceを選びます。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/212060/6cd2eea9-c681-3735-6a71-e97bd22d611f.png)

マイプロダクトを登録する画面で、「製品を作成する」を選びます。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/212060/33b28513-df14-ac5d-6c34-97164c346400.png)

プロダクト登録画面の製品情報のところで、製品名、IDなど必要情報を入れていきます。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/212060/4c81ac6d-1cb5-2a94-284b-d6b05431e74f.png)

次にセキュリティ・プロファイル画面で、新しいセキュリティ・プロファイルを作っていきます。
この中で大事なのは、「許可された出荷地」（？）にhttp://localhost:5050とhttp://ip_address:5050を入れます。
また、「許可された返品URL」（？）にhttp://localhost:5050/codeとhttp://ip_address:5050/codeを入れます。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/212060/9a0f3ffb-9590-4cca-2ab9-9c134ed1320d.png)

必要情報を入れ終わったら、製品情報を保存します。

クライアントID、クライアント・シークレットなどはこのあとのインストレーションで使いますので、これらの情報を記録しておいて下さい。

- AlexaPiのインストール
- 

さて、AlexaPiをインストールしていきましょう。
ドキュメントによると/opt以下に入れるのがお勧めだそうです。それに従って、opt以下にgitからAlxaPiをクローンし、スクリプトを流します。
その最中にクライアントIDなどを聞かれるので、先ほど記録した情報を入れていきます。

```Python:AlexaPi

cd /opt

sudo apt-get install git

sudo git clone https://github.com/alexa-pi/Alexa.git

sudo ./AlexaPi/src/scripts/setup.sh

```
このスクリプトが流れ終わると、AlxaPiがラズパイに入りました。なんだかあっさり入ってしまって拍子抜けするくらいです。
Systemctlでラズパイ起動時に、このAlexaPiが自動起動するように登録します。
Statusを見ると、ちゃんと登録されているかが確認できます。

```Python:systemctl

sudo systemctl start AlexaPi.service

sudo systemctl status AlexaPi.service

```

さあこれでラズパイをリブートすると、Hello!の声が聞こえれば、Alexaが動き出しています。
もしHello！の声が聞こえなかったり、以下コマンドでAlexaプロセスが見えない場合は、デバッグモードで流すとエラーなどが見えると思います。
またログや設定ファイルは以下のようにして確認できます。
もし不具合が続く場合は、[こちらのデバッグの仕方](https://github.com/alexa-pi/AlexaPi/wiki/Audio-setup-&-debugging) も見てみて下さい。

```Python:Debug
# Alexaプロセス確認
ps aux | grep alexa

# デバッグモード
python /opt/AlexaPi/src/main.py -d

# ログ確認
sudo journalctl -u AlexaPi.service
sudo less /var/log/AlexaPi.log

# AlexaPi設定ファイル
sudo vi /etc/opt/AlexaPi/config.yaml

```

さあ、Alexa!の掛け声の後に、What is the weather in Tokyo? などと話しかけてみて下さい。

"Yes"という声が聞こえて、Alexaがちゃんとお天気などを答えてくれます。

[Youttube: AmaBon Talk](https://youtu.be/ZBR2bzi-kGo)

## Alexaをハックする

Alexaでひとしきり遊んだ後は、Alexaをハックして自分独自のお喋りスピーカーにしてみましょう。

といっても、仕組みは簡単、Alexaなどで音声が録音されるとラズパイ上でステータスが変更されます。
このステータス・ファイルを読んで、それが変更されたらモーターなどを動かすようにします。
ここでは、盆栽を針金で作って、それを下からサーボモーターを回し、話しかけるたびに盆栽がくるくる回るようにします。
![IMG_9241.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/dc6a0881-6515-ad24-058e-c1d44435c426.jpeg)



- サーボモーターを動かすPythonプログラム 
- 

まずは、Alexaが反応したらラズパイからサーボモーターを動かす為のPythonスクリプトを書いておきます。サンプルはこんな感じです。

```Python:servo.py
# Servo Control
import time
import wiringpi

pin =12

# use 'GPIO naming'
wiringpi.wiringPiSetupGpio()
 
# set #18 to be a PWM output
wiringpi.pinMode(pin, wiringpi.GPIO.PWM_OUTPUT)
 
# set the PWM mode to milliseconds stype
wiringpi.pwmSetMode(wiringpi.GPIO.PWM_MODE_MS)
 
# divide down clock
wiringpi.pwmSetClock(192)
wiringpi.pwmSetRange(2000)
 
delay_period = 0.01
 
while True:
        for pulse in range(50, 250, 1):
                wiringpi.pwmWrite(pin, pulse)
                time.sleep(delay_period)
        for pulse in range(250, 50, -1):
                wiringpi.pwmWrite(pin, pulse)
                time.sleep(delay_period)

wiringpi.pwmWrite(pin, 0)

---

#sudoでサーボプログラムを流して下さい
sudo python servo.py

```

とりあえずこのサーボ・プログラムを動かして、サーボモーターがちゃんと動くか確認しておいて下さい。

![20171213_012559.gif](https://qiita-image-store.s3.amazonaws.com/0/212060/289c3d02-db6f-7a3e-c7a7-ebe70399358f.gif)


- プログラムモニターの登録
- 


さて、ここからはAlexaに話しかけた時のステータスをチェックするプログラムを書いていきます。
ラズパイでaplayにより音声が発せられると、このフォルダの中のstatusというファイルに、RUNNNINGなどのステータスが変わっていきます。
自分の環境で、*のところを0や1などで探してみて、音声が出た時のstatusファイルの場所を探してみて下さい。

/proc/asound/card*/pcm0p/sub*/status

そのstatusファイルが変更されたかどうかをチェックするプログラムを作ります。
そしてstatusが変更された、先ほどのサーボプログラムを起動するようにします。

```shell:monitor.sh

sudo vi monitor.sh

--- モニター・シェル ---

#!/bin/bash

DIR='/proc/asound/card0/pcm0p/sub0/status'
CMD='sudo python /home/pi/web/cgi-bin/servo.py'

content=''
while true
do
    new_content=`cat $DIR`  
    if [[ "$content" != "$new_content" ]]; then
        content=$new_content
        $CMD
    fi
    sleep 0.25
done

```

更にこのスクリプトを自動起動させるための以下のようなスクリプトをセットして、再度リブート。

```shell:autoMonitor.sh

sudo vi /etc/init.d/autoMonitor.sh

--- モニター自動起動シェル ---

#!/bin/bash
# /etc/init.d/autoMonitor.sh

case "$1" in
  start)
    echo "Starting autoMonitor.sh"
    /home/pi/web/monitor.sh
    ;;
  stop)
    echo "Stopping autoMonitor.sh"
    killall monitor.sh
    ;;
  *)
    echo "Usage: /etc/init.d/go-furby-go.sh {start|stop}"
    exit 1
    ;;
esac

exit 0

```

これでリブートした後に、Alexaに話しかけてみると、、、どうでしょいうか？Alexaが"Yes"と言い出したところくらいから、サーボモーターが動いてくれたのではないでしょうか？

ちなみに、今回私は適当に針金で盆栽風の飾りを作りましたが、[こちらのサイト](http://www.1999.co.jp/erumaer/m210.html) などに針金を使った素晴らしい盆栽コレクション(?)があります。参考にしてみて、自分の美学のままに作ってみて下さい。

![IMG_8461.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/57dbe6e5-9d74-9082-c93b-dbc98fef5372.jpeg)

[Youtube: Moving Bonsai](https://youtu.be/LE5-R3ep8xc)

さあ盆栽を乗せて、話しかけると、アマボンが踊りだします！
せっかくクリスマスなことだし、ボンサイにLEDをつけて、動くとさらにLEDがピカピカするようにすると、気分も盛り上がって最高！
![20171213_014528.gif](https://qiita-image-store.s3.amazonaws.com/0/212060/912b9220-9112-9dd0-94b0-432bab8f7ab8.gif)

[Youtube: AmaBon Weather Bonsai](https://youtu.be/w1YYQlE7qbw)

- 最後になってすみません、今のところまだ英語バージョンだけなようです！
- 

[AlexaPiのFAQ](https://github.com/alexa-pi/AlexaPi/wiki/Q&A-(FAQ))には、多言語も対応可能、と書いてあるのですが、私のアカウントではまだ日本語での話しかけに対応できていません。もう少しやってみますが、もしご存知の方がいれば、Alexa Voice Serviceでの日本語対応を教えて下さい！（すみません、最後の最後で。。）


という事で、ラズパイに自分でAmazon Alexaをインストールして、更にそれをハックして独自のお喋りスピーカー（アマボン・クリスマス・バージョン）を作ってみました。

これと同様にGoogle Home/Assistantをインストールしたり、声で操作するロボットなども作っていますので、[ブログ http://blog.ktrips.net](http://blog.ktrips.net) やここQiitaにも後程アップデートします！

それでは、よいクリスマスを！ Happy Christmas!

ヨシケン

# 参考リンク
- [ラズパイのセットアップ](https://qiita.com/rubytomato@github/items/07c16a631cee1e9a68be)
- [AlexaPiのドキュメント(英語)](https://github.com/alexa-pi/AlexaPi/wiki/Installation)
- [Amazon Alexa Voice Serviceのページ(英語)](https://developer.amazon.com)
- [Blog.ktrips.netヨシケンのモノ作りブログ](http://blog.ktrips.net)