読者です 読者をやめる 読者になる 読者になる

雑談対話APIを使ってみる

API RaspberryPi Web python 開発 電子工作

雑談対話APIを使ってみる

今回はこれまでとは毛色をかえてDoCoMoさんの雑談対話APIを使用してみようと思います。 最近はLINEなどのBotなどが使えるようになったりとBotのようなテキスト対話型の自動応答も必要性が上がってきたような気がします。また、Botではなくリアルなロボット(Pepperやロボホンなど)でも対話的に対応してほしい要求があります。

そんなときに使用できるのが、雑談に答えてくれるようなAPIになります。 ハッカソンでもこのような雑談APIが使われることが多くなっているような気がします。

そこで使い方をメモって置こうと思います。

DoCoMoさんの雑談対話APIは以下を参照してください。

dev.smt.docomo.ne.jp

f:id:ueponx:20161115011709j:plain

基本的にはユーザから発せられるテキストをHTTPのPOSTメソッドを使用してJSON形式で送信することで、対話した形のテキストデータ(こちらもJSON形式)で返送されます。

お手軽に試してみるには画面内にある【試して見る】を押してみます。するとAPIコンソールの画面が開きます。

f:id:ueponx:20161115014118j:plain

ここで実行ボタンをクリックすると画面の下部に実行結果が表示されます。

f:id:ueponx:20161115014646j:plain

説明のために【HTTPリクエストボディ】タブをクリックします。

このコンソール画面では雑談対話APIに対してAPIキーをダミーの値"xxxxxxxxxxx…"とし、jsonデータで対話データを送っています。

エンドポイントは

https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue

となるので、このエンドポイントにAPIKEYをクエリ形式で送信します。

https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=【取得したAPIKEY】

ボディは以下のようなJSON形式になります。

{
  "utt": "こんにちは",
  "context": "",
  "nickname": "光",
  "nickname_y": "ヒカリ",
  "sex": "女",
  "bloodtype": "B",
  "birthdateY": "1997",
  "birthdateM": "5",
  "birthdateD": "30",
  "age": "16",
  "constellations": "双子座",
  "place": "東京",
  "mode": "dialog"
}

サンプルでは以上のデータになっていますが、ユーザの属性を与えている部分がほとんどで、必須になるのはuttの値だけなので以下のようなJSONデータでも実行可能です。

{
  "utt": "こんにちは"
}

uttに対話するテキストデータを入れることになります。すると以下のようなJSONデータが返送されます。

{
  "utt": "あらこんにちは",
  "yomi": "あらこんにちは",
  "mode": "dialog",
  "da": "0",
  "context": "XfjRobOGN_OFec2kr2JMHw"
}

データを見ればuttの値が対話されたデータになるのはわかるのですが、重要なのは contextになります。このAPIではデータを送るたびに会話の最初から開始されるので呼び出すごとに新しい会話になってしまいます。そこで、一度呼び出した結果に格納されるcontextの値をJSONデータに格納することで会話を継続した形で対話を行ってくれるようになります。

  • utt … ユーザの発話を入力します。255文字以下
  • context … システムから出力されたcontextを入力することにより会話を継続します。255文字以下

今回の例であればこの会話の流れを次に反映させるには

{
  "utt": "今日はいい天気ですね"
  "context": "XfjRobOGN_OFec2kr2JMHw"
}

と送信することになります。

pythonで雑談APIを使用してみる

折角なのでRaspberryPIのpythonをつかって雑談APIの機能を作ってみます。 ライブラリとしてはrequestsjsonのライブラリを使っています。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json
import types

KEY = '【取得したAPIKEY】'

# 1回目の呼び出し(会話の開始)

endpoint = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=REGISTER_KEY'
url = endpoint.replace('REGISTER_KEY', KEY)

payload = {'utt' : 'こんにちは', 'context': ''}
headers = {'Content-type': 'application/json'}

r = requests.post(url, data=json.dumps(payload), headers=headers)
data = r.json()

response = data['utt']
context = data['context']
print "response: %s, context: %s" %(response, context)

# 2回目の呼び出し

payload['utt'] = response
payload['context'] = data['context']

r = requests.post(url, data=json.dumps(payload), headers=headers)
data = r.json()

response = data['utt']
context = data['context']

print "response: %s, context: %s" %(response, context)

こんな感じでしょうか。一回目の呼び出しで「こんにちは」と会話を開始し、2回目の呼び出しではその会話の継続としてオウム返しで文章を送っています。

$ ./docomo_zatsudan.py
response: お元気ですか, context: YtIzpLxIMZl5Wssue4ZQiQ
response: 最初のお小遣いは、500円だったかな。, context: YtIzpLxIMZl5Wssue4ZQiQ

なんとなく拙い感じもする会話になっていますが、属性の設定を行ったり、Twitterなどの文章で話しかければもう少し違う感じになりそうです。 また雑談APIでは読みがなも返されるので、読み上げ系の機能と連携も容易そうです。

おわりに

次回も雑談というか会話系のAPIを調べてみようと思います。