AI「A3RT」を使ってJavaでトークアプリを作ってみた

この記事はリクルートが提供するAI「A3RT」の「Talk API」を利用しトークアプリを作成する、しかもcurlコマンドやPython、JavaScriptで書けばもっと簡単にできるのに、敢えて**Java**を駆使(苦死?)する~~GWを持て余した暇人の~~記事である。

##はじめに

AI「A3RT」については[公式サイト](https://a3rt.recruit-tech.co.jp/)を参照のこと。

####提供されているAPI

- Listing API
- Image Influence API
- Text Classification API
- Text Suggest API
- Proofreading API
- Talk API

今回はTalk APIを使って簡単なトークアプリを作ってみる。

##環境・準備
- Windows10
- JDK1.8.0_121

APIを実行するためにはAPI KEYが必要なので[ここ](https://a3rt.recruit-tech.co.jp/product/talkAPI/)で発行する。

##サンプルコード

標準入力で取得した文字列をAPIにPOSTで送信し結果を得る、これをループするだけの簡単な仕様。「bye」と入力すると終了します。
作った環境がProxyありの環境だったのでサンプルコードにはProxyまわりの記述があるが、Proxyがない環境であれば不要です。
あと、レスポンスの文字が一部unicode文字列なので、それを普通の文字列に変換する処理がある。
エラーハンドリングはゆるゆるなのでご容赦を。:stuck_out_tongue_closed_eyes:

```java:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;

public class SmallTalkApp {

    public static void main(String[] args) {
        while (true) {
            HttpURLConnection conn = null;
            try {
                //標準入力
                System.out.print("[me]");
                BufferedReader br
                        = new BufferedReader(new InputStreamReader(System.in));
                String input = br.readLine();

                if (input == null || input.isEmpty()) {
                    continue;
                } else if (input.equals("bye")) {
                    System.out.println("終了");
                    return;
                }

                //送信データ
                //発行したAPI KEYを書く
                String data = "apikey=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&query=" + input;

                //HTTP接続
                URL url = new URL("https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk");
                //Proxy設定(ネット環境でProxyがある場合のみ)
                Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxyhost", 9999));
                conn = (HttpURLConnection) url.openConnection(proxy);
                conn.setDoInput(true);
                conn.setDoOutput(true);
                conn.setRequestMethod("POST");
                conn.setUseCaches(false);

                //POST送信
                try (DataOutputStream dos = new DataOutputStream(conn.getOutputStream())) {
                    dos.writeBytes(data);
                }

                //レスポンス受信
                int rescode = conn.getResponseCode();
                if (rescode == HttpURLConnection.HTTP_OK) {
                    try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
                        StringBuilder buf = new StringBuilder();
                        String line;

                        while ((line = reader.readLine()) != null) {
                            buf.append(line);
                        }
                        System.out.println(convertToOiginal(buf.toString()));
                    }
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                if (conn != null) {
                    conn.disconnect();
                }
            }
        }
    }

    /**
     * unicode文字列を文字列に変換(u\3042 ⇒ あ)
     *
     * @param unicode unicode文字列を含む文字列
     * @return 文字列
     */
    private static String convertToOiginal(String unicode) {
        String tmp = unicode;
        while (tmp.indexOf("\\u") > 0) {
            String str = tmp.substring(tmp.indexOf("\\u"), tmp.indexOf("\\u") + 6);
            int c = Integer.parseInt(str.substring(2), 16);
            tmp = tmp.replaceFirst("\\" + str, new String(new int[]{c}, 0, 1));
        }
        return tmp;
    }
}

```

##結果
会話できてますね（白目:rolling_eyes:

```
[me]お疲れ様です。
{"status": 0, "message": "ok", "results": [{"perplexity": 0.7773633993386415, "reply": "私はそんなに嫌いじゃないですよ"}]}
[me]ありがとうございます。
{"status": 0, "message": "ok", "results": [{"perplexity": 0.07521183094611102, "reply": "あなたはよくするんですか?"}]}
[me]はい、します。あなたはよくするんですか?
{"status": 0, "message": "ok", "results": [{"perplexity": 1.5817458708187506, "reply": "私のですか?秘密ですよ"}]}
[me]お願いします。教えてください!
{"status": 0, "message": "ok", "results": [{"perplexity": 2.4087016492196223, "reply": "あなたはよくするんですか?"}]}
[me]私も秘密です
{"status": 0, "message": "ok", "results": [{"perplexity": 0.23161212785866075, "reply": "あなたはよくするんですか?"}]}
[me]休みは何をしますか?
{"status": 0, "message": "ok", "results": [{"perplexity": 7.697953651890003, "reply": "あなたはよく確認するんですね?"}]}
[me]
```

##おわりに
このAIはまだ公開されたばかりなので、これからの学習に期待しましょう。