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

Entradas más populares de este blog

index

Vosk en una Página Web

Proyecto de Transcripción de Voz en Tiempo Real