キーワード(Keyword)とそれに対するTapiaの発話(Answer)をjsonファイルに登録します。
ユーザーの発話とJSONファイルのKeywordが一致した場合、同じ(Category)の(Answer)からランダムで返答をします。
◆◇◆◇◆サンプルコード:jsonファイルに発話内容を登録して会話する◆◇◆◇◆
1) ボタンを追加する
サンプルコード「0.ボタンを追加する」を参考に作成します
2) 発話ファイルを追加する
jsnoファイルにキーワードとTapiaが発話する言葉を登録します。
tapia-sample\app\src\main\直下へ「assets」フォルダを作成します。そのフォルダへ「keyword.json」を追加します。
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;
}
}