4. TAPIAに言葉の内容を理解させる

1) TAPIAアプリの言語を設定する

◆使用例:日本語の設定を行う

TapiaApp.setCurrentLanguage(Language.LanguageID.JAPANESE);

2) LanguageからNLUのプロバイダーのインスタンスを取得する

TAPIAのNLU機能を利用するために、まず最初に抽象クラス TapiaActivity の拡張を作成する。
TapiaActivity の onCreate 関数で TapiaActivity.offlineNLUProvider クラスののインスタンスを取得する。

◆以下の記述で、TapiaActivity.sttProvider インスタンスを利用できるようになる。
offlineNLUProvider = TapiaApp.currentLanguage.getOfflineNLUProvider(); 


3) Actionで認識した言葉を答える

① 抽象クラスActionの拡張を作成する
offlineNLUProvider = TapiaApp.currentLanguage.getOfflineNLUProvider();
public abstract class MyAction extends Action{
protected MyAction(OnActionListener onActionListener){
super(onActionListener);
}
public enum MyActionType implements ActionType{
ROTATE,
GIVE_TIME,
GIVE_DATE,
...
}
}
注:新しいActionを拡張する場合、ActionType列挙オブジェクトに追加する必要がある

② ①で作成したActionクラスの拡張を作成する
public class Rotate extends MyAction {
public OnRotateListener onRotateListener;
public Rotate(OnRotateListener rotateListener){
super(rotateListener);
onRotateListener = rotateListener;
type = MyActionType.ROTATE;
}
static public abstract class OnRotateListener implements MyAction.OnActionListener {
int degree;
int orientation;
@Override
public void onAction() {
onRotate(orientation,degree);
}
abstract public void onRotate(int orientation,int degree);
 }
}

4) STTProviderのインスタンスから返されたテキストを分析する

TapiaActivityで、必要なAction一覧を作成する。
この一覧とSTTProviderから返された文書一覧を合わせて、analyseText関数に渡す。
ArrayList actions = new ArrayList<>();
actions.add(new Rotate(new Rotate.OnRotateListener()){
@override
public void onRotate(int orientation, int degree){
TapiaRobot.rotate(activity, orientation, degree);
}));
 ・・・
offlineNLUProvider.analyseText(yourSentences,actions);

5) NLUProviderインターフェースを実装する。

すでに実装済みのサンプルアプリのLocal_NLUクラスを自由に使うことができ、かつ変更も可能である

6) Local_NLUで必要なキーワードを追加する

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.ROTATE));
//複数のキーワードを探すために
myKeywords.add(new Keyword(new String[]{"動いて", "ください"},
MyAction.MyActionType.ROTATE));
…
}
…
}

7) Local_NLU.analyseText関数で、ActionTypeに基づいたswitchのcaseを作成する

switch ((MyAction.MyActionType)keywordGroup.actionType) {
case ROTATE:
//この Action を行うかどうかを確認する。
Rotate rotate = (Rotate) MyAction.queryAction(actionToListen,
MyAction.ActionType.ROTATE);
//変数が null ではない場合に、続ける。
if(rotate != null) {
for (String sentence : sentences) {
rotate.setOrientation(getOrientation(sentence));
}
int degrees = -1;
for (String sentence : sentences){
rotate.setDegree(getDegrees(sentence));
break;
}
if (degrees != -1) {
 // to execute the action put it in result action
resultAction = rotate;
} else {
resultAction = null;
}
}
Break;
…
}
// switch の終わりに、resultAction 変数が “null”でない場合は、resultAction.onAction の関数を呼び出す。
if(resultAction != null) {
resultAction.onAction();
}