AigcTestCaseAgent 内部测试

测试用例语音多维度扩充 · 结果示例

系统:AigcTestCaseAgent  ·  链路:Zephyr 用例→规则模板 + LLM 变体→TTS 批量合成(车机语音控制 · Speech for Media 域)

数据标记筛选: ● 真实 ● fixture ● 示意 ● 规划中 来源标注以小字附于每组卡片 · 点击徽章可筛选
区块一

深度

上下文 · 跨域功能 · 多意图
1. 上下文(多轮对话) fixture tests/schema/test_m9_depth.py · src/aigc_test/schema/corpus.py Turn(role=user|system)

语料 schema 中每条语料可携带多轮 Turn(role=user|system) 前置上下文,被测轮为最后一轮 user turn,上下文轮参与 prompt 拼接。

上下文 · system已为您打开音乐播放器
→
被测轮 · user打开音乐播放器
intent="media.app.open_player"
上下文 · user播放周杰伦的歌
→
被测轮 · user播放周杰伦的歌
intent="media.play_artist"  slots={artist: 周杰伦}
2. 跨域功能 / 实际场景 真实 data/corpus.db(1851 条 Zephyr 语料) · configs/priority.yaml

语料库全域分布(共 1851 条,六个功能域):

media.music
779
fg_detect
608
audiobook
276
media.llm
149
radio
27
applemusic
12

真实例句(Zephyr 用例 ID 来自 data/corpus.db):

media.llm · 开放式播控能不能找一些古典的音频听一听呢
→
media.llm车内比较沉闷,播一首带点节奏感的歌来听听。
TMT-T124510TMT-T124511同域另一例:找一首电视剧《武林外传》的歌曲来听听(TMT-T124514)
applemusic打开Apple Music
→
radio / audiobook播放电台 · 播放节目
TMT-T156361TMT-T10708TMT-T10543
fg_detect · 系统触发(非用户主动进入 App)播放
→
fg_detect暂停 · 上一首
TMT-T112579(p1 / p3 / p4 三个子步骤)

优先级口径(configs/priority.yaml):music = P0(通勤高频场景) · fg_detect = P2(系统触发、低频)

3. 多意图(AI 生成复合句) fixture + 机制 src/aigc_test/llm/multi_intent.py · tests/llm/test_multi_intent.py

LLM 基于单意图种子句生成复合句(prompt 示例:打开空调然后放音乐),再按连接词白名单切分回子意图并守卫校验。

种子句打开音乐播放器
→
复合句 → 切分打开音乐播放器接着播放周杰伦的歌
切分为 [打开音乐播放器, 播放周杰伦的歌]
复合句(双连接)打开空调,顺便放首歌
→
复合句(三子句)打开音乐播放器然后暂停再打开我的收藏
「然后」「再」串联,切分为三个子意图
普通话轨放点音乐然后暂停再收藏这首歌
→
方言轨同结构复合句进入方言合成管线
方言轨复用同一多意图切分机制

连接词白名单(句首「再」不切分,避免误伤「再来一首」类续播说法):

然后接着顺便随后再 反例:「再来一首」句首「再」不切分
区块二

表达方式

同义表达 · 语序倒装 · 重音
1. 同义不同表达 真实 configs/rule_templates.yaml + data/cache/poc_dimvariants/(真实 GLM 缓存)

规则模板组(确定性扩展,ground truth 由规则独占推导):

模板原句播放{artist}的歌
→
同模板组变体来一首{artist}的歌 · 我想听{artist}的歌
另一组:播放{genre} ↔ 来点{genre}

真实 GLM 变体组 · 0.5 倍速指令(同义 + 数字等价:「零点五倍速」↔「半倍速」↔「0.5倍」):

原句语义速度太快了,帮我调成零点五倍速。
→
GLM 变体放得太快了,换成半倍速。
data/cache/poc_dimvariants/
GLM 变体这速度太快了,调成0.5倍。
→
GLM 变体太快了,调到半倍速吧。
同一语义等价类,槽位数值归一后一致

真实 GLM 变体组 · 凤凰传奇点歌(口语化开放式表达):

GLM 变体搞不清凤凰传奇哪首歌好听,直接给我放一首他们最出名的歌听听吧
→
GLM 变体不知道凤凰传奇有啥好听的歌,随便挑一首他们最火的单曲播放吧
期望意图一致(点播指定歌手)
2. 同表达不同顺序(倒装) 机制真实 + 例句示意 src/aigc_test/llm/variants.py D11_inversion · docs/architecture.md

