Pepper
Choregraphe

pepperとの会話を進化させるQiChat-Syntaxまとめ(自分用メモ)

More than 3 years have passed since last update.


はじめに

QiChatをひと通り調べようと思っていろいろ実行してみました。

自分用メモのため見にくいですがご勘弁。

たぶん、誰か(RobotStartさんに期待)もっと見やすい一覧を作ってくれることでしょう。


Header keywords

これをxxx.topファイルの先頭に書く

topic: ~topicname()

language: jpj


concept(コンセプト)

concept:(greetings) ^rand[やあ こんにちは どうも]

concept:(wine)[白 赤]ワイン
concept:(alcohol)[ビール ~wine]

u:(~greetings) ~greetings
u:(あなたが飲んでるのは _~wine なの?)うん、 $1 だよ
u:(何か飲みたい)~alcohol 飲む?

・concept:(xxx)でひとまとまりの言葉を使いまわせる

・~xxxでコンセプトを呼び出し

・[]の中に複数語を入れることで、用意された様々な応答ができる

・ちなみに単語の区切りは半角スペースでも全角スペースでもよい

・^randで列挙した文字列をランダムに使用

人間:やあ (100%)  

ロボット:どうも
人間:どうも (100%)
ロボット:こんにちは
人間:どうも (100%)
ロボット:やあ
人間:こんにちは (100%)
ロボット:やあ

人間:あなたが飲んでいるのは白ワインなの? (100%)
ロボット:うん、白ワインだよ
人間:あなたが飲んでいるのは赤ワインなの? (100%)
ロボット:うん、赤ワインだよ

人間:何か飲みたい (100%) #応答の順序は列挙した順序(ビール→白ワイン→赤ワイン)
ロボット:ビール飲む ?
人間:何か飲みたい (100%)
ロボット:白ワイン飲む ?
人間:何か飲みたい (100%)
ロボット:赤ワイン飲む ?
人間:何か飲みたい (100%)
ロボット:ビール飲む ?
人間:何かのみたい (100%) #ダイアログ上で漢字とひらがなは区別される
人間:何か飲みたいな (100%) #指定した文字列が入っていれば語尾などが増えても認識する
ロボット:白ワイン飲む ?
人間:何か飲みたいな (100%)
ロボット:赤ワイン飲む ?
人間:何か飲みたい (100%)
ロボット:ビール飲む ?
人間:何か飲みたい (100%)
ロボット:白ワイン飲む ?


dynamic(ダイナミック)

いまいちわからない

topic: ~dynamic()

language: enu

dynamic:mp3
u:({please} ["i want" play] _~mp3) let's play $1

# call it when speech recognition is running
proxy = ALProxy("ALDialog")
proxy.setConcept("mp3","enu", ["mika", "queen", "village people", "boy george"])


include(別のトピックファイル読込)

topic: ~ok()

language: enu
# suppose lexicon_enu contains concept ~confirmation and ~negation
include:lexicon_enu.top
u:(hello) are you ok ?
u1:(~confirmation) yupi
u1:(~negation) Doh !


language(言語)

language: jpj   #日本語の指定


topic(トピック)

topic: ~name ()


Rules


User rule(ルール)

・改行やインデントは無視される

・会話はこんなふうに書きますよってこと

u:(入力)応答

u:(にゅうりょく)
おうとう

人間:入力 (100%)
ロボット:応答
人間:にゅうりょく (100%)
ロボット:おうとう


User subrule(サブルール)

・u1,u2,u3...を使うことで会話を分岐できる。

・以下は、同じ「いいえ」に対して違う応答ができている。

u:(動物)犬か猫、飼っていますか?

u1:(犬)大きい犬ですか?
u2:(はい)走れる広いところが必要ですね!
u2:(いいえ)かわいいですね!
u1:(猫)かわいいですね!
u1:(いいえ)わたしといっしょですね!

u:(スポーツの話)それもいいですね。

proposal:スポーツの話題にします?
u1:(はい)そうしましょう!
u1:(ううん)わかりました。

人間:動物 (100%)

ロボット:犬か猫、飼っていますか ?
人間:いいえ (100%)
ロボット:わたしといっしょですね !
人間:動物 (100%)
ロボット:犬か猫、飼っていますか ?
人間:犬 (100%)
ロボット:大きい犬ですか ?
人間:いいえ (100%)
ロボット:かわいいですね !
人間:スポーツの話にしよう (100%)
ロボット:それもいいですね 。


Proposal(提案)

proposal:コップに牛乳を入れて。

