#はじめに
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メモ