##概要
discord.pyでdiscordのbotを製作していて、テキストチャンネルの発言をボイスチャンネルで読み上げようとしています。読み上げにはVoiceTextのAPIを使用してwaveファイルを取得し、ffmpegPCMAudioで再生しています。
##環境
Windows 10 home 64bit
Python 3.9
discord.py 1.7.3
python-voicetext 0.3.1
##症状
長文を読み上げている最中にテキストチャンネルに新たに発言すると、エラーが発生し、新しい方の発言は読み上げられない。
##コード
python
1import discord 2import datetime 3import time 4import os 5from voicetext import VoiceText 6import wave 7import asyncio 8 9 10TOKEN = '' 11KEY = "" 12 13 14client = discord.Client() 15vt = VoiceText(KEY) 16check_text_channel = None 17 18 19#接続時の処理 20@client.event 21async def on_ready(): 22 dt_now = datetime.datetime.now() 23 print(f"[{dt_now}]Launch complete!") 24 25#メッセージが送られた時 26@client.event 27async def on_message(message): 28 29 #botの発言は無視 30 if message.author.bot: 31 return 32 33 #ボイスチャンネルに接続 34 elif message.content == "yomi.c": 35 if message.author.voice is None: 36 await message.channel.send(f"{message.author.mention}さんはボイスチャンネルに接続していません") 37 dt_now = datetime.datetime.now() 38 print(f"[{dt_now}]{message.author}さんはボイスチャンネルに接続していません") 39 40 else: 41 await message.author.voice.channel.connect() 42 global check_text_channel 43 check_text_channel = message.channel 44 await message.channel.send(f"{message.author.voice.channel.name}に接続しました") 45 dt_now = datetime.datetime.now() 46 print(f"[{dt_now}]{message.author.voice.channel.name}に接続しました") 47 48 49 #ボイスチャンネルから切断 50 elif message.content == "yomi.dc": 51 if message.guild.voice_client is None: 52 await message.channel.send("ボイスチャンネルに接続していません") 53 dt_now = datetime.datetime.now() 54 print(f"[{dt_now}]ボイスチャンネルに接続していません") 55 56 else: 57 await message.guild.voice_client.disconnect() 58 await message.channel.send("切断しました") 59 dt_now = datetime.datetime.now() 60 print(f"[{dt_now}]切断しました") 61 62 #読み上げ 63 elif message.channel == check_text_channel: 64 if message.guild.voice_client is None: 65 await message.channel.send("ボイスチャンネルに接続していません") 66 dt_now = datetime.datetime.now() 67 print(f"[{dt_now}]ボイスチャンネルに接続していません") 68 69 else: 70 #音声ファイル作成 71 ut = time.time() 72 with open(f"{ut}.wav","wb") as f: 73 f.write(vt.speed(150).to_wave(message.content)) 74 75 #音声読み上げ 76 message.guild.voice_client.play(discord.FFmpegPCMAudio(f"{ut}.wav")) 77 78 79 #音声ファイル削除 80 with wave.open(f"{ut}.wav", "rb")as f: 81 wave_length=(f.getnframes() / f.getframerate()) #再生時間 82 print(f"PlayTime:{wave_length}") 83 await asyncio.sleep(wave_length + 5) 84 os.remove(f"{ut}.wav") 85 86client.run(TOKEN)
##エラーメッセージ
ErrorMessage
1PlayTime:7.034013605442177 2Ignoring exception in on_message 3Traceback (most recent call last): 4 File "C:\Users\GardenTree\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\client.py", line 343, in _run_event 5 await coro(*args, **kwargs) 6 File "d:\Desktop\yomi-KAI\yomi-KAI.py", line 76, in on_message 7 message.guild.voice_client.play(discord.FFmpegPCMAudio(f"{ut}.wav")) 8 File "C:\Users\GardenTree\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\voice_client.py", line 558, in play 9 raise ClientException('Already playing audio.') 10discord.errors.ClientException: Already playing audio. 11INFO:discord.player:Preparing to terminate ffmpeg process 35480. 12INFO:discord.player:ffmpeg process 35480 has not terminated. Waiting to terminate... 13INFO:discord.player:ffmpeg process 35480 should have terminated with a return code of 1. 14INFO:discord.player:Preparing to terminate ffmpeg process 7840. 15INFO:discord.player:ffmpeg process 7840 successfully terminated with return code of 0.
##調べたこと
- ブロッキングが発生している?
- Queueを使えば良い?
##実現したいこと
長文を読み上げ中に新たなテキストが送られると、長文を読み終わった後に読んでほしい。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/14 13:16
2021/08/14 13:25
2021/08/14 13:46
2021/08/14 13:50
2021/08/14 13:59
2021/08/14 14:01
2021/08/14 14:09
2021/08/14 14:17
2021/08/14 14:27