【GoogleHome】仮想通貨のレートを喋らせてみた-1

まずは、簡単にスマートスピーカーについて知るところから始めていきましょう。
いいから何やったのか知りたい方は、『どういう手順でしゃべらせる?』からお読みください。

スマートスピーカーとは

対話型の音声操作に対応したAIアシスタントを利用可能なスピーカーで、AIスピーカーとも呼ばれているものです。
音楽鑑賞や調べ物、買い物といったサービスを「音声」のみで利用できる新しく注目されているデバイスです。

その証拠に色んなメーカーがこぞって開発を進めています。

各社のスマートスピーカー

それでは各社が提供しているスマートスピーカーってどんなのがあるのか。。。
2018年10月現在では、日本未発売のものもありますがこれぐらいをおさえておけば大体のスマートスピーカーをおさえられていると思うものをまとめました。
※ここに記載しているサイズや価格は標準仕様のものを載せています。他にもエントリーモデルやハイエンドモデルを揃えているものもあります。

 

Google HomeGoogleGoogle Assistant直径: 96.4 mm
高さ: 142.8 mm
15,120円(税込)Buy Now
Amazon EchoAmazonAlexa直径: 88 mm
高さ: 148 mm
11,980円(税込)Buy Now
ClovaLINEClova直径: 201.05 mm
高さ: 139.84 mm
14,000円(税込)Buy Now
InvokeMicrosoftCortana直径:106.68 mm
高さ:241.30 mm
199ドル日本未発売
HomePodAppleSiri直径: 172 mm
高さ: 142 mm
349ドル日本未発売

補足)その他のスマートスピーカー

上記にはないが、スマートスピーカーだと打ち出して販売されている製品がいくつか見受けられると思います。
これらを表に載せなかったのは、他社のAIアシスタントを搭載しているからです。例えばSonyのスマートスピーカーであればGoogleAssistantを搭載しているといった具合です。今回の記事ではAIアシスタントが独自のものだけをリストアップしました。

GoogleHomeとは

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

store.google.com

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

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

きっかけ

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

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

  • アラーム(寝室と部屋が離れているので使わない)
  • ラジオニュース(となりにテレビあるんだからテレビで見る)
  • 天気予報(そもそも天気予報を確認する習慣がない)
  • 交通状況の確認(交通状況を聞きたくなるときは車乗っちゃってる)

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

いや、待てそれはまずい

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

ところで、話は変わるんですが私年末に仮想通貨始めたんですよ。今話題のコインチェックで…もちろんNem買ってました。はい、やられましたねー
それでも、まだギリギリ含み益をm・・・・・・・・あ!これだわ。各通貨のレートをGoogleHomeさんに問い合わせよう。という流れで題材が決まり開発がスタートしました。

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

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

DialogFlow(旧Api.ai)を使えばいいらしい。GoogleHome内臓のGoogleAssistantがDialogFlowと接続してくれるDialogFlowでこういう問いかけにはこういう風に返すとかの設定をしておくだけでいいみたいなことを書いてある。そこからpython使っていろいろする場合は、サーバ(無料で使えるherokuを使えばいいんじゃない?って書いてた)にプログラムをアップロード(正確にはデプロイ)して、Webhookするとかなんとか。。。あんまりよく分からない。わかりやすく図示すると私がやりたいことをイメージに起こすとこんな感じだろうと目論んですすめることにする。

  1. 1.人(自分)が話しかける
  2. 2.GoogleAssistantがDialogFlowと接続する
  3. 3.DialogFlowとサーバ(heroku)をWebhookで通信する
  4. 4.サーバ(heroku)にデプロイしておいた自作Pythonが動作する
  5. 5.自作のPythonプログラムがCoincheckのAPIを叩いてレートをjson形式で取得する
  6. 6.サーバからDialogFlowにGoogleAssistantで読み込めるjson形式で返却する
  7. 7.GoogleAssistantがGoogleHomeで結果を返す

準備する物(?)

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

DialogFlowの設定

DialogFlowで新規agentの作成

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

反応させたい単語を登録

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

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

 

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

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

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

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

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

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

 

GitHubの設定

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

github.com

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

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

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

まず、この中から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": #Actionで設定した文字列に合わせる。
        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(urrency, 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ファイルの作成は完了。
あとは、これをWebを介してGoogleHomeがアクセスできるようにすればいい。方法は次の更新で行う。

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

「【GoogleHome】仮想通貨のレートを喋らせてみた-1」への1件のフィードバック

  1. ピンバック: 【GoogleHome】仮想通貨のレートを喋らせてみた2 | 趣味で始める機械学習

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です