EchoLoc / evaluation /render_metrics /write_report_v2.py
zsy814's picture
Initial EchoLoc code release
d8bfe4a verified
Raw
History Blame Contribute Delete
4.41 kB
"""Write a compact markdown report for the emo-change evaluation v2.
Reads:
<stats-dir>/target_achievement.baseline.csv
<stats-dir>/target_achievement.<winner>.csv
<stats-dir>/stats_wide.baseline.csv
<stats-dir>/stats_wide.<winner>.csv
<eval-dir>/dropped_by_reason.<winner>.json
Writes:
<out> (a single markdown file)
"""
from __future__ import annotations
import argparse
import csv
import json
import os
from typing import Dict, List
def read_csv(path: str) -> List[dict]:
if not os.path.isfile(path):
return []
with open(path) as f:
return list(csv.DictReader(f))
def fmt_num(x, digits=4):
if x is None or x == "":
return "-"
try:
v = float(x)
return f"{v:.{digits}f}"
except Exception:
return str(x)
def fmt_pct(x):
if x is None or x == "":
return "-"
try:
v = float(x)
return f"{v:+.2f}%"
except Exception:
return str(x)
def table_of_achievement(rows: List[dict], variant="combined", lang="all") -> str:
subset = [r for r in rows if r["variant"] == variant and r["lang"] == lang]
if not subset:
return "(no data)\n"
out = "| target | ours | qwen3omni | rel | need | achieved |\n"
out += "|---|---|---|---|---|---|\n"
for r in subset:
ok = "YES" if r.get("achieved") == "True" else "NO"
out += (
f"| {r['target']} | {fmt_num(r['ours'])} | {fmt_num(r['qwen3omni'])} | "
f"{fmt_pct(r['rel_pct'])} | {r['target_pct']}% | {ok} |\n"
)
return out
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--winner", required=True)
ap.add_argument("--stats-dir", required=True)
ap.add_argument("--eval-dir", required=True)
ap.add_argument("--out", required=True)
args = ap.parse_args()
tgt_baseline = read_csv(os.path.join(args.stats_dir, "target_achievement.baseline.csv"))
tgt_winner = read_csv(os.path.join(args.stats_dir, f"target_achievement.{args.winner}.csv"))
drop_path = os.path.join(args.eval_dir, f"dropped_by_reason.{args.winner}.json")
drop = {}
if os.path.isfile(drop_path):
with open(drop_path) as f:
drop = json.load(f)
md = []
md.append("# emo-change Eval v2 Report\n")
md.append(f"**Checkpoint**: `qwen3tts_vdtoken_basespk_emoc_17b_1e6_freezecp/checkpoint-46000`\n")
md.append(f"**Baseline**: `qwen3omni`; **Ours**: `self_model`\n")
md.append(f"**Winning drop preset**: `{args.winner}`\n")
md.append(f"**Rows dropped**: union={drop.get('n_union', '?')} "
f"(margin={drop.get('n_margin', '?')}, wer={drop.get('n_wer', '?')}, "
f"list={drop.get('n_list_type', '?')}, utmos={drop.get('n_utmos', '?')})\n\n")
md.append("## Contract Targets — before any filtering\n\n")
md.append(table_of_achievement(tgt_baseline, "combined", "all"))
md.append("\n### by-lang (combined)\n\n")
md.append("**English**\n\n")
md.append(table_of_achievement(tgt_baseline, "combined", "en"))
md.append("\n**Chinese**\n\n")
md.append(table_of_achievement(tgt_baseline, "combined", "zh"))
md.append("\n## Contract Targets — after applying winner preset\n\n")
md.append(table_of_achievement(tgt_winner, "combined", "all"))
md.append("\n### by-lang (combined)\n\n")
md.append("**English**\n\n")
md.append(table_of_achievement(tgt_winner, "combined", "en"))
md.append("\n**Chinese**\n\n")
md.append(table_of_achievement(tgt_winner, "combined", "zh"))
md.append("\n## Contract Targets — after applying winner preset (combined_no_speaker)\n\n")
md.append(table_of_achievement(tgt_winner, "combined_no_speaker", "all"))
md.append("\n## Files\n")
md.append(f"- Baseline stats: `{args.stats_dir}/stats_flat.baseline.csv` / `stats_wide.baseline.csv`\n")
md.append(f"- Winner stats: `{args.stats_dir}/stats_flat.{args.winner}.csv` / `stats_wide.{args.winner}.csv`\n")
md.append(f"- Winner drops: `{args.eval_dir}/dropped_row_ids.{args.winner}.json` / "
f"`dropped_by_reason.{args.winner}.json`\n")
md.append(f"- Winner scores: `{args.eval_dir}/final_scores.{args.winner}.csv` / `final_summary.{args.winner}.json`\n")
with open(args.out, "w", encoding="utf-8") as f:
f.write("".join(md))
print(f"[write] {args.out}")
if __name__ == "__main__":
main()