#python-3.x #audio #discord.py #discord.py-rewrite #pyaudio
#python-3.x #Аудио #discord.py #pyaudio
Вопрос:
Я не знаю, что не так.
когда я вызываю voice_test
команду на своем сервере discord, бот подключается к голосовому каналу, его контур становится зеленым, но я ничего не слышу.
Во время выполнения кода я не получаю обратной трассировки.
вот код:
CHUNK = 2048
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
@client.command()
async def voice_test(ctx, *, channel: discord.VoiceChannel):
if ctx.voice_client is not None:
vc = await ctx.voice_client.move_to(channel)
else:
vc = await channel.connect()
p = pyaudio.PyAudio()
stream = p.open(
format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
output=True,
frames_per_buffer=CHUNK
)
while vc.is_connected():
data = stream.read(CHUNK)
vc.send_audio_packet(data, encode=False)
#print(data)
print('done playing',file=sys.stderr)
stream.stop_stream()
stream.close()
p.terminate()
Комментарии:
1. У меня нет опыта
PyAudio
, поэтому он может блокировать. Вы пробовалиvc = await channel.connect()
и тогдаvc.voice_client.play(src, after=lambda x: print('done playing', x))
?2. @Benjin, я обновил код, но он все еще не работает.
Ответ №1:
Исходя из моего собственного недавнего опыта, у вас есть несколько проблем, но все это сводится к тому, что discord ожидает 20 Мс двухканального звука в кодировке opus частотой 48000 Гц.
Если вы закодировали свой звук в opus перед вызовом send_audio_packet, вы начнете слышать звук. Плохой звук, но звук.
Это то, что сработало для меня после многих итераций, проб и ошибок.
class PyAudioPCM(discord.AudioSource):
def __init__(self, channels=2, rate=48000, chunk=960, input_device=1) -> None:
p = pyaudio.PyAudio()
self.chunks = chunk
self.input_stream = p.open(format=pyaudio.paInt16, channels=channels, rate=rate, input=True, input_device_index=input_device, frames_per_buffer=chunk)
def read(self) -> bytes:
return self.input_stream.read(self.chunks)
async def play_audio_in_voice():
vc.play(PyAudioPCM(), after=lambda e: print(f'Player error: {e}') if e else None)