import sys import os import pyaudio from vosk import Model, KaldiRecognizer import ctypes import time import keyboard BUFFER = 2000 # Tamaño del buffer de audio RECOGNITION_ACTIVE = False # Estado inicial del reconocimiento # Códigos virtuales para las teclas VK_ALTGR = 0xA5 # AltGr (Right Alt) VK_AUX = 0x50 # P (corresponde al código de tecla en el teclado español) # Función para verificar si una tecla está presionada def is_key_pressed(key_code): return ctypes.windll.user32.GetAsyncKeyState(key_code) & 0x8000 != 0 # Carga el modelo de Vosk (español) def load_model(model_path="vosk-model-es-0.42"): return Model(model_path) # Inicializa PyAudio def initialize_audio(): p = pyaudio.PyAudio() stream = p.open( format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=2000 ) stream.start_stream() return p, stream # Cambia el estado del reconocimiento de voz def toggle_recognition_state(): global RECOGNITION_ACTIVE RECOGNITION_ACTIVE = not RECOGNITION_ACTIVE state = "activado" if RECOGNITION_ACTIVE else "desactivado" print(f"Reconocimiento de voz {state}.") # Procesa el audio y realiza la transcripción def process_audio(stream, recognizer): data = stream.read(BUFFER, exception_on_overflow=False) # Lee el flujo de audio if recognizer.AcceptWaveform(data): result = recognizer.Result() # Obtiene la transcripción text = eval(result)['text'].encode('utf-8').decode('utf-8') if text.strip(): text += ' ' print(text) # Agrega un espacio al final keyboard.write(text) # Escribe el texto donde esté el cursor # Cierra los recursos de audio def close_audio_resources(p, stream): stream.stop_stream() stream.close() p.terminate() # Función principal del programa def main(): global RECOGNITION_ACTIVE print("Presiona 'AltGr' + 'P' para activar/desactivar el reconocimiento de voz...") # Inicializa el modelo y los recursos de audio model = load_model() p, stream = initialize_audio() recognizer = KaldiRecognizer(model, 16000) try: while True: # Detecta si 'AltGr' y 'Ñ' están presionadas if is_key_pressed(VK_ALTGR) and is_key_pressed(VK_AUX): toggle_recognition_state() while is_key_pressed(VK_ALTGR) or is_key_pressed(VK_AUX): time.sleep(0.1) # Espera a que se suelten las teclas para evitar múltiples activaciones # Procesa el audio si el reconocimiento está activado if RECOGNITION_ACTIVE: process_audio(stream, recognizer) time.sleep(0.05) # Pequeña pausa para reducir la carga de la CPU except KeyboardInterrupt: print("\nPrograma terminado por el usuario.") finally: close_audio_resources(p, stream) if __name__ == "__main__": main()