Android端末で対話API(しりとり)を使ってみる


Pocket

以前「Android Wearで音声入力を使ってしりとり」をご紹介しましたが、今回は音声入力部分ではなく、「しりとり」機能の実装方法についてご紹介です。

っと言っても中身は「docomo Developer supportの雑談対話API」を使っているだけなんですけどね(^^ゞ
提供サれているAPI形式が「REST,Android SDK, iOS SDK, Server side JAVA SDK」となっていて、どんな端末にも織り込む事ができたりします。

雑談対話APIは、いわゆる「人工無脳(chatbot)」機能を提供してくれます。
人工無脳を作ったことがある人は解ると思いますが、いかに学習させるかがめんどくさい(面白いとも言うw)ところなのですが、この雑談対話APIを使うとそいういった事を気にせず簡単にアプリに対話機能を実装することができます。

今回は雑談対話APIの一機能である「しりとり機能」を使ってみたいと思います。

Docomo Siritori API

 

1.準備

まずはここからSDKをダウンロードしてきます。
ダウンロードしたファイルを解凍して、libsフォルダに入っている下記ファイルをAndroidStudioプロジェクトのlibsフォルダにコピーします。
・docomo-common-android-sdk-1.0.2.jar
・docomo-dialogue-android-sdk-1.1.0.jar
・jackson-annotations-2.2.3.jar
・jackson-core-2.2.3.jar
・jackson-databind-2.2.3.jar
※Gradleのsyncを忘れずに

※使用しているAndroidStudioのバージョンによっては、ビルド時に”duplicate file…”というエラーがでるので、その場合はbuild.gradleに下記を追加。

android {
  省略
  packagingOptions {
    exclude "META-INF/LICENSE"
    exclude "META-INF/NOTICE"
  }
}

 

2.実装方法

しりとり機能の簡単な使い方です。
雑談対話APIは、話者情報やキャラクタの設定など、いろいろパラメータを設定できるのですが、今回そこら辺は一切使っていません。

 

1.INTERNETパーミッションを追加。
<uses-permission android:name="android.permission.INTERNET" />

 

2.Siritori.java

雑談対話APIへのアクセス処理はすべてSiritoriクラスの責務として、こんな感じで実装してみました。

public class Siritori {
    private TextView mMonitorView; //Apiからの応答を表示するViewのホルダー
    private String mContext; //雑談対話APIで会話を継続させるためのコンテキスト

    public Siritori(TextView monitor) {
        mMonitorView = monitor;
    }

    /**
     * しりとりを開始する
     */
    public void start() {
        mContext = null;
        ApiTask task = new ApiTask();
        task.execute("しりとりしよう");
    }

    /**
     * 応答を返す
     */
    public void response(String text) {
        ApiTask task = new ApiTask();
        task.execute(text);
    }

    public class ApiTask extends AsyncTask<String, Void, DialogueResultData> {

        public ApiTask() {

        }

        @Override
        protected DialogueResultData doInBackground(String... params) {
            DialogueResultData resultData = null;
            try {
                Dialogue dialogue = new Dialogue();

                DialogueRequestParam requestParam = new DialogueRequestParam();
                if (mContext != null) {
                    requestParam.setContext(mContext);
                    requestParam.setMode("srtr");
                } else {
                    requestParam.setMode("dialog");
                }
                requestParam.setUtt(params[0]);

                resultData = dialogue.request(requestParam);

            }catch (SdkException e) {
                e.printStackTrace();
            }catch (ServerException e) {
                e.printStackTrace();
            }
            return resultData;
        }

        @Override
        protected void onPostExecute(DialogueResultData dialogueResultData) {
            if (dialogueResultData != null) {
                mMonitorView.setText(dialogueResultData.getUtt());
                mContext = dialogueResultData.getContext();
            }
        }
    }
}

【12-16行目】
しりとりの開始です。
APIに対し「しりとりしよう」と言うと、しりとりモードに入ることができます。

 
【21-24行目】
相手の言葉に対しレスポンスを返す処理です。

 
【26-64行目】
APIを叩く処理です。
基本的には、DialogueRequestParamでパラメータを設定して、Dialogue.request()に渡してあげると、戻り値で応答が帰ってきます。
39行目のIf文は、しりとり中(=継続させるためのコンテキストがある場合)は、コンテキストをセットしモードをしりとり”srtr”に設定することで、しりとりの継続が可能になります。

なお、しりとりの開始や継続のやり方は、
雑談対話API インターフェース仕様書
に詳しく載っています。

 

3.MyActivity.java

「しりとりやろう」ボタンを押すとしりとりが始まり、下部のEditTextと送信ボタンで応答を返すという簡単なインターフェースです。

Docomo Siritori API

public class MyActivity extends Activity {

    private Siritori mSiritori;
    private EditText mEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        AuthApiKey.initializeAuth("your api key");

        mSiritori = new Siritori((TextView)findViewById(R.id.textView));
        mEditText = (EditText)findViewById(R.id.editText);

        Button startBtn = (Button)findViewById(R.id.button_start);
        startBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               mSiritori.start();
            }
        });

        Button resBtn = (Button)findViewById(R.id.button_send);
        resBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mSiritori.response(mEditText.getText().toString());
            }
        });
    }
…省略

以上で、コンピューター相手にしりとりができます。

 
 

あとがき

コンピューターとしりとり勝負をするとか・・・これほど不毛なことはないと思うんですよね;
まず勝てないし…究極の暇つぶしアプリです。

・・・と思っていたのですが・・・勝てました!
Docomoしりとり勝利

なんでしょう・・・嬉しくない・・・というか、すごく馬鹿にされている感がするのですが(^_^;)。

ではでは~。
 

 
 

Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です