2transcriptor.py-4000 # 4000 frames = 0.25s
import queue
import sounddevice as sd
from vosk import Model, KaldiRecognizer
import json
import os
import sys
from datetime import datetime
# Ruta al modelo Vosk
MODEL_PATH = "models/vosk-model-small-es-0.42"
# Frecuencia y bloque recomendados
SAMPLE_RATE = 16000
BLOCK_SIZE = 4000 # 4000 frames = 0.25s
# Archivo para guardar transcripciones
ARCHIVO_SALIDA = "transcripcion.txt"
# Cola de audio
q = queue.Queue()
def audio_callback(indata, frames, time, status):
if status:
print(f"⚠️ Estado: {status}", file=sys.stderr)
q.put(bytes(indata))
def main():
if not os.path.exists(MODEL_PATH):
print(f"❌ No se encontró el modelo en: {MODEL_PATH}")
print("🔗 Descárgalo desde: https://alphacephei.com/vosk/models")
return
print("📦 Cargando modelo...")
model = Model(MODEL_PATH)
recognizer = KaldiRecognizer(model, SAMPLE_RATE)
print("🎤 Dictado iniciado. Habla por el micrófono...\n(CTRL+C para detener)\n")
# Prepara archivo de salida
with open(ARCHIVO_SALIDA, "a", encoding="utf-8") as f_out:
f_out.write("\n\n📅 Inicio de dictado: " + datetime.now().strftime("%Y-%m-%d %H:%M:%S") + "\n")
last_partial = ""
try:
with sd.RawInputStream(samplerate=SAMPLE_RATE, blocksize=BLOCK_SIZE,
dtype='int16', channels=1, callback=audio_callback):
while True:
data = q.get()
if recognizer.AcceptWaveform(data):
resultado = json.loads(recognizer.Result())
texto = resultado.get("text", "").strip()
if texto:
print("📝 Texto:", texto)
f_out.write(texto + "\n")
f_out.flush()
else:
parcial = json.loads(recognizer.PartialResult()).get("partial", "").strip()
if parcial and parcial != last_partial:
print("⏳", parcial, end='\r')
last_partial = parcial
except KeyboardInterrupt:
print("\n🛑 Dictado detenido por el usuario.")
f_out.write("🛑 Dictado finalizado: " + datetime.now().strftime("%Y-%m-%d %H:%M:%S") + "\n")
except Exception as e:
print(f"💥 Error: {e}")
print("🧪 Verifica que tu micrófono esté disponible o prueba:\nimport sounddevice as sd\nprint(sd.query_devices())")
if __name__ == "__main__":
main()
Comentarios
Publicar un comentario