45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
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")
|