diff --git a/requirements.txt b/requirements.txt index d0c6e664..72270760 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,6 +14,7 @@ openvr==1.26.701 pydub==0.25.1 psutil==5.9.8 pykakasi==2.3.0 +pycaw==20240210 translators @ git+https://github.com/misyaguziya/translators@5.9.2.1 SpeechRecognition @ git+https://github.com/misyaguziya/custom_speech_recognition@3.10.4 tinyoscquery @ git+https://github.com/cyberkitsune/tinyoscquery@0.1.2 \ No newline at end of file diff --git a/src-python/models/transcription/transcription_utils.py b/src-python/models/transcription/transcription_utils.py index 2281fa22..5842c89e 100644 --- a/src-python/models/transcription/transcription_utils.py +++ b/src-python/models/transcription/transcription_utils.py @@ -1,6 +1,23 @@ from time import sleep from threading import Thread +import comtypes from pyaudiowpatch import PyAudio, paWASAPI +from pycaw.callbacks import MMNotificationClient +from pycaw.utils import AudioUtilities + +class Client(MMNotificationClient): + def __init__(self): + super().__init__() + self.loop = True + + def on_default_device_changed(self, flow, flow_id, role, role_id, default_device_id): + self.loop = False + + def on_device_added(self, added_device_id): + self.loop = False + + def on_device_removed(self, removed_device_id): + self.loop = False class DeviceManager: _instance = None @@ -18,10 +35,8 @@ class DeviceManager: self.default_output_device = {"device": {"name": "NoDevice"}} self.update() - self.monitoring_flag = True - self.th_monitoring = Thread(target=self.startMonitoring) - self.th_monitoring.daemon = True - self.th_monitoring.start() + self.monitoring_flag = False + self.startMonitoring() def update(self): buffer_input_devices = {} @@ -96,11 +111,32 @@ class DeviceManager: self.output_devices = buffer_output_devices self.default_output_device = buffer_default_output_device + print("default_input_device", self.default_input_device) + + def monitoring(self): + comtypes.CoInitialize() + cb = Client() + enumerator = AudioUtilities.GetDeviceEnumerator() + enumerator.RegisterEndpointNotificationCallback(cb) + try: + while self.monitoring_flag is True: + while cb.loop is True: + sleep(1) + enumerator.UnregisterEndpointNotificationCallback(cb) + self.update() + + cb = Client() + enumerator = AudioUtilities.GetDeviceEnumerator() + enumerator.RegisterEndpointNotificationCallback(cb) + except Exception: + pass + comtypes.CoUninitialize() + def startMonitoring(self): self.monitoring_flag = True - while self.monitoring_flag is True: - self.update() - sleep(1) + self.th_monitoring = Thread(target=self.monitoring) + self.th_monitoring.daemon = True + self.th_monitoring.start() def stopMonitoring(self): self.monitoring_flag = False @@ -121,7 +157,10 @@ class DeviceManager: device_manager = DeviceManager() if __name__ == "__main__": - print("getInputDevices()", device_manager.getInputDevices()) - print("getDefaultInputDevice()", device_manager.getDefaultInputDevice()) - print("getOutputDevices()", device_manager.getOutputDevices()) - print("getDefaultOutputDevice()", device_manager.getDefaultOutputDevice()) \ No newline at end of file + # print("getInputDevices()", device_manager.getInputDevices()) + # print("getDefaultInputDevice()", device_manager.getDefaultInputDevice()) + # print("getOutputDevices()", device_manager.getOutputDevices()) + # print("getDefaultOutputDevice()", device_manager.getDefaultOutputDevice()) + + while True: + sleep(1) \ No newline at end of file