ホーム 開発支援情報 技術ブログ 使ってみようAPI講座 【使ってみようAPI講座】Lesson3 : 雑談対話API(後編)

使ってみようAPI講座

【使ってみようAPI講座】Lesson3 : 雑談対話API(後編)

掲載日:2015年04月16日

引き続き雑談対話APIを例に、コンピュータと自然な会話を行うためのAndroidアプリ作り、docomoIDと連係したパーソナライズ機能の解説まで進めます。雑談対話API(前編)をお読みいただいてから、後編をお楽しみください。

雑談対話APIを使ったコンピュータとのチャットアプリ

雑談対話APIのリクエスト

レイアウトおよびデータを保持/更新するクラスが作成できたので、次は、雑談対話APIの呼び出しを行います。

雑談対話APIでは、対話に必要な情報をリクエストパラメータとしてセットしてAPIを呼出し、サーバからのレスポンスに含まれる返答を取得することで雑談対話を行います。 流れは次のようになります。

雑談対話APIの流れ

雑談対話APIの流れ

対話の内容を継続する例
リクエストパラメータは、DialogueRequestParamクラスを作成し、setUttメソッドの引数に、ユーザから入力された会話をセットし、API呼出しのリクエストを行います。

また、コンピュータと継続して雑談を行うためには、雑談対話APIのリクエストボディに、contextIDを設定します。このcontextIDとは、サーバのレスポンスに含まれる任意の値を、次回の会話のリクエストに設定することで、対話の流れや文脈をAPIエンジンが判断し、より自然な会話になるようにレスポンスを返します。

さらにユーザのプロフィール属性を設定することで、対話をよりユーザの好みに近づけることができます。詳細はリファレンス仕様書を参照ください。

今回のチャットサンプルアプリではPreferenceActivityクラスを使って設定画面から登録しています。

雑談対話APIの呼び出しを行います。画面のコメント送信ボタンをクリックしたときの処理を次のように実装します。

public void onClick(View v) {
   
// 1. 雑談対話パラメータ生成
   
DialogueRequestParam param = new DialogueRequestParam() {
       
{
           
// 設定値をリクエストパラメータに設定
            sp
= PreferenceManager
                   
.getDefaultSharedPreferences(getApplicationContext());

            setUtt
(editText.getText().toString());
           
~中略~
            setContext
(contextId);

       
}
   
};
   
// 2. ユーザの発言を画面のListViewにセット
   
String comment = editText.getText().toString();
   
CommentItem peopleData = new CommentItem(comment,
            R
.drawable.people, R.layout.comment_list_right);
    list
.add(peopleData);

   
// 3. 雑談対話のタスク生成/実行
   
AlertDialog.Builder dlg = new AlertDialog.Builder(
           
MainActivity.this);
    task
= new DialogueAsyncTask(dlg);
    task
.execute(param);
}

リスト2 リクエストパラメータとAPIの呼び出し(MainActivity.javaの抜粋)

1. 雑談対話パラメータ生成
リクエストパラメータは、DialogueRequestParamクラスを作成し値をセットします。雑談対話APIで必須項目となるのが、会話内容です。setUttメソッドの引数に、ユーザから入力された会話をセットし、API呼出しのリクエストを行います。このutt属性は必須項目です。その他の項目は任意項目ですが、ContextIDをセットしないと会話が続きません。

2.ユーザの発言を画面のListViewにセット
ユーザの会話の入力値をListViewに表示します。

3. 雑談対話のタスク生成/実行
DialogueAsyncTaskクラスを生成し、雑談対話APIを実行します。executeメソッドに、1で生成したリクエストパラメータを引数として渡します。

docomo IDと連携したパーソナライズ機能

