◆ソースコード:
TapiaActivity.offlineNLUProvider クラスのインスタンスを取得します。
/offlineNLUProviderのインスタンスを取得する
offlineNLUProvider = TapiaApp.currentLanguage.getOfflineNLUProvider();/
//ask関数の引数にsttProviderを設定してTAPIAがしゃべったあとに聞き取りを開始する
ttsProvider.ask(getString(R.string.service_hello0),sttProvider);
//sttProviderのインスタンスから返されたテキストを分析する。(list:ユーザ発話,actions:キーワード)
offlineNLUProvider.analyseText(list,actions);
//offlineNLUProvider分析後の処理を記入する
offlineNLUProvider.setOnAnalyseCompleteListener(new NLUProvider.OnAnalyseCompleteListener() {
・・・//処理を記入する
◆◇◆◇◆サンプルコード:TAPIAが言葉を識別してそれらに応じて発話する◆◇◆◇◆
1) ボタンを追加する
サンプルコード「0.ボタンを追加する」を参考に作成します
2) 抽象クラスActionの拡張を作成する
tapia-sample\app\src\main\java\com.tapia.mji.demo\Actions\MyAction.javaへ追加します
public enum MyActionType implements ActionType {
・・・
GIVE_TIME,
GIVE_DATE,
BYE,
NAME,// 追加します
INTRODUCE,// 追加します
…
}
3) 2)で作成したActionクラスの拡張を作成する
tapia-sample\app\src\main\java\com.tapia.mji.demo\Actions\MySimpleAction.javaへ追加する
//追加します
public static class Introduce extends MySimpleAction {
public Introduce(SimpleAction.OnSimpleActionListener simpleActionListener) {
super(simpleActionListener, MyActionType.INTRODUCE);
}
}
//追加します
public static class Name extends MySimpleAction {
public Name(SimpleAction.OnSimpleActionListener simpleActionListener) {
super(simpleActionListener, MyActionType.NAME);
}
}
4) Local_NLUで必要なキーワードを追加する
tapia-sample\app\src\main\java\com.tapia.mji.demo\Providers\LocalNLU.javaへ追加する
public Local_NLU(Context context, Language.LanguageID language){
・・・
if(language == Language.LanguageID.JAPANESE){
//1つのキーワードを探すために、STT プロバイダが漢字もひらがなも出力するので、両方を追記することを推奨します
myKeywords.add(new Keyword(new String[]{"回転"},MyAction.MyActionType.ROTATE));
//以下キーワードを追加します
myKeywords.add(new Keyword(new String[]{"自己紹介","じこしょうかい"},MyAction.MyActionType.INTRODUCE));
myKeywords.add(new Keyword(new String[]{"名前","なまえ","お名前","おなまえ","誰","だれ"},MyAction.MyActionType.NAME));
…
}
//getSimpleBestKeywordsGroupを一部修正します。上で複数のキーワードを追加したので、それに対応するように修正します。
public Keyword getSimpleBestKeywordsGroup(ArrayList keywords, List sentences){
Keyword bestKeywords = null;
for (int k = sentences.size() - 1; k >= 0; k--) {
for (Keyword kw: keywords) {
//boolean isMatch = true;//コメントアウトします
for (String word: kw.keywordArray) {
//以下修正します。if(!sentences…をif(sentences…へ変更します。
if(sentences.get(k).toLowerCase().contains(word.toLowerCase()))//修正します。
bestKeywords = kw;//追加します。bestKeywordsへの追加をここでします。
//isMatch = false;//コメントアウトします
}
//if(isMatch)//コメントアウトします
//bestKeywords = kw;//コメントアウトします
}
}
return bestKeywords;
}
5) Activityに以下処理を記入する
TapiaActivityで、必要なaction一覧を作成する。この一覧とSTTProviderから返された文書一覧を合わせて、anakyseText関数に渡す。
//■□■名前は?とと聞かれたら「タピアです」と答える。自己紹介と言われたら「白くてかわいいロボットです」と答える■□■
public class Talk3Activity extends TapiaActivity {
TapiaAnimation tapiaAnimation;
List actions = new ArrayList<>();
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.eyes_layout);
ImageView tapiaEyes = (ImageView) findViewById(R.id.eyes);
//タピアの表情を目をパチパチに設定する
tapiaAnimation = new TapiaAnimation(this,tapiaEyes);
tapiaAnimation.startAnimation(TapiaAnimation.PLAIN ,true);
//タピアが話をする言語を日本語にする
TapiaApp.setCurrentLanguage(Language.LanguageID.JAPANESE);
//TTS、STTの設定をする
ttsProvider = TapiaApp.currentLanguage.getTTSProvider();
sttProvider = TapiaApp.currentLanguage.getOnlineSTTProvider();
//offlineNLUProviderの設定をする
offlineNLUProvider = TapiaApp.currentLanguage.getOfflineNLUProvider();
//タピアの顔を長押しした時終了する
tapiaEyes.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
finish();
return false;
}
});
//action一覧を作成する。ArrayListのactionに登録したキーワードを追加する
// Action一覧STTProviderから返された文書一覧を合わせてanalyseText関数に渡す analyseText(ユーザ発話,action)
actions.add(new MySimpleAction.Name(new SimpleAction.OnSimpleActionListener() {
@Override
public void onSimpleAction() {
try {
ttsProvider.ask("タピアです",sttProvider);//タピアですと言う
} catch (LanguageNotSupportedException e) {
e.printStackTrace();
}
}
}));
actions.add(new MySimpleAction.Introduce(new SimpleAction.OnSimpleActionListener() {
@Override
public void onSimpleAction() {
try {
ttsProvider.ask("白くてかわいいロボットです。",sttProvider); //はい何でしょうか。
} catch (LanguageNotSupportedException e) {
e.printStackTrace();
}
}}));
}
@Override
protected void onResume() {
super.onResume();
try {
//タピアが「はい何でしょうか」と言った後に聞き取りを開始する
ttsProvider.ask(getString(R.string.service_hello0),sttProvider); //はい何でしょうか。引数sttProviderで聞き取りを開始
} catch (LanguageNotSupportedException e) {
e.printStackTrace();
}
//タピアが聞き取りをした後、analyseText関数で聞いた言葉を分析する
sttProvider.setOnRecognitionCompleteListener(new STTProvider.OnRecognitionCompleteListener() {
@Override
public void onRecognitionComplete(List list) {
offlineNLUProvider.analyseText(list,actions);//引数 list:(ユーザー発話)、action:(キーワード)
//該当する言葉がない場合、「もう一度」と言う
offlineNLUProvider.setOnAnalyseCompleteListener(new NLUProvider.OnAnalyseCompleteListener() {
@Override
public void OnAnalyseComplete(Action action) {
//該当する値がない場合「もう一度」と言う
if(action == null){
try {
ttsProvider.ask(getString(R.string.general_dont_understand0),sttProvider); //「もう一度」と言う
} catch (LanguageNotSupportedException e) {
e.printStackTrace();
}
}
}});
}});
}
@Override
protected void onPause() {
super.onPause();
sttProvider.stopListening();
}
}