Files
Transcripcion_audio_texto/script_pulsar_para_hablar.py

92 lines
2.9 KiB
Python

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()