ContextIDを使ってユーザとコンピュータ間でより自然な対話になるよう文脈を解析しながらやりとりができますが、このContextIDはアプリケーションを終了すると、サーバ上から削除されてしまいます。雑談対話APIでは、会話の内容をdocomo IDと紐づけてサーバ上に蓄積し、後日改めて対話を行ったときも、前回の会話内容を分析し、より最適な会話を続けるパーソナライズ機能が提供されています。

docomo IDを使ったパーソナライズを行うには、OAuth認証を行って、アクセストークンを取得します。取得したアクセストークンを、雑談対話APIのリクエストパラメータにセットすることで、docomo IDに紐づいた対話内容がサーバ上に蓄積されます。OAuth認証を行うためのSDKは以下のページから取得ください。

OAuth SDK for Android

ダウンロードしたファイルに含まれるdocomo-oauth-android-sdk-1.1.1.jarをAndoridプロジェクトのlibsフォルダ内にコピーしてください。

また、このSDKを利用するため、docomo Developer supportのマイページから必要なキー情報を取得します。取得した情報を、次のとおり認証を行うOAuthActivity.javaにセットします。今回のチャットアプリのサンプルでは、取得したアクセストークンをPreferencesに保存しています。

/** OAuth 認証用 client id  */
private static final String CLIENT_ID = "xxxxx";
/** OAuth 認証用 client secret  */
private static final String SECRET_ID = "xxxxx";
/** OAuth 認証用 scope  */
private static final String SCOPE = "dialogue";
/** OAuth 認証用 コールバックURL  */
private static final String REDIRECT_URI = "xxxxx";

リスト3 docomo ID認証で必要な情報の設定 (OAuthActivity.javaの抜粋)

雑談対話APIのレスポンス

DialogueAsyncTaskクラスは、雑談対話APIのレスポンスを受け取ります。docomo ID認証によるパーソナライズ機能を使うためには、APIのリクエストに取得したアクセストークンを、リクエストパラメータとともに送信します。パーソナライズ機能を使わない時はAPIの呼び出しはリクエストパラメータのみを送ります。

// 雑談対話要求処理クラスにリクエストデータを渡し、レスポンスデータを取得する
Dialogue search = new Dialogue();
// パーソナライズ機能を利用するときは、リクエストにアクセストークンを送る
boolean oauthFlg = sp.getBoolean("personalize", false);
if ( oauthFlg ) {
   
String accessToken = sp.getString("accessToken", "");
    resultData
= search.request(reqParam, accessToken);

} else {
    resultData
= search.request(reqParam);
}

リスト4 雑談対話APIのレスポンス取得(MainActivity.javaの抜粋)

雑談対話APIを呼び出すと、以下のような項目がレスポンスとして返ります。このレスポンスから雑談対話の返答(utt)を取得し、画面のListViewコントロールにデータを表示します。

内容 項目 データ型 説明
システムの返答 utt string 雑談返答
音声合成用読み出力 yomi string 音声合成用出力
モード mode string 対話のモード
対話番号 da int ユーザとシステムの対話に対してサーバが付与した番号
コンテキストID context string 自動的にシステムより出力されるID

動作確認

雑談対話APIのサーバとネットワーク通信を行う必要があるので、最後にAndroidManifest.xmlに以下のパーミッションを設定します。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

リスト5 パーミッションの設定(AndroidManifest.xmlの抜粋)

サンプルアプリを実行すると、対話画面が表示されます。筆者が試したところ、対話内容は、会話の文脈をもとに返答されることが多いですが、時々、ニックネームで呼ばれたり、登録した場所の天気やイベント情報などが返答されたりすることもあります。

最後に

今回は、雑談対話APIを使ったチャットアプリを作りました。docomo APIを使うと敷居の高い技術も短時間で手軽にアプリケーションに組み込むことができます。ぜひ他のAPIも試してみてください。

原著 : 阿佐 志保

お問い合わせ
「docomo Developer support」及び「作ろうスマートフォン/iモードコンテンツ」に関するお問い合わせです。よくあるご質問や技術ブログで解決しない場合は、お問い合わせください。