aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/verify_final.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/verify_final.py')
-rw-r--r--scripts/verify_final.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/scripts/verify_final.py b/scripts/verify_final.py
new file mode 100644
index 0000000..7be410b
--- /dev/null
+++ b/scripts/verify_final.py
@@ -0,0 +1,50 @@
+# -*- 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))