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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:48:05