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 # 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=BUFFER ) stream.start_stream() return p, stream # 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(): print("Mantén presionado 'AltGr' + 'P' para activar el reconocimiento de voz...") # Inicializa el modelo y los recursos de audio model = load_model() p, stream = initialize_audio() recognizer = KaldiRecognizer(model, 16000) accumulated_audio = b"" # Variable para almacenar el audio acumulado try: while True: # Detecta si 'AltGr' y 'P' están presionadas if is_key_pressed(VK_ALTGR) and is_key_pressed(VK_AUX): print("Reconocimiento activado. Habla ahora...") while is_key_pressed(VK_ALTGR) and is_key_pressed(VK_AUX): audio_data = listen_audio(stream) # Escucha el audio accumulated_audio += audio_data # Acumula el audio mientras las teclas estén presionadas print("Reconocimiento desactivado.") # Procesa el audio acumulado cuando se sueltan las teclas if accumulated_audio: process_audio(accumulated_audio, recognizer) accumulated_audio = b"" # Limpia el buffer de audio acumulado time.sleep(0.05) # 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()