Pepperと会話する

Chat Topicを作成してペッパーと会話をしてみます。

※プロジェクトの初期設定については下記の記事を参考にしてください
PepperがHello Worldするまで

Chat Topicを作る

まずはPepperとの会話内容を作成していくためにChatTopicというファイルを作成していきます。

File→New→Chat Topic

chat topicの作成


Chat Topicボタンをクリックすると下記のようなポップアップが表示されます
今回は下記のように設定しています。

Languages: 日本語
ファイル名  : talk
Regionsdh : Any region

Languageは好みの言語を選んでくださいファイル名は大文字を使えないため小文字で指定をしています。Regionsですが、今回は日本語を選んでいるため一つしか選択肢が出てないのでJPの方を選択しても良いのですが、Englishなどを選ぶと場所によって英語の言い回し?が変わるようで、いくつか種類があります。何が必要なのかわからないのでここはAny regionを選択しておくのが良いと思います。


Languages: 日本語
ファイル名  : taik
Regionsdh :
Any region

Languageは好みの言語を選んでくださいファイル名は大文字を使えないため小文字で指定をしています。Regionsですが、今回は日本語を選んでいるため一つしか選択肢が出てないのでJP:Japanの方を選択しても良いのですが、Englishなどを選ぶと場所によって英語の言い回しが変わるようで、いくつか種類があります。何が必要なのかわからないのでここはAny regionを選択しておくのが良いと思います。



今回は作成した際にコメントアウトで作成されているものを流用して下記のようなコードにしてみました。
topic:トピックの名前、javaで呼び出す際に使う
concept:()の中に書いた文字を実際の会話の中に含めることで[]の中に書いてある文字列を認識することができる。
u:人間とペッパーの会話()の中が人間の発する内容で、外がペッパー君が喋ってくれる内容

topic: ~talk()
# Defining extra concepts out of words or group of words
concept:(hello) [こんにちは ちーっす おはよう]
# Replying to speech
u:(~hello) ~hello

コードで呼び出す

onRobotFocusGainedの中身のコードは下記のようになります。少し手順が長いですが、Topicに作成したchat topicをセット→QichatbotにTopicをセット→chatに入れて実行!の流れで進んでいきます。

Topic topic = TopicBuilder.with(qiContext)
                .withResource(R.raw.talk)
                .build();
        QiChatbot qiChatbot = QiChatbotBuilder.with(qiContext)
                .withTopic(topic)
                .build();
        chat = ChatBuilder.with(qiContext)
                .withChatbot(qiChatbot)
                .build();
        chat.async().run();

ペッパーと会話途中に人間がどこかに行ってしまうことが考えられます。
途中の状態が残っていると次にペッパーの前に現れた人間との会話が不自然になってしまうので人間がペッパーから離れたら会話の内容をリセットする必要があります。そのためonRobotFocusLost()の中にchatをリセットするコードを記述します。

if (chat != null) {
            chat.removeAllOnStartedListeners();
        }

コードはこれまでの記述で全てなのですが、このままでは動きません。なぜかというとペッパーの胸部にあるタブレットの初期設定の言語が英語に設定されているためです。

ペッパーの言語設定

ペッパー言語設定を行なっていきます。エミュレータを起動し、ホーム画面が見えている状態にしておきます。

次に白いボタン?ボタン名がわからないですが、右の真ん中にある白いボタンを押すと下記のような一覧が表示されていろんな設定ができます。

設定の中に言語と入力という項目があるので、開きます




一番上のLanguageがおそらくEnglishになっているはずなのでここを日本語に変更してください。これでビルドが通るようになります。

ペッパーと挨拶してみる

ペッパー君のエミュレータが表示されたらDialog Viewを開いてみてください。ペッパーに向かって実際に話しかけることもできますが、Dialog Viewからはキーボードで人間の発話内容を記述することができます。

ペッパー君の会話の準備ができているかどうかの判断はチャットバーの色を見て判断します。チャットバーの色が灰色だとペッパーに話しかけても反応してくれません。青になるまで待ちましょう。

実際に話しかけてみました。人間側でおはようと3回入力してペッパーはchat Topicで設定していた、[こんにちわ, ちーっす, おはよう]の3つの言葉を順番に話してくれました。話す順番をランダムにしたりもできるのですがそれはまた別に書きたいと思います。気になる方はリファレンスを読んでみてください.
QiChat – Syntax

実行結果


コード全文

package com.example.harumi_sagawa.test;

import android.os.Bundle;
import android.util.Log;

import com.aldebaran.qi.Consumer;
import com.aldebaran.qi.Future;
import com.aldebaran.qi.sdk.QiContext;
import com.aldebaran.qi.sdk.QiSDK;
import com.aldebaran.qi.sdk.RobotLifecycleCallbacks;
import com.aldebaran.qi.sdk.builder.ChatBuilder;
import com.aldebaran.qi.sdk.builder.QiChatbotBuilder;
import com.aldebaran.qi.sdk.builder.SayBuilder;
import com.aldebaran.qi.sdk.builder.TopicBuilder;
import com.aldebaran.qi.sdk.design.activity.RobotActivity;
import com.aldebaran.qi.sdk.object.conversation.Chat;
import com.aldebaran.qi.sdk.object.conversation.QiChatbot;
import com.aldebaran.qi.sdk.object.conversation.Say;
import com.aldebaran.qi.sdk.object.conversation.Topic;

public class MainActivity extends RobotActivity implements RobotLifecycleCallbacks {
    private Chat chat;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        QiSDK.register(this, this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        QiSDK.unregister(this, this);
    }

    @Override
    public void onRobotFocusGained(QiContext qiContext) {
        Topic topic = TopicBuilder.with(qiContext)
                .withResource(R.raw.talk)
                .build();
        QiChatbot qiChatbot = QiChatbotBuilder.with(qiContext)
                .withTopic(topic)
                .build();
        chat = ChatBuilder.with(qiContext)
                .withChatbot(qiChatbot)
                .build();
        chat.async().run();

    }

    @Override
    public void onRobotFocusLost() {
        if (chat != null) {
            chat.removeAllOnStartedListeners();
        }
    }

    @Override
    public void onRobotFocusRefused(String reason) {

    }
}