Raspberry PiとAlexaでオリジナルスキルを作る 「今日のご飯は?」

Raspberry Pi

Raspberry PiとAlexaでオリジナルスキルを作る

Raspberry PiとAlexaでオリジナルスキルを作ります。

今日のご飯は?

Alexaに「今日のご飯は?」と聞くと、メニューをランダムに提案してくれるスキルを作ってみます。

構成図としてはこんな感じです。

Raspberry Piでご飯を提案するシェルスクリプトを作る

ご飯のメニューを提案してくれるシェルスクリプト書きます。

ついでに50%くらいの確率で外食も提案してくれるようにしてみます。

meal.sh
#!/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
カレー
ハンバーグ
パスタ
ラーメン
餃子

out_meal.list
牛角
吉野家
スシロー

仕組みとしては、meal.listの中からランダムに3つ選んできて出力するといった感じです。

引数でLINEに通知、Alexaから出力、Bluetoothスピーカーから出力できるようにしています。
環境に合わせて修正してください。

引数を入れない場合は標準出力に出力されるようになっています。
以下のように出力されればOKです。

pi@raspberrypi3:/opt/test $ ./meal.sh
今日のご飯は、餃子、ハンバーグ、餃子、なんてどうですか?

Alexaの設定

これでご飯を提案してくれるシェルスクリプトができました。

次に、Alexaにオリジナルスキルを追加してみます。

今回はNode-RED Alexa Home Skill Bridgeでデバイスとして登録します。
「ラズパイ」という名前にしてみました。

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は別の機能を作成しましたが今回は省略です。

alexapi.sh
#!/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がしゃべるようにしています。

AlexaをRaspberry PiのNodeREDから喋らせる
Raspberry PiからAlexaを喋らせるこれまで、Raspberry PiからBluetoothスピーカとして接続したAlexaから音声を出力していました。Raspberry Pi Zero WHを使ってAm...

実際に使ってみる

実際に作成した「今日のご飯は?」スキルを使ってみます。

恥ずかしいのでSiriに起動を頼みます。

悪い提案をするAlexa

完成です!こんな感じでオリジナルのアレクサスキルを作ることができました!

問題としてはこの方法だと、呼びかけが定形になってしまうことです。

例えば、今日の天気は?今日のご飯は?歴史の問題を出して?といったトリガーが固定のスキルを作成することはできますが、「マクドナルドを外食リストに追加して」といったような変数を与えることはできません。

簡単な変数なら直接定形アクションを作れば対応できますが、毎回変わる変数を与えることはできません。

私は他にもBME280の結果をもとにした「寝室の気温は?」スキルなども作っています。
作り方の基本は全く同じです。

みなさんもオリジナルアレクサスキルをRaspberry Piで作成してみてはどうでしょうか。

コメント

タイトルとURLをコピーしました