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