【Amazon Connect】通話記録の録音ファイルがプロンプトの再生 (Play Prompt) で流せなくてハマった話

【Amazon Connect】通話記録の録音ファイルがプロンプトの再生 (Play Prompt) で流せなくてハマった話

2026.02.19

はじめに

こんにちは、フニです。
Amazon Connect のプロンプトの再生 (Play Prompt) ブロックから音声ファイルを登録してもエラー扱いになってしまい、ハマってました。
本記事では、その理由と解決策についてご紹介します。

エラーの原因について

背景

S3 バケットに保存されていた音声ファイルを指定しましたが、音声が流れず電話が切断されました。

CleanShot 2026-02-17 at 20.01.02@2x.png

CloudWatch Logs に 'Error' と表示されるのみで、詳細なエラーメッセージが記録されていなかったため、原因把握が難しい状況でした。

{
    "Results": "Error",
    "ContactFlowModuleType": "PlayPrompt",
    (省略…)
}

調査でわかったこと

前提として、今回プロンプトの再生ブロックに登録したのは以下の設定により S3 に保存された通話録音です。

CleanShot 2026-02-17 at 19.56.11@2x.png

CleanShot 2026-02-17 at 19.57.24@2x.png

Play Prompt ブロックの公式ドキュメントに要件が記載されてました。

サポートされている形式: Amazon Connect は、プロンプトに使用する .wav ファイルをサポートしています。8 KHz の .wav ファイルと U-Law エンコーディングのモノチャネルオーディオを使用する必要があります。そうしないと、プロンプトが正しく再生されません。公開されているサードパーティーツールを使用して、.wav ファイルを U-Law エンコーディングに変換できます。ファイルを変換した後、Amazon Connect にアップロードします。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/play.html

今回は Amazon Connect で録音したファイルを流そうとしてましたが、
録音ファイルが Play Prompt の要件を満たせない仕様となっていることに気づきました。

項目 Amazon Connect 録音形式 Play Prompt 要件 必要な対応
ビット深度 16-bit 8-bit 16-bit → 8-bit への変換が必要
コーデック PCM(リニアPCM, S16 LE) U-Law(G.711 μ-law) ロスレス PCM からロッシー U-Law への変換が必要
チャンネル数 ステレオ(2ch) モノラル(1ch) ステレオからモノラルへのミックスダウンが必要

解決策について

音声ファイルのフォーマットを Play Prompt の要件に合わせて変換することで解決できることがわかりました。
今回は AWS Lambda で FFmpeg を活用した解決策をご紹介します。

FFmpeg は音声・動画ファイルの変換に使用されるツールです。詳細については以下のブログをご参照ください。

https://devio2025-ecs-main-v3.developers.io/articles/lambda-ffmpeg/

設定手順

  1. 以下のリンクから AWS Verified Author として用意されている Application をデプロイします。

https://serverlessrepo.aws.amazon.com/applications/us-east-1/145266761615/ffmpeg-lambda-layer

CleanShot 2026-02-18 at 11.43.42@2x.png

CleanShot 2026-02-18 at 11.46.35@2x.png

デプロイが完了したら、レイヤーとして追加されます。

(レイヤーのARNの例)
arn:aws:lambda:<AWSリージョン>:<AWSアカウントID>:layer:ffmpeg:<バージョン>

CleanShot 2026-02-18 at 11.55.41@2x.png

  1. AWS Lambda 関数を作成し、メモリやタイムアウトなどの設定を変更します。

CleanShot 2026-02-18 at 12.00.42@2x.png

CleanShot 2026-02-18 at 13.21.21@2x.png

  1. AWS Lambda の実行ロール側に、S3 音声ファイルの操作権限を付与します。

