ALDialog/QiChatメモ

`ALDialog/QiChat`に可能性を感じたのでメモです

#`ALDialog/QiChat`の概要

![Screen Shot 2015-03-01 at 12.01.08 PM.png](https://qiita-image-store.s3.amazonaws.com/0/70456/e3e95911-204e-b945-35b0-4f7d33184c8a.png)

ChoregrapheにDialogボックスを配置すると、
`QiChat`というスクリプトによってPepperくんの会話などを制御出来る。
良く使う基本的な`QiChat`のシンタックスをメモ。

##concept
会話のパターンを宣言するのに使用。
変数として会話のパターンを入れておくイメージ。
例:

*スクリプト*

```lang:
...
concept:(yes) [はい いいですよ]
u:(~yes) やったー
...
```
**`[]`**の中に入れることによって複数パターンを登録できる。
`~`を付けると、`concept`の内容を持ってくる。

*結果*

```lang:
Human: はい (100%)
Robot: やったー
Human: いいですよ (100%)
Robot: やったー
```

##proposal
Pepperくんに喋らせる言葉を関数化出来るシンタックス。
以下のように扱う。
`proposal: %hoge Pepperです、こんにちは`
(`%`の後にタグ名でタグを付けることが出来る)

###^nextProposal

次の`proposal`を持ってくる。
例:

*スクリプト*

```lang:
...
proposal: １番目
proposal: ２番目
proposal: ３番目
u:(こんにちは) ^nextProposal
...
```

*結果*

```lang:
Human: こんにちは (100%)
Robot: １番目
Human: こんにちは (100%)
Robot: ２番目
Human: こんにちは (100%)
Robot: ３番目
```

###^previousProposal

**一個前**の`proposal`を持ってくる。
(注:`^nextProposal`のように前に行く動作ではない。)
例:

*スクリプト*

```lang:
...
proposal: １番目
proposal: ２番目
proposal: ３番目
u:(こんにちは) ^nextProposal
u:(こんばんは) ^previousProposal
...
```

*結果*

```lang:
Human: こんにちは (100%)
Robot: １番目
Human: こんにちは (100%)
Robot: ２番目
Human: こんばんは (100%)
Robot: １番目
Human: こんばんは (100%)
Robot: ２番目
Human: こんばんは (100%)
Robot: １番目
```

###^sameProposal

先ほどと同じ`proposal`を持ってくる。
例:

*スクリプト*

```lang:
...
proposal: １番目
proposal: ２番目
proposal: ３番目
u:(こんにちは) ^nextProposal
u:(こんばんは) ^previousProposal
u:(おはよう) ^sameProposal
...
```

*結果*

```lang:
Human: こんにちは (100%)
Robot: １番目
Human: おはよう (100%)
Robot: １番目
Human: おはよう (100%)
Robot: １番目
```

###^activate(タグ名), ^deactivate(タグ名)

タグを付けた`proposal`の有効化と無効化を行う。
例:

*スクリプト*

```lang:
...
proposal: こんにちは
proposal: %hoge おはよう
proposal: こんばんは
u:(こんにちは) ^nextProposal
u:(おはよう) ^deactivate(hoge) 今は朝では無いですよね
...
```

*結果*

```lang:
Human: こんにちは (100%)
Robot: こんにちは
Human: おはよう (100%)
Robot: 今は朝では無いですよね
Human: こんにちは (100%)
Robot: こんばんは
```

###^goto(タグ名), ^gotoReactive（タグ名）

`%`によってタグを付けた文章を持ってくる。
（注:`^goto`は一度のみ。）
例:

*スクリプト*

```lang:
...
proposal: %hoge Pepperです
u:(こんにちは) こんにちは ^goto(hoge)
u:(おはよう) おはよう ^gotoReactive(hoge)
...
```

*結果*

```lang:
Human: こんにちは (100%)
Robot: こんにちはPepperです
Human: こんにちは (100%)
Robot: こんにちは
Human: おはよう (100%)
Robot: おはようPepperです
Human: おはよう (100%)
Robot: おはようPepperです
```

###^gotoRandom(タグ名)

同じタグが付いた文章をランダムに持ってくる。
(注:こちらも一度持ってきた文章は持ってこない)
例:

*スクリプト*

```lang:
...
proposal: %hoge Pepper1です
proposal: %hoge Pepper2です
proposal: %hoge Pepper3です
u:(こんにちは) こんにちは ^gotoRandom(hoge)
...
```

*結果*

```lang:
Human: こんにちは (100%)
Robot: こんにちはPepper3です
Human: こんにちは (100%)
Robot: こんにちはPepper1です
Human: こんにちは (100%)
Robot: こんにちはPepper2です
Human: こんにちは (100%)
Robot: こんにちは
```

##include
外部のトピックファイルを持ってくる。
整理できてとても便利。
例:

*スクリプト*

```lang:hoge_jpj.top
...
proposal: Pepperです
proposal: 百万馬力ですよ！
...
```

```lang:main_jpj.top
...
include: hoge_jpj.top
u:(こんにちは) ^nextProposal
...
```

*結果*

```lang:
Human: こんにちは (100%)
Robot: Pepperです
Human: こんにちは (100%)
Robot: 百万馬力ですよ！
```

##サブルール
例:

*スクリプト*

```

u:(こんにちは) こんにちは、今日の体調はどうですか？
    u1:(~good) それは良かったです。
    u1:(~bad) お気の毒に、どこが悪いですか？
        u2:(e:Dialog/NotUnderstood) $Dialog/LastInput が悪いのですか。
                                    $Dialog/LastInput が良くなる情報を表示します。
                                    $health=$Dialog/LastInput
```

*結果*

```

Human: こんにちは (100%)
Robot: こんにちは、今日の体調はどうですか？
Human: 辛いです (100%)
Robot: お気の毒に、どこが悪いですか？
Human: 頭 (100%)
Robot: 頭が悪いのですか。頭が良くなる情報を表示します。

```

上記の例のように**`u:`**だけではなく、
**`u1:`**,**`u2:`**のように**uの後に数字を追加する**ことにより
会話の条件分岐を行えたり、自然な会話の流れを実現出来る。

```

proposal: 今日の体調はどうですか？
    u1:(~good) それは良かったです。
    u1:(~bad) お気の毒に。

```

上記のように`proposal`の後にも使える。

スクリプトの一番下の行のように変数に会話の内容を入れることにより、`Dialog`ボックスの
次のボックスに値を受け渡すことが可能。
値を受け渡してその内容によって処理を行える。
(参考:[会話入門 (Pepper TechFes技術セッション)/ボックスからの出力](http://qiita.com/Atelier-Akihabara/items/37f5e99058ec39307038#%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%8B%E3%82%89%E3%81%AE%E5%87%BA%E5%8A%9B))


#所感

`proposal`辺りと`concept`変数を使えば一連の会話の流れは簡単に出来そう。
結構癖のあるスクリプトなので、テストを繰り返しながらの実装になりそう...
まだ細かいところに手が届きそうなシンタックスがあるので勉強次第更新します。

#参考

[会話入門 (Pepper TechFes技術セッション)](http://qiita.com/Atelier-Akihabara/items/37f5e99058ec39307038)
`QiChat`を使って会話と連動してモーションを動かす方法など

[Dialogとメモリイベント (Dialog応用)](http://qiita.com/Atelier-Akihabara/items/34488f5bc99213bfb16d)
`Dialog`のメモリイベントや、`QiChat`内でメモリイベントを持ってくる方法など

[pepperとの会話を進化させるQiChat-Syntaxまとめ（自分用メモ）](http://qiita.com/phptaro/items/d7428c416f27df82426e)
日本語版公式ドキュメントと言って良いシンタックスの紹介量です。

[QiChat - Table of Content](http://doc.aldebaran.com/2-1/naoqi/audio/dialog/aldialog_syntax_toc.html)
`QiChat`公式ドキュメント（英語）