aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/verify_final.py
blob: 7be410b828972bdbadf1dfc4f43ba6b098aabf5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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))