import sys import os import pyaudio from vosk import Model, KaldiRecognizer import ctypes import time import keyboard import winsound 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"): print("Cargando modelo de reconocimiento de voz, por favor espera...") model = Model(model_path) print("Modelo cargado exitosamente.") return model # 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}.") # Escucha el audio del stream def listen_audio(stream): return stream.read(BUFFER, exception_on_overflow=False) # Procesa el audio y realiza la transcripción def process_audio(data, recognizer): if recognizer.AcceptWaveform(data): result = recognizer.Result() # Obtiene la transcripción text = eval(result)['text'].encode('utf-8').decode('utf-8') if text.strip(): print(text) # Muestra la transcripción en consola 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 # Inicializa el modelo y los recursos de audio model = load_model() print("Presiona 'AltGr' + 'P' para activar/desactivar el reconocimiento de voz...") p, stream = initialize_audio() recognizer = KaldiRecognizer(model, 16000) try: while True: # Detecta si 'AltGr' y 'P' 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 # Leer audio continuamente audio_data = listen_audio(stream) # Procesar el audio según el estado del reconocimiento if RECOGNITION_ACTIVE: process_audio(audio_data, recognizer) else: # Solo evalúa si hay un resultado válido, pero no lo usa if recognizer.AcceptWaveform(audio_data): recognizer.Result() 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()