2017年様々なAIスマート・スピーカーが出て賑わっていますが、棒や湯飲みでない、自分なりのAIスピーカーを自作して、楽しく話しかけてみませんか?
私ヨシケンは、Google HomeやAmazon Echoなど色々なAIスピーカーを買って遊んでいますが、そのお喋り機能を自作してIoTなモノも作っています。今回はAmazon AlexaをRaspberry Piにインストールして、話しかければ話しかけるほど愛着が湧き、枝ぶりが良くなる(?)盆栽型アマゾンAlexaのアマ・ボンを作っていきたいと思います!
どうせChristmasのAdvent Calendarですし、LEDも付けてクリスマスツリー風にして、誰かにクリスマス・プレゼントにしたら、喜ばれる事間違いなし!?
アマボンの作り方は、ざっとこんな感じ:
- AIスピーカーを作るのに必要なもの一覧
- Raspberry Pi、ハードウェア(スピーカー、マイク)の設定
- Amazon Alexa機能の導入
- Alexaをハックして、盆栽を動かすようにする
必要なもの:
- Raspberry Pi 3 Bodel B
- USBマイク
- 又は、Seeed Respeaker
- スピーカー(イヤフォン・ジャックがあるものなら何でもOK)
- サーボモーター
- LED
- バッテリー(必要があれば)
- 外装(皆さんのお好きに。私はなぜか盆栽にしたくて。。)
ハードウェアの設定:
- Raspberry Piの設定
ラズパイのOS Raspbianのインストール、RasPi-configでの設定、Wifi環境、SSH接続など基本的なところは、こちらのエントリ などによくまとまっていますので、参照してやってみて下さい。
ここでは、Raspbianの最新版Stretch-Desktopを使っていて、ラズパイの基本的な設定が済んでいる事を前提に進めます。
- スピーカー、マイクの設定
それでは、スピーカーとマイクをラズパイに挿し、ちゃんと動いているか確認しましょう。
まずaplay -lでスピーカーが認識されているか確かめます。ここでは Card 0にスピーカーが認識されている状態です。
サンプル・サウンドを流してみて、音が出るか確認します。
aplay -l
aplay /usr/share/sounds/alsa/Front_Center.wav
次に、arecordでマイクのカード番号を確認します。この場合は Card 1になっています。
自分で音を録音し、それを先ほどのaplayで聞いてみましょう。
最後に、arecordとaplayを繋げて、ファイルにせずに、その場の音がスピーカーから流れる事を確認します。ハウリングするかもしれないので、音量を適当に調整して下さい。
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自身が公開しているこちらのサンプル版 を入れるのが正統派で、それでももちろんAlexaを動かして遊ぶことができます。ただこちらだとRaspbianのDesktopから幾つかサービスを立ち上げる必要がありますし、ラズパイを立ち上げた時に自動起動させたかったのですがそれが分からなかったり(やっている人いたら教えて下さい!)と、ちょっと面倒だなあ、という印象です。
そんな時に、こちらのAlexaPiといういい感じのパッケージがありますので、ここではこれをインストールしていきます。
(更にサンプル版はJavaとNode.jsベースですが、AlexaPiは名前の通りPythonで書かれているので、そっちの方が慣れていて。。)
AlexaPiのインストールの仕方サイトの通りにやっています!
- Alexa Voice Serviceの登録
まずはAmazonの開発者コンソールにログインします。
Alexa Voice Serviceを選びます。
マイプロダクトを登録する画面で、「製品を作成する」を選びます。
プロダクト登録画面の製品情報のところで、製品名、IDなど必要情報を入れていきます。
次にセキュリティ・プロファイル画面で、新しいセキュリティ・プロファイルを作っていきます。
この中で大事なのは、「許可された出荷地」(?)にhttp://localhost:5050とhttp://ip_address:5050を入れます。
また、「許可された返品URL」(?)にhttp://localhost:5050/codeとhttp://ip_address:5050/codeを入れます。
必要情報を入れ終わったら、製品情報を保存します。
クライアントID、クライアント・シークレットなどはこのあとのインストレーションで使いますので、これらの情報を記録しておいて下さい。
- AlexaPiのインストール
さて、AlexaPiをインストールしていきましょう。
ドキュメントによると/opt以下に入れるのがお勧めだそうです。それに従って、opt以下にgitからAlxaPiをクローンし、スクリプトを流します。
その最中にクライアントIDなどを聞かれるので、先ほど記録した情報を入れていきます。
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を見ると、ちゃんと登録されているかが確認できます。
sudo systemctl start AlexaPi.service
sudo systemctl status AlexaPi.service
さあこれでラズパイをリブートすると、Hello!の声が聞こえれば、Alexaが動き出しています。
もしHello!の声が聞こえなかったり、以下コマンドでAlexaプロセスが見えない場合は、デバッグモードで流すとエラーなどが見えると思います。
またログや設定ファイルは以下のようにして確認できます。
もし不具合が続く場合は、こちらのデバッグの仕方 も見てみて下さい。
# 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がちゃんとお天気などを答えてくれます。
Alexaをハックする
Alexaでひとしきり遊んだ後は、Alexaをハックして自分独自のお喋りスピーカーにしてみましょう。
といっても、仕組みは簡単、Alexaなどで音声が録音されるとラズパイ上でステータスが変更されます。
このステータス・ファイルを読んで、それが変更されたらモーターなどを動かすようにします。
ここでは、盆栽を針金で作って、それを下からサーボモーターを回し、話しかけるたびに盆栽がくるくる回るようにします。
- サーボモーターを動かすPythonプログラム
まずは、Alexaが反応したらラズパイからサーボモーターを動かす為のPythonスクリプトを書いておきます。サンプルはこんな感じです。
# 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
とりあえずこのサーボ・プログラムを動かして、サーボモーターがちゃんと動くか確認しておいて下さい。
- プログラムモニターの登録
さて、ここからはAlexaに話しかけた時のステータスをチェックするプログラムを書いていきます。
ラズパイでaplayにより音声が発せられると、このフォルダの中のstatusというファイルに、RUNNNINGなどのステータスが変わっていきます。
自分の環境で、*のところを0や1などで探してみて、音声が出た時のstatusファイルの場所を探してみて下さい。
/proc/asound/card*/pcm0p/sub*/status
そのstatusファイルが変更されたかどうかをチェックするプログラムを作ります。
そしてstatusが変更された、先ほどのサーボプログラムを起動するようにします。
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
更にこのスクリプトを自動起動させるための以下のようなスクリプトをセットして、再度リブート。
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"と言い出したところくらいから、サーボモーターが動いてくれたのではないでしょうか?
ちなみに、今回私は適当に針金で盆栽風の飾りを作りましたが、こちらのサイト などに針金を使った素晴らしい盆栽コレクション(?)があります。参考にしてみて、自分の美学のままに作ってみて下さい。
さあ盆栽を乗せて、話しかけると、アマボンが踊りだします!
せっかくクリスマスなことだし、ボンサイにLEDをつけて、動くとさらにLEDがピカピカするようにすると、気分も盛り上がって最高!
Youtube: AmaBon Weather Bonsai
- 最後になってすみません、今のところまだ英語バージョンだけなようです!
AlexaPiのFAQには、多言語も対応可能、と書いてあるのですが、私のアカウントではまだ日本語での話しかけに対応できていません。もう少しやってみますが、もしご存知の方がいれば、Alexa Voice Serviceでの日本語対応を教えて下さい!(すみません、最後の最後で。。)
という事で、ラズパイに自分でAmazon Alexaをインストールして、更にそれをハックして独自のお喋りスピーカー(アマボン・クリスマス・バージョン)を作ってみました。
これと同様にGoogle Home/Assistantをインストールしたり、声で操作するロボットなども作っていますので、ブログ http://blog.ktrips.net やここQiitaにも後程アップデートします!
それでは、よいクリスマスを! Happy Christmas!
ヨシケン