QiChatを使ってPepperを自由に動かす。【イベント】

##関連記事
僕の作成した記事ですが、紹介させてもらいます。

>QiChatを使ってPepperを自由に動かす。【チュートリアル】
>http://qiita.com/DeveloperRyo87/items/83a7d0327116214892d4
>QiChatを使ってPepperを自由に動かす。【イベント】<-本記事
>http://qiita.com/DeveloperRyo87/items/da5a73f15f0da3aea2a2
>QiChatを使ってPepperを自由に動かす。【コラボラティブ】
>http://qiita.com/DeveloperRyo87/items/d4b3f9ae411fc685239a
>QiChatを使ってPepperを自由に動かす。【まとめ】
>http://qiita.com/DeveloperRyo87/items/7a72c039efe2d2954c7b

##始めに
Qichatを使えば、Dialogボックスだけである程度の物事を管理できるようになるので、その辺をまとめた記事がなかったので、作成しようと思います。

今回も、先に記事を公開して、暇があるタイミングで更新していくスタンスで行きたいと思います。

##確認方法
###確認環境
MacBook Pro (Retina, 13-inch, Late 2013)
コレグラフ2.1.3
NAO 2.1.3(basic Channelインストール済み)
うちにはNAOしかいないのでとりあえず、NAOで。
Pepper欲しい。

##方針
~~とりあえず、チュートリアルとして、ルールの使い方や、コンセプトの使い方を簡単に説明して、そのあとは本題のイベントを使った話とか、コラボラティブな話とか書いていきたいです。~~

この項ではダイアログで使えるイベントを解説していきます。

##イベント
###Dialogのイベント
1. Dialog/Answered

	自分の言った言葉を繰り返す。
	
	```
	u:(こんにちは) こんにちは
	u:(なんて言ったの) わたしは $Dialog/Answered　と言った。#わたしはこんにちはと言った。
	```
	
1. Dialog/Failure

	Dialog/Fallbackまたは、Dialog/NotUnderstoodを2回行うと、3回目に呼び出される。
	
	```
	u:(e:Dialog/NotUnderstood) 失敗	#2回発動
	u:(e:Dialog/Failure) 三回も失敗してやんの―	
	```	

1. Dialog/Fallback

	Fallbackと一致すると発動。
	どうしたら発動するのかわからない。

1. Dialog/IsStarted
	
	Dialogが起動していればTrueを返す、らしい？
	
	>Event: "Dialog/IsStarted"
	>True if ALDialog is started.
	
	
	```
	u:(e:onStart) こんにちは
	u:(こんにちは) ["$Dialog/IsStarted==True ひまなの？" "けっ！"]　#あれ？けっ！って言われたんだけど...
	```	

1. Dialog/LastInput

	最後の入力を繰り返す。	

	```
	u:(おはよう)　$Dialog/LastInput　#おはよう
	```	


1. Dialog/NotSpeaking5
1. Dialog/NotSpeaking10
1. Dialog/NotSpeaking15
1. Dialog/NotSpeaking20

	話をしないで、5,10,15,20秒経つと発話する。

	```
	u:(e:Dialog/NotSpeaking5) 　なんか話してー
	u:(e:Dialog/NotSpeaking10)　話してよー
	u:(e:Dialog/NotSpeaking15)　私の事嫌いになった？
	u:(e:Dialog/NotSpeaking20)　もーあなたなんか嫌い！！
	```	
	
	なんだか、ヘコんできた。

1. Dialog/NotUnderstood
1. Dialog/NotUnderstood2
1. Dialog/NotUnderstood3

	聞き取れなければ、1,2,3と反応が変わります。

	```
	u:(e:Dialog/NotUnderstood) わかりません。
	u:(e:Dialog/NotUnderstood2) わかんない！
	u:(e:Dialog/NotUnderstood3) わからないって言ってるでしょ！！
	```

1. Dialog/SameRule

	下のような感じで使えると思ったんだけど。動かなかった。
	

	```
	u:(e:onStart) あなたは人ですか？
   		u1:(そうです)　もう一度聞きます。あなたは人ですか？　$Dialog/SameRule　
   		u1:(いいえ) ですよねー！そんな顔してますもんね。 
	```
	


####ここまでで。
Qichatで記述して、間違った行は反応してくれないみたい。(未確認)

###NAOqi Event
>NAOqi Event
>http://doc.aldebaran.com/2-1/naoqi-eventindex.html

数が多すぎるので、使いそうなものだけ列挙してみます。
1. EngagementZones系
2. ALBasicAwareness系
3. Touch系
4. Recognized系

### Qichatの活用すると面白そうなスクリプト

以下のものの中から、いくつかピックアップして紹介したいと思います。

>QiChat - すべての構文
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/aldialog_syntax_toc.html#dialog-toc

####【Skin】ルールの自作

>Qichat - Skin
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/dialog-syntax_full.html#transformation-rules

ルールというとu1,u2,u3...のというインデントで整形したものを指しています。
ただ、これだけだと、NAO個人(個ロボット?)を表現することが難しいです。
何が言いたいかというと、アプリケーションによってキャラクターが代わったり、声の大きさ、高さ、速さが代わって安定したNAOというキャラクターが存在しにくくなります。

