Amazon Lex
開発者ガイド

ステップ 2a (オプション): 音声による情報フローの詳細を確認する (コンソール)

このセクションでは、クライアントが音声を使用してリクエストを送信した場合の、クライアントと Amazon Lex 間の情報フローについて説明します。詳細については、「PostContent」を参照してください。

  1. ユーザーの発話: 花を注文したい。

    1. クライアント (コンソール) は以下の PostContent リクエストを Amazon Lex に送信します。

      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1 x-amz-lex-session-attributes: "e30=" Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1" Accept: "audio/mpeg" Request body input stream

      リクエストの URI と本文の両方で Amazon Lex に情報が提供されています。

      • リクエスト URI – ボット名 (OrderFlowers)、ボットエイリアス ($LATEST)、ユーザー名 (ユーザーを識別するランダムな文字列)。content はこれが PostContent API リクエスト である (PostText リクエストではない) と示します。

      • リクエストヘッダー

        • x-amz-lex-session-attributes – base64-encoded 値は、"{}" を表します。クライアントが最初のリクエストを行うときにはセッション属性はありません。

        • Content-Type –オーディオ形式が反映されています。

      • リクエストボディ – ユーザー入力のオーディオストリーム (「花を注文したい」)。

      注記

      話すのではなく PostContent API にテキスト (「花を注文したい」) を送信することをユーザーが選択した場合、リクエストボディはユーザー入力です。それに応じて Content-Type ヘッダーが設定されています。

      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1 x-amz-lex-session-attributes: "e30=" Content-Type: "text/plain; charset=utf-8" Accept: accept Request body input stream
    2. 入力ストリームから、Amazon Lex はインテント (OrderFlowers) を検出します。次に、そのインテントのスロットのいずれか (この場合は FlowerType)、およびその値を引き出すプロンプトの 1 つ を選択し、以下のヘッダーを付けてレスポンスを送信します。

      x-amz-lex-dialog-state:ElicitSlot x-amz-lex-input-transcript:I would like to order some flowers. x-amz-lex-intent-name:OrderFlowers x-amz-lex-message:What type of flowers would you like to order? x-amz-lex-session-attributes:e30= x-amz-lex-slot-to-elicit:FlowerType x-amz-lex-slots:eyJQaWNrdXBUaW1lIjpudWxsLCJGbG93ZXJUeXBlIjpudWxsLCJQaWNrdXBEYXRlIjpudWxsfQ==

      ヘッダー値では以下の情報が指定されています。

      • x-amz-lex-input-transcript – リクエスト内の音声 (ユーザー入力) のトランスクリプト

      • x-amz-lex-message – Amazon Lex がレスポンスで返した音声のトランスクリプト

      • x-amz-lex-slots – スロットと値のペアを表す次の文字列を base64 でエンコードした値

        {"PickupTime":null,"FlowerType":null,"PickupDate":null}
      • x-amz-lex-session-attributes – セッション属性を表す文字列 ({}) を base64 でエンコードした値

      クライアントはレスポンス本文内の音声を再生します。

  2. ユーザーの発声: バラ

    1. クライアント (コンソール) は以下の PostContent リクエストを Amazon Lex に送信します。

      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1 x-amz-lex-session-attributes: "e30=" Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1" Accept: "audio/mpeg" Request body input stream ("roses")

      リクエストボディはユーザー入力の音声ストリーム (「バラ」) です。sessionAttributes は空のままです。

    2. Amazon Lex は現在のインテントのコンテキストで入力ストリームを解釈します (FlowerType スロットに関する情報をこのユーザーに求めていたことを覚えています)。Amazon Lex はまず、現在のインテントのスロット値を更新します。次に、別のスロット (PickupDate) をそのプロンプトメッセージの 1 つ (いつバラをピックアップなさいますか?) と共に選択し、以下のヘッダーを付けてレスポンスを返します。

      x-amz-lex-dialog-state:ElicitSlot x-amz-lex-input-transcript:roses x-amz-lex-intent-name:OrderFlowers x-amz-lex-message:When do you want to pick up the roses? x-amz-lex-session-attributes:e30= x-amz-lex-slot-to-elicit:PickupDate x-amz-lex-slots:eyJQaWNrdXBUaW1lIjpudWxsLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6bnVsbH0=

      ヘッダー値では以下の情報が指定されています。

      • x-amz-lex-slots – スロットと値のペアを表す次の文字列を base64 でエンコードした値。

        {"PickupTime":null,"FlowerType":"roses","PickupDate":null}
      • x-amz-lex-session-attributes – セッション属性を表す文字列 ({}) を base64 でエンコードした値

      クライアントはレスポンス本文内の音声を再生します。

  3. ユーザーの発声: 明日

    1. クライアント (コンソール) は以下の PostContent リクエストを Amazon Lex に送信します。

      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1 x-amz-lex-session-attributes: "e30=" Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1" Accept: "audio/mpeg" Request body input stream ("tomorrow")

      リクエストボディはユーザー入力の音声ストリーム (「明日」) です。sessionAttributes は空のままです。

    2. Amazon Lex は現在のインテントのコンテキストで入力ストリームを解釈します (PickupDate スロットに関する情報をこのユーザーに求めていたことを覚えています)。Amazon Lex はまず、現在のインテントのスロット (PickupDate) 値を更新します。次に、値を引き出す別のスロット (PickupTime)、およびその値を引き出すいずれかのプロンプト (「2017 年 3 月 18 日の何時にバラをピックアップなさいますか」) を選択し、以下のヘッダーを付けてレスポンスを返します。

      x-amz-lex-dialog-state:ElicitSlot x-amz-lex-input-transcript:tomorrow x-amz-lex-intent-name:OrderFlowers x-amz-lex-message:When do you want to pick up the roses on 2017-03-18? x-amz-lex-session-attributes:e30= x-amz-lex-slot-to-elicit:PickupTime x-amz-lex-slots:eyJQaWNrdXBUaW1lIjpudWxsLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6IjIwMTctMDMtMTgifQ== x-amzn-RequestId:3a205b70-0b69-11e7-b447-eb69face3e6f

      ヘッダー値では以下の情報が指定されています。

      • x-amz-lex-slots – スロットと値のペアを表す次の文字列を base64 でエンコードした値。

        {"PickupTime":null,"FlowerType":"roses","PickupDate":"2017-03-18"}
      • x-amz-lex-session-attributes – セッション属性を表す文字列 ({}) を base64 でエンコードした値

      クライアントはレスポンス本文内の音声を再生します。

  4. ユーザーの発声: 午後 6 時

    1. クライアント (コンソール) は以下の PostContent リクエストを Amazon Lex に送信します。

      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1 x-amz-lex-session-attributes: "e30=" Content-Type: "text/plain; charset=utf-8" Accept: "audio/mpeg" Request body input stream ("6 pm")

      リクエストボディはユーザー入力の音声ストリーム (「午後 6 時」) です。sessionAttributes は空のままです。

    2. Amazon Lex は現在のインテントのコンテキストで入力ストリームを解釈します (PickupTime スロットに関する情報をこのユーザーに求めていたことを覚えています)。&LEXlong; はまず現在のインテントのスロット値を更新します。

      ここで、Amazon Lex はすべてのスロットのデータがそろっていることを検出します。ただし、OrderFlowers インテントには確認メッセージが設定されています。そのため、Amazon Lex はインテントの達成に進む前に、ユーザーからの明示的な確認を必要とします。&LEXlong; は、花を注文する前に確認を要求する以下のヘッダーを付けてレスポンスを送信します。

      x-amz-lex-dialog-state:ConfirmIntent x-amz-lex-input-transcript:six p. m. x-amz-lex-intent-name:OrderFlowers x-amz-lex-message:Okay, your roses will be ready for pickup by 18:00 on 2017-03-18. Does this sound okay? x-amz-lex-session-attributes:e30= x-amz-lex-slots:eyJQaWNrdXBUaW1lIjoiMTg6MDAiLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6IjIwMTctMDMtMTgifQ== x-amzn-RequestId:083ca360-0b6a-11e7-b447-eb69face3e6f

      ヘッダー値では以下の情報が指定されています。

      • x-amz-lex-slots – スロットと値のペアを表す次の文字列を base64 でエンコードした値。

        {"PickupTime":"18:00","FlowerType":"roses","PickupDate":"2017-03-18"}
      • x-amz-lex-session-attributes – セッション属性を表す文字列 ({}) を base64 でエンコードした値

      クライアントはレスポンス本文内の音声を再生します。

  5. ユーザーの発声: はい

    1. クライアント (コンソール) は以下の PostContent リクエストを Amazon Lex に送信します。

      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1 x-amz-lex-session-attributes: "e30=" Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1" Accept: "audio/mpeg" Request body input stream ("Yes")

      リクエストボディはユーザー入力の音声ストリーム (「はい」) です。sessionAttributes は空のままです。

    2. Amazon Lex は入力ストリームを解釈し、注文を進めることをユーザーが望んでいることを理解します。OrderFlowers インテントには、フルフィルメントアクティビティとして ReturnIntent が設定されています。これによって、Amazon Lex はすべてのインテントデータをクライアントに返すように指示されます。Amazon Lex は次のレスポンスを返します。

      x-amz-lex-dialog-state:ReadyForFulfillment x-amz-lex-input-transcript:yes x-amz-lex-intent-name:OrderFlowers x-amz-lex-session-attributes:e30= x-amz-lex-slots:eyJQaWNrdXBUaW1lIjoiMTg6MDAiLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6IjIwMTctMDMtMTgifQ==

      x-amz-lex-dialog-state レスポンスヘッダーは ReadyForFulfillment に設定されています。これで、クライアントはインテントを達成できます。

  6. ここで、ボットを再テストします。新しい (ユーザー) コンテキストを確立するには、コンソールで [Clear] リンクを選択します。OrderFlowers インテントに指定するデータに、以下のような無効なデータを含めます。以下に例を示します。

    • 花の種類として「Jasmine」 (サポートされている花の種類ではない)

    • 花をピックアップする日付として「昨日」

    ボットではこれらの値が受け付けられることがわかります。これは、ユーザーデータを初期化および検証するコードがないためです。次のセクションでは、その処理を行う Lambda 関数を追加します。Lambda 関数について、以下の点に注意してください。

    • ユーザー入力のたびにスロットデータを検証します。インテントは最後に達成されます。つまり、ボットはスロットデータをクライアントに返すだけではなく、花の注文を処理してユーザーにメッセージを返します。詳細については、「Lambda 関数の使用」を参照してください。

    • セッション属性も設定します。セッション属性の詳細については、「PostText」を参照してください

      ご利用開始のセクションを完了したら、その他の演習 (その他の例: Amazon Lex ボットの作成) を行うことができます。ボットの例: BookTrip は、セッション属性を使用してクロスインテント情報を共有し、ユーザーと動的に会話します。

次のステップ

ステップ 3: Lambda 関数を作成する (コンソール)