8.Tapiaが発話する言葉を一括登録する

キーワード(Keyword)とそれに対するTapiaの発話(Answer)をjsonファイルに登録します。 ユーザーの発話とJSONファイルのKeywordが一致した場合、同じ(Category)の(Answer)からランダムで返答をします。

◆◇◆◇◆サンプルコード:jsonファイルに発話内容を登録して会話する◆◇◆◇◆

1) ボタンを追加する

サンプルコード「0.ボタンを追加する」を参考に作成します

2) 発話ファイルを追加する

jsnoファイルにキーワードとTapiaが発話する言葉を登録します。 tapia-sample\app\src\main\直下へ「assets」フォルダを作成します。そのフォルダへ「keyword.json」を追加します。
Tapia

3) Activityに以下処理を追加する

//■□■JSONに登録した発話リストから、タピアと会話する■□■
public class Talk5Activity extends TapiaActivity {
    TapiaAnimation tapiaAnimation;
    private List keywordList = new ArrayList();
    private String answer;//タピアの発話
    private String keyword;//キーワード

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.eyes_layout);
        ImageView tapiaEyes = (ImageView) findViewById(R.id.eyes);

        //日本語の設定をする
        TapiaApp.setCurrentLanguage(Language.LanguageID.JAPANESE);
        //TapiaActivity.ttsProviderクラスのインスタンスを取得する
        ttsProvider = TapiaApp.currentLanguage.getTTSProvider();
        sttProvider = TapiaApp.currentLanguage.getOnlineSTTProvider();

        //アニメーションのインスタンスを作成する
        tapiaAnimation = new TapiaAnimation(this,tapiaEyes);
        //タピアの顔を長押しした時終了します
        tapiaEyes.setOnLongClickListener(new View.OnLongClickListener() {
           @Override
            public boolean onLongClick(View v) {
               finish();
               return false;
            }
        });

        try {
            // JSON データを assets フォルダから取得する
            InputStream oInStream = getAssets().open("keyword.json");
            // JSON データをオブジェクトに変換する
            JsonReader jReader = new JsonReader( new InputStreamReader( oInStream ,"UTF-8") );

            //JSONデータをkeywordListへ追加する
            jReader.beginArray();
            while (jReader.hasNext()) {
                keywordList.add(readMessage(jReader));
            }
            jReader.endArray();

            //タピアが「こんにちは」という
            try {
                ttsProvider.say("こんにちは");
                tapiaAnimation.setBackground(R.drawable.gradient_yellow);
            } catch (LanguageNotSupportedException e) {
                e.printStackTrace();
            }

            //タピアが「こんにちは」と言った後に言葉の聞き取りを開始する
            ttsProvider.setOnSpeechCompleteListener(new TTSProvider.OnSpeechCompleteListener() {
                @Override
                public void onSpeechComplete() {
                    //言葉の聞き取りを開始する
                    sttProvider.listen();
                    //聞き取った言葉がkeywordListにあるか解析する
                    sttProvider.setOnRecognitionCompleteListener(new STTProvider.OnRecognitionCompleteListener() {
                        @Override
                        public void onRecognitionComplete(List list) { //list:ユーザー発話
                            //タピアが聞き取った言葉を振り分ける。
                            for (String sentence : list){ //sentence:ユーザー発話
                                //カテゴリをカウントする
                                for (int iList = 0; iList < keywordList.size() ; iList ++ ){
                                    //キーワードをカウントする
                                    for (int iKeylist = 0; iKeylist < keywordList.get(iKeylist).getKeyword().size() ; iKeylist++){  
                                        //キーワードをセットする
                                        keyword = keywordList.get(iList).getKeyword().get(iKeylist) ;

                                        //ユーザー発話とキーワードが合致した場合、ArrayListからanswerをランダムで取得する
                                        if (sentence.equals(keyword)){

                                            Random r = new Random();
                                            int n = r.nextInt(keywordList.get(iList).getAnswer().size());
                                            answer = keywordList.get(iList).getAnswer().get(n);
                                            break;
                                        }else {
                                            //ユーザー発話がキーワードにない場合「もしもし」と答える
                                            answer = "もしもし";
                                        }
                                    }
                                    if (sentence.equals(keyword)){//ループを抜ける
                                        break;
                                    }
                                }
                                if (sentence.equals(keyword)){//ループを抜ける
                                    break;
                                }
                            }
                            try {
                                //ユーザー発話と合致したキーワードに登録されているアンサーをタピアがしゃべる
                                ttsProvider.say(answer);
                            } catch (LanguageNotSupportedException e) {
                                e.printStackTrace();
                            }
                        }
                });
                    tapiaAnimation.startAnimation(TapiaAnimation.SMILING,true);
                    tapiaAnimation.setBackground(R.drawable.gradient_aqua);
                    ttsProvider.stopSpeaking(false);
                }
            });

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();

        }
    }

    //JSONデータをkeywordListへ追加する
    public Keyword readMessage(JsonReader reader) throws IOException {
        String category = null;
        List keyword = null;
        List answer = null;

        reader.beginObject();
        while (reader.hasNext()) {
            String name = reader.nextName();
            if (name.equals("Category")) {
                category = reader.nextString();
            } else if (name.equals("Keyword") && reader.peek() != JsonToken.NULL) {
                keyword = readStringArray(reader);
            } else if (name.equals("Answer") && reader.peek() != JsonToken.NULL) {
                answer = readStringArray(reader);
            } else {
                reader.skipValue();
            }
        }
        reader.endObject();
        return  new Keyword(category,keyword,answer);
    }

    public List readStringArray(JsonReader reader) throws IOException {
        List wordList = new ArrayList();

        reader.beginArray();
        while (reader.hasNext()) {
            wordList.add(reader.nextString());
        }
        reader.endArray();
        return wordList;
    }

    @Override
    protected void onResume() {
        super.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
    }
}
            

4) Keywordクラスを作成する

//キーワードクラス
public class Keyword {

    private String id ;//カテゴリ
    private List keyword;
    private List answer ;

    public Keyword(String id, List keyword, List answer){
        this.id = id;
        this.keyword = keyword;
        this.answer = answer;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public  List getKeyword() {
        return keyword;
    }

    public List getAnswer() {
        return answer;
    }
}

© 2019 - MJI Inc. Copyright reserved -