class Voice2Keyboard:
    def __init__(self):
        self.hook = Hook()
        self.hook.handler = self.on_event
        self.HOTKEY = {'Lwin', 'Z'}
        self.LANGUAGE = "tr-TR"
        self.recognizer = speech_recognition.Recognizer()
        self.lock = False
        self.list_devices()

    def list_devices(self):
        for index, name in enumerate(
                speech_recognition.Microphone.list_microphone_names()):
            log.info(f"device_index[{index}]='{name}'")

        log.info(
            "if microphone doesn't work, try to set DEVICE_INDEX to one the devices above"
        )
        self.DEVICE_INDEX = None

    def on_event(self, event):
        if not isinstance(
                event,
                KeyboardEvent) or event.event_type != 'key down' or self.lock:
            return False

        if set(event.pressed_key) != self.HOTKEY:
            # log.info(event.__dict__)
            return False

        self.lock = True

        log.info("listening...")
        with speech_recognition.Microphone(
                device_index=self.DEVICE_INDEX) as source:
            audio = self.recognizer.listen(source)

        log.info("converting audio to text...")
        try:
            text = self.recognizer.recognize_google(
                audio_data=audio,
                # This uses Google Speech Engine's public API key.
                # If you exceed the quota, you need your own API key from https://console.developers.google.com/
                key="AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw",
                language=self.LANGUAGE)
            log.info(f"typing '{text}'")
            keyboard.send_keys(text, with_spaces=True)
        except:
            log.exception("")
        finally:
            keyboard.send_keys("{VK_LWIN up}{Z up}")
            self.lock = False

    def listen(self):
        log.info(f"registering {self.HOTKEY} hotkey")
        self.hook.hook(keyboard=True, mouse=False)

    def exit(self):
        log.info(f"unregistering hotkey")
        self.hook.unhook_keyboard()