语音大模型怎么“打分”?AU-Harness 把复杂 benchmark 装进一个开源工具箱
如果你只想知道结论
AU-Harness = 一套用 Python 写的开源脚本,能把 50+ 语音数据集、21 种任务、9 种指标一次性跑完;跑得快(比现有工具快 127%)、配得细(每句话长度、口音、噪声都能筛)、结果可复现(提示词、打分全部锁版本)。
装好 vLLM → 改两行 config → bash evaluate.sh → 几个小时后拿到 CSV/JSON 报告。
下面把“为什么、装什么、怎么跑、看什么”逐层拆开讲清。
一、为什么又需要一个新工具?
老痛点 | 具体表现 | AU-Harness 的对策 |
---|---|---|
跑得慢 | 单卡单模型、无并发、无批处理 | vLLM 批推理 + 数据集分片 + Token 池调度 |
比不了 | 各家提示词格式不同,A 家多一个“请回答”就多 3% 分 | 统一 system prompt 模板,可版本化 |
测不全 | 只有 ASR 或情绪识别,缺“谁说了什么、什么时候” | 新增 LLM-Adaptive Diarization 与 Spoken Language Reasoning 两大板块 |
二、它到底测哪些“语音能力”?
用一句话概括:从“听见”到“听懂”再到“跟着做”。
六大类 | 举例任务 | 典型数据集 | 输出形式 |
---|---|---|---|
语音识别 | 普通话转写、代码混合、长音频 | LibriSpeech、VoxPopuli | 文字 |
副语言 | 情绪、口音、性别、说话人 | MELD、VoxCeleb | 标签 |
音频理解 | 场景、音乐 | AudioCaps、CHiME | 文字描述 |
口语理解 | 意图、问答、摘要、翻译 | SLURP、CoVoST2 | 文字/标签 |
口语推理 | 函数调用、SQL 生成、多轮指令 | Speech-BFCL、Speech-Spider | 可执行代码 |
安全 | 对抗样本、伪造音频 | AdvBench、AVSpoof | 安全分数 |
新任务 1:LLM-Adaptive Diarization
不给专用声纹模型,只靠提示词让大模型输出“:hello (0.0,1.2s)”这种带时间戳的转写,再用 WDER/cpWER 打分。
新任务 2:Spoken Language Reasoning
把文本指令用 TTS 念出来,让模型“听”完再写 SQL 或调 API,测它跨模态推理能力。
三、核心架构:三步流水线,全是并发
图 1:Config → Request Controller → Concurrent Engines
-
Config 模块
YAML 里写清“哪些模型、哪些数据集、什么指标、什么提示词”,一键版本控制。 -
Request Controller
维护“令牌桶”——一个令牌 = 一次推理请求。所有引擎抢令牌,vLLM 后端自动批处理,失败可重试。 -
Concurrent Engines
每张卡跑一个 Engine,内部再按 batch_size 把音频切片喂模型;后处理、打分、写日志都在子进程完成,主进程只汇总。
四、性能实测:同样 500 条语音,时间对比
工具 | 实时系数 RTF ↓ | 样本/秒 ↑ |
---|---|---|
VoiceBench | 87.9 | 0.15 |
AudioBench | 19.9 | 0.66 |
Kimi-Eval | 7.1 | 1.87 |
AU-Harness | 3.6 | 3.65 |
-
RTF = 处理耗时 / 音频时长;越低越好 -
硬件:A100 40 GB ×1;数据集:LibriSpeech-test-clean 1.05 h
五、安装与 5 分钟上手
0)前提
-
Python ≥3.9 -
有 NVIDIA 驱动 + CUDA 11.8+ -
已装 vLLM(如没有, pip install vllm
即可)
1)克隆与装依赖
git clone https://github.com/ServiceNow/AU-Harness.git
cd AU-Harness
python -m venv myenv && source myenv/bin/activate
pip install -r requirements.txt
2)填 key & 端点
cp sample_config.yaml config.yaml
# 编辑 config.yaml
export ENDPOINT_URL="http://localhost:8000/v1"
export AUTH_TOKEN="sk-xxx"
3)跑一条最小示例
bash evaluate.sh
日志实时刷在终端,结果落在 run_logs/{时间戳}/
4)看结果
-
逐条打分: run_logs/{t}/emotion_recognition/emotion_recognition_llm_judge_binary_qwen2.5_omni.csv
-
总表: run_logs/{t}/final_scores.json
六、YAML 配置速查表
段落 | 干嘛 | 示例 |
---|---|---|
dataset_metric | 指定“数据集+指标”对 | [librispeech_test_other, word_error_rate] |
filter | 只跑部分样本 | num_samples: 300;length_filter: [1.0, 30.0] |
models | 可同时测 N 个模型 | 每个模型单独写 batch_size、chunk_size、 temperature |
generation_params_override | 给某任务/某模型开小灶 | 温度、最大 token 数 |
prompt_overrides | 换提示词 | system / user 都可改 |
judge_settings | LLM-as-Judge 必备 | 指定 judge 模型、并发数 |
七、常见问答 FAQ
Q1:没有 A100,普通 2080 能跑吗?
能。把 batch_size
降到 16–32,chunk_size
改 10 s,RTF 会升高但照样能出结果。
Q2:只想测自己私有数据怎么办?
在 tasks/
对应目录新建 mytask.yaml
,字段照抄模板,把 dataset_path
指到本地 JSON/CSV 或 HuggingFace repo 即可。
Q3:需要多卡多机?
把同一模型起多个 vLLM 端点,YAML 里写多行 model,名字不同即可;AU-Harness 会自动按令牌桶做负载均衡。
Q4:为什么同样模型两次分数差 0.5%?
LLM-as-Judge 本身有随机性;官方建议把 temperature
锁 0.0,开 seed
,并跑三次取中位数。
Q5:提示词必须英文吗?
system prompt 可任意改中文,但当前 benchmark 的参考答案是英文,打分模型也是英文,换中文需自己译标签。
八、把 benchmark 转化成业务指标的一条示范链
-
业务场景:客服对话质检
需求 = 说话人分错 < 10%、情绪检出召回 > 85% -
在 AU-Harness 里勾任务
dataset_metric: [[callhome, wder], [meld, llm_judge_binary]]
-
筛数据
length_filter: [10, 60]
只留 10–60 s 的通话段 -
跑完后拿到
WDER = 8.2%,情绪 F1 = 87% → 满足上线阈值 -
生成对内报告
直接读final_scores.json
写进 PPT,不再手工对 Excel。
九、局限与社区待办
-
依赖 vLLM:无成熟后端的模型只能回退到单条推理,速度打回原型。 -
时间戳精度:LLM-Adaptive Diarization 在重叠语音、快切说话人时仍偏高 WDER。 -
语言覆盖:目前 70% 数据集是英文,中文、低资源语言需社区继续贡献。
十、一句话总结
AU-Harness 把“准备数据 → 写提示词 → 并发推理 → 统一打分”这条最耗时的评估流水线,封装成一条 bash evaluate.sh
命令,并公开全部代码与配置模板。
研究者和工程师不用再重复造轮子,只需关心“我要测什么、阈值多少”,就能把语音大模型真正地、可复现地“称一称”重量。