Amazon LexをAmazon Connectから呼び出す際、SSMLによる音声スピード調整方法

Amazon LexをAmazon Connectから呼び出す際、SSMLによる音声スピード調整方法

Clock Icon2025.06.04

はじめに

Amazon ConnectからAmazon Lexを呼び出し、LexのコードフックでLambdaを呼び出す設定にしている場合に、SSMLを使って音声スピードやイントネーションを調整する方法をご紹介します。

以前、Amazon ConnectとAmazon Lexで電話予約を自動化する方法をご紹介しました。

https://dev.classmethod.jp/articles/amazon-bedrock-tooluse-connect-reservation-system/

今回は、上記の記事をもとに、SSMLで音声スピードを調整する方法を解説します。

Lambdaのコードを修正

LexのコードフックでLambdaを呼び出す設定にしている場合、Lexボット側では制御できないため、Lambda側で設定する必要があります。

先ほど紹介したブログのコードの一部です。

修正前
def create_response(content, dialog_action='ElicitIntent', session_attributes=None):
    response = {
        'messages': [{'contentType': 'PlainText', 'content': content}],
        'sessionState': {
            'dialogAction': {'type': dialog_action},
            'intent': {
                'name': 'FallbackIntent',
                'state': 'InProgress' if dialog_action == 'ElicitIntent' else 'Fulfilled'
            }
        }
    }
    if session_attributes:
        response['sessionState']['sessionAttributes'] = session_attributes
    return response

以下のとおり修正します。

修正後
def create_response(content, dialog_action='ElicitIntent', session_attributes=None):
+    # SSMLタグで音声速度を80%に固定
+    ssml_content = f'<speak><prosody rate="80%">{content}</prosody></speak>'

    response = {
+        'messages': [{'contentType': 'SSML', 'content': ssml_content}],
-        'messages': [{'contentType': 'PlainText', 'content': content}],
        'sessionState': {
            'dialogAction': {'type': dialog_action},
            'intent': {
                'name': 'FallbackIntent',
                'state': 'InProgress' if dialog_action == 'ElicitIntent' else 'Fulfilled'
            }
        }
    }
    if session_attributes:
        response['sessionState']['sessionAttributes'] = session_attributes
    return response

修正内容は以下のとおりです。

  • messagesのcontentTypeをPlainTextからSSMLに変更
  • content内にメッセージ内容とSSMLタグを設定

messagesのcontentTypeをPlainTextからSSMLに変更し、content内にメッセージ内容とSSMLタグを設定するだけです。

各フィールドの説明は以下のとおりです。

  • contentType — 使用するメッセージのタイプ
    • CustomPayload — アプリケーションのデータまたはメタデータを含むようにカスタマイズできる応答文字列
    • ImageResponseCard — ユーザーが選択できるボタン付きの画像。詳細については、「ImageResponseCard」を参照してください
    • PlainText — プレーンテキスト文字列
    • SSML — 音声応答をカスタマイズするための音声合成マークアップ言語を含む文字列
  • content — ユーザーに送信するメッセージ。メッセージタイプが PlainText、CustomPayload、または SSML の場合、このフィールドを使用します

https://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/lambda-response-format.html

SSMLタグのprosodyrateで音声スピードを調節できます。設定可能な範囲は20-200%です。

https://docs.aws.amazon.com/polly/latest/dg/prosody-tag.html

Amazon Connect でサポートされている SSML タグについては、以下のドキュメントにまとめられています。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/supported-ssml-tags.html

注意点

今回紹介した方法では、Lexボットの応答すべてで音声スピードがゆっくりになります。

特定の内容(予約内容を確認後、最終確認時の復唱のみ)のみゆっくり話させる場合は、以下の方法を取るとよいでしょう。

  • コード内で条件分岐を使用し、特定の内容のみ今回紹介したrateを設定
  • それ以外はrateを設定しない(デフォルトは100%)

また、企業のサービス名をConnectで発話させるとイントネーションに違和感を持ってしまう場合も、同様に特定のワードのみSSMLで設定するよう条件分岐させるとよいでしょう。

イントネーションのテストは、Amazon Pollyのマネジメントコンソール上で行うと簡単に調節できます。

cm-hirai-screenshot 2025-06-03 13.50.25

SSMLによるさまざまなチューニング方法については、以下のブログをご参照ください。

https://dev.classmethod.jp/articles/amazon-polly-ssml-address/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.