#
#   python_voz_a_texto_con_vosk.py
#
#   Convertir de Voz a Texto (Speech to Text - STT) usando 'Vosk'
#
#   Se requiere instalar "vosk": https://pypi.org/project/vosk/
#       $ pip3 install vosk
#   Se requiere instalar "PyAudio": https://pypi.org/project/PyAudio/
#       $ pip3 install PyAudio
#   Se requiere descargar un modelo de:
#       https://alphacephei.com/vosk/models
#   En algunas plataformas en necesario instalar previamente algunas bibliotecas adicionales:
#       $ sudo apt install portaudio19-dev
#       $ sudo apt install python3-pyaudio
#
#   Rogelio Ferreira Escutia - marzo 2026
#

from vosk import Model, KaldiRecognizer
import pyaudio

print("\nConvertir de Voz a Texto (Speech to Text - STT) usando 'Vosk'\n")

# Se recomienda descargar el "Modelo Pequeño" para dispositivos con pocos recursos de cómputo:
#   Model: vosk-model-small-es-0.42
#   Size: 39M
#   Word error rate/Speed: 16.02 (cv test) 16.72 (mtedx test) 11.21 (mls)
#   Notes: Lightweight wideband model for Android and RPi
#   License: Apache 2.0
# Se descarga el archivo. vosk-model-small-es-0.42.zip
# Se copia a la carpeta del código y ahí se descomprime

# Para equipos de cómputo con mayor procesamiento se recomienda el "Modelo Grande":
#   Model: vosk-model-es-0.42
#   Size: 1.4G
#   Word error rate/Speed: 7.50 (cv test) 10.05 (mtedx test) 5.84 (mls)
#   Notes: Big model for Spanish
#   License: Apache 2.0
# Se descarga el archivo. vosk-model-es-0.42.zip
# Se copia a la carpeta del código y ahí se descomprime

# Para el "Modelo Pequeño"
#model = Model("vosk-model-small-es-0.42")

# Para el Modelo Grande"
model = Model("vosk-model-es-0.42")

recognizer = KaldiRecognizer(model, 16000)

mic = pyaudio.PyAudio()
stream = mic.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=8192)

print("Puede empezar a hablar para la captura de sonido...")
while True:
    data = stream.read(4096)
    if recognizer.AcceptWaveform(data):
        text = recognizer.Result()
        print(text)