PepperのQiChatスクリプトに外部データなどから動的な値を与えるには
PepperのQiChatのスクリプトに外部データなどから動的に値を与えたいとった場合にどうすればいいか調べてみました。 動的に値を与えるにはALMemoryのメモリ変数と、ALDialogのsetConceptを使用するようです。
注意事項
ソフトバンクロボティクス株式会社のPepperを活用し、独自開発したものです。
参考
こちらの資料を参考にさせていただきました。
タブレットの表示機能を駆使しながら会話をしてくれる Pepper アプリを作ってみる
ALDialog/QiChatメモ
個別のPepperちゃんの語彙を動的に増やす
環境について
今回使用した環境です。
MacOS Sierra 10.12.2
Choregraphe 2.4.3.28
Pepper
サンプルについて
作成したサンプルはこちらです。
https://github.com/piroku/QiChatSample
QiChatスクリプト
conceptのようなキーワードを動的に与えるには、conceptではなくdynamicで定義します。
dynamicの設定名は、conceptと同じように(~ + 設定名)で記述できます。
また、各発話のメッセージは変数で指定しています。
解説
onStartで\$QiChatSample/onStartMessageの内容を発話して、(~dy_ans_1)〜(~dy_ans_3)を待ちます。
(~dy_ans_1)〜(~dy_ans_3)が聞き取れたら、対応するメッセージ\$QiChatSample/dyAns1Message〜\$QiChatSample/dyAns3Messageを発話し、終了メッセージ\$QiChatSample/endMessageを発話して終了します。
聞き取れなかった時は、\$QiChatSample/stayMessageを発話し、聞き取りを継続します。
また、頭(先頭)をタッチすると終了メッセージを発話して終了するようにしています。
topic: ~QiChat()
language: jpj
dynamic:dy_ans_1
dynamic:dy_ans_2
dynamic:dy_ans_3
u:(e:onStart) ^mode(contextual) $QiChatSample/onStartMessage
u1:(~dy_ans_1) $QiChatSample/dyAns1Message $output="dy_ans_1" \pau=200\ $QiChatSample/endMessage $onStopped=1
u1:(~dy_ans_2) $QiChatSample/dyAns2Message $output="dy_ans_2" \pau=200\ $QiChatSample/endMessage $onStopped=1
u1:(~dy_ans_3) $QiChatSample/dyAns3Message $output="dy_ans_3" \pau=200\ $QiChatSample/endMessage $onStopped=1
u1:(e:Dialog/NotUnderstood) $QiChatSample/stayMessage ^stayInScope
u:(e:FrontTactilTouched) $QiChatSample/endMessage $onStopped=1
bx_データ読み込みボックス
JSONデータを読み込みます。実際にはREST API等で提供できる形にしておき、Pepperで取り込むといった形になるのではと思います。
{
"onStartMessage": "\\rspd=110\\\\vct=135\\今日の調子はどう?",
"ans_1": {
"concept": "元気,元気だよ,バッチリ,調子いい,調子良い,いいよ",
"message": "\\rspd=110\\\\vct=135\\今日も1日\\rspd=120\\がんばろー"
},
"ans_2": {
"concept": "悪い,調子悪い,良くない,だるい,眠い,帰りたい",
"message": "\\rspd=110\\\\vct=135\\こんな日もあるよ|\\pau=200\\\\vct=140\\どんまい!"
},
"ans_3": {
"concept": "まあまあ,いまいち,普通",
"message": "\\rspd=110\\\\vct=135\\張り切っていこー"
},
"stayMessage": "\\rspd=110\\\\vct=130\\聞き取れなかった|もう一度お願い!",
"endMessage": "\\rspd=110\\\\vct=135\\終了するね"
}
bx_ダイアログ設定_日本語版ボックス
ALDialogのsetConceptを使用して、QiChatスクリプトで定義したdynamicの定義名(例:dy_ans_1)に対して、キーワードのリストを設定します。サンプルプログラムでは、JSONデータでconceptキーに指定された値(例:"元気,元気だよ,バッチリ,調子いい,調子良い,いいよ")をリストに変換したものをsetConceptで使用します。
#外部データの取得
data = memory.getData("QiChatSample/InitData")
initdata = json.loads(data)
dy_ans_1=initdata["ans_1"]["concept"].encode("utf-8").split(",")
dy_ans_2=initdata["ans_2"]["concept"].encode("utf-8").split(",")
dy_ans_3=initdata["ans_3"]["concept"].encode("utf-8").split(",")
#QiChatのスクリプトでdynamicで指定した名前でセットする
dialog.setConcept("dy_ans_1", "jpj", dy_ans_1)
dialog.setConcept("dy_ans_2", "jpj", dy_ans_2)
dialog.setConcept("dy_ans_3", "jpj", dy_ans_3)
また、QiChatスクリプトで定義したALMemoryの変数も設定します。
#QiChatに定義したメッセージ変数のセット
memory.insertData("QiChatSample/onStartMessage", initdata["onStartMessage"].encode("utf-8"))
memory.insertData("QiChatSample/stayMessage", initdata["stayMessage"].encode("utf-8"))
memory.insertData("QiChatSample/dyAns1Message", initdata["ans_1"]["message"].encode("utf-8"))
memory.insertData("QiChatSample/dyAns2Message", initdata["ans_2"]["message"].encode("utf-8"))
memory.insertData("QiChatSample/dyAns3Message", initdata["ans_3"]["message"].encode("utf-8"))
memory.insertData("QiChatSample/endMessage", initdata["endMessage"].encode("utf-8"))
うまくいかないとき
QiChatのスクリプトで、同じ定義名でconceptで定義して実行してしまうと、QiChatスクリプトを書き換えてもダメなようです。Pepperを再起動することで忘れてくれました。
また、もし何度かプログラムをエラーなどで中断させてしまった場合で、その後思ったように動作しないとった場合は、Pepperのロボアプリ一覧から、「.lastUploadedChoregrapheBehavior」を消すか、Pepperを再起動してみてください。
Author And Source
この問題について(PepperのQiChatスクリプトに外部データなどから動的な値を与えるには), 我々は、より多くの情報をここで見つけました https://qiita.com/HiroyukiYasui/items/d46d43593a3cb24f88d5著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .