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メモ