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

Tapia
TAPIAに言葉の内容を理解させます

◆ソースコード:

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) ボタンを追加する

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

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();
    }
}
            

© 2018 - MJI Inc. Copyright reserved -