# -*- coding: utf-8 -*- """QA sobre el MP4 terminado: extrae el audio ya mezclado con la musica, lo corta segun el timeline y lo transcribe. Prueba que se entiende la voz por encima de la cama, no solo que el WAV suelto estaba bien.""" import json, os, subprocess, sys from difflib import SequenceMatcher ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.join(ROOT, "scripts")) from narration import SCRIPTS from verify import norm from gen_audio import transcribe LIMITE = 0.88 def main(names): peor = [] for name in names: mp4 = os.path.join(ROOT, "out", f"{name}.mp4") tl = json.load(open(os.path.join(ROOT, "out", f"{name}_timeline.json"))) segs = json.load(open(os.path.join(ROOT, "audio", name, "segments.json")))["segments"] work = os.path.join(ROOT, "tmp", name + "_fin") os.makedirs(work, exist_ok=True) entero = os.path.join(work, "todo.wav") subprocess.run(["ffmpeg", "-v", "error", "-y", "-i", mp4, "-vn", "-ac", "1", "-ar", "16000", entero], check=True) trozos = [] for bt in tl["beats"]: p = os.path.join(work, f"{bt['i']:02d}.wav") subprocess.run(["ffmpeg", "-v", "error", "-y", "-ss", f"{bt['start']:.3f}", "-t", f"{segs[bt['i']]['dur'] + 0.25:.3f}", "-i", entero, "-c", "copy", p], check=True) trozos.append(p) tr = transcribe(trozos, work) print(f"\n=== {name} (mezcla final) ===") for bt, p in zip(tl["beats"], trozos): i = bt["i"] got = tr[p] r = SequenceMatcher(None, norm(segs[i]["tts"]), norm(got)).ratio() if r < LIMITE: peor.append((name, i, r)) print(f" {i:02d} {'OK ' if r >= LIMITE else 'REV'} {r:.2f} | {got}") print("\n>> a revisar:", peor if peor else "nada") if __name__ == "__main__": main(sys.argv[1:] or list(SCRIPTS))