#!/usr/bin/env python3
"""
Transcribe un fichero de audio (OGG u otro formato) a texto con faster-whisper.

Uso:
    python transcribir.py audio.ogg
    python transcribir.py audio.ogg --modelo medium --srt
    python transcribir.py audio.ogg --idioma en --dispositivo cuda
"""

import argparse
import sys
import time
from pathlib import Path

from faster_whisper import WhisperModel


def formato_tiempo_srt(segundos: float) -> str:
    """Convierte segundos al formato de tiempo SRT: HH:MM:SS,mmm"""
    ms = int(round(segundos * 1000))
    h, ms = divmod(ms, 3_600_000)
    m, ms = divmod(ms, 60_000)
    s, ms = divmod(ms, 1000)
    return f"{h:02}:{m:02}:{s:02},{ms:03}"


def main():
    parser = argparse.ArgumentParser(description="Transcribe audio a texto con faster-whisper")
    parser.add_argument("audio", help="Ruta del fichero de audio (.ogg, .mp3, .wav...)")
    parser.add_argument("--modelo", default="small",
                        help="tiny, base, small, medium, large-v3 (por defecto: small)")
    parser.add_argument("--idioma", default="es",
                        help="Código de idioma (por defecto: es). Usa 'auto' para detectarlo")
    parser.add_argument("--dispositivo", default="cpu", choices=["cpu", "cuda"],
                        help="cpu o cuda (por defecto: cpu)")
    parser.add_argument("--srt", action="store_true",
                        help="Genera también un fichero de subtítulos .srt")
    args = parser.parse_args()

    ruta_audio = Path(args.audio)
    if not ruta_audio.is_file():
        sys.exit(f"Error: no existe el fichero '{ruta_audio}'")

    # int8 es lo más rápido en CPU; float16 es lo habitual en GPU
    compute_type = "float16" if args.dispositivo == "cuda" else "int8"

    print(f"Cargando modelo '{args.modelo}' en {args.dispositivo}...")
    modelo = WhisperModel(args.modelo, device=args.dispositivo, compute_type=compute_type)

    idioma = None if args.idioma == "auto" else args.idioma
    inicio = time.time()

    segmentos, info = modelo.transcribe(
        str(ruta_audio),
        language=idioma,
        vad_filter=True,   # elimina silencios largos y reduce "alucinaciones"
        beam_size=5,
    )

    print(f"Idioma: {info.language} (probabilidad {info.language_probability:.2f})")
    print(f"Duración del audio: {info.duration:.1f} s\n")

    lineas_txt = []
    bloques_srt = []

    # Los segmentos se generan sobre la marcha: la transcripción ocurre en este bucle
    for i, seg in enumerate(segmentos, start=1):
        texto = seg.text.strip()
        print(f"[{seg.start:7.1f}s -> {seg.end:7.1f}s] {texto}")
        lineas_txt.append(texto)
        bloques_srt.append(
            f"{i}\n{formato_tiempo_srt(seg.start)} --> {formato_tiempo_srt(seg.end)}\n{texto}\n"
        )

    ruta_txt = ruta_audio.with_suffix(".txt")
    ruta_txt.write_text("\n".join(lineas_txt) + "\n", encoding="utf-8")
    print(f"\nTexto guardado en: {ruta_txt}")

    if args.srt:
        ruta_srt = ruta_audio.with_suffix(".srt")
        ruta_srt.write_text("\n".join(bloques_srt), encoding="utf-8")
        print(f"Subtítulos guardados en: {ruta_srt}")

    print(f"Tiempo total: {time.time() - inicio:.1f} s")


if __name__ == "__main__":
    main()
