File size: 2,013 Bytes
6eed659
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Decode le devhard avec chaque modele candidat -> combine PAR LANGUE.
But : trouver un HYBRIDE par langue (meilleur modele pour lin, meilleur pour sna)."""
import json, os, soundfile as sf, torch, jiwer
from transformers import AutoModelForCTC, AutoProcessor
ROWS=[json.loads(l) for l in open("/root/devhard/devhard_linsna.jsonl")]
def norm(s): return " ".join(str(s).replace("|"," ").split())
def comb(R,H):
    pr=[(r,h) for r,h in zip(R,H) if r.strip()]
    r=[x for x,_ in pr]; h=[x for _,x in pr]
    w=jiwer.wer(r,h); c=jiwer.cer(r,h); return w,c,0.5*w+0.5*c
CANDS=["joint_cont_best","joint_cont2_best","joint_best","mms1b_lin_best","sna_ps_best","lin_s4_best"]
allhyps={}
for name in CANDS:
    M=f"/root/models/{name}"
    try:
        proc=AutoProcessor.from_pretrained(M)
        model=AutoModelForCTC.from_pretrained(M,dtype=torch.bfloat16).cuda().eval()
    except Exception as e:
        print(f"{name}: SKIP ({str(e)[:60]})",flush=True); continue
    hy={}
    with torch.inference_mode():
        for i in range(0,len(ROWS),8):
            b=ROWS[i:i+8]
            au=[sf.read(r["audio"],dtype="float32")[0] for r in b]
            x=proc(au,sampling_rate=16000,return_tensors="pt",padding=True)
            x={k:v.to("cuda",dtype=torch.bfloat16 if v.dtype==torch.float32 else v.dtype) for k,v in x.items()}
            pid=model(**x).logits.float().argmax(-1).cpu().numpy()
            for r,h in zip(b,proc.batch_decode(pid)): hy[r["id"]]=norm(h)
    del model; torch.cuda.empty_cache()
    allhyps[name]=hy
    line=[name]
    for lang in ["lin","sna"]:
        sub=[r for r in ROWS if r["lang"]==lang]
        w,c,m=comb([r["text"] for r in sub],[hy[r["id"]] for r in sub])
        line.append(f"{lang}={m:.4f}")
    sub=ROWS
    w,c,m=comb([r["text"] for r in sub],[hy[r["id"]] for r in sub])
    line.append(f"ALL={m:.4f}")
    print("  ".join(line),flush=True)
json.dump(allhyps,open("/root/devhard_allhyps.json","w",encoding="utf-8"),ensure_ascii=False)
print("PERLANG_DONE",flush=True)