local_audio_streamer.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import threading
  2. import sounddevice as sd
  3. import numpy as np
  4. import time
  5. import logging
  6. logger = logging.getLogger(__name__)
  7. class LocalAudioStreamer:
  8. def __init__(
  9. self,
  10. input_queue,
  11. output_queue,
  12. list_play_chunk_size=512,
  13. ):
  14. self.list_play_chunk_size = list_play_chunk_size
  15. self.stop_event = threading.Event()
  16. self.input_queue = input_queue
  17. self.output_queue = output_queue
  18. def run(self):
  19. def callback(indata, outdata, frames, time, status):
  20. if self.output_queue.empty():
  21. self.input_queue.put(indata.copy())
  22. outdata[:] = 0 * outdata
  23. else:
  24. outdata[:] = self.output_queue.get()[:, np.newaxis]
  25. logger.debug("Available devices:")
  26. logger.debug(sd.query_devices())
  27. with sd.Stream(
  28. samplerate=16000,
  29. dtype="int16",
  30. channels=1,
  31. callback=callback,
  32. blocksize=self.list_play_chunk_size,
  33. ):
  34. logger.info("Starting local audio stream")
  35. while not self.stop_event.is_set():
  36. time.sleep(0.001)
  37. print("Stopping recording")