[Amazon Connect] 自動音声メニューで2回目以降の繰り返し時はメッセージ内容を変えたい

「自動音声メニュー」の作りを工夫することで、お客様の利便性向上に繋げましょう!
2022.06.13

みなさん、こんにちは!
福岡オフィスの青柳です。

今回はAmazon Connectで「自動音声メニュー」を実装する時のテクニックをご紹介します。

こんな「自動音声メニュー」を作りたい

お客様から電話が掛かってきた時、オペレーターへ繋ぐ前に「自動音声メニュー」に従ってお客様にプッシュボタン操作を行って頂きます。 (いわゆる「IVR:Interactive Voice Response」の基本的な機能ですね)

自動音声のメッセージはこのような感じにしましょう。

お電話ありがとうございます。
プッシュボタンでメニューを選択してください。

ご購入前のお問い合わせは「1」を、
ご購入後のお問い合わせは「2」を押してください。

そして、お客様が押したボタンに応じて、それぞれの担当オペレーターのキューへ転送します。

  • 「1」を押した場合は、セールス担当のオペレーターのキューへ転送
  • 「2」を押した場合は、サポート担当のオペレーターのキューへ転送

よくあるパターンですね。 これなら簡単に実装できそうです。

お客様がボタン操作を間違った場合は「再入力」を促す

でも、これだけではメニューとして十分ではありませんね。

お客様が「1」「2」以外のボタンを押してしまったり、しばらく操作をしなかった場合 (タイムアウト) は、再入力を促すメッセージを流すべきでしょう。

入力が確認できませんでした。
もう一度入力してください。

ご購入前のお問い合わせは「1」を、
ご購入後のお問い合わせは「2」を押してください。

再入力を促すメッセージは、最初に流すメッセージとは前半部分が異なります。

さて、これをAmazon Connectのコンタクトフロー上に実装したいと思います。

実装してみる

実装パターン1: メッセージを分割する

まず思い付くシンプルな方法としては、以下のフロー図のような構成が考えられます。

(※ 見易くするため、各ブロックの「エラー」出力の接続先については省略しています)

「最初に流すメッセージ」と「再入力を促すメッセージ」を、それぞれで前半と後半に分割します。
前半部分は各メッセージで内容が異なる部分、後半部分は各メッセージで内容が共通の部分です。

フローに入ったら、まず「プロンプトの再生」ブロックで「最初に流すメッセージ」の前半部分を再生します。(図の「①」)

続けて「顧客の入力を取得する」ブロックでメッセージの後半部分を再生しつつ、利用者のプッシュボタン入力を待ちます。(図の「②」)

「顧客の入力を取得する」ブロックが「タイムアウト」になった場合、または「デフォルト」(=指定された番号以外が押された) の場合は、最初のものとは別の「プロンプト」ブロックに遷移して、再入力を促すメッセージの前半部分を再生します。(図の「③」)
そして「顧客の入力を取得する」ブロックに進むと、メッセージの後半部分が再生されるという訳です。

このように、プロンプトで再生するメッセージをフローのロジックに合わせて上手く分割することで、スッキリとしたフローを作成することができます。

プッシュボタンの「先行入力」を受け付けたい

前述のフローを作成して実際に電話を掛けてみると、気付くことがあるかと思います。

メッセージの前半部分「お電話ありがとうございます。プッシュボタンでメニューを選択してください。」あるいは「入力が確認できませんでした。もう一度入力してください。」が流れている最中は、プッシュボタンを押しても受け付けられません。

メッセージの後半部分「ご購入前のお問い合わせは「1」を、ご購入後のお問い合わせは「2」を押してください。」が再生され始めると、プッシュボタンが受け付けられるようになります。

これは、メッセージを再生しているブロックが「プロンプトの再生」であるか「顧客の入力を取得する」であるかの違いです。
「プロンプトの再生」ブロックでは、プッシュボタンの入力を受け付けることができないためです。

では、「メッセージの前半部分でもプッシュボタンの入力を受け付けたい」という場合には、どうすればよいのでしょう。

