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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 03:36:01