【Amazon Connect】録音ファイルを指定した電話番号に発信して再生する「録音転送システム」を作ってみた
はじめに
こんにちは、フニです。
本記事では、Amazon Connect で録音した音声ファイルを指定した電話番号に着信して再生する方法についてご紹介します。
録音転送システムの流れ
今回作成する録音転送システムのフローは以下の通りです。

仕様上、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) | ステレオからモノラルへのミックスダウンが必要 |
前提
- Amazon Connect 構築済み
手順
1. 録音ファイル保存用 Amazon Connect フローの作成
今回は以下のサンプルフローを用意しました。
記録分析と処理動作を設定ブロックにより、Amazon Connect の通話記録に登録した S3 バケットに録音が保存されます。
電話番号にはこちらのフローを設定します。


2. フォーマット変換後の録音ファイル用 S3 バケットの作成
今回はバケット名のみ指定し、デフォルト設定のまま作成します。

バケットポリシーに以下を適用します。<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 の作成
- 以下のリンクから AWS Verified Author として用意されている Application をデプロイします。


デプロイが完了したら、レイヤーとして追加されます。
(レイヤーのARNの例)
arn:aws:lambda:<AWSリージョン>:<AWSアカウントID>:layer:ffmpeg:<バージョン>

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


- AWS Lambda の実行ロール側に、S3 音声ファイルの操作権限を付与します。
必要に応じて対象リソースを絞って適用することを推奨します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::*/*"
}
]
}
- Lambda 関数に FFmpeg レイヤーを追加します。
(ARNの例)
arn:aws:lambda:<AWSリージョン>:<AWSアカウントID>:layer:ffmpeg:<バージョン>

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


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

- 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 フローの作成
今回は以下のサンプルフローを用意しました。
プロンプトの再生ブロックにより、録音ファイルが再生されます。


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


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

{
"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
}
}
}

発信のための 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 コンソールからルールを作成します。


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

{
"source": ["aws.s3"],
"detail-type": ["Object Created"],
"detail": {
"bucket": {
"name": ["<S3バケット名>"]
},
"object": {
"key": [{
"wildcard": "connect/<S3バケット名>/CallRecordings/*.wav"
}]
}
}
}
作成した Step Functions をターゲットに登録します。

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


入力パス
{
"bucket": "$.detail.bucket.name",
"key": "$.detail.object.key"
}
入力テンプレート
{
"s3file": "https://<bucket>.s3.ap-northeast-1.amazonaws.com/<key>"
}
結果
Amazon Connect で録音した音声を、転送先として登録した電話番号に着信・再生してくれました。

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






