Воспроизведение во время записи

У меня есть код, он записывает голос и формирует фреймы, а потом из них собирает .wav файл. Можно ли как-нибудь сразу же воспроизводить эти фреймы?

Код:

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

print(frames)
stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

“сразу” это как? Во время записи, или просто в конце запустить воспроизведение wav файла, или что?

Во время записи

А это для чего?

Если записывать и слушать свою речь во время записи как в подкастах и т.п., то это надо делать без задержки, иначе будет мешать. Speech Jammers: When you need someone to just stop talking!

Что вроде бы не так просто сделать, и возможно не любое оборудование (микрофон, звуковая карта) подойдет. https://stackoverflow.com/a/17765778/964478

Гугл подсказал такой простой пример записи и воспроизведения, но тут будет задержка. PyAudio: record sound and play it back after a delay · GitHub

У меня заработало после пары исправлений (видимо оно писалось для древней версии Питона), но как-то плохо воспроизводит, появляется странный шум, не знаю это в коде дело или в чем-то на моей стороне.

import multiprocessing as mp
import time

CHUNK = 1024
CHANNELS = 2
RATE = 44100
DELAY_SECONDS = 5
DELAY_SIZE = DELAY_SECONDS * RATE / (10 * CHUNK)


def feed_queue(q):
    import pyaudio

    FORMAT = pyaudio.paInt16
    p = pyaudio.PyAudio()

    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)

    while True:
        frame = []
        for i in range(10):
            frame.append(stream.read(CHUNK))
        data_ar = b''.join(frame)
        if q.full():
            q.get_nowait()
        q.put(data_ar)


queue = mp.Queue(maxsize=int(DELAY_SIZE))
p = mp.Process(target=feed_queue, args=(queue,))
p.start()

# хз зачем это было нужно, не заметил разницы
# give some time to bufer
#time.sleep(DELAY_SECONDS)

import pygame.mixer
pygame.mixer.init()
S = pygame.mixer.Sound
while True:
    d = queue.get()
    S(d).play()

Вообще я хотел попробовать реализовать простенький голосовой чат) Пойду попробую.