You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现Amazon Connect实时音频流转WAV并存入S3?

用Python将Amazon Connect实时流转换为WAV格式

绝对可以用Python实现这个转换!Amazon Connect通过Kinesis Video Streams传输的实时音频是16kHz采样率、16位深度、单声道的PCM原始数据——WAV格式本质就是PCM数据加上标准的文件头,所以我们只需要给原始PCM数据加上正确的WAV头,就能生成通用播放器可识别的WAV文件了。

下面是针对你的Lambda代码的修改方案,全程用Python标准库实现,不需要额外安装依赖(非常适合Lambda环境):

核心思路

  1. 从Kinesis Video Streams获取原始PCM音频数据
  2. 在内存中给PCM数据添加WAV文件头(匹配Connect的音频参数)
  3. 将生成的WAV数据上传到S3

修改后的Lambda代码

import json
import boto3
import time
import wave
from io import BytesIO

bucket='kinesis-video-streams-random'
key = 'streams/latest.wav'  # 改成wav后缀,方便播放器识别

def lambda_handler(event, context):
    try:
        s3_client = boto3.client('s3', region_name='us-east-1')
        kinesis_client = boto3.client('kinesisvideo', region_name='us-east-1')
        
        # 获取GET_MEDIA的端点
        get_ep = kinesis_client.get_data_endpoint(
            StreamARN='arn:aws:kinesisvideo:us-east-1:xxxxxxxxx:stream/xxxxxxxx',
            APIName='GET_MEDIA'
        )
        video_client = boto3.client('kinesis-video-media', endpoint_url=get_ep['DataEndpoint'], region_name='us-east-1')
        
        # 获取媒体流
        stream = video_client.get_media(
            StreamARN='arn:aws:kinesisvideo:us-east-1:xxxxxxxxx:stream/xxxxxxxx',
            StartSelector={'StartSelectorType': 'EARLIEST'}
        )
        
        # 读取原始PCM数据
        pcm_data = stream['Payload'].read()
        
        # 在内存中创建WAV文件(避免使用Lambda临时存储)
        wav_buffer = BytesIO()
        with wave.open(wav_buffer, 'wb') as wav_file:
            # 严格匹配Amazon Connect的音频参数
            wav_file.setnchannels(1)  # 单声道
            wav_file.setsampwidth(2)  # 16位深度=2字节
            wav_file.setframerate(16000)  # 16kHz采样率
            # 写入原始PCM数据
            wav_file.writeframes(pcm_data)
        
        # 将WAV数据上传到S3
        wav_buffer.seek(0)  # 重置缓冲区指针到开头
        s3_client.put_object(Bucket=bucket, Key=key, Body=wav_buffer)
        
        print(f"转换后的WAV文件已存储到S3桶 {bucket},路径:{key}")
        return {"statusCode": 200, "message": "转换并上传成功"}
    
    except Exception as e:
        error_msg = f"处理出错:{str(e)}"
        print(error_msg)
        return {"statusCode": 500, "error": error_msg}

关键细节说明

  • 音频参数必须严格匹配:Amazon Connect的实时音频固定是16kHz、16位、单声道,参数错配会导致播放速度异常、噪音甚至无法播放。
  • 内存高效处理:用BytesIO在内存中生成WAV文件,符合Lambda无服务器环境的最佳实践,避免了临时文件的读写开销。
  • Lambda配置调整:建议把Lambda内存设置为512MB以上,超时时间设为10-15秒,确保有足够资源处理音频流和S3上传操作。

测试建议

部署修改后的Lambda后,触发一次通话流,然后从S3下载生成的WAV文件,用普通音频播放器(比如VLC、Windows Media Player)打开验证。如果播放异常,优先检查音频参数是否正确,再排查Kinesis Video Streams的流是否包含有效音频数据。

内容的提问来源于stack exchange,提问作者eastwood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:14:40