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

  • 57
    いいね
  • 20
    コメント
この記事は最終更新日から1年以上が経過しています。

2014/9/20にベルサール渋谷ガーデンでおこなわれた Pepper Tech Festival 2014 の技術セッションで紹介された作例を紹介します。

概要

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

Pepper Tech Festival 2014動画

以下のリンクで、該当箇所から再生できます。

Pepper Tech Festival 2014 〜 技術セッション(応用篇)

関連チュートリアル

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

つくってみる

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

ダイアログの作成

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

    add-dialog-topic-1.png

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

    add-dialog-topic-2.png

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

    add-dialog-topic-3.png

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

    dialog-topic.png

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

    dialog-add.png

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

    dialog-add-dlg.png

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

    dialog-box-flow.png

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

    dialog-box-connection.png

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

    select-topic.png

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

    script-editor.png

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

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

    以下のようになります。

    script-editor-example.png

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

確認してみよう

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

Pepper実機の場合は、「こんにちは」と話しかけてみてください。
また、バーチャルロボットの場合は、ダイアログパネルを用いて文字列ベースで動作確認をすることができます。

dialog.png

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

info.png (参考)バーチャルロボットにおいてエラーが発生する場合は

バーチャルロボットでこのサンプルを実行しようとした場合、startボックスがエラーを示す赤色となり、ログビューアに以下のようなエラーが出力される場合があります。

[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):会話をする、音を鳴らすを参考に、はじめに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文字列中の制御文字列についてなどを参考にしてください。

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

ダイアログでのアニメーションつきスピーチの例

複数の単語の候補

人間が発する言葉にはさまざまなものが考えられ、同じようなことを意味する言葉を候補として複数定義する必要が出てきます。これは、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

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

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

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

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

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

connect-pin.png

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