student-v5 / code /demos_v5.py
amir0907's picture
Surgical emotion module v5: 6.25 Hz + weak supervision from RAVDESS/CREMA-D intensity labels (pairwise ranking) - breaks the label-free proxy ceiling
d29b895 verified
Raw History Blame Contribute Delete
2.48 kB
"""Standalone v5 demo pass: one STRONG utterance per emotion + neutral + zh clip."""
import glob, json, os, sys
import torch
import torch.nn.functional as F
sys.path.insert(0, "/tmp/work/s2st_emotion")
from compare_v5 import (demo_plot, new_target, load_wav, EMO_FIELD)
def main():
from funasr import AutoModel
from surgical_emotion import SurgicalConfig, SurgicalEmotionEncoder
DEV = "cuda:0"
fun = AutoModel(model="/tmp/work/emotion2vec_plus_base", trust_remote_code=False,
device=DEV, disable_update=True)
teacher = fun.model.eval()
payload = torch.load("/tmp/work/surgical_out_v5/surgical_emotion_module.pt",
map_location=DEV, weights_only=False)
cfg = SurgicalConfig()
cfg.group_size = int((payload.get("config") or {}).get("group_size", 8))
enc = SurgicalEmotionEncoder(teacher, cfg).to(DEV)
enc.adapter.load_state_dict(payload["adapter_state"]); enc.eval()
torch.set_grad_enabled(False)
files = sorted(glob.glob("/tmp/work/ravdess_kag/**/*.wav", recursive=True))
speech = [f for f in files if os.path.basename(f).split("-")[1] == "01"
and 19 <= int(os.path.basename(f).split("-")[-1].split(".")[0]) <= 24]
by_emo = {}
for f in speech:
by_emo.setdefault(os.path.basename(f).split("-")[2], []).append(f)
demo_files = []
for e in sorted(by_emo):
if e == "01": continue
strong = [f for f in by_emo[e] if os.path.basename(f).split("-")[3] == "02"]
demo_files.append(strong[0] if strong else by_emo[e][0])
neutral = by_emo.get("01", [])
if neutral: demo_files = [neutral[0]] + demo_files
for f in demo_files:
wav = load_wav(f).cpu()
b = os.path.basename(f)
out = enc(wav[None].to(DEV), torch.tensor([wav.numel()], device=DEV))
src = F.layer_norm(wav[None], wav[None].shape).to(DEV)
states = teacher.extract_features(src, padding_mask=None, mask=False)["x"]
probs_t9 = torch.softmax(teacher.proj(states), -1)[0]
tgt50 = new_target(probs_t9, wav)
emo = EMO_FIELD.get(b.split("-")[2], "?")
ilbl = b.split("-")[3]
demo_plot(f"{emo}_{b[:20]}", wav, out, probs_t9, tgt50, cfg.frame_rate_hz,
{"ravdess_label": emo,
"intensity_label": "strong" if ilbl == "02" else "normal"})
print("demo done:", emo, flush=True)
print("DEMOS_DONE", flush=True)
if __name__ == "__main__":
main()