#!/usr/bin/env python3
"""Genera audio en ingles con piper, para que Claude le hable a Julio.

Sirve para dos cosas: dictados y shadowing sobre temas propios (metano,
nubes, ciberseguridad, ventas) en vez de los dialogos genericos del libro.

    python decir.py "texto" salida.wav
    python decir.py --archivo texto.txt salida.wav
    python decir.py --lento "texto" salida.wav      (para dictado)
"""
import argparse
import os
import subprocess
import sys

ENV = "/data/users/julio/.conda/envs/tts/bin/python"
VOCES = "/data/users/julio/.local/share/piper-voices"


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("texto", nargs="?", help="texto a decir")
    ap.add_argument("salida", help="archivo .wav de salida")
    ap.add_argument("--archivo", help="leer el texto de un .txt en vez del argumento")
    ap.add_argument("--voz", default="en_US-lessac-medium")
    ap.add_argument("--lento", action="store_true",
                    help="mas despacio, para dictado")
    args = ap.parse_args()

    if args.archivo:
        texto = open(args.archivo, encoding="utf-8").read()
    elif args.texto:
        texto = args.texto
    else:
        texto = sys.stdin.read()

    if not texto.strip():
        sys.exit("no hay texto que decir")

    modelo = os.path.join(VOCES, args.voz + ".onnx")
    if not os.path.exists(modelo):
        sys.exit(f"falta la voz {args.voz}. Descargar con:\n"
                 f"  cd {VOCES} && {ENV} -m piper.download_voices {args.voz}")

    os.makedirs(os.path.dirname(os.path.abspath(args.salida)), exist_ok=True)
    cmd = [ENV, "-m", "piper", "-m", modelo, "-f", os.path.abspath(args.salida)]
    if args.lento:
        cmd += ["--length-scale", "1.35"]

    r = subprocess.run(cmd, input=texto, text=True, cwd=VOCES,
                       capture_output=True)
    if r.returncode != 0:
        sys.exit(r.stderr.strip() or "piper fallo")
    print(f"{args.salida} listo")


if __name__ == "__main__":
    main()
