完全合成的双人对话,用户和助手各占一个声道,重叠是真的同时发声。 每一行的助手行为由一条说出口的指令决定,而这条指令下的正确答案 是算出来的,不是写死的。
公开数据集:huggingface.co/datasets/zetianli/FD_data_v3 (816 行——2 个含校验失败行的组整组剔除) · 覆盖总览(四层、含试听) · 本页自带音频,离线可听
下面每组例子里,同一个 base_conv_id 的几行共享逐样本相同的用户声道——
所以听得出来的任何差别,只可能来自指令。戴耳机效果最好:左声道是用户,右声道是助手。
播放器不出现的话,说明你所在的环境挡掉了内联音频;
点每个播放器下面的「下载」按钮,或者直接用浏览器打开本地的
duplex_report.html,就能听。
用户前面说自己喜欢安静,讲着讲着自相矛盾。第一条没有指令,助手等他说完;第二条的指令说「我说完之前都别出声,等多久都一样——但我把事实说错了就当场纠正,别等」,助手切了进去。
第二条 17.1 秒,助手切进来说 Wait, I thought you said you liked the quiet;用户的话在 17.5 秒被截断,最后 12 个词没说出口。
两行的用户声道逐样本相同,差别只可能来自指令。这条的策略名叫 listen,但例外条款触发了,正确行为是打断——只认策略名字的模型必错。这正是这批数据存在的理由。
用户在 30.5 秒插话「就购物清单那部分」。基线停下来处理;一条程序指令要求说完再理;另一条要求停住但先安静听完。三条的用户声道逐样本相同。
prog0 被插话后没有停(时间线上轮次完整);none 和 prog1 都在插话处被截断,prog1 停住后约 1.0 秒才接话——那一秒的沉默就是「先听完」的声学形状。
指令是采样出来的程序,标签由解释器在每个决策点算出来——同一个时刻、相反的动作。构建器按各行自己的标签决定让不让出发言权,不这么做的话三行听起来会一模一样。
助手嘴上说着等待语、文本流正要发搜索调用时,用户插进来改主意「Actually, make it Greek food instead」。调用在修正说完之后才发出,参数里已经是 Greek。
25.1 秒用户插话;27.6 秒文字流才发出 tool_call(参数 cuisine=Greek);29.7 秒结果返回,之后助手才开口报结果。
工具调用走文本流、和语音并行,时间线上是第三条轨。调用若在修正之前发出,它反映不了修正,场景就是空的——时序是这行数据的全部内容。
数据里出现过的每一个情境都在下面,而且给的是对照组——
同一段对话的几个变体,用户声道逐样本相同,所以听得出的差别只可能来自指令。
每条都写了这个情境在考什么,以及这一条该听见什么
(时间点是从这一行自己的时间线读出来的,不是我写的)。
八个 policy 取值全部覆盖。
考什么一口气讲完,子句边界清楚但完全没有停顿。边界不等于可以插话——考的是模型会不会把语法边界误当轮次边界
(无指令对照基线)
全程没有重叠事件;0 处停顿,助手始终没出声
Give me a short mm-hmm or got it when I pause so I know you're with me, but don't start talking.
19.3s 助手附和「yeah」
考什么纯沉默,没有任何口头信号。停顿多长算「让出发言权」?这条考的是模型有没有把绝对时长当阈值用
(无指令对照基线)
全程没有重叠事件;1 处停顿,助手始终没出声
Small signals only, and only where I leave room for them — but if I get a plain fact wrong, correct me on the spot rather than waiting.
15.5s 助手附和「Got it」
考什么带情绪的私人经历加一个沉重的停顿。这里的停顿不是让你说话,是需要你别说话
(无指令对照基线)
全程没有重叠事件;1 处停顿,助手始终没出声
It's unnerving when you're completely silent — a quick 'right' at the breaks is enough. Nothing longer than that.
17.0s 助手附和「oh no」
考什么错误明确、代价明确,是最容易的一档。模型如果连这个都不敢插,说明它把「别打断」学成了「永远别说话」
(无指令对照基线)
全程没有重叠事件;0 处停顿,助手始终没出声
When the user states something factually wrong, interrupt immediately to correct it. Do not wait for them to finish. Otherwise, listen — except when I'm reading something out to you, where I need a short confirmation after each part.
13.1s 助手切入「Wait, they can't actually sing though, right?」 · 13.5s 轮次被截断,6 个词没说出口
考什么用户明说「等我想想」。有显式的占位信号,是这一组里最容易的一档
(无指令对照基线)
全程没有重叠事件;1 处停顿,助手始终没出声
Backchannel briefly when the user pauses or seems to seek confirmation while speaking. Outside of those moments, keep listening without taking the floor.
16.6s 助手附和「mm-hmm」
考什么长时间迟疑,但用户还在组织语言。和上一条的区别在于他不需要你补词,只需要你别打断
(无指令对照基线)
全程没有重叠事件;3 处停顿,助手始终没出声
It's unnerving when you're completely silent — a quick 'right' at the breaks is enough. Nothing longer than that — but if I'm obviously hunting for a word, just supply it instead of leaving me hanging.
19.2s 助手切入「slow down a bit」 · 19.6s 轮次被截断,5 个词没说出口
考什么同样是纠错,但代价更高。这里考的是模型会不会因为「用户语气很随意」就跟着放松
(无指令对照基线)
全程没有重叠事件;0 处停顿,助手始终没出声
You are fact-checking me as I speak. Wrong claim, immediate cut-in. No claim, no cut-in — except when I'm reading something out to you, where I need a short confirmation after each part.
12.9s 助手切入「No, like, stop, that will make it way worse!」 · 13.2s 轮次被截断,1 个词没说出口
考什么同样是纠错,但代价更高。这里考的是模型会不会因为「用户语气很随意」就跟着放松
Hold everything until my turn is over, however long that takes — but if I say something that could actually be unsafe, cut in straight away and tell me.
15.8s 助手切入「No, you can't do that」 · 16.2s 轮次被截断,4 个词没说出口
考什么矛盾跨轮次,不在当前这句话里。要发现它,模型必须记住用户几轮之前说过什么——纯声学线索在这里帮不上忙
(无指令对照基线)
全程没有重叠事件;0 处停顿,助手始终没出声
Don't let a mistake stand: the moment I say something that isn't right, jump in and fix it. Any other time, just let me talk — except when I'm reading something out to you, where I need a short confirmation after each part.
11.6s 助手切入「Wait, I thought you said twenty years?」 · 11.9s 轮次被截断,8 个词没说出口
考什么用户在念地址或编号。这里反过来:不出声才是错的,用户需要逐条确认收到
(无指令对照基线)
全程没有重叠事件;1 处停顿,助手始终没出声
It's unnerving when you're completely silent — a quick 'right' at the breaks is enough. Nothing longer than that — but if I get a plain fact wrong, correct me on the spot rather than waiting.
17.8s 助手附和「got it」
考什么「你懂我意思吧」——像提问但其实是要一个确认。给长答案就是理解错了
(无指令对照基线)
全程没有重叠事件;1 处停顿,助手始终没出声
Give me a short mm-hmm or got it when I pause so I know you're with me, but don't start talking.
18.2s 助手附和「mm-hmm」
考什么带「呃」「嗯」的规划性停顿。这些填充词是「我还没说完」的信号,不是间隙
(无指令对照基线)
全程没有重叠事件;3 处停顿,助手始终没出声
One thing: when I ask you something outright, pause and take it on board. Otherwise speak up, and if you are already mid-sentence just let it go.
13.4s 助手切入「Oh, the one with the big bell?」 · 13.7s 轮次被截断,11 个词没说出口
Here's how I want this to go: the second time I pause in the middle of what I'm saying, give me a quick confirmation, but only the once. Otherwise speak up, and if you are already talking finish your thought.
13.3s 助手切入「Oh, the one with the old bell tower?」 · 13.7s 轮次被截断,11 个词没说出口
考什么用户卡词,绕着概念描述。补词是帮忙,但补早了就是抢话——考的是时机不是意愿
(无指令对照基线)
全程没有重叠事件;2 处停顿,助手始终没出声
I'd rather be corrected mid-sentence than say something wrong for a whole minute, so please don't save it for the end — except when I'm reading something out to you, where I need a short confirmation after each part.
22.6s 助手切入「Baking soda?」 · 22.8s 轮次被截断,1 个词没说出口
考什么助手正在讲方案,用户加一条新约束。停下来还不够,后面的方案要跟着改
(无指令对照基线)
24.6s 用户插话「Wait, actually, my friend just told me they can only come after four o'clock.」 · 25.0s 轮次被截断,16 个词没说出口
Yield fast when I break in, then adapt.
24.7s 用户插话「Wait, actually, my friend just told me they can only come after four o'clock.」 · 25.0s 轮次被截断,15 个词没说出口
Carry on through my mm-hmms.
24.6s 用户插话「Wait, actually, my friend just told me they can only come after four o'clock.」 · 被插话但没有让出发言权
考什么用户说没听清。要重说,不是接着往下讲
(无指令对照基线)
23.8s 用户插话「Wait, Mexican chocolate?」 · 24.2s 轮次被截断,18 个词没说出口
If I say yeah or okay while you're explaining, that means keep going — don't stop and don't restart.
23.9s 用户插话「Wait, Mexican chocolate?」 · 被插话但没有让出发言权
考什么用户把范围收窄。同样是停下来改,但改的是粒度不是方向
(无指令对照基线)
23.9s 用户插话「Like, what does that actually look like?」 · 24.3s 轮次被截断,24 个词没说出口
Don't hand the floor back just because I made a sound. Only stop when I actually ask something.
23.9s 用户插话「Like, what does that actually look like?」 · 被插话但没有让出发言权
考什么「等一下」「不是」这类短促信号。短,但确实是要你停
(无指令对照基线)
30.9s 用户插话「Actually, I already have a partner in mind.」 · 31.2s 轮次被截断,23 个词没说出口
If I say yeah or okay while you're explaining, that means keep going — don't stop and don't restart.
30.9s 用户插话「Actually, I already have a partner in mind.」 · 被插话但没有让出发言权
考什么被要求小结时让不让出发言权;让了之后的回复要真的是小结
(无指令对照基线)
27.8s 用户插话「Yeah, just give me the short version.」 · 28.3s 轮次被截断,4 个词没说出口
When I ask for more specific details, don't stop and don't restart. That said, when it's the first thing I say, just listen, from the moment I've been going on for a while. Otherwise just listen.
27.9s 用户插话「Yeah, just give me the short version.」 · 被插话但没有让出发言权
When it isn't that I've been going on for a while, hold off and let me get through it, but at most twice. Otherwise a quiet mm-hmm is fine, and if you are already talking finish your thought.
27.9s 用户插话「Yeah, just give me the short version.」 · 被插话但没有让出发言权
考什么用户转向另一件更要紧的事。改的是方向
(无指令对照基线)
30.9s 用户插话「Wait, forget that, the inspection is starting now!」 · 31.3s 轮次被截断,12 个词没说出口
Short noises from me are encouragement, not an interruption. Finish what you were saying.
30.9s 用户插话「Wait, forget that, the inspection is starting now!」 · 被插话但没有让出发言权
考什么用户短暂重叠一句附和。这不是要发言权——停下来就错了
(无指令对照基线)
13.4s 用户附和「mm-hmm」
While you are speaking, if the user gives a short acknowledgment like mm-hmm or right, treat it as support. Keep talking and finish your thought without yielding.
13.3s 用户附和「mm-hmm」
考什么「接着说」类信号。和上一条一样是不该让出发言权的情况,信号更明确
(无指令对照基线)
22.2s 用户附和「mm-hmm」
Short noises from me are encouragement, not an interruption. Finish what you were saying.
22.2s 用户附和「mm-hmm」
考什么同上,但调用的是执行类动作,代价更高
(无指令对照基线)
18.1s 文字流发出调用 · 19.1s 结果返回
考什么hold 语还没说完,用户就改了需求。调用必须反映改动——发早了就发错了
(无指令对照基线)
20.2s 用户插话「Actually, make it twelve minutes.」 · 22.3s 文字流发出调用 · 23.9s 结果返回 · 20.6s 轮次被截断,1 个词没说出口
Treat any interjection from me as a course correction: stop, say you got it, and continue from the new direction.
20.2s 用户插话「Actually, make it twelve minutes.」 · 22.3s 文字流发出调用 · 23.7s 结果返回 · 20.6s 轮次被截断,1 个词没说出口
考什么用户补了一条约束。调用参数要反映补充后的要求,不是原始要求
(无指令对照基线)
17.2s 文字流发出调用 · 18.8s 结果返回
考什么口播 hold 语的同时文字流发出查询调用。考的是语音和文本流能不能真的并行
(无指令对照基线)
18.6s 文字流发出调用 · 20.3s 结果返回
下面三张表覆盖数据里出现过的全部取值。 说明文字与 HuggingFace 数据卡同源,任何一个没有说明的取值都会让发布流程直接失败。
| 取值 | 说明 | 本数据集 |
|---|---|---|
| proactive | 用户持有发言权,助手判断要不要以及何时介入(打断 / 附和 / 继续听) | 554 |
| responsive | 助手持有发言权,用户压着它说话,助手决定让不让出发言权 | 206 |
| tool | 助手嘴上说 hold 语的同时,文本流并行发出工具调用 | 63 |
none 是同组的无指令对照行。prog0 / prog1 只是编号,真实语义在 program 字段的规则里,口语渲染在 instruction。其余是固定策略名,取自 Instruct-FD 的动作集合。
| 取值 | 说明 | 本数据集 |
|---|---|---|
| none | 无指令基线。同组的对照行,用来看模型在没有指令时的默认行为 | 352 |
| backchannel | 在用户停顿或寻求确认时给简短回应(嗯、好的),不夺发言权 | 97 |
| prog0 | 采样出来的指令程序(第 1 条)。真实语义在 `program` 字段,不在这个名字里 | 86 |
| prog1 | 采样出来的指令程序(第 2 条),与 prog0 在同一段对话上要求不同的行为 | 86 |
| interrupt | 用户说错时立刻打断纠正,不等他说完 | 63 |
| listen | 安静听着,不打断也不附和,等用户明确说完再接话 | 57 |
| continue | 自己正在说话时,用户给出简短附和,视为支持,说完不让 | 52 |
| acknowledge | 自己正在说话时,用户插入纠正或新约束,立刻停下、确认并调整 | 30 |
标【诱饵】的场景里,出现的东西看着像该介入的信号,但正确做法是不动。
| 取值 | 大类 | 说明 | 本数据集 |
|---|---|---|---|
| sequential_info_capture | proactive | 用户在念结构化信息(地址、编号),需要逐条确认收到 | 81 |
| hesitation_prompt | proactive | 用户在排练发言,卡住并出现长时间迟疑 | 73 |
| word_retrieval_assist | proactive | 用户想不起某个词,绕着这个概念描述——要不要替他补上 | 72 |
| emotional_disclosure | proactive | 用户讲一段带情绪的私人经历,中途留下一个沉重的停顿 | 52 |
| self_contradiction | proactive | 用户这句话和自己前面说过的直接矛盾 | 52 |
| short_stop_repair | responsive | 用户用「等一下」「不是」这类短促信号打断 | 49 |
| scope_narrowing | responsive | 助手在泛泛回答,用户插话把范围收窄到某一点 | 47 |
| factual_misinformation | proactive | 用户很自信地说错了一个日常事实,并开始据此做计划 | 45 |
| safety_correction | proactive | 用户轻描淡写地说了一个有安全风险的错误认知,并打算照做 | 41 |
| cognitive_pause | proactive | 用户句子说到一半陷入沉默思考,没有任何口头信号,然后继续 | 38 |
| user_filler_pause | proactive | 用户边想边说,带着「呃」「嗯」和规划性的停顿 | 32 |
| user_attention_check | proactive | 用户中途确认助手还跟得上(「你懂我意思吧」) | 26 |
| summary_request | responsive | 讲解中途用户插话要求先小结一下——助手要停下来给个摘要 | 25 |
| clause_boundary_tracking | proactive | 用户一口气讲一条多段推理,子句边界清楚但完全没有停顿或确认 | 22 |
| floor_hold_signal | proactive | 用户用「等我想想」这类话占住发言权,停顿,然后接着说 | 20 |
| topic_redirect | responsive | 助手在答一件事,用户插话转向另一件更要紧的事 | 20 |
| tool_followup_constraint | tool | 用户先提要求,随后补一个额外约束,调用要反映补充后的要求 | 19 |
| user_continuer | responsive | 助手解释时用户重叠一个「接着说」类的信号 | 18 |
| tool_barge_in_during_hold | tool | 助手正说 hold 语时用户插话改需求,调用必须反映改动 | 18 |
| user_acknowledgment | responsive | 助手解释时用户短暂重叠一句附和,表示在听 | 16 |
| hearing_check | responsive | 用户插话说没听清最后一段,要求重说 | 16 |
| tool_action_request | tool | 用户要求执行一个动作,助手说 hold 语的同时发出调用 | 15 |
| add_constraint | responsive | 助手正在讲方案,用户插进来加一条新约束,方案要跟着改 | 15 |
| tool_info_request | tool | 用户问的问题只能靠查询工具回答,助手说 hold 语的同时发出调用 | 11 |
| 音频里的事件 | 次数 |
|---|---|
| 用户停顿 | 1035 |
| 助手附和(压在用户说话上) | 195 |
| 用户打断助手 | 172 |
| 助手主动打断用户 | 128 |
| 用户附和 | 26 |
| 工具调用(语音与文本流并行) | 63 |
| 其中被取消、且不报结果 | 0 |
| 动作标签 | 含义 | 数量 |
|---|---|---|
| listen | 安静听着,不打断也不附和 | 793 |
| backchannel | 短促回应,不夺发言权 | 258 |
| interrupt | 立刻切进去说 | 236 |
| acknowledge | 停下、确认、调整 | 135 |
| continue | 说完不让 | 162 |
动作集合与 Instruct-FD(arXiv 2607.20460)一致,分数可以直接对齐。
acknowledge 和 continue 偏薄——它们只能出现在
「助手正在说、用户压过来」的时刻,这类时刻天然稀少,是下一步要补的。
其中 172 行的指令是采样出来的程序,其余走固定策略。
原来的做法是一张手写表:几个策略乘几种措辞,再加几条例外。表有多大,数据的天花板就有多高。 现在指令是一段小程序——原子上的规则,带与或非、序数、作用域和优先级—— 每个决策点的正确动作由解释器跑出来,AST 和逐点标签都存进数据行。 拿程序在同一段对话上重跑,必须逐条复现同样的标签:823 行 0 处不一致。
原子也不是手写的。一个标注模型读完成稿,说出它看见了什么
(changes_subject、struggles_for_word、corrects_misconception…),
在语料里跨话题反复出现过的才允许进指令。词表跟着数据长,不跟着我长。
| 检验 | 问的问题 | 结果 |
|---|---|---|
| 标签复算 | 把存下来的程序重跑一遍,标签还是那些吗 | 0 处不一致 |
| 泄漏 | 只看对话、不看指令,能猜对吗 | 低于基线 0.029 |
| Track A | 从合成好的音频重新推导,结构对得上吗 | 823 / 823 |
泄漏用留一组交叉验证,不是样本内。样本内的版本一度读到 0.609、 看着像失败,其实是特征太细导致分类器把每一行背了下来——留一组是 0.428, 比多数类基线还低。指标本身也要被怀疑。
在这之前所有批次都只到脚本为止,没有一行被真正渲染成音频。 一旦把音频建出来跑校验,问题立刻出现——而且每一个都只有在这一层才暴露。
新加的「让不让出地板」「应答延迟」记录被塞进了 events,
而 events 是带时间戳的时间线,校验器按 t 字段遍历它。
这两条是关于这一行的标注,不是时间线上的事件。
往一个有 schema 契约的列表里加东西之前没读契约。
调用在用户说完「算了」四秒之后才发出——那就没有东西可取消。 更糟的是已取消的调用还发出了结果事件,而「给已取消的调用报结果」 正是这个场景存在的意义。
校验按 policy 名字判断助手该不该出声,但组合指令是
「平时听着,但我念清单时逐条确认」——例外触发时它就该出声。
同一类混淆先后出现在生成器、采样器、校验器里。每次都是能力扩展 暴露了旧假设,不是新代码写错。
读一条行的 JSON 就发现:某一轮 t_end 是 15.18,
词表却列到 15.77,而「没说出口」的尾巴少了第一个词。
两个缺陷:被切断的那个词按「开始时刻」判定,于是只发出 12 毫秒的词被算成说过了;
更严重的是 43 个被切轮次里共 641 个词的时间戳指向静音,没有任何标记。
现在每个词带 spoken 标志,并且有专门的检查会让这类问题当场变红。