記事の内容を試す場合は自己責任でお願いいたします。
- Raspberry Pi Zero WH OSインストール
- Raspberry Pi Zero WHを使ってAmazon Echo Flexから音を出す
- Raspberry Piと赤外線LEDで家電を操作する
- Raspberry PiとBME280を利用して気温、湿度、気圧を測定する
- Raspberry Pi Zero WHにMackerelを導入して死活監視を行う
- Raspberry Piで照度を取得する TSL2572 TSL2561
- AlexaからRaspberry Piを経由して家電を音声で操作する
- AlexaをRaspberry PiのNodeREDから喋らせる
- Raspberry PiとAlexaでオリジナルスキルを作る 「今日のご飯は?」
- Raspberry Pi とSlackとLINE Messaging APIでLINEから家電を操作する
- Raspberry Piで収集したセンサー情報をMachinistに送信する
- Raspberry Piを使ってAlexaからゴミの日のお知らせをする
- Raspberry Piでダイソーのリモートシャッターを使う
- 2台のRaspberry PiとMySQLでレプリケーションを構成する
- iPhoneからRaspberry Piを経由して家電を操作する
- Raspberry PiでWebサーバを立ててブラウザから家電を操作する
Raspberry PiとAlexaでオリジナルスキルを作る
Raspberry PiとAlexaでオリジナルスキルを作ります。
今日のご飯は?
Alexaに「今日のご飯は?」と聞くと、メニューをランダムに提案してくれるスキルを作ってみます。
構成図としてはこんな感じです。

Raspberry Piでご飯を提案するシェルスクリプトを作る
ご飯のメニューを提案してくれるシェルスクリプト書きます。
ついでに50%くらいの確率で外食も提案してくれるようにしてみます。
#!/bin/bash
cd `dirname $0`
filename="meal.list"
filename2="out_meal.list"
num=`cat ${filename} | wc -l`
col=`echo $(($RANDOM % $num + 1 ))`
meal=`sed -n ${col}p $filename`
col=`echo $(($RANDOM % $num + 1 ))`
meal2=`sed -n ${col}p $filename`
col=`echo $(($RANDOM % $num + 1 ))`
meal3=`sed -n ${col}p $filename`
msg="今日のご飯は、${meal}、${meal2}、${meal3}、なんてどうですか?"
out=`echo $(($RANDOM % 100 ))`
if [ $out -lt 50 ]; then
num=`cat ${filename2} | wc -l`
col=`echo $(($RANDOM % $num + 1 ))`
outmeal=`sed -n ${col}p $filename2`
msg="${msg}それとも、${outmeal}にいっちゃいます?"
fi
if [ $# -eq 1 ]; then
if [ $1 = "line" ]; then
/opt/scripts/line_notify.sh ${msg}
elif [ $1 = "alexa" ]; then
echo "$msg" > /opt/nodered/alexa_speak.txt
elif [ $1 = "living_speaker" ]; then
ssh pi@raspberrypizero "/opt/openjtalk/openjtalk.sh "$msg""
fi
else
echo $msg
fi
meal.listにメニュー一覧を記述します。
同様にout_meal.listに外食一覧を記述します。
カレー
ハンバーグ
パスタ
ラーメン
餃子
牛角
吉野家
スシロー
仕組みとしては、meal.listの中からランダムに3つ選んできて出力するといった感じです。
引数でLINEに通知、Alexaから出力、Bluetoothスピーカーから出力できるようにしています。
環境に合わせて修正してください。
引数を入れない場合は標準出力に出力されるようになっています。
以下のように出力されればOKです。
pi@raspberrypi3:/opt/test $ ./meal.sh
今日のご飯は、餃子、ハンバーグ、餃子、なんてどうですか?
Alexaの設定
これでご飯を提案してくれるシェルスクリプトができました。
次に、Alexaにオリジナルスキルを追加してみます。
今回はNode-RED Alexa Home Skill Bridgeでデバイスとして登録します。
「ラズパイ」という名前にしてみました。
こんな感じでAlexa Home Skill Bridgeに登録します。

ポイントは%を選択しておくことです。
次に、Alexaからデバイスを検索して「ラズパイ」というデバイスを見つけておきます。
デバイスが追加されたら、定形アクションを作成します。
このような感じで定形アクションを作ります。
そうです。パーセントの指定でオリジナルスキルを振り分けます。
通常の方法でやると、オリジナルスキルを増やせば増やすごとにデバイスを追加していく必要がありますが、今回の方法だと1つのデバイスで0~100までの値を変数として与えることで機能を分岐させます。
今回の場合だと、4%のデータをRaspberry Piに送ることで「今日のご飯は?」スキルとして起動させます。
わかりやすいように定形アクション名に番号を振っています。
これでAlexa側の準備ができました。
Raspberry PiのNodeREDを準備する
次にRaspberry PiのNodeREDを準備します。
NodeREDを開いてこのように登録します。

今回はalexapi.shというシェルスクリプトを準備して、その中で機能を分岐させます。
今回の場合は引数として「4」が来るので、それをif文で分岐させます。
その中に先程作成したmeal.shを呼び出すようにします。
1~3は別の機能を作成しましたが今回は省略です。
#!/bin/bash
if [ $# -eq 1 ]; then
if [ $1 = "0" ]; then
echo "">/dev/null
elif [ $1 = "1" ]; then
echo "skill1"
elif [ $1 = "2" ]; then
echo "skill2"
elif [ $1 = "3" ]; then
echo "skill3"
elif [ $1 = "4" ]; then
/opt/scripts/meal.sh alexa
fi
fi
実行権付与も忘れずに。
今回作成したmeal.shは引数で出力先を設定しています。
「alexa」と引数を入れるとAlexaがしゃべるようにしています。

実際に使ってみる
実際に作成した「今日のご飯は?」スキルを使ってみます。
恥ずかしいのでSiriに起動を頼みます。
完成です!こんな感じでオリジナルのアレクサスキルを作ることができました!
問題としてはこの方法だと、呼びかけが定形になってしまうことです。
例えば、今日の天気は?今日のご飯は?歴史の問題を出して?といったトリガーが固定のスキルを作成することはできますが、「マクドナルドを外食リストに追加して」といったような変数を与えることはできません。
簡単な変数なら直接定形アクションを作れば対応できますが、毎回変わる変数を与えることはできません。
私は他にもBME280の結果をもとにした「寝室の気温は?」スキルなども作っています。
作り方の基本は全く同じです。
みなさんもオリジナルアレクサスキルをRaspberry Piで作成してみてはどうでしょうか。
コメント