Add Spanish Vosk model files and implement audio recognition script version 2
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user