まずは簡単に説明しましょう。例えば、上で利用した例文ですが、

	
```
u:(e:onStart) あなたは人ですか？
	u1:(そうです)　もう一度聞きます。あなたは人ですか？
   	u1:(いいえ) ですよねー！そんな顔してますもんね。 
```

まぁなんというか普通です。
これにスキンを使用すると、以下のようになります。【あくまでイメージです。正しいものは以下説明を見てください。】

```
u:(e:onStart) あなたは人ですかにゃん？
	u1:(そうです)　もう一度聞きます。あなたは人ですかにゃん？
   	u1:(いいえ) ですよにゃー！そんな顔してますもんにゃー。 
```

簡単に猫型ロボットの完成です。
え？うちのNAOは赤い子ですよ？

具体的な作り方を見て行きましょう。
##### Skinの構文

######基本構文

```
s:(ロボットの発話) 修飾子
s:(ロボットの発話)
修飾子
```
普通の、"u"を使って書いていたものが"s"に代わったと思ってもらえば大丈夫です。

######^addword
s:(ロボットの発話) ^addword(言い回し, 位置, 頻度)
・言い回し
	言い回しに関しては、単語、文、concept等が使えます。
・位置
	a. 整数値: その位置に言い回しを追加してくれます。
	b. "end": 文末に言い回しを追加してくれます。
	c. "top": 文頭に言い回しを追加してくれます。
・頻度
	"1"で毎回適用、"0"は適用しない。
	
```

u:(こんにちは) こんにちは、人間！
u:(元気) 元気だよ

s:(こんにちは、人間) ^addword(わたしはお前の父だ。, end, 1)
s:(*) ^addword(へい, start, 1)

```

>人間：こんにちは (52.05%)
>ロボット：へいこんにちは、人間！わたしはお前の父だ  。
>人間：元気 (67.62%)
>ロボット：へい元気だよ

このような感じで使えます。

######^replace
s:(ロボットの発話) ^replace(言い回し1, 言い回し2, 頻度)
・言い回し
	言い回し1を言い回し2に置き換えます。
・頻度
	"1"で毎回適用、"0"は適用しない。

```
u:(e:onStart) あなたは人ですか？
    u1:(そうです)　もう一度聞きます。あなたは人ですか？
    u1:(いいえ) ですよね！そんな顔してますもんね。 

s:({*} ですか {*}) ^replace(ですか, ですかにゃん, 1)
s:({*} ね {*}) ^replace(ね, にゃー, 1)
```
>ロボット：あなたは人ですかにゃん  ？
>人間：<...> いいえ <...> (62.24%)
>ロボット：ですよにゃー！そんな顔してますもんにゃー  。

今回例文で、"ね"の一文字だけを登録してサンプルとしましたが、実際にそれで行うと、

>ロボット：今日は何の日？にゃーのひだよー！
>ロボット：ごめんにゃー
>ロボット：息のにゃーを止めてやる
>ロボット：おかにゃーが欲しいです

みたいな感じで、全然話の内容が入ってこなくなります。ご注意ください。
(文字で登録するのではなく、単語などで登録すると良いと思います。)

####【^start,^wait,^stop,^run】外部モーションの呼び出し
#####^start
モーション、またはbehaviorを開始する。
#####^wait
実行中のモーション、またはbehaviorを終わるまで待機する。
#####^stop
実行中のモーション、またはbehaviorを終了させる。
#####^run
モーション、またはbehaviorを開始する。(途中で中断される可能性あり)
#####sample
AnimatedSayで見慣れているかと思いますが、既存モーションを利用して動作をさせることが出来ます。
既存モーションは"animations"というアプリを参考にしてください。

```
Hello! ^start(animations/Stand/Gestures/Hey_1) Nice to meet you ^wait(animations/Stand/Gestures/Hey_1)
```

![スクリーンショット 2015-06-30 17.13.03.png](https://qiita-image-store.s3.amazonaws.com/0/35860/c6efdf77-bb53-015b-250d-59243a57edbd.png "スクリーンショット 2015-06-30 17.13.03.png")





####【^startSound,^waitSound,^stopSound,^runSound】外部音源の呼び出し
#####^startSound
音源の再生を開始する。
#####^waitSound
音源の再生を終わるまで待機する。
#####^stopSound
音源の再生を終了させる。
#####^runSound
音源の再生を開始する。(途中で中断される可能性あり)



##感想
~~まだまだ、ドキュメントを読み足りていないので、細かく目を通したい。
この記事も、まだまだ書き足りていないので、どんどん書き足していこうと思っています。
今後とも宜しくお願いします。~~

記事を分割しました。
現在はただ分割してあるだけなのでまだ見難いかもしれませんが、おいおい直していきます。

##参考URL

>Qichat - Syntax
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/dialog-syntax_full.html#dialog-rules

>Qichat - Cheatsheet
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/aldialog_syntax_cheat_sheet.html?highlight=cheat