会話入門 (Pepper TechFes技術セッション)

2014/9/20にベルサール渋谷ガーデンでおこなわれた [Pepper Tech Festival 2014](http://www.softbank.jp/robot/special/techfes/) の技術セッションで紹介された作例を紹介します。

#概要

技術セッションでは、会話入門として、ダイアログの機能の使い方について紹介しました。このチュートリアルでは、その内容についてまとめています。

###Pepper Tech Festival 2014動画
以下のリンクで、該当箇所から再生できます。

[![Pepper Tech Festival 2014 〜 技術セッション（応用篇）](http://img.youtube.com/vi/MjaOWfYWBjA/0.jpg)](http://www.youtube.com/watch?v=MjaOWfYWBjA&t=38m5s)

###関連チュートリアル

以下のチュートリアルでもQiChat Scriptを利用した会話の定義例を説明しています。あわせて参照してください。

* [Pepperチュートリアル (4)：会話をする、音を鳴らす#QiChat Scriptの活用](http://qiita.com/Atelier-Akihabara/items/52e086e7c47d85b9ed3d#2-2)

#つくってみる

実際にアプリケーションを作って試してみる動画は http://www.youtube.com/watch?v=MjaOWfYWBjA&t=38m45s を参考にしてください。
新規にプロジェクトを開いた状態で、以下のように操作していきます。

###ダイアログの作成

1. [プロジェクトの内容]パネルの**[+]ボタンをクリックし、[ダイアログのトピックを作成中...]を選択**します

    ![add-dialog-topic-1.png](https://qiita-image-store.s3.amazonaws.com/0/54394/fa8e2d2f-8585-5d73-a6c2-6fe8b2063ccc.png)

2. 設定ダイアログボックスが開くので、**[英語(enu)]のチェックをはずし[A]**、**[日本語(jpj)]のチェックをオン[B]**にします

    ![add-dialog-topic-2.png](https://qiita-image-store.s3.amazonaws.com/0/54394/af7b5dbf-0c83-875d-5f2a-43aad75a2d1d.png)

3. [名前]に **start と入力**します

    ![add-dialog-topic-3.png](https://qiita-image-store.s3.amazonaws.com/0/54394/fd229a32-d0d1-f152-e32e-37e01e190b48.png)

4. [追加]ボタンを押します。すると、[プロジェクトの内容]パネルに `start` というフォルダが作成され、 `start.dlg` と `start_jpj.top` という2つのファイルが作成されます

    ![dialog-topic.png](https://qiita-image-store.s3.amazonaws.com/0/54394/e64e2a71-f26a-c02c-2764-40d3b3812126.png)

5. 次に、この `start` ダイアログを実行するためのボックスを配置します。フローダイアグラム上で右クリックをおこない、**[ボックスの新規作成]の[ダイアログ...]を選択**します

    ![dialog-add.png](https://qiita-image-store.s3.amazonaws.com/0/54394/7d995f99-7cc5-056e-368e-991392d9fa71.png)

6. ボックスの設定ダイアログが開くので、[トピック]から **start を選択**します

    ![dialog-add-dlg.png](https://qiita-image-store.s3.amazonaws.com/0/54394/b06bcad0-d160-f874-ca59-d4897dc4af8e.png)

7. [OK]ボタンを押します。すると、フローダイアグラム中に `start` ボックスが作成されます

    ![dialog-box-flow.png](https://qiita-image-store.s3.amazonaws.com/0/54394/186dca65-fa54-d22d-1406-bbe1ed42815b.png)

8. このボックスを以下のように接続します

    ![dialog-box-connection.png](https://qiita-image-store.s3.amazonaws.com/0/54394/03332715-e867-2090-887b-9093c5ed1bce.png)

9. 最後に、ダイアログにスクリプトを記述し、会話の内容を作成します。[プロジェクトの内容]パネルの `start_jpj.top` を**ダブルクリック**してください (.topは、topicを意味しています)

    ![select-topic.png](https://qiita-image-store.s3.amazonaws.com/0/54394/608e0f7b-15bf-5bf3-bad8-813b8cdaaaad.png)

10. ダイアログのスクリプトを編集するパネルがあらわれます。ここでは、QiChat Scriptを記述して、会話の内容を定義することができます

    ![script-editor.png](https://qiita-image-store.s3.amazonaws.com/0/54394/3846070d-f6b9-4600-3914-84c32922985f.png)

    ここでは、以下のようなスクリプトを追記してみてください。

    ```
    u:(こんにちは)こんにちは。ねぇ、にらめっこしない？
    ```

    以下のようになります。

    ![script-editor-example.png](https://qiita-image-store.s3.amazonaws.com/0/54394/b9f4b712-2154-c8c0-9ac3-f2a5389a1137.png)

    `u:(文字列)` は、ユーザが文字列を発した場合に、続く言葉をしゃべることを意味しています。QiChat Scriptではさまざまな記述が可能です。これについては、後ほどいくつか見ていきます。


#確認してみよう

動作確認をおこなうには [Pepperチュートリアル (1)：SDKインストールとアプリケーションの作成/実行#Pepperでの実行](http://qiita.com/Atelier-Akihabara/items/c5f57358a7b333eef397#2-7) を参考にPepperに接続し、[ロボットにアップロードして再生]をおこなってみてください。

Pepper実機の場合は、「こんにちは」と話しかけてみてください。
また、バーチャルロボットの場合は、[ダイアログパネル](http://qiita.com/Atelier-Akihabara/items/a6a97c717c5f96daff1d#-%E5%8F%82%E8%80%83%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%83%91%E3%83%8D%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%81%A8%E3%81%AE%E5%AF%BE%E8%A9%B1)を用いて文字列ベースで動作確認をすることができます。

![dialog.png](https://qiita-image-store.s3.amazonaws.com/0/54394/995357ea-ba17-6316-b0f5-afa00e1d13cd.png)

なお、Pepper実機の場合も、会話の内容を確認することに使えます。なかなか思った通りの反応をしてくれない場合は、ダイアログパネルでPepperがどう認識しているのか、確認してみてください。

> ####![info.png](https://qiita-image-store.s3.amazonaws.com/0/54394/ed7863bd-4c2e-7710-58db-0e38a4f26959.png) (参考)バーチャルロボットにおいてエラーが発生する場合は
> バーチャルロボットでこのサンプルを実行しようとした場合、startボックスがエラーを示す赤色となり、[ログビューア](http://qiita.com/Atelier-Akihabara/items/7a898f5e4d878b1ad889#4-10)に以下のようなエラーが出力される場合があります。
> 
> ```
> [ERROR] behavior.box :FMBoxTopic::xApplySpecialIONatureAction:0 _Behavior__lastUploadedChoregrapheBehaviorbehavior_11800137040__root__start_1: Error in call of ALDialog::activateTopic:	loadTopic::ALDialog
	No language is set
> ```
> 
> このような場合は、[Pepperチュートリアル (4)：会話をする、音を鳴らす](http://qiita.com/Atelier-Akihabara/items/52e086e7c47d85b9ed3d#3-2)を参考に、はじめに**Set LanguageボックスでJapanese** を選択するようにしてください。
> Pepper実機の場合は、起動時に言語選択をしており、適切にLanguageが設定された状態になっているため、このようなエラーは発生しません。

この例では単純な受け答えだけを定義しただけですが、QiChatを用いると他にもさまざまなことをおこなうことができます。
これから、いくつかの機能についてみていきます。


#QiChatのその他の機能

##アニメーションの実行

Pepperにはあらかじめ多くのモーションが用意されており、`^関数呼び出し` といった形で、モーションを開始したり、モーション終了を待機したりといったことが可能です。

この命令には以下のようなものがあります。

| 関数 | 機能 |
|-----|----| 
| ^mode(*body_language_mode*) | 身振りのモードを切り替えます。*body_language_mode*には、`disabled`, `random`, `contextual` のいずれかが指定できます |
| ^start(*animation*) | 指定したモーションやビヘイビアを開始します。モーションには、`animations/Stand/Gestures/ShowSky_1` などと、Pepperにインストールされているモーションを指定することができます |
| ^wait(*animation*) | アニメーションの実行終了を待機します |

他、指定可能な関数の一覧については、 NAOqi Developer guide > NAOqi Framework > NAOqi API > NAOqi Audio > ALDialog > QiChat - Syntax > Rule functions and properties を参照してください。
また、Pepperで実行可能なアニメーションの一覧については、 NAOqi Developer guide > NAOqi Framework > NAOqi API > NAOqi Audio > ALAnimatedSpeech > ALAnimatedSpeech - Advanced > Pepper - List of animations available by default を参照してください。

たとえば、以下のように「ジェスチャー」と人間から言われたら、モーション `animations/Stand/Gestures/ShowSky_1` を再生しながら「みて」としゃべらせてみます。モーションの後は、1秒(=1000ミリ秒)待機してから、「どうよ？」としゃべらせてみるには、以下のような定義を記述します。

```
u:(ジェスチャー)^mode(disabled)^start(animations/Stand/Gestures/ShowSky_1) みて ^wait(animations/Stand/Gestures/ShowSky_1) \pau=1000\ ^mode(contextual) どうよ？
```

\pau=1000\のような記述については、[say文字列中の制御文字列について](http://qiita.com/Atelier-Akihabara/items/acc8d2ad6c3881f112a4#-%E5%8F%82%E8%80%83say%E6%96%87%E5%AD%97%E5%88%97%E4%B8%AD%E3%81%AE%E5%88%B6%E5%BE%A1%E6%96%87%E5%AD%97%E5%88%97-pau200-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)などを参考にしてください。

この場合、Pepperに「ジェスチャー」としゃべりかけると、以下のようにアニメーションつきでPepperがしゃべります。

[![ダイアログでのアニメーションつきスピーチの例](http://img.youtube.com/vi/e35EWGeY258/0.jpg)](http://www.youtube.com/watch?v=e35EWGeY258)


##複数の単語の候補

人間が発する言葉にはさまざまなものが考えられ、同じようなことを意味する言葉を候補として複数定義する必要が出てきます。これは、Conceptという機能を用いて実現することができます。

Pepper Tech Festival 2014で配布したUSBメモリの `Welcome to Pepper Tech Fes 2014/SB_SampleApp/pepper_dialog_sample` には、dialogのアプリケーション例が同梱されています。
この中の `pepper_dialog_sample.pml` をChoregrapheで開くと、[プロジェクトの内容]パネル内に `lexicon110_jpj.top` というトピックファイルがありますので、これをダブルクリックして開いてみてください。

![lexicon.png](https://qiita-image-store.s3.amazonaws.com/0/54394/573f8d17-0d31-4d33-da4d-aa45f31c5015.png)

たとえば、以下のような行が定義されています。

```
concept:(yes)[はい はーい はぁい うん そうです そうだね そうだな そうだよ そうやな そうよ 思う おもう 思います おもいます そう思う そう思います いいよ いいですね いいですよ いいとも OK ok オッケー わかった わかりました ...]
```

このように `concept:` という記述を利用することで、「はい」「はーい」など複数の言葉を`yes`という名前でまとめて定義することができます。この言葉の集合は `~` を指定して参照することができます。以下のようにすることで、「はい」もしくはそれに近い意味の言葉を受け取ったら、「よかったあ」と答えるダイアログを定義することが可能です。

```
concept:(yes)[はい はーい はぁい うん そうです そうだね そうだな そうだよ そうやな そうよ 思う おもう 思います おもいます そう思う そう思います いいよ いいですね いいですよ いいとも OK ok オッケー わかった わかりました 了解 承知 当然 当たり前 あたりまえ 勿論 もちろん その通り おっしゃる通り そうかも そうかもね いいかも まあね まぁね まーね それはそうだ それはそうです それはそうでしょ そりゃそうだ そりゃそうです そりゃそうでしょ そうに決まってる そうに決まってます そうに決まっている そうに決まっています]

u:(~yes)よかったあ
```

また、このサンプルのように、 `include` を用いて、別のトピックファイルを読み込むことも可能です。サンプルのファイルを見ながら、どのような記述がされており、どのような動きになるのか見てください。

##サブルール

ある受け答えをした後にのみ、特定の受け答えを有効にしたいなど、文脈を考えたルールを定義することも可能です。

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

このようにすると、同じ「はい」「いいえ」でも、その受け答えの流れによって異なる反応をさせることが可能です。


##ボックスからの出力

ダイアログからボックスの外へと出力をおこなうこともできます。これにより、ダイアログで受け答えをしつつ、必要に応じて別のボックスを起動したりすることができます。

たとえば、以下のようにダイアログボックスの出力側で右クリックをし、[Add output]を選択、Typeが[数]の`output`という名前の出力を追加します。

![add-output.png](https://qiita-image-store.s3.amazonaws.com/0/54394/39129f47-972a-2110-61b2-05dcfd6cfb39.png)

次に、ダイアログ内で、以下のように `$出力名` に値を代入するような記述を追加します。これで、「わかりました」の後に `output` に対して `1` を出力するようになります。

```
u:(まわって)わかりました $output = 1
```

以下のように追加された `output` 出力をMove Toボックスにつなげば、「まわって」の後にMove Toボックスを実行することができます。

![connect-pin.png](https://qiita-image-store.s3.amazonaws.com/0/54394/8a66d9b5-43f6-6524-7923-75a459195f3d.png)

このように、QiChatによりさまざまな機能を実現することができます。
SDKドキュメント NAOqi Developer guide > NAOqi Framework > NAOqi API > NAOqi Audio > ALDialog > QiChat には他にもさまざまな機能が説明されています。ぜひ参照して、Pepperに色々な対話をさせてみてください。