proposal:いちごを3つ入れて。
proposal:バニラアイスも入れて。
proposal:蓋をして振る!
proposal:ミルクシェイクのできあがり~

u:(ミルクシェイクが飲みたい)いいですよ。作り方を教えるから準備ができたら次はと言ってください。

u:(次は)^nextProposal

ロボット:いいですよ。作り方を教えるから準備ができたら次はと言ってください  。

人間:次は (100%)
ロボット:コップに牛乳を入れて 。
人間:次は (100%)
ロボット:いちごを3つ入れて 。
人間:次は (100%)
ロボット:バニラアイスも入れて 。
人間:次は (100%)
ロボット:蓋をして振る !
人間:次は (100%)
ロボット:ミルクシェイクのできあがり~
人間:次は (100%)
人間:次は (100%)

関連した関数もある。

^nextProposal,

^sameProposal,
^goto,
^gotoRandom,
^gotoReactivate,
^topicTag.


Delimiters(区切り文字)


Choice: [ ] (選択)

[]を使って認識してほしい単語に複数の選択肢をもてる

u:([やあ おう]、ペッパー)[こんにちは どうも]太郎さん

人間:やあ、ペッパー (100%)

ロボット:こんにちは太郎さん
人間:おう、ペッパー (100%)
ロボット:どうも太郎さん

関連した関数

^first.

^rand.
^repeat.


Phrase delimiter: ” “

""で囲むと文章単位で認識(日本語ではそれほど必要ないかも)


Optional part: { } (付随的な言葉)

u:(元気{いっぱい}だね) うん、元気だよ

人間:元気だね (100%)

ロボット:うん、元気だよ
人間:元気いっぱいだね (100%)
ロボット:うん、元気だよ


Special characters (特殊文字)


Comments: # (コメント)

行内において#の後ろに書いたものはすべてコメント扱い


Wildcard: * (ワイルドカード)

u:(ぼく、*っていうんだ)よろしく

u:(休日は*するんだ)楽しそうだね

人間:ぼく、たろうっていうんだ (100%)

ロボット:よろしく
人間:ぼく、けんたっていうんだ (100%)
ロボット:よろしく
人間:休日はテニスするんだ (100%)
ロボット:楽しそうだね
人間:休日はドライブするんだ (100%)
ロボット:楽しそうだね

Pepperは人間が喋った任意の言葉を認識できるか?で精度について触れられている。


Forbidden word: ! (禁止語)

u:(りんごが好き)美味しいですもんね

人間:りんごが好き (100%)

ロボット:美味しいですもんね
人間:りんごが好きではない (100%)
ロボット:美味しいですもんね

これだと文脈に当てはまらないので "!" を使う

u:(りんごが好き)美味しいですもんね

u:(りんごが好き !ではない)まずいですもんね

人間:りんごが好き (100%)

ロボット:美味しいですもんね
人間:りんごが好きではない (100%)
ロボット:まずいですもんね


Tag: % (タグ)

文章やトピックにタグをつけて使い回しができる

proposal: %天気 今日の天気はどう?

u:(天気の話してよ)^goto(天気)
u:(何かお話しして)%物語 わかりました。3匹のくまの話をしましょう
u:(退屈だな)^goto(物語)

人間:天気の話してよ (100%)

ロボット:今日の天気はどう ?
人間:何かお話しして (100%)
ロボット:わかりました。3匹のくまの話をしましょう
人間:退屈だな (100%)
ロボット:わかりました。3匹のくまの話をしましょう


Input storing: _ (入力を変数に入れる)

u:(私の名前は _* です)こんにちは $1 さん $name=$1

u:(名前、覚えてくれた?)はい、 $name さんですよね。
u:(ぼく、 _[チョコ チーズ] が好きなんだ) $1 を食べたいですか?

人間:私の名前はたろうです (100%)

ロボット:こんにちはたろうさん
人間:名前、覚えてくれた? (100%)
ロボット:はい、たろうさんですよね 。
人間:ぼく、チョコが好きなんだ (100%)
ロボット:チョコを食べたいですか ?
人間:ぼく、チーズが好きなんだ (100%)
ロボット:チーズを食べたいですか ?

関連した関数

Wildcard: *.

Concept call: ~.
Variable: $.


Variable: $ (変数)

$をつけると変数グローバル変数として使える。型はなし。

e:VariableNameという書き方も可

変数はALMemoryに保存される

u:(_[チョコ チーズ]が食べたいな) いいですよ。 $askedFood=$1

u:(なんて頼んだ?) ^first["$askedFood を頼みました" "わかりません"]

人間:なんて頼んだ? (100%) #まだ変数に値がないので「わかりません」が返る

