繁体   English   中英

如何在用户所在的 discord 语音通道中播放 gtts mp3 文件 (discord.py)

[英]how to play gtts mp3 file in discord voice channel the user is in (discord.py)

就像标题一样,我需要将 gtts 文件播放到语音频道中,最简单的方法是什么? 我正在使用 python 3.7。 到目前为止,这是我的代码:

@client.command(name="repeat")
async def repeat(context):
  import gtts, ffmpeg
  from discord.ext import commands
  # grab the user who sent the command
  user = context.message.author
  voice_channel = user.voice.voice_channel
  channel = None
  # only play music if user is in a voice channel
  if voice_channel != None:
    await ctx.send(f"What do you want to say, type cancel to cancel:")
        
    def check(msg):
      return msg.author == ctx.author and msg.channel == ctx.channel
        
    try:
      msg = await client.wait_for("message", check=check, timeout=120)
  
    except asyncio.TimeoutError:
      await ctx.send("Sorry, you didn't reply in time!")
      
    if(msg.content == 'cancel'):
      return
    
    tts = gtts.gTTS(str(msg.content), lang="en")
    tts.save("text.mp3")
    
    # grab user's voice channel
    channel = voice_channel.name
    await client.say('User is in channel: '+ channel)
    # create StreamPlayer
    vc = await client.join_voice_channel(voice_channel)
    player = vc.create_ffmpeg_player('text.mp3', after=lambda: print('done'))
    player.start()
    while not player.is_done():
      await asyncio.sleep(1)
      # disconnect after the player has finished
      player.stop()
      await vc.disconnect()
    else:
      await client.say('User is not in a channel.')

我仍然是在 discord 上制作机器人的新手,所以我的代码看起来像垃圾箱起火,我目前正在修复/压缩我的代码。 我再次使用 python 3.7

所以,首先你应该把任何导入文件放在文件的开头(你导入不和谐的同一区域)

现在进入代码,我将简化一下。 我的代码不向用户询问文本,而是此代码使用命令后调用的输入。 !repeat Hello将在语音频道中hello

首先,这里有一些连接语音通道的代码。 为此,我们将把它分开。 这是一些不错的代码,比我将尝试的 gtts 代码要好一些。

@bot.command()
async def connect(ctx, *, channel: discord.VoiceChannel=None):
    """
    Connect to a voice channel
    This command also handles moving the bot to different channels.

    Params:
    - channel: discord.VoiceChannel [Optional]
        The channel to connect to. If a channel is not specified, an attempt to join the voice channel you are in
        will be made.
    """
    if not channel:
        try:
            channel = ctx.author.voice.channel
        except AttributeError:
            raise InvalidVoiceChannel('No channel to join. Please either specify a valid channel or join one.')

    vc = ctx.voice_client

    if vc:
        if vc.channel.id == channel.id:
            return
        try:
            await vc.move_to(channel)
        except asyncio.TimeoutError:
            raise VoiceConnectionError(f'Moving to channel: <{channel}> timed out.')
    else:
        try:
            await channel.connect()
        except asyncio.TimeoutError:
            raise VoiceConnectionError(f'Connecting to channel: <{channel}> timed out.')

    await ctx.send(f'Connected to: **{channel}**', delete_after=20)

很酷,所以现在我们可以连接到频道了。 所以这是我的 go 在实际做一些 gtts 工作。 我就不多说了,都是评论。 但是,如果有问题,请发表评论:)

以下是需要的 import from gtts import gTTS

@bot.command()
async def repeat(ctx, *, text=None):
    """
    A command which saves `text` into a speech file with
    gtts and then plays it back in the current voice channel.

    Params:
     - text [Optional]
        This will be the text we speak in the voice channel
    """
    if not text:
        # We have nothing to speak
        await ctx.send(f"Hey {ctx.author.mention}, I need to know what to say please.")
        return

    vc = ctx.voice_client # We use it more then once, so make it an easy variable
    if not vc:
        # We are not currently in a voice channel
        await ctx.send("I need to be in a voice channel to do this, please use the connect command.")
        return

    # Lets prepare our text, and then save the audio file
    tts = gTTS(text=text, lang="en")
    tts.save("text.mp3")

    try:
        # Lets play that mp3 file in the voice channel
        vc.play(discord.FFmpegPCMAudio('text.mp3'), after=lambda e: print(f"Finished playing: {e}"))

        # Lets set the volume to 1
        vc.source = discord.PCMVolumeTransformer(vc.source)
        vc.source.volume = 1

    # Handle the exceptions that can occur
    except ClientException as e:
        await ctx.send(f"A client exception occured:\n`{e}`")
    except TypeError as e:
        await ctx.send(f"TypeError exception:\n`{e}`")
    except OpusNotLoaded as e:
        await ctx.send(f"OpusNotLoaded exception: \n`{e}`")

现在,为了离开当前语音频道,您可以执行以下操作

@bot.command()
async def disconnect(ctx):
    """
    Disconnect from a voice channel, if in one
    """
    vc = ctx.voice_client

    if not vc:
        await ctx.send("I am not in a voice channel.")
        return

    await vc.disconnect()
    await ctx.send("I have left the voice channel!")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM