しぷぜん

しぷぜん

素人プログラマなおいがStep Zero to Oneしていくブログ

【Dialogflow,Python】GoogleHomeに仮想通貨の現在レートを喋ってもらうまで(その1)

にほんブログ村 IT技術ブログ Pythonへ

こんにちは、なおいです。

今回は、GoogleHomeにて自作アプリを作成してみました。スマートスピーカーとAIは仲良しですからね。手を出さないわけにはいきませんね。前後編の2部で書いていきますが、ここではDialogflowとPythonの作成までとします。次回はherokuへのデプロイから実際に喋らせるまでを書きますのでお楽しみに 

 

 

 

GoogleHomeとは

Google Homeの説明は今更ですが、2016年に北米で発売されたGoogle製のスマートスピーカーです。Google Assistantを搭載しており様々な操作を行えます。家にあるだけでなんか未来感を楽しめるというおまけもついてきます。

 

store.google.com

簡単にできることをご紹介すると、以下のようなことが声だけで出来るようになります。音楽をかけたり、どこか行きたい時にどれぐらいかかるかさくっと知りたい時には非常に便利そうです。

  1. 音楽をかける(GooglePlayMusicやSpotify
  2. 天気予報を聞く
  3. 場所を調べる
  4. 交通状況を確認する
  5. 言葉の意味を調べる
  6. 翻訳する
  7. アラーム・タイマーをセットする
  8. スケジュールを確認する(Googleカレンダー
  9. ラジオをかける(日経電子版News Radiko etc...)
  10. スマート家電との連携

 

きっかけ

発売当初からとても気になっていたんですが、結局置物になるよなと思いつつスルーをしていた所、昨年末(2017/12)に半額で販売するというニュースが流れたので、miniの価格(約7000円)でHomeが買えるならと購入し、テレビの横に鎮座させました。

意気揚々と初期設定を済ませてからの一週間ぐらいは『アラームかけて~、音楽かけて~、ニュース聞きたい~』とか言いまくってた。。。

 

まではよかったのですが、

  • アラーム(寝室と部屋が離れているので意味ないな)
  • ラジオニュース(となりにテレビあるんだからテレビで見るな)
  • 天気予報(今の天気が知れればいいタイプだからカーテン開ければわかるな)
  • 交通状況の確認(思ったより交通状況を聞きたくなる機会ないな)

となり、さらに購入当初夢見た『テレビをつけて』とか『電気をつけて』とか『エアコンつけて』とかは対応しているスマート家電でない場合、スマートリモコンがないとだめという事で、二週間程度で置物まっしぐら...

 

いや、待てそれはまずい 

流石に二週間でただの置物に成り下がる(7000円)は痛手。とりあえずなんかしよう...

 

ところで、話は変わるんですが私年末に仮想通貨始めたんですよ。今話題のコインチェックで…もちろんNem買ってました。はい、やられましたねw

それでも、まだギリギリ含み益をm・・・・・・・・あ!

 

これだわ。各通貨のレートをGoogleHomeさんに問い合わせよう。ということで、題材が決まったので早速開発していこうと思います。

 

どういう手順でしゃべらせる?

という事でやりたいことが決まったので、まずはGoogleHomeを自由にしゃべらせる方法を調べる。

DialogFlow(旧Api.ai)を使えばいいらしい。GoogleHome内臓のGoogleAssistantがDialogFlowと接続してくれるDialogFlowでこういう問いかけにはこういう風に返すとかの設定をしておくだけでいいみたいなことを書いてある。

そこからpython使っていろいろする場合は、サーバ(無料で使えるherokuを使えばいいんじゃない?って書いてた)にアップロード(デプロイ)して、Webhookするとかなんとか。。。あんまりよく分からないが私がやりたいことをイメージに起こすとこんな感じか?

f:id:ct-innovation01:20180202132833j:plain
  1. 人(自分)が話しかける
  2. GoogleAssistantがDialogFlowと接続する
  3. DialogFlowとサーバ(heroku)をWebhookを使って接続する
  4. サーバ(heroku)にデプロイしておいた自作Pythonが動作する
  5. 自作PythonCoincheckAPIを叩いてレートをjson形式で取得する
  6. サーバからDialogFlowにGoogleAssistantで読み込めるjson形式で返却する
  7. GoogleAssistantがGoogleHomeで結果を返す

 

準備する物(?)

  • Python3.5.
  • Googleアカウント+DialogFlowアカウント
  • サーバ(無いならherokuアカウント)
  • (heroku使うなら)GitHubアカウント
  • GoogleHome

 アカウントばっかだなこれ

 

DialogFlowの設定

DialogFlowで新規agentの作成

Dialogflowにログインして、[Create new agent]で新規作成を行います。

f:id:ct-innovation01:20180202134724p:plain

反応させたい単語を登録

今回は仮想通貨の銘柄を反応させて、日本円とのレートを答えてほしい。よって、入力として受け取る単語(ビットコインとかイーサリウムとか)をEntitiesに登録します。左側のEntitiesを選択してCREATE ENTITYで新しい単語帳を作成します。 

f:id:ct-innovation01:20180202135848p:plain

必要な単語と文字揺れが起こってもいいように日本語とか略称とかを入れて[SAVE]で保存します。

 

どんな反応をさせたいかを登録

次に、『ビットコインの値段は?』と聞いたら『今の価格はXXX円です。』といった返答が欲しいのでQ&Aのフローを登録していきます。登録する先はIntentsです。左側のIntentsを選択してCREATE INTENTで新しい単語帳を作成します。 

f:id:ct-innovation01:20180202145140p:plain

Entitiesに正しく登録されていれば、蛍光ペンでなぞったような色が付きます。

その他の設定として重要な所はActionの所に入力する任意の文字列が重要です(後述)。また、Responseはとりあえず返答をどうするかなので上手く結果が返ってこなかった場合を想定して、「わかりませんでした」としておきました。

最後に、Fullfilmentについてはどちらもチェックを付けておいてください。全ての設定が終わったら[SAVE]で保存します。

f:id:ct-innovation01:20180202145642p:plain

最後に一つDialogflowでの設定がありますが、今はできないので一旦作業を中断して次に進みます。

 

GitHubの設定

自作のPythonファイルを利用して計算をしたりしたい場合は、サーバにファイルをアップロード(正確にはデプロイ)してあげる必要があります。その際に以下のブログとGitHubを参考にしました。

ai-kenkyujo.com

github.com

herokuへデプロイするための準備(プログラムなど各ファイル作成)

下のGitHubのデータ一式を一旦zip形式とかでダウンロードして、必要なものを利用して自分のGitHubアカウントにリポジトリを作成して、同様の校正でアップロードします。

とりあえずこれだけあれば動作しましたっていう構成をスクショしたので貼っときます。

f:id:ct-innovation01:20180202153218p:plain

まず、この中からapp.pyのコードを変更します。修正内容は割愛しますが、下線をひいた部分が注意する所です。

app.py

from __future__ import print_function
from future.standard_library import install_aliases
install_aliases()

from urllib.parse import urlparse, urlencode
from urllib.request import urlopen, Request
from urllib.error import HTTPError

import json
import os
import requests
from pandas import DataFrame

from flask import Flask
from flask import request
from flask import make_response
from flask import render_template

import
sys
import logging

app = Flask(__name__)

app.logger.addHandler(logging.StreamHandler(sys.stdout))
app.logger.setLevel(logging.ERROR)
# Flask app should start in global layout

coins = {'Bitcoin': 'btc_jpy',
'Ethereum': 'eth_jpy',
'NEM': 'xem_jpy',
'Bitcoin Cash': 'bch_jpy',
'Ripple': 'xrp_jpy',
'Monero': 'xmr_jpy',
'Augur': 'rep_jpy',
'Litecoin': 'ltc_jpy',
'Lisk': 'lsk_jpy',
'DASH': 'dash_jpy',
'Factom': 'fct_jpy',
'Ethereum Classic': 'etc_jpy',
'Zcash': 'zec_jpy'
}


@app.route('/webhook', methods=['POST'])
def webhook():
req = request.get_json(silent=True, force=True)

print("Request:")
print(json.dumps(req, indent=4))

res = processRequest(req)

res = json.dumps(res, indent=4)
# print(res)
r = make_response(res)
r.headers['Content-Type'] = 'application/json'
return r


def processRequest(req):
if req.get("result").get("action") != "check_Cryptocurrency":
return {}
base_url = 'https://coincheck.com/api/rate/'
cryptocurrency, currency = get_currency(req)
if currency is None:
return {}
url = base_url + currency
print(url)
data = requests.get(url).json()
res = makeWebhookResult(currency, data, cryptocurrency)
return res


def get_currency(req):
result = req.get("result")
# requestライブラリでデータを取得して返却させる
if cryptocurrency is None:
  return None

return cryptocurrency, coins[cryptocurrency]


def makeWebhookResult(currency, data, cryptocurrency):
# なんかうまいこと取得したデータを加工
return {
"speech": speech,
"displayText": speech,
"source": "apiai-crypt"
}


if __name__ == '__main__':
port = int(os.getenv('PORT', 5000))

print("Starting app on port %d" % port)

app.run(debug=False, port=port, host='0.0.0.0'

次にrequirement.txtの中身を記述します。

ここで一つ目の下線部に関わる重要な点があります。Pythonは様々なOSSライブラリを利用して、プログラムを動作させていますがherokuにはもちろんライブラリは入っていません。この問題を解決するために、「requirement.txt」を使っています。このテキストファイルの中にインストールしたいライブラリとそのバージョンを書き込んでおくことでデプロイ時にこのライブラリもインストールしてくれます。

requests==2.18.4
pandas==0.22.0
Flask==0.10.1
future==0.16.0

もうひとつ重要な点があります。二つ目の下線部の所ですが、こちらはDialogflowのEntitiesにあるActionで任意に決めた文字列と合わせてください。

 

とりあえずは、ここまででPythonファイルの作成は完了。 

 

ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin