雑談対話APIを使ってみる
今回はこれまでとは毛色をかえてDoCoMoさんの雑談対話APIを使用してみようと思います。 最近はLINEなどのBotなどが使えるようになったりとBotのようなテキスト対話型の自動応答も必要性が上がってきたような気がします。また、Botではなくリアルなロボット(Pepperやロボホンなど)でも対話的に対応してほしい要求があります。
そんなときに使用できるのが、雑談に答えてくれるようなAPIになります。 ハッカソンでもこのような雑談APIが使われることが多くなっているような気がします。
そこで使い方をメモって置こうと思います。
基本的にはユーザから発せられるテキストをHTTPのPOSTメソッドを使用してJSON形式で送信することで、対話した形のテキストデータ(こちらもJSON形式)で返送されます。
お手軽に試してみるには画面内にある【試して見る】を押してみます。するとAPIコンソールの画面が開きます。
ここで実行ボタンをクリックすると画面の下部に実行結果が表示されます。
説明のために【HTTPリクエストボディ】タブをクリックします。
このコンソール画面では雑談対話APIに対してAPIキーをダミーの値"xxxxxxxxxxx…"とし、jsonデータで対話データを送っています。
エンドポイントは
となるので、このエンドポイントに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の機能を作ってみます。
ライブラリとしてはrequests
とjson
のライブラリを使っています。
#!/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を調べてみようと思います。