1. ホーム
  2. python

[解決済み] discord.pyでKDBotのようなTTSボットを作るにはどうしたらいいですか?

2022-03-03 01:40:30

質問

初めてコマンドを使用したとき、ボットはボイスチャンネルに入り、完璧に動作しますが、再度コマンドを使用すると動作しなくなります。コマンドを使うたびにボットを切断してみましたが、うまくいきません。ボットがすでにチャンネルに接続している場合は、kdbotのように音声を再生させる必要があります。誰か助けてくれませんか?

@bot.command()
async def tts(ctx,*, text:str):
    global gTTS
    language = "es-us"
    user = ctx.author
    speech = gTTS(text=text,lang=language,slow=False)
    speech.save("audio.mp3")
    channel = user.voice.channel
    
    try:
        vc = await channel.connect()
    except:
        print("Already connected")
        #vc = discord.VoiceClient(bot,channel)
        #await vc.connect(reconnect=True,timeout=4)

    vc.play(discord.FFmpegPCMAudio('audio.mp3'), after=None)
    counter = 0
    cwd = os.getcwd()
    duration = audio_len(cwd + "/audio.mp3")
    while not counter >= duration:
        await asyncio.sleep(1)
        counter += 1
    #await vc.disconnect()

解決方法は?

ボットが VoiceChannel は、すでに VoiceClient を取得することができます。

from discord.utils import get
[...]
voice = get(self.bot.voice_clients, guild=ctx.guild)

使い方はこうだ。

@bot.command()
async def tts(ctx,*, text:str):
    global gTTS
    speech = gTTS(text=text, lang="es-us", slow=False)
    speech.save("audio.mp3")

    voice = get(self.bot.voice_clients, guild=ctx.guild)
    if not voice:
        voice = await ctx.author.voice.channel.connect()

    voice.play(discord.FFmpegPCMAudio('audio.mp3'), after=None)

    counter = 0
    cwd = os.getcwd()
    duration = audio_len(cwd + "/audio.mp3")
    while not counter >= duration:
        await asyncio.sleep(1)
        counter += 1