LoginSignup
81
81

More than 5 years have passed since last update.

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

Posted at

はじめに

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

81
81
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
81
81