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

#はじめに
QiChatをひと通り調べようと思っていろいろ実行してみました。
自分用メモのため見にくいですがご勘弁。
たぶん、誰か（RobotStartさんに期待）もっと見やすい一覧を作ってくれることでしょう。




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

```txt
topic: ~topicname()
language: jpj
```

##concept（コンセプト）

```txt
concept:(greetings) ^rand[やあ こんにちは どうも]
concept:(wine)[白　赤]ワイン
concept:(alcohol)[ビール ~wine]

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

・concept:(xxx)でひとまとまりの言葉を使いまわせる
・~xxxでコンセプトを呼び出し
・[]の中に複数語を入れることで、用意された様々な応答ができる
・ちなみに単語の区切りは半角スペースでも全角スペースでもよい
・^randで列挙した文字列をランダムに使用

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

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


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

##dynamic（ダイナミック）
いまいちわからない


```txt
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（別のトピックファイル読込）

```txt
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（言語）

```txt
language: jpj	＃日本語の指定
```

##topic(トピック)

```txt
topic: ~name ()
```


#Rules
##User rule（ルール）

・改行やインデントは無視される
・会話はこんなふうに書きますよってこと

```txt
u:(入力)応答
u:(にゅうりょく)
  おうとう


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


##User subrule（サブルール)

・u1,u2,u3...を使うことで会話を分岐できる。
・以下は、同じ「いいえ」に対して違う応答ができている。

```txt
u:(動物)犬か猫、飼っていますか？
   u1:(犬)大きい犬ですか？
     u2:(はい)走れる広いところが必要ですね！
     u2:(いいえ)かわいいですね！
   u1:(猫)かわいいですね！
   u1:(いいえ)わたしといっしょですね！

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

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

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



##Proposal（提案）

```txt
proposal:コップに牛乳を入れて。
proposal:いちごを３つ入れて。
proposal:バニラアイスも入れて。
proposal:蓋をして振る！
proposal:ミルクシェイクのできあがり～

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

u:(次は)^nextProposal
```

```txt
ロボット：いいですよ。作り方を教えるから準備ができたら次はと言ってください  。
人間：次は (100%)
ロボット：コップに牛乳を入れて  。
人間：次は (100%)
ロボット：いちごを３つ入れて  。
人間：次は (100%)
ロボット：バニラアイスも入れて  。
人間：次は (100%)
ロボット：蓋をして振る  ！
人間：次は (100%)
ロボット：ミルクシェイクのできあがり～
人間：次は (100%)
人間：次は (100%)
```



関連した関数もある。

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



#Delimiters（区切り文字）

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

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

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

関連した関数

    ^first.
    ^rand.
    ^repeat.





##Phrase delimiter: ” “
""で囲むと文章単位で認識（日本語ではそれほど必要ないかも）

##Optional part: { }　（付随的な言葉）

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

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

#Special characters （特殊文字）
##Comments: #　（コメント）
行内において#の後ろに書いたものはすべてコメント扱い


##Wildcard: * (ワイルドカード）

```txt
u:(ぼく、*っていうんだ)よろしく
u:(休日は*するんだ)楽しそうだね
```

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

[Pepperは人間が喋った任意の言葉を認識できるか？](http://qiita.com/songchongok/items/c4acde4320ef39128c87)で精度について触れられている。

##Forbidden word: ! （禁止語）

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

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

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

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

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


##Tag: % (タグ)
文章やトピックにタグをつけて使い回しができる

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

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

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

```txt
u:(私の名前は　_*　です)こんにちは　$1 さん　$name=$1
u:(名前、覚えてくれた？)はい、　$name　さんですよね。
u:(ぼく、　_[チョコ　チーズ]　が好きなんだ)　$1 を食べたいですか？
```


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

関連した関数

    Wildcard: *.
    Concept call: ~.
    Variable: $.




##Variable: $ (変数）
$をつけると変数グローバル変数として使える。型はなし。
e:VariableNameという書き方も可
変数はALMemoryに保存される

```txt
u:(_[チョコ　チーズ]が食べたいな)　いいですよ。 $askedFood=$1
u:(なんて頼んだ？) ^first["$askedFood　を頼みました" "わかりません"]
```

```txt
人間：なんて頼んだ？ (100%)　#まだ変数に値がないので「わかりません」が返る
ロボット：わかりません
人間：チョコが食べたいな (100%)
ロボット：いいですよ  。
人間：なんて頼んだ？ (100%)
ロボット：チョコを頼みました
人間：チーズが食べたいな (100%)
ロボット：いいですよ  。
人間：なんて頼んだ？ (100%)
ロボット：チーズを頼みました
```

関連した関数

    ^first,
    ^clear.


##Conditions: == > <> <　（条件分岐）

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

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


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

```txt
u:(言うとおりに動いて)はい、足を触るか命令してください
u:(e:LeftBumperPressed 足を動かして)　はい、左足を動かします。
u:(e:LeftBumperPressed この足を光らせて)はい、左足を光らせます。
```

```txt
人間：言うとおりに動いて (100%)
ロボット：はい、足を触るか命令してください
（左のバンパーを押すと「はい、左足を動かします。」）
（左のバンパーを押しながら「この足を光らせて」と言うと「はい、左足を光らせます。」）
```

となるはず。（実機未確認）



##Concept call: ~ (コンセプトの呼び出し)
```txt
u:(何してるの？)飲み物を提供してます
u:(なにか ~want な)何が　~want ですか？
    u1:(_~drink) $1 の準備をしますね。
```

```txt
人間：何してるの？ (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

```text
u:(音楽の話をしよう)いいですよ！
u:^private(なんの話をしてたっけ) 音楽の話をしてましたよ
```

```text
人間：なんの話をしてたっけ (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 公式](http://doc.aldebaran.com/2-1/naoqi/audio/dialog/dialog-syntax_full.html?highlight=qichat)
[会話入門 (Pepper TechFes技術セッション)](http://qiita.com/Atelier-Akihabara/items/37f5e99058ec39307038)
[QICHAT ポイント解説](http://robo.genv.sophia.ac.jp/wp_robot/?page_id=12)
[ALDialog/QiChatメモ](http://qiita.com/Atelier-Akihabara/items/34488f5bc99213bfb16d)