ロボット:わかりません
人間:チョコが食べたいな (100%)
ロボット:いいですよ 。
人間:なんて頼んだ? (100%)
ロボット:チョコを頼みました
人間:チーズが食べたいな (100%)
ロボット:いいですよ 。
人間:なんて頼んだ? (100%)
ロボット:チーズを頼みました

関連した関数

^first,

^clear.


Conditions: == > <> < (条件分岐)

u:(_[チョコ チーズ]が食べたいな) いいですよ。 $askedFood=$1

u:(なんて頼んだ?) ^first["$askedFood を頼みました" "わかりません"]
u:(もっと食べたい)^first["$askedFood==チョコ 取り過ぎは良くないです" "はい、もっと持ってきますね。"]

人間:チョコが食べたいな (100%)

ロボット:いいですよ 。
人間:なんて頼んだ? (100%)
ロボット:チョコを頼みました
人間:もっと食べたい (100%)
ロボット:取り過ぎは良くないです
人間:チーズが食べたいな (100%)
ロボット:いいですよ 。
人間:なんて頼んだ? (100%)
ロボット:チーズを頼みました
人間:もっと食べたい (100%)
ロボット:はい、もっと持ってきますね 。

Robot events: e:eventName (イベントと関連付ける)

u:(言うとおりに動いて)はい、足を触るか命令してください

u:(e:LeftBumperPressed 足を動かして) はい、左足を動かします。
u:(e:LeftBumperPressed この足を光らせて)はい、左足を光らせます。

人間:言うとおりに動いて (100%)

ロボット:はい、足を触るか命令してください
(左のバンパーを押すと「はい、左足を動かします。」)
(左のバンパーを押しながら「この足を光らせて」と言うと「はい、左足を光らせます。」)

となるはず。(実機未確認)


Concept call: ~ (コンセプトの呼び出し)

u:(何してるの?)飲み物を提供してます

u:(なにか ~want な)何が ~want ですか?
u1:(_~drink) $1 の準備をしますね。

人間:何してるの? (100%)

ロボット:飲み物を提供してます
人間:なにかほしいな (100%)
ロボット:何がのみたいですか ?
人間:ビールがいい (100%)
ロボット:ビールの準備をしますね 。
人間:なにかのみたいな (100%)
ロボット:何がほしいですか ?
人間:牛乳がのみたい (100%)
ロボット:牛乳の準備をしますね 。


Forbidden characters (使用できない文字)


Forbidden characters in Human input (人間の入力)

・句読点は使わない

・単語が識別される

・すべての特殊文字同様、$は予約語なので dollar と入力する(英語の場合)

・アポストロフィー(`)は使えるが ( ’)は使えない

・(日本語に限り)数字は全角でなく半角数字を使う


Forbidden characters in Robot output (ロボットの入力)

・すべての特殊文字同様、$は予約語なので dollar と入力する(英語の場合)

・アポストロフィー(`)は使えるが ( ’)は使えない


Rule functions and properties (関数や属性の規則)


^activate ^deactivate (有効化・非有効化)

タグを指定して有効化・非有効化できる


^clear

変数をクリアできる


^exist ^notExist

変数に値があるかどうかを判定できる


^first

選択肢の中で最初に有効化されているものを選択する


^goto

指定したタグへとぶ


^gotoRandom

複数のタグの応答から一つをランダムに選ぶ


^gotoReactivate

プロポーザル(proposal)を最有効化する


^nextProposal

有効化された最初のプロポーザルに飛ぶ


^play

ベータ関数のためなくなる可能性がある


^previousProposal


^private

u:(音楽の話をしよう)いいですよ!

u:^private(なんの話をしてたっけ) 音楽の話をしてましたよ

人間:なんの話をしてたっけ (100%) #まだトピックにフォーカスされていないため、無応答になる

人間:音楽の話をしよう (100%)
ロボット:いいですよ !
人間:なんの話をしてたっけ (100%)
ロボット:音楽の話をしてましたよ


^rand

ランダムに選ぶ


^repeat


^sameProposal


^stayInScope


Animated speech functions

        ^mode

^run
^runTag
^runSound
^start
^startTag
^startSound
^stop
^stopTag
^stopSound
^wait
^waitTag
^waitSound
Topic properties
^notInEmbeddedASR
^noPick
^noStay
^resetOnFocus
^fallback
^topicTag
Transformation rules
Skin: s:
^addword
^replace


参考

QiChat - Syntax 公式

会話入門 (Pepper TechFes技術セッション)

QICHAT ポイント解説

ALDialog/QiChatメモ