D11 定义:「同一指令的语序变化/倒装说法(如把动宾或时间状语换位),关键词保留完整,意图不变」。

收率效果(真实):媒体域泛点播说法收率 6/51 → 39/51 ——由「倒装容忍 + 语气后缀归一 + equivalent_intents 等价类守卫」共同贡献。

示意例句(机制真实,以下具体句子为示意,仓库中暂无对应的真实缓存实例):

常规语序播放周杰伦的歌
→
倒装语序 示意周杰伦的歌播放一下
常规语序把音量调到 30
→
后置补充 示意音量调到 30 帮我弄一下
3. 同表达不同重音 规划中 · 低优先级 D1–D12 扰动体系 · TTS workflow
仓库中暂无实例 / 规划中。当前 12 维扰动体系(D1–D12)暂无重音维度,TTS workflow 无 emphasis 参数。本维度暂不产出语料,待后续规划评估。
区块三

方言

普通话 vs 粤语
普通话 vs 粤语 真实 configs/dialects.yaml · configs/rule_templates_cantonese.yaml · examples/cantonese_poc.py · src/aigc_test/tts/gateway.py

方言机制要点:

粤语特有字 ["啲","嚟","嘅","咗","畀","喇","唔","聽"] verify_threshold=0.5(CER≤0.5 判泄漏) 合成走 qwen_clone 工作流

普粤对照表(configs/rule_templates_cantonese.yaml):

普通话粤语意图
播放音乐播啲歌嚟聽media.play_music
放首歌畀啲歌我聽下media.play_music
我想听周杰伦的歌我想聽周杰倫嘅歌media.play_artist
暂停暫停一陣media.control.pause
继续播放繼續播落去media.control.resume
收藏歌曲收藏呢首歌media.collection.add

PoC 真实合成句(examples/cantonese_poc.py,克隆参考音频文本:「今日天气几好,我哋出发啦」):

普通话播放音乐 · 放一首张学友的歌
→
粤语 · 已真实合成开啲音乐嚟听下 · 同我放首张学友嘅歌
参考音频文本 → 「今日天气几好,我哋出发啦」
区块四

负面 case(坏结果机制展示)

泄漏 · 归因 · 守卫 · 判否 · 预检
当前真实评测数据 24 条全部 pass —— 以下均为机制说明与 fixture 示例,用于展示系统的坏结果处理路径。
方言泄漏丢弃 fixture + 机制 tests/ 方言校验 · manifest 记录
合成音频 CER 超限 → 回炉重试 → 丢弃并记 manifest dropped
合成音频经方言校验,若 CER 超过阈值则判为方言泄漏,回炉重试 3 次,仍超限则丢弃并记入 manifest:
{"id":"y1","utterance":"u1","mandarin_ref":"m1","attempts":3,"cer":0.0}
泄漏率示例:3 产物 + 2 dropped → leak_rate = 0.4
归因 attribution 四分类 fixture tests/ 归因逻辑
评测失败自动归因到四个桶
cer=0.5 → "asr_error"   cer=0 但意图未命中 → "nlu_error"
slot_f1=0.5 → "slot_error"   超时 → "timeout"
守卫丢弃(坏 LLM 候选) fixture + 机制 tests/ 守卫逻辑(ground truth 由规则独占推导)
意图守卫 dropped_guard
「随便听听」→ 规则推导落 media.play_artist 与期望不符 → 整条丢弃。
多意图守卫 dropped_guard
「今天天气怎么样然后打开音乐」—— 首子句非媒体域,丢弃;
「播放收藏歌曲」—— 单子句非复合句,丢弃。
变体白名单拦截 机制 tests/ 变体校验
LLM 变体输出四类拦截
非 JSON · 超 50 字 · 与原句相同 · 非法 dict —— 任一命中即剔除,不入库。
judge 判否 机制 tests/ judge 契约
verdict 契约
verdict="fail" 正常判否入库;缺 quote / verdict 非枚举 / rationale 空白 → 拒收;
LLM 异常 → verdict="pending_manual" + degraded=True,转人工。
preflight 失败 机制 tests/ worker 预检
预检不过 → worker 拒绝领任务
预检 ok=False → worker 退出码 2,不领取任何任务。
沪语占位方言 机制 configs/dialects.yaml status=placeholder
占位方言明确报错,不静默失败
方言 status="placeholder" → 合成时明确报错(不崩溃、不产出脏数据)。