import threading | |
import sounddevice as sd | |
import numpy as np | |
import time | |
import logging | |
logger = logging.getLogger(__name__) | |
class LocalAudioStreamer: | |
def __init__( | |
self, | |
input_queue, | |
output_queue, | |
list_play_chunk_size=512, | |
): | |
self.list_play_chunk_size = list_play_chunk_size | |
self.stop_event = threading.Event() | |
self.input_queue = input_queue | |
self.output_queue = output_queue | |
def run(self): | |
def callback(indata, outdata, frames, time, status): | |
if self.output_queue.empty(): | |
self.input_queue.put(indata.copy()) | |
outdata[:] = 0 * outdata | |
else: | |
outdata[:] = self.output_queue.get()[:, np.newaxis] | |
logger.debug("Available devices:") | |
logger.debug(sd.query_devices()) | |
with sd.Stream( | |
samplerate=16000, | |
dtype="int16", | |
channels=1, | |
callback=callback, | |
blocksize=self.list_play_chunk_size, | |
): | |
logger.info("Starting local audio stream") | |
while not self.stop_event.is_set(): | |
time.sleep(0.001) | |
print("Stopping recording") | |