雑談対話(自然対話)APIの比較
忘備録です。雑談対話APIを探す機会があったので、雑談対話APIの種類と、実際に試したしたもの、それぞれの特徴などを書いておきます。
Pythonでdocomo自然対話APIとTalkAPIをたたきました
docomo自然対話API
雑談対話APIを使うには、メールでの登録と、アプリケーションの登録申請を出す必要があります。登録申請は比較的早く通ります。
2018年11月1日以降は機能制限により、レスポンスに10秒程度の時間を要する場合や、
2018年10月31日以前と同様の対話をご利用いただけない可能性がございますので、ご了承ください。
また、これらの機能制限の内容につきましては、予告なく変更する場合がございます。
docomoは、2018/10/01に、「かたらい」という新しい雑談対話APIをリリースしています。(かたらいについては、下記)
使い方
実際にpythonからリクエストをしてみたので、書いておきます。
詳しい使い方は、こちらの、雑談対話を見てください。
ユーザ登録 >> 雑談開始、となります。
Step1 ユーザ登録
ユーザ登録のエンドポイント(post):"https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/registration"
def register(): headers = {'Content-Type': 'application/json;charset=UTF-8'} params = {'APIKEY':API_KEY} body = {"botId": "Chatting","appKind": "AppName"} r = requests.post(R_BASE_URI,data=json.dumps(body),headers=headers,params=params) cnvtime = time.strptime(time.ctime()) nowtime = time.strftime("%Y-%m-%d %H:%M:%S",cnvtime) # 現在の時刻 return [json.loads(r.text),nowtime]
post時に、json.dumpsをしてデータを渡さないと、正しく受け取らないみたいなので注意です。
現在時刻を返しています。これは、対話時に使います。
レスポンスとして、appIDが返ってきます。(sample)
{ "appId":"469b2c0c-55e9-4ad7-af04-213858ffd3be" // sample }
Step2 雑談
エンドポイント(post) : https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue
取得したappIDをbodyに入れてリクエストを送ります。
addRecvTimeに前回送信した時の時刻、addSendTimeに送信時刻を入れましょう。
def Chatting(appID,nowtime,msg): headers = {'Content-Type': 'application/json;charset=UTF-8'} params = {'APIKEY':API_KEY} payload = { "language":"ja-JP", "botId":"Chatting", "appId":appID, "voiceText":msg, "clientData":{ "option":{ `プロフィールなど` } }, "appRecvTime": nowtime, "appSendTime": time.strftime("%Y-%m-%d %H:%M:%S",time.strptime(time.ctime())) } payload = json.dumps(payload) r = requests.post(BASE_URI,data=payload,headers=headers,params=params) r = json.loads(r.text) print("system >> "+ r["systemText"]["expression"]) return r["serverSendTime"] # サーバーからの受信時間を返しています。
mainはこんな感じ
def main(): [regist_res,nowtime] = register() print(regist_res["appId"]) # 以下、対話(無限ループ) print("「終了」と入力するとプログラムを終了します") while(True): print("<< ", end="") msg = input() if msg == "終了" : break nowtime = Chatting(regist_res["appId"],nowtime,msg)
特徴
ユーザ情報を入力するため、それに応じた応答もありました。(○○さん、今日の調子はどうですか?など) 自然対話も実現できます。内容も濃いです。 その分、個別にユーザーデータの処理や、時間を保持する必要があります。(簡単ですが)
また、「提供が一部制限されている」だけあって、応答時間が長いです。
実際にプログラム内で計測したところ、6秒~8.5秒でした。 実際のシステムに組み込むには少し工夫がいりそうです。
かたらい
HPの右下の「かたらいを試す」ボタンから、試すことができます。
Repl-AIと連携提供がされています。 今回は試していません。
特徴
企業が使うレベルなので、他と比較すると結構高額です。
詳しい値段については、各自問い合わせる必要があります。
ただし、めちゃくちゃ優秀です。かなり自然な応答でもあり、シナリオが多く、成長させることもできます。いろいろな方言にも対応しているそうです。
TalkAPI
リクルートが無料で提供している物です。リクエスト制限もないので、簡単にシステムに組み込むことができます。 メールアドレスを登録してAPIKeyが発行できます。
詳細はこちら
使い方
エンドポイント(post): https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk
上記の詳細に、リクエストパラメータや、レスポンス内容について書かれてあります。
def talk(msg): params = {"apikey": API_KEY,"query": msg} res = requests.post(BASE_URL,data=params) response = json.loads(res.text) print("system >> ",end="") try: print(response["results"][0]["reply"],end="") except KeyError: print("応答テキストがありません",end="") def main(): while(True): print("<< ", end="") msg = input() if msg == "終了": break else : talk(msg)
特徴
上記の通り、無料でリクエスト制限がない。
リクエストに必要な情報量が少ないので、シンプルなコードで実装できます。
応答時間がとにかく早いです。(0.6秒 ~ 1.2秒)
ただし、学習能力は高いと言えません。他のAPIと比べると劣っています。
返答も、応答テキストがない場合もあるので、エラー処理をしてあげる必要があります。
「早いね」のようなシンプルな文字列でも応答テキストがなかったので、頭の良さは怪しいという印象です。
これ以降のAPIについては、試していません。調べた内容のまとめと忘備録です。他の選択肢として。
wit.AI
日本語にも対応したようです。無料、API制限なしです。https://wit.ai/
GitHubのアカウント、もしくはFacebookのアカウントで登録するようです。
Cotogoto / Noby API
料金は無料ですが、API制限は、一日1000回までです。https://app.cotogoto.ai/webapi/console.do
会話での学習や、アプリでのコマンド登録機能など機能は充実しています。
登録はLINEのアカウント、またはFacebookのアカウントからしかできないみたいです。
SimSimi API
韓国製ですが、日本語に対応しています。たまに韓国語や中国語を話すらしいです。
会話の語尾が「~でござる」とか、他のAPIと比べて個性的な部分が面白そう。
応答は十分自然で面白そうですが、それなりに弱点もあるみたいです。
参考記事:https://sub-konogi.ssl-lolipop.jp/blog/?p=859
まとめ
研究で使うので、料金や対応言語、登録方法(LINE登録はNGとか)、応答時間等に縛りがありますが、意外と対話APIって多いですね。紹介していないものもいくつかあります。それらはこちらの記事を参考に。