0.はじめに
お正月に実家に帰省した人も多いはず。私もその一人ですが、両親の老いを感じ、あと何回会えるのかなとふと感じてしまいました。「あと何回両親と会えるか計算してくれるアプリを作ろう」と思いたったのですが、すでに素敵なサービスが英語ですがありました。Gigazineで紹介されています。こうやって数字で可視化してみるといつかいなくなってしまう現実味が増しますよね。
参考記事:両親にあと何回会えるのかを計算してくれるサービス「See Your Folks」
See Your Folks http://seeyourfolks.com/
1.作ってみたものはこちら
WEBサービスはもうあったので、LINEBotとスマートスピーカー(GoogleAssistant)対応する両親にあと何回会えるのかを計算してくれるアプリにリメイクしてみることにしました。実際に作ったデモ動画(LINEBot)はこちらです。
Google Dialogflow&python であと何回親に会えるか計算してくれる #linebot を作成。こうやって数字化されると切なくなりますね。
— さい🦏 (@saisan78) 2019年1月14日
男女、年齢、頻度のslotで埋める対話処理を作るのがコードをかくより簡単でした。 良かったら使ってみて下さい。https://t.co/fFJtMwATR0 pic.twitter.com/ledlHW9D6I
実際に利用してみたい方はLINEQRコードから友達になってみてください。
※(注意)時々Herokuが眠っています。。。
#2. 全体構成
今回は以下のような構成で作成します。
DialogFlowを用いることでLINEBotとGoogleAssistantの両方に簡単に対応することができる構成にしました。
#3.あと何回会えるのか計算する
計算式ですが、(平均寿命 - 親の年齢)×(一年間に会える日数) = 今から親と過ごせる残り日数としました。平均余命のデータなどもありますが、今回はシンプルに上記の式を利用しています。
そのため、以下を変数としてLINEBotを作りました。
- 性別(男女)
- 年齢
- 一年間に会える回数
2017年の日本人の平均寿命は女性が87・26歳、男性が81・09歳で、いずれも過去最高を更新した。20日に厚生労働省が発表した「簡易生命表」で明らかになった。
https://www.asahi.com/articles/ASL7N51XSL7NUTFK01Y.html
#2. Dialogflowで対話ロジックを作成する
Dialogflowの使い方やLINEBotの作成方法は以下の記事を参考にしました。
今回は必要なSlotを以下のように設定しています。
- 男女: Person
- 年齢: number
- 一年間に会える回数: times
上記の3つの変数をいろんなパターンでユーザが聞いてきそうなので、以下のようなIntentを登録しました。
母親も父親の呼び方も人それぞれなので、色々な呼び方に対応できるよう辞書を作っています。
#4. 外部の計算処理部分
3つの変数を用いて計算する部分は外部のサーバ(Heroku)を利用しています。
私も以下のポイントにまんまとハマったので共有しておきます。
また、参考までに計算部分のPythonは以下になります。
@app.route("/post_request_google", methods=['POST'])
def webhook():
data = request.json
print(json.dumps(data, ensure_ascii=False))#デバッグ用
try:
times = data["queryResult"]["parameters"]["times"]
userAge = data["queryResult"]["parameters"]["number"]
userInfo = data["queryResult"]["parameters"]["Person"]
if(userInfo == "お母さん"):
familydays = (87 - userAge)*times
else:
familydays = (81 - userAge)*times
message = "1年に" + str(int(times)) + "回会うとして、あなたが" + userInfo + "と会えるのは残り約" + str(int(familydays)) + "回かもしれません。大事にしてくださいね。"
if(familydays <= 0):
message = "長生きされてますね。あなたが" + userInfo + "と会える回数は私にはわかりません。大事にしてくださいね。"
else:
print("ok")
except KeyError:
print("KeyError")
reply_body = {
"fulfillmentText":message
,"fulfillmentMessages":[
{
"text": {
"text": [
message
]
}
}
]
,"source":""
}
print(message)
return jsonify(reply_body)
#5. DialogFlowを使ってみての感想
今回感じたDialogFlowのメリットは以下です。
- LINEBotとGoogleAssistantのスキルの両方を一度に簡単に作成できる!
- 対話の処理がGUIベースで簡単に作成できる!
一方で、画像を扱うLINEBotなどを作りたい場合にはなかなか使い方が難しいかなとも感じました。
また何か分かり次第まとめたいと思います。