diff --git a/eval/asr_eval/cli.py b/eval/asr_eval/cli.py index 1a152fb..213355f 100644 --- a/eval/asr_eval/cli.py +++ b/eval/asr_eval/cli.py @@ -17,8 +17,8 @@ from rich.console import Console from rich.progress import BarColumn, Progress, TextColumn, TimeElapsedColumn from .datasets import build_dataset -from .engines import build_engine -from .metrics.err import score_sample +from .engines import Transcript, build_engine +from .metrics.err import empty_counts, score_sample from .metrics.resource import ResourceProbe from .report import aggregate, render_markdown, write_reports @@ -117,8 +117,12 @@ def cmd_run(args: argparse.Namespace) -> int: ) as prog: task = prog.add_task(f"{name}", total=len(samples)) for s in samples: - tr = _transcribe_one(engine, s.audio_path) - sc = score_sample(s.ref_text, tr.text) + try: + tr = _transcribe_one(engine, s.audio_path) + except Exception as ex: # 单条样本失败不拖垮整轮评估 + tr = Transcript(text="", audio_sec=0.0, proc_sec=0.0, error=str(ex)) + # 失败样本不计入准确率(counts 置空),仅在 errors 列计数 + sc = empty_counts() if tr.error else score_sample(s.ref_text, tr.text) rows.append({ "engine": name, "dataset": s.dataset, diff --git a/eval/asr_eval/datasets/custom.py b/eval/asr_eval/datasets/custom.py index c943470..8af3959 100644 --- a/eval/asr_eval/datasets/custom.py +++ b/eval/asr_eval/datasets/custom.py @@ -11,6 +11,7 @@ from __future__ import annotations import json import os import re +import sys from collections.abc import Iterator from ..manifest import Sample @@ -50,6 +51,9 @@ class CustomDataset: audio = row["audio"] if not os.path.isabs(audio): audio = os.path.join(self._base, audio) + if not os.path.exists(audio): + print(f"[custom] 跳过缺失音频:{audio}", file=sys.stderr) + continue lang = row.get("lang") or _guess_lang(text) n += 1 yield Sample(