SORACOMの料金を音声で確認する

Google Home + SORACOM連携ネタの第3弾となります。
以前の2記事は多くの反響を頂きました。ありがとうございました。

スマートスピーカーのGoogle Home(Mini)を購入しました。 クラウドと連携させ、SORACOM SIMの回線状態を音声で変更するアプリケーションを作成してみました。
Google Homeからの音声操作でWioLTEのLEDの発光色を変更してみます。 (SORACOM UG #10 LT発表内容)

さて上記では音声で回線速度の変更を行ったのですが、通信サービスで問い合わせたい情報は何と言っても「料金」ではないでしょうか。

SORACOM APIには(確定前/確定後)料金を確認する機能がありますので、Google Homeから音声で問い合わせる機能を開発してみます。

アーキテクチャ

前回までは、Google Homeの音声認識を司るGoogleアシスタントとクラウド側にあるSORACOM APIとの繋ぎにはIFTTTを利用していました。しかし残念ながらIFTTTは発話トリガーにしか利用できず、問い合わせ結果に応じた任意の文言を発話させることができないため、今回の仕組みにおいては利用できません。

そのため今回は Actions on Google と Dialogflow を用いて実現することにします。

ざっくりとした流れは下記の通りです。

  1. 対話的にパラメータを問い合わせ
    Dialogflowを用いた場合、パラメータを対話的に問い合わせることができるので、料金を確認したい年月を問い合わせます。
  2. Lambda関数呼び出し
    Dialogflow(Fulfillment)よりAPI Gatewayを経由してLambda関数を呼び出し
    (パラメータに年月を付与)
  3. SORACOM APIに料金を確認
    Lambda関数にてSORACOM APIに料金を確認し、応答文を作成し返答
  4. 回答を発話
    Lambda関数にて生成した文言を発話

AWS側設定

Lambda関数

今回もPython3.6で簡単に作成してみました。

import requests
import json
import datetime

soracom_address='(SORACOMユーザ名)'
soracom_password='(パスワード)'

def lambda_handler(event, context):
  # 入力値処理
  yearmonth = getyearmonth(event)

  # 認証&APIKey/Token入手
  headers = {'Content-Type': 'application/json'}
  payload = {'email': soracom_address, 'password': soracom_password}
  responce = requests.post("https://api.soracom.io/v1/auth", headers=headers,data=json.dumps(payload)).text
  data = json.loads(responce)

  try:
    apikey = data['apiKey']
    token = data['token']
  except:
    return 'Invalid Username/Password'

  headers = {
    'Accept': 'application/json',
    'X-Soracom-Api-Key': apikey,
    'X-Soracom-Token': token
  }
  
  # 日時のチェック
  # 未来:エラーを返す
  # 今月:確定前料金を取得
  # 過去:確定済料金を取得
  nowmonth = datetime.datetime.today().strftime("%Y%m")
  
  if (int(yearmonth) > int(nowmonth)):
    payload = {"fulfillmentText": '翌月以降の料金は確認できません'}
  else:  
    if (yearmonth == nowmonth):
      url="https://api.soracom.io/v1/bills/latest"
      comment = '今月の確定まえ料金は'
    else:
      url="https://api.soracom.io/v1/bills/" + yearmonth
      comment = yearmonth[0:4]+'年'+yearmonth[5:7]+'月の料金は'
    
    # 料金データの取得
    responce = requests.get(url,headers=headers).text
    data = json.loads(responce)
    payload = {"fulfillmentText": comment + str(data['amount'])+'円です'}
    
  return payload

def getyearmonth(event):
  yearmonth = None

  if (isinstance(event, dict)):
      if ("queryResult" in event):
        if ("parameters" in event["queryResult"]):
          if ("date-period" in event["queryResult"]["parameters"]):
            startdate = event["queryResult"]["parameters"]["date-period"]["startDate"]
            yearmonth = startdate[0:4] + startdate[5:7]
  return yearmonth

API Gateway

基本的には、音声でSORACOM SIMの状態を変更するの内容と同じです。
但しDialogflow(Fulfillment)の設定では任意のヘッダを付与することができますので、API GatewayのAPIキーを設定することができ、簡易的な認証に利用できます。

以下の手順で設定します。
(※イメージは一部前回の記事から転用していますのでご注意下さい)

  1. APIキーの作成
    左側のメニューからAPIキーを選択します。
    アクションボタンからAPIキーの作成を選択します。

    続いてAPIキーの名前を入力し保存ボタンを押します。

    APIキーが作成されますので、「表示」を押し内容をメモしておきます。
  2. 新規APIの作成
    APIの作成をクリックし、API名を入力します。
  3. メソッドの作成
    アクションからメソッドの作成を選択し、POSTアクションを作成、Lambda関数を呼び出せるようにします。発行されたURLをメモしておきます。
  4. APIキー認証の有効化
    POSTメソッドのメソッドリクエストを開き、「APIキーの必要性」をtrueにしチェックボックスをクリックします。

Actions on Googleの設定

いよいよActions on Googleの設定に入ります。
コンソールにサインインします。初回接続時には自身のGoogleアカウントで認証して下さい。

続いて「Add/import project」をクリックし新しいプロジェクトを作成します。

新しいプロジェクト名を入力し、「CREATE PROJECT」をクリックします。

チュートリアル画面が表示されますが、今回は「SKIP」で良いです。

最後に左メニューの SETUP ⇒ invocationを選択します。
本アプリの呼び出し方法を入力し、上部のSAVEをクリックし完了です。

Dialogflowの設定

続いて言語解析を司る Dialogflowの設定に入ります。
コンソールにログインします。こちらも初回アクセス時には自身のGoogleアカウントで認証して下さい。

初期設定

まず、左メニューの「Create Agent」より新規エージェントの作成を行います。
その際、Actions on Googleのプロジェクトとの紐付けを行います。

Fulfillment

次に API Gatewayを呼び出すWebhookの設定を行います。
メニューのFulfillmentを開いて有効化し、API GatewayのURLとHEADERSにx-api-keyとしてAPI GatewayのAPIキーを入力します。

Intents

いよいよ言語解析の設定です。
Intentsメニューのプラスボタンを押して新規Intentの作成画面に移ります。
Training pharasesに音声入力として受け付けたい文言を入力します。

今回は年月の料金を知りたいので以下のように入力しました。年月の部分の色が変わりパラメータとして認識されていることがわかります。

下の方にスクロールすると、パラメータdate-periodが自動的に作成されています。
パラメータが不足したときに対話的に問い合わせできるよう、PROMPTSの入力をしておきます。

Integrations

以上で設定は完了です。
メニュー Integrations をクリックし、Google Assistantを選択します。
アプリケーションの配信はしないので、下の方の「TEST」をクリックします。

以上で設定は完了です。

デモ

Actions on Google + Dialogflowの音声アプリケーション開発も慣れれば簡単にできますね。
デモ動画も作成してみましたので、ご覧下さい。

SORACOMの料金を音声で確認する

私の場合はSORACOM plan-D のSIMを1枚(長期割引で)契約しているだけなので、かなり安価ですが・・・(お恥ずかしい限り)

皆様も是非お試し下さい。