Discord.py 如何不保存音频文件直接播放gTTS生成的语音内容
解决方案
你可以通过内存字节流暂存gTTS生成的音频数据,全程不写入本地磁盘,直接传给FFmpeg读取播放即可,修改方案如下:
前置准备
需要用到Python标准库的BytesIO实现内存流存储,无需额外安装第三方依赖。
修改后完整代码
from io import BytesIO import discord from gtts import gTTS from discord.ext import commands @commands.command() async def tts(self, ctx, *, text): # 创建内存流对象存储音频 audio_stream = BytesIO() # 生成TTS音频直接写入内存流,不存本地 tts = gTTS(text=text, lang="en", slow=False) tts.write_to_fp(audio_stream) # 重置流指针到起始位置,否则读取不到内容 audio_stream.seek(0) channel = voice_channel.name await ctx.send('User is in channel: ' + channel) vc = await voice_channel.connect() # 传入内存流,指定pipe=True让FFmpeg从流读取数据 vc.play( discord.FFmpegPCMAudio(audio_stream, pipe=True), after=lambda e: print("Done") )
核心改动说明
- 用
BytesIO类文件对象替代本地文件路径,音频数据全程存于内存,没有磁盘读写开销,也不会产生临时文件 - 调用gTTS的
write_to_fp方法直接把音频二进制数据写入内存流,代替原有的save存本地操作 - 给
FFmpegPCMAudio传入pipe=True参数,告知FFmpeg接收的是输入流而非本地文件路径 - 修正原代码中
after回调的写法,原写法会在调用play时就立刻执行打印,改成lambda写法可实现播放结束后再触发回调
常见问题排查
- 如果播放无声音,优先检查是否忘记调用
audio_stream.seek(0)重置流指针 - 多用户同时调用命令不会出现文件冲突问题,每个请求的内存流都是独立隔离的
内容的提问来源于stack exchange,提问作者Robiot
相关产品推荐
相关产品推荐