メッセージの分割を止めて、メッセージ全文を「顧客の入力を取得する」ブロックで再生するようにすれば、プッシュボタンの入力を受け付けるようになります。

メッセージを分割しないとなると、フローの構成はどうすればよいのでしょうか・・・

この図のように「最初に流すメッセージ」と「再入力を促すメッセージ」でそれぞれ「顧客の入力を取得する」ブロックを用意して組み合わせれば、ロジックとしては実現できます。

ただ・・・プッシュボタン入力判定の部分が冗長になってしまいますし、ブロック同士を結ぶ線も複雑になりますし、なんとかしたいですね・・・

実は、上記の図のフローは正常に動作しません。
下の方の「顧客の入力を取得する」ブロックの「タイムアウト」と「デフォルト」から伸びる線が自分自身に接続されていますが、このような接続は許されていないためです。
正しく動作させるには、タイムアウト・デフォルトの出力を一旦「ループ」ブロック等に接続してから、そのブロックの出力を「顧客の入力を取得する」へ接続する必要があります。
ここでは本題から外れるため詳細な説明は省略します。

実装パターン2: メッセージ内容を動的に変化させる

「プロンプトの再生」「顧客の入力を取得する」などのブロックで再生させるプロンプトのメッセージは、固定の文字列を指定できるだけでなく「動的に変化する」文字列を設定することができます。

この時に用いるのが、Amazon Connectコンタクトフローの「属性」の種類の一つである「ユーザー定義の属性」です。

「ユーザー定義の属性」とは、コンタクトフロー内でユーザー (ここでの「ユーザー」はAmazon Connectを使ってシステム構築を行う皆さんのことです) が自由に値を設定したり、変更したり、参照することができるものです。
プログラミング言語における「変数」のようなものだとイメージすると分かり易いでしょう。

「ユーザー定義の属性」を使ったフローの構成は、以下の図のようになります。

実装パターン1のフローにおいて「プロンプトの再生」ブロックが存在していた2箇所を「コンタクト属性の設定」ブロックに置き換えています。

それぞれの「コンタクト属性の設定」ブロックでは、MessageTextという名前の「ユーザー定義の属性」にメッセージの前半部分の文字列をセットしています。(図の「①」および「②」)

そして、「顧客の入力を取得する」ブロックで再生するプロンプトのメッセージ内容を、以下のように変更します。

メッセージテキストに$.Attributes.<属性名>と記述することで、記述した部分が「ユーザー定義の属性」に設定されている文字列の内容に置き換わります。

この「顧客の入力を取得する」ブロックを処理する際、ここに到達するのが初めてであれば、左上の「コンタクト属性の設定」ブロックによって属性MessageTextには「お電話ありがとうございます。プッシュボタンでメニューを選択してください。」という文字列がセットされているはずです。

ここに到達するのが2回目以降であれば、左下の「コンタクト属性の設定」ブロックによって属性MessageTextには「入力が確認できませんでした。もう一度入力してください。」という文字列がセットされているはずです。

このように、「ユーザー定義の属性」を使うと、フロー中の処理の進行状況に応じて再生するプロンプトのメッセージ内容を動的に変化させることができるのです。

録音した音声プロンプトを使いたい場合

ここまでは、プロンプトを機械音声によるテキスト読み上げで行ってきました。

一方、プロンプトは録音した音声ファイルを使って再生することもできます。

ここからは、録音した音声プロンプトを使う場合に「自動音声メニュー」を実装する方法について説明しましょう。

実装パターン1: 音声プロンプトを分割する

まずは、当ブログ記事の最初に紹介した「実装パターン1: メッセージを分割する」に準拠した方法で実装してみましょう。

テキスト読み上げの時と同様に、音声プロンプトを前半部分と後半部分に分割します。 (もしくは、最初から分けて録音しておきます)

あとは、「プロンプトの再生」「顧客の入力を取得する」の各ブロックで、プロンプトの再生方法を「テキスト読み上げ」から「音声プロンプト」に変更するだけです。

フロー図を見て頂くと分かるように、最初に紹介したフロー図と構成自体は変わりません。

