Как интегрировать PyAudio и discord.py для воспроизведения звука с моего микрофона

#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)