【Amazon Connect】録音ファイルを指定した電話番号に発信して再生する「録音転送システム」を作ってみた

【Amazon Connect】録音ファイルを指定した電話番号に発信して再生する「録音転送システム」を作ってみた

2026.02.19

はじめに

こんにちは、フニです。
本記事では、Amazon Connect で録音した音声ファイルを指定した電話番号に着信して再生する方法についてご紹介します。

録音転送システムの流れ

今回作成する録音転送システムのフローは以下の通りです。

CleanShot 2026-02-19 at 22.26.01@2x.png

仕様上、AWS Lambda で録音ファイルを変換する必要があります。
詳細は以下のブログをご参照ください。

項目 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) ステレオからモノラルへのミックスダウンが必要

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

https://dev.classmethod.jp/articles/amazon-connect-play-prompt-recording-troubleshoot-ffmpeg/

前提

  • Amazon Connect 構築済み

手順

1. 録音ファイル保存用 Amazon Connect フローの作成

今回は以下のサンプルフローを用意しました。
記録分析と処理動作を設定ブロックにより、Amazon Connect の通話記録に登録した S3 バケットに録音が保存されます。
電話番号にはこちらのフローを設定します。

CleanShot 2026-02-19 at 22.52.42@2x.png

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

2. フォーマット変換後の録音ファイル用 S3 バケットの作成

今回はバケット名のみ指定し、デフォルト設定のまま作成します。

CleanShot 2026-02-19 at 22.57.04@2x.png

バケットポリシーに以下を適用します。<S3バケット名> は変更してください。

{
    "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バケット名>/*"
            ]
        }
    ]
}

3. FFmpeg 処理用 AWS Lambda の作成

  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 変数は ### 2. フォーマット変換後の録音ファイル用 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,
    }

4. 録音ファイル再生用 Amazon Connect フローの作成

今回は以下のサンプルフローを用意しました。
プロンプトの再生ブロックにより、録音ファイルが再生されます。

CleanShot 2026-02-19 at 23.24.29@2x.png

CleanShot 2026-02-19 at 23.25.53@2x.png

5. Step Functions の作成

Step Functions コンソールからステートマシンを作成します。

CleanShot 2026-02-19 at 23.13.37@2x.png

CleanShot 2026-02-19 at 23.16.00@2x.png

以下のサンプルコードを入力し、作成を押下します。
Parameters内の変数は置き換えてください。

CleanShot 2026-02-19 at 23.19.43@2x.png

{
  "Comment": "録音転送システム",
  "StartAt": "Amazon Connect 発信",
  "States": {
    "Amazon Connect 発信": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:connect:startOutboundVoiceContact",
      "Parameters": {
        "InstanceId": "<AmazonConnectインスタンスID>",
        "ContactFlowId": "<AmazonConnectフローID>",
        "SourcePhoneNumber": "<AmazonConnect電話番号>",
        "DestinationPhoneNumber": "<転送先電話番号>",
        "Attributes": {
          "s3file.$": "$.s3file"
        }
      },
      "End": true
    }
  }
}

CleanShot 2026-02-19 at 23.28.58@2x.png

発信のための StartOutboundVoiceContact 権限は自動付与されないため、Step Functions の IAM ロール側に以下のポリシーを追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "connect:StartOutboundVoiceContact",
            "Resource": "arn:aws:connect:ap-northeast-1:<AWSアカウントID>:instance/*/contact/*"
        }
    ]
}

6. EventBridge ルールの作成

EventBridge コンソールからルールを作成します。

CleanShot 2026-02-19 at 23.32.23@2x.png

CleanShot 2026-02-19 at 23.33.50@2x.png

カスタムパターンを選択後、以下のイベントパターンを入力します。
<S3バケット名> は ### 2. フォーマット変換後の録音ファイル用 S3 作成 のバケット名に置き換えます。

CleanShot 2026-02-19 at 23.35.20@2x.png

{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["<S3バケット名>"]
    },
    "object": {
      "key": [{
        "wildcard": "connect/<S3バケット名>/CallRecordings/*.wav"
      }]
    }
  }
}

作成した Step Functions をターゲットに登録します。

CleanShot 2026-02-19 at 23.37.52@2x.png

追加設定の方で「入力トランスフォーマー」を設定します。設定が完了したらそのままルールを作成します。

CleanShot 2026-02-19 at 23.39.03@2x.png

CleanShot 2026-02-19 at 23.41.03@2x.png

入力パス

{
  "bucket": "$.detail.bucket.name",
  "key": "$.detail.object.key"
}

入力テンプレート

{
  "s3file": "https://<bucket>.s3.ap-northeast-1.amazonaws.com/<key>"
}

結果

Amazon Connect で録音した音声を、転送先として登録した電話番号に着信・再生してくれました。

CleanShot 2026-02-19 at 22.26.01@2x.png

さいごに

今回は、Amazon Connect で録音した音声ファイルを指定した電話番号に着信して再生する方法についてご紹介しました。
この記事が誰かの助けになれば幸いです。

参考

https://dev.classmethod.jp/articles/amazon-connect-play-prompt-recording-troubleshoot-ffmpeg/

この記事をシェアする

FacebookHatena blogX

関連記事