如何用Nextcord在Discord频道播放AWS Polly音频缓冲?
解决Nextcord播放AWS Polly内存音频的问题
核心问题拆解
- Polly返回的16位单声道PCM和Nextcord要求的双声道不匹配,导致音调异常
- MP3内存流播放时,未正确重置缓冲指针或指定FFmpeg输入格式,导致无声
方案1:内存内完成PCM单声道转双声道
直接通过复制单声道采样数据生成双声道PCM,配合FFmpeg参数指定格式:
import io import boto3 import nextcord # 假设已初始化polly_client和有效语音连接vc response = polly_client.synthesize_speech( VoiceId="Brian", OutputFormat='pcm', SampleRate="16000", Text=message, Engine='standard' ) # 读取单声道PCM原始数据 mono_pcm = response['AudioStream'].read() # 单转双:每个16位采样(2字节)重复一次 stereo_pcm = b''.join([sample * 2 for sample in io.BytesIO(mono_pcm).read(2)]) stereo_buff = io.BytesIO(stereo_pcm) # 传入FFmpeg时明确指定输入参数 vc.play(nextcord.FFmpegPCMAudio( source=stereo_buff, pipe=True, options='-ar 16000 -ac 2 -f s16le' ))
方案2:修复MP3内存流播放
关键是重置缓冲指针,并告诉FFmpeg输入格式为MP3:
import io import boto3 import nextcord response = polly_client.synthesize_speech( VoiceId="Brian", OutputFormat='mp3', SampleRate="16000", Text=message, Engine='standard' ) mp3_buff = io.BytesIO(response['AudioStream'].read()) # 必须把缓冲指针移到开头,否则FFmpeg读不到数据 mp3_buff.seek(0) vc.play(nextcord.FFmpegPCMAudio( source=mp3_buff, pipe=True, options='-f mp3' ))
注意事项
- 确认FFmpeg已安装并加入系统环境变量,Nextcord能正常调用
- 语音连接对象
vc必须处于已连接频道的状态 - 小音频片段处理时,避免BytesIO对象被提前回收
内容的提问来源于stack exchange,提问作者Drew Scatterday
相关产品推荐
相关产品推荐

