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

如何使用boto3从Amazon Lex响应中获取并播放音频流?

我之前也踩过这个Amazon Lex音频流的坑!官方文档确实讲得太简略了,折腾了好一阵才搞定。下面是我亲测有效的解决步骤,你可以照着试试:

第一步:请求时必须指定响应的音频格式

调用client.post_content()的时候,一定要加上responseContentType参数,明确告诉Lex你要返回的音频格式(比如MP3或者WAV)。如果没加这个参数,Lex默认返回的可能是原始PCM数据,这种格式大部分播放器都不支持,自然播放不了。

示例代码:

import boto3

# 初始化Lex客户端(V2版本,V1的话用'lex-runtime')
client = boto3.client('lexv2-runtime')

response = client.post_content(
    botId='你的Bot ID',  # Lex V2必填,V1用botName
    botAliasId='你的Bot别名ID',  # Lex V2必填,V1用botAlias
    localeId='zh_CN',  # 对应你的Bot语言 locale
    sessionId='唯一的用户会话ID',
    inputStream=b'你的输入音频字节(语音输入时必填)',
    contentType='audio/l16; rate=16000; channels=1',  # 输入音频格式,按实际情况调整
    responseContentType='audio/mpeg'  # 重点!指定返回MP3格式的音频
)

注:如果你用的是Lex V1,参数名替换为botName、botAlias,去掉botId和botAliasId即可。

第二步:读取并处理StreamingBody

StreamingBody是boto3的流式对象,read()方法确实能获取到音频字节,但你需要把这些字节转换成可播放的格式——要么保存成文件,要么用音频库直接播放。

方法1:保存为文件后播放

这是最稳妥的方式,把字节写入MP3文件,然后用系统播放器打开:

# 获取音频流对象
audio_stream = response['audioStream']
# 读取所有字节数据
audio_bytes = audio_stream.read()

# 写入本地MP3文件
with open('lex_response.mp3', 'wb') as audio_file:
    audio_file.write(audio_bytes)

# 调用系统播放器播放
import os
# 根据你的操作系统选择对应命令
os.startfile('lex_response.mp3')  # Windows
# os.system('open lex_response.mp3')  # Mac
# os.system('xdg-open lex_response.mp3')  # Linux

方法2:直接用Python库播放(无需保存文件)

如果你不想生成本地文件,可以用pydub库直接播放字节流(需要先安装pydub和ffmpeg):

from pydub import AudioSegment
from pydub.playback import play
import io

audio_stream = response['audioStream']
audio_bytes = audio_stream.read()

# 将字节转换成AudioSegment对象,format要和responseContentType一致
audio = AudioSegment.from_file(io.BytesIO(audio_bytes), format='mp3')
# 直接播放音频
play(audio)

几个容易踩的坑

  • 格式不匹配:如果responseContentType指定的是audio/wav,处理时就要用format='wav',否则会出现解码错误。
  • 输入格式错误:语音输入时,Lex对音频格式有严格要求(比如16kHz采样率、单声道、L16编码),输入格式不对会导致Lex返回无效音频流。
  • 空流判断:有时候Lex可能仅返回文本响应,没有音频流,建议先判断'audioStream' in response再处理,避免报错。

示例判断逻辑:

if 'audioStream' in response:
    # 处理音频流逻辑
    audio_stream = response['audioStream']
    audio_bytes = audio_stream.read()
else:
    print("Lex未返回音频流,仅返回文本响应:", response['messages'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:22:47