音声プロンプトを利用する場合は、予め「プロンプトライブラリ」に音声ファイルを登録しておく必要があります。
(※ S3バケットに保存した音声ファイルを参照する方法もありますが、ここでは割愛します)

そして、「プロンプトの再生」「顧客の入力を取得する」の各ブロックで、再生する音声プロンプトをプロンプトライブラリに登録した音声ファイルから選択します。(図の「①」「②」および「③」)

これで、録音した音声プロンプトを使って「初回」と「再入力」で異なるメッセージ内容を流す「自動音声メニュー」が実装できました。

実装パターン2: 再生する音声プロンプトを動的に指定する

では次に、「メッセージの前半部分でもプッシュボタンの入力を受け付けたい」場合の実装方法を説明します。

この場合、音声プロンプトは全てのメッセージ内容を含んだものを「初回」「再入力」向けにそれぞれ用意します。

「初回」の音声プロンプト (prompt_first_and_menu.wav)
お電話ありがとうございます。プッシュボタンでメニューを選択してください。
ご購入前のお問い合わせは「1」を、ご購入後のお問い合わせは「2」を押してください。
「再入力」の音声プロンプト (prompt_retry_and_menu.wav)
入力が確認できませんでした。もう一度入力してください。
ご購入前のお問い合わせは「1」を、ご購入後のお問い合わせは「2」を押してください。

これらの音声プロンプトを「初回」「再入力」それぞれのシチュエーションで動的に切り替える必要があります。

そのためには、テキスト読み上げの時と同様に「ユーザー定義の属性」を利用します。

フローの構成はテキスト読み上げの時とほぼ同じですが、「コンタクト属性の設定」「顧客の入力を取得する」の各ブロックで設定している内容がテキスト読み上げの時と大きく異なります。

まず、「プロンプトID」について説明しましょう。

プロンプトライブラリに登録した音声プロンプトは、それぞれ「プロンプトID」を持ちます。
プロンプトIDはプロンプトライブラリの画面で確認することができます。

arn:aws:connect:~で始まる文字列の全体が「プロンプトのARN」で、ARNの最後のprompt/に続く文字列が「プロンプトID」です。

確認したプロンプトIDを、「コンタクト属性の設定」ブロックを使ってPromptIDという名前の「ユーザー定義の属性」にセットします。(図の「①」および「②」)

そして、「顧客の入力を取得する」ブロックで音声プロンプトの設定を「属性を使用する」に指定して、タイプ「ユーザー定義」、属性「PromptID」をそれぞれ選択します。

これで、「コンタクト属性の設定」でセットした属性PromptIDの値に応じて再生する音声プロンプトを動的に切り替えることができます。

おわりに

今回は、Amazon Connectで「自動音声メニュー」を実装するいくつかのパターンについて解説しました。

自動音声メニューを実装する場合、まず最初に、メッセージを「プロンプトの再生」ブロックと「顧客の入力を取得する」ブロックのどちらで再生させるべきかについて検討する必要があります。
ポイントの一つは「プロンプトの再生」ブロックの再生中はプッシュボタン入力を受け付けない、という点です。
プッシュボタンの先行入力を受け付けたい場合は、全てのメッセージを「顧客の入力を取得する」ブロックで再生することを検討しましょう。

また、フローのロジックに応じて再生するプロンプトを動的に変化させたい場合は、「ユーザー定義の属性」を上手く利用することがポイントです。
「ユーザー定義の属性」は「Lambda関数の呼び出し」機能と組み合わせると強力な力を発揮するのですが、Lambdaと組み合わせず単体で利用しても今回のようにいろいろなことが実現できます。
まずは単体での利用方法を身に着けることが「ユーザー定義の属性」さらには「属性」全体を使いこなす第一歩となるでしょう。

今回は比較的シンプルなメニュー構成を例に解説しましたが、応用すればより複雑なメニュー構成を実装することもできると思います。
当記事を参考に「自動音声メニュー」を工夫することで、お客様の利便性向上に繋げて頂けると幸いです。