必要に応じて対象リソースを絞って適用することを推奨します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::*/*"
        }
    ]
}
  1. Lambda 関数に FFmpeg レイヤーを追加します。
(ARNの例)
arn:aws:lambda:<AWSリージョン>:<AWSアカウントID>:layer:ffmpeg:<バージョン>

CleanShot 2026-02-18 at 13.38.06@2x.png

  1. トリガーに Amazon Connect 録音ファイルが保存される S3 を指定します。

CleanShot 2026-02-18 at 13.39.31@2x.png

CleanShot 2026-02-18 at 13.40.48@2x.png

Amazon Connect 録音ファイルが保存される S3 は以下画像で設定されている S3 バケットのことです。

CleanShot 2026-02-17 at 19.57.24@2x.png

  1. AWS Lambda に音声ファイルのフォーマットの変換を行うコードをデプロイします。

以下はサンプルコードです。
OUTPUT_BUCKET 変数を変換後のファイルを保存する S3 バケットに書き換えます。

import subprocess
import urllib.parse
import boto3

s3 = boto3.client("s3")

# /opt/bin はLambdaレイヤーのffmpegパス
FFMPEG_PATH = "/opt/bin/ffmpeg"
# 変換後ファイルの出力先バケット
OUTPUT_BUCKET = "<出力先S3バケット名>"

def lambda_handler(event, context):
    """
    S3上のWAVファイル(PCM/ステレオ)をU-Law/モノラルに変換し、別バケットに保存する
    """
    # S3トリガーイベントからバケット名とキーを取得
    record = event["Records"][0]["s3"]
    source_bucket = record["bucket"]["name"]
    key = urllib.parse.unquote_plus(record["object"]["key"])

    # 一時ファイルパス
    input_path = "/tmp/input.wav"
    output_path = "/tmp/output.wav"

    # 元バケットからダウンロード
    s3.download_file(source_bucket, key, input_path)

    # ffmpegで変換: 8KHz, モノラル, U-Law
    cmd = [
        FFMPEG_PATH,
        "-y",
        "-i", input_path,
        "-ar", "8000",
        "-ac", "1",
        "-acodec", "pcm_mulaw",
        output_path,
    ]

    result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)

    if result.returncode != 0:
        raise RuntimeError(f"ffmpeg failed: {result.stderr}")

    # 変換後のキー: converted/ プレフィックスに保存
    converted_key = key.replace("CallRecordings/", "CallRecordings/converted/")

    # 出力先バケットにアップロード
    s3.upload_file(
        output_path,
        OUTPUT_BUCKET,
        converted_key,
        ExtraArgs={"ContentType": "audio/wav"},
    )

    # PlayPrompt用のHTTPS URL生成
    encoded_key = urllib.parse.quote(converted_key, safe="/")
    converted_url = f"https://{OUTPUT_BUCKET}.s3.ap-northeast-1.amazonaws.com/{encoded_key}"

    return {
        "convertedUrl": converted_url,
        "convertedBucket": OUTPUT_BUCKET,
        "convertedKey": converted_key,
    }
  1. 変換後の録音ファイルが配置された S3 のバケットポリシーを変更します。

プロンプトの再生ブロックから変換後の録音ファイルに対してアクセスできるよう、S3 バケットのポリシーの変更が必要です。

CleanShot 2026-02-18 at 14.06.49@2x.png

以下サンプルを参考に、バケットポリシーを適用します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowConnectPlayPrompt",
            "Effect": "Allow",
            "Principal": {
                "Service": "connect.amazonaws.com"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<S3バケット名>",
                "arn:aws:s3:::<S3バケット名>/*"
            ]
        }
    ]
}

結果

Amazon Connect の電話後、保存された録音ファイルが以下のフォーマットに変換されていました。

項目 Amazon Connect 録音 (変換前) FFmpeg 処理 (変換後)
ビット深度 16-bit 8-bit
コーデック PCM(リニアPCM, S16 LE) U-Law(G.711 μ-law)
チャンネル数 ステレオ(2ch) モノラル(1ch)

プロンプトの再生ブロックにも、変換後のパスを入力すると問題なく音声が流れてきました。

CleanShot 2026-02-18 at 14.06.49@2x.png

{
    "Results": "Success",
    "ContactFlowModuleType": "PlayPrompt",
    (省略…)
}

さいごに

本記事では、Amazon Connect の通話記録の録音ファイルがプロンプトの再生 (Play Prompt) で流せない理由と解決策についてご紹介しました。
この記事が誰かの助けになれば幸いです。

参考

https://dev.classmethod.jp/articles/amazon-connect-audio-file-specification-for-primpt/

この記事をシェアする

FacebookHatena blogX

関連記事