Pycord开发Discord语音Bot时语音接收无故中断问题咨询
Pycord语音机器人录制随机中断问题
问题背景
- 开发带实时对话能力的Discord机器人,核心逻辑为机器人加入语音频道后,接收频道内所有用户的语音音频,使用Pycord提供的
VoiceClient类处理音频收发逻辑。 - 需实现语音监听自动启停逻辑:自动判断用户开始发言、结束发言的时机,用户停止发言后自动处理已接收的音频并计算回复内容。由于Pycord未暴露用户发送音频的状态提示(即客户端上用户发言时显示的绿色边框标识),原生
VoiceClient.start_recording()与VoiceClient.stop_recording()方法仅支持通过指令手动控制,因此计划通过检测Sink的数据写入行为实现自动启停控制。
故障表现
- 启动录制(调用
VoiceClient.start_recording())初期功能正常,终端可正常打印接收到的语音数据,但运行一段时间后会随机停止接收新数据。 - 经排查,问题定位到Pycord库
voice_client.py第806行代码:
故障发生时ready, _, err = select.select([self.socket], [], [self.socket], 0.01)VoiceClient的socket持续处于未就绪状态,err返回值始终为None,无明确错误抛出。
复现代码
import discord import io from discord.sinks import WaveSink as PycordWaveSink, Filters, AudioData bot = discord.Bot() class WaveSink(PycordWaveSink): @Filters.container def write(self, data, user): if user not in self.audio_data: file = io.BytesIO() self.audio_data.update({user: AudioData(file)}) file = self.audio_data[user] file.write(data) print(data) @bot.slash_command(guild_ids=[GUILD_ID]) async def join(ctx): await ctx.author.voice.channel.connect() await ctx.respond(f'listening to {ctx.author.name}', ephemeral=True) bot.voice_clients[0].start_recording(WaveSink(), lambda x: x) bot.run(TOKEN)
复现步骤
- 将机器人加入语音频道后持续发言,直到终端不再打印语音数据即可复现该问题。
内容的提问来源于stack exchange,提问作者davelopment
相关产品推荐
相关产品推荐

