TL;DR:full-duplex spoken model 的主问题已经从「能不能同时听和说」推进到「能不能在连续语音流里做正确的 floor-control decision」。Moshi 先把实时双流 speech-to-speech 建起来,Full-Duplex-Bench 把 pause handling、turn-taking、backchanneling、interruption management 变成可测指标,后续 alignment/RL 工作开始把 interaction timing 从语义生成里拆出来优化。DuplexPO(arXiv:2607.07148)的关键处理是:只在 dynamics-critical windows 里采样,用 FCDR 分解 start/backchannel/stop/regularization reward,再用 GRPO-style objective 更新局部 policy,同时通过 KL 和 SFT reference 保住 what to say。

full-duplex RL 的脉络要先从一个更朴素的问题开始:语音模型已经会回答问题以后,为什么还要专门学「什么时候说」?

传统 voice assistant 像一个严格排队的柜台:用户说完一句,系统转写一句,LLM 生成一句,TTS 再读一句。这个流程在任务型 QA 里很自然,因为它默认对话已经被切成整齐的 turn。真实对话更像两个人共用同一个声道:用户会停顿、补充、犹豫、打断;听者会用很短的 backchannel 表示还在听;说话权的交接经常发生在几百毫秒的窗口里。

所以 full-duplex spoken model 最后面对的对象不只是文本 token。它每一小段时间都在回答三个问题:

content: 现在要说什么
timing: 现在该不该开口
state: 如果用户开始说话,系统该继续、停下,还是只给短反馈

这三个问题混在一起训练,就容易出现一个熟悉现象:模型答案没错,但交互很别扭。它可能在用户长停顿时抢话,也可能在用户真正说完以后沉默太久,还可能把本该一声「嗯」的 backchannel 变成完整句子。

本文目录如下:

0. 什么是 full-duplex spoken model?
1. 第一阶段:先把双流实时建起来
2. 第二阶段:把自然交互拆成可测行为
3. 第三阶段:为什么 SFT 到这里会变弱
4. 第四阶段:RL 怎么进入 full-duplex
5. DuplexPO:把 conversational dynamics 单独拿出来优化
6. 实验结果说明了什么
7. 对 RL infra 的启发
8. 结语
full-duplex spoken model RL 的主线:先获得双流实时能力,再把互动行为拆成评估维度,最后用局部 RL 优化 floor-control decisions。

full-duplex spoken model RL 的主线:先获得双流实时能力,再把互动行为拆成评估维度,最后用局部 RL 优化 floor-control decisions。

0. 什么是 full-duplex spoken model?

half-duplex 的系统只有一个隐含规则:同一时间只有一方说话。系统通常等用户输入结束,再开始生成。这种规则把复杂对话简化成下面的流水线:

user speech -> ASR -> text LLM -> TTS -> agent speech

full-duplex 取消了这个假设。用户语音流 x1:T 一直进来,agent 输出流 y1:T 也可以同时产生。每个时刻,模型既要听用户当前在说什么,又要决定自己当前的发声状态:

for each frame t:
    observe user stream x_<=t
    observe agent history y_<t
    decide y_t in {silence, speak, backchannel, yield, ...}

Moshi(arXiv:2410.00037)是这条线很重要的起点。它指出传统 pipeline 会累积数秒级 latency,文本中间表示会丢失 emotion 和 non-speech sound,turn-based segmentation 也处理不好 overlap、interruption、interjection。Moshi 还引用了一个经验事实:overlapping speech 约占 spoken time 的 10% 到 20%。

Moshi 的做法是把 spoken dialogue 建成 speech-to-speech generation。模型同时处理 user stream 和 agent stream,用 text token 作为 audio token 的前缀来稳住语言质量。论文报告 theoretical latency 为 160ms,实践中约 200ms。

这一阶段解决的是「模型形态」问题:模型终于可以在结构上同时听和说。但结构准备好以后,新的问题马上出现:模型有没有学会在共享声道里守规矩?

1. 第一阶段:先把双流实时建起来

Moshi 之后的一批工作主要在回答「full-duplex 模型该怎么搭」。

Freeze-Omni(arXiv:2411.00774)强调 frozen LLM backbone,把 speech encoder/decoder 接到文本 LLM 上,避免有限语音数据把原有语言能力冲淡。论文摘要报告它用 8 张 GPU 和 60,000 条 multi-round text QA data 训练 speech-to-speech conversation 能力。

SALM-Duplex(arXiv:2505.15670)进一步把 continuous user inputs 和 codec agent outputs 放在一个模型里处理。论文报告 barge-in success rate 从 Moshi 的 55.1% 到 94.5%,barge-in latency 为 0.69s。

SALMONN-omni(arXiv:2505.17060)走 codec-free 路线,强调 standalone speech LLM 自己管理 speaking/listening state。论文报告在 predicted turn-taking setting 下,相比已有开源 full-duplex speech interaction LLM 平均提升 35.9%。

把这些放在一起看,第一阶段的核心可以概括成三件事:

1. 降低端到端语音交互 latency
2. 让 user stream 和 agent stream 可以重叠存在
3. 尽量保住原本 LLM 的语言和推理能力

但 full-duplex 的难点没有被 architecture 完全消化。一个系统能在用户说话时输出音频,和它知道什么时候该输出音频,是两个不同问题。后者需要评估和优化 floor-control 行为。

2. 第二阶段:把自然交互拆成可测行为

Full-Duplex-Bench(arXiv:2503.04721)把问题往前推了一步。它跳出只测 QA、ASR 或普通 speech quality 的框架,把 full-duplex interaction 拆成四个维度:

  1. pause handling:用户只是中间停顿时,模型保持安静;
  2. backchanneling:用户连续说话时,模型给短反馈,但不接管话题;
  3. smooth turn-taking:用户真的让出 floor 时,模型及时接话;
  4. interruption management:用户打断时,模型能停下并切换关注点。

这四个维度很关键。以前说一个 voice agent「自然」或者「不自然」,常常很难定位原因;Full-Duplex-Bench 把自然交互拆成了可测的局部行为。模型失败以后,可以问得更具体:

它是在 pause 上过早开口?
还是在 turn-taking 上反应太慢?
还是 backchannel 太长,变成了抢话?
还是用户打断后没有 yield?

这个 benchmark 也把 full-duplex RL 的方向暗示出来了。SFT 可以模仿一段对话的 token 序列,但很多失败发生在极窄的时间窗口。一个 <BOS> 提前几帧,一个 <EOS> 晚几帧,文本内容可能完全合理,交互体验已经变了。

所以 full-duplex 的优化目标逐渐从「整段回复好不好」变成「某个互动事件附近的决策对不对」。

3. 第三阶段:为什么 SFT 到这里会变弱

SFT 在 full-duplex 里会遇到两个问题。

第一个问题是 credit assignment。自然语音对话很长,真正决定体验的动作经常只在边界附近出现。比如用户说完一个 clause 后停了 400ms,模型开口是否合适,取决于前后语义、prosody、停顿长度、历史节奏。把整段音频都丢给 token-level likelihood,训练信号会被大量无关 token 稀释。

第二个问题是目标混合。自然对话数据里有许多 fragment、overlap、短反馈和修补语。完整模仿它,可能学到交互节奏,也可能让 assistant-style instruction following 变弱。DuplexPO 把这个现象称为 intelligence-dynamics trade-off:full-duplex dynamics 越强,reasoning 和 instruction-following 可能越弱。

直观地说,SFT 同时在教两件事:

what to say: 语义内容、推理、指令遵循
when to speak: 开口、停顿、让出、短反馈

这两个目标共享同一段训练序列,但需要的监督粒度不同。what to say 常常需要长上下文和语义判断;when to speak 常常发生在几百毫秒的局部窗口里。继续把它们放在同一个 token likelihood 里优化,信号会互相干扰。

后面的 RL 工作基本都围绕同一个问题展开:怎样单独优化 interaction timing,同时尽量不动语义能力?

4. 第四阶段:RL 怎么进入 full-duplex

full-duplex RL 的问题一直在变:一开始大家想把真实用户互动变成 preference signal;很快发现 preference 太粗,需要 reward;reward 做出来以后,又发现 timing reward 会伤语义;再往后,优化对象开始从整段对话收缩到短 segment、短 window。

我把这条路线拆成五个 stage。

4.1 Stage 1:从真实用户互动里构造 preference

Aligning Spoken Dialogue Models from User Interactions(arXiv:2506.21463)解决的是一个很基础的问题:text RLHF 的 preference data 不能原样搬到 speech dialogue。

文本 preference 通常长这样:

context = text_prompt
winner = better_text_answer
loser = worse_text_answer

full-duplex speech conversation 复杂很多。它没有干净的 turn boundary;用户和模型可以同时说话;错误也不只来自内容,还可能来自 interruption、prolonged silence、overlap、backchannel timing。论文的处理流程大概是:

raw_live_conversations
    -> timestamped ASR transcript
    -> LLM judge marks problematic replies
    -> split issues into content-related and timing-related
    -> synthesize preferred response with matched timing
    -> train with DPO-LN on the model text stream

这里有几个细节很重要。

  1. preference 来源是真实互动:作者部署 Moshi,让用户自由对话,再从 raw multi-turn speech conversations 里构造 preference pairs。unique-context 数据集包含 154,301 pairs,其中 timing-only issues 占 57%,content-only issues 占 20%,两者都有占 23%。

  2. timing issue 被显式标出来:论文把 interruption 和 unresponsiveness 放进 LLM judge 的评估轴。timing-only 数据里,18% 来自 model cutting the user,82% 来自 model not answering within appropriate time。

  3. DPO 只算 text stream 概率:论文尝试过同时用 text token 和 audio token 的概率估计,但训练不稳定、效果差;最后使用 text-token-only 的 DPO-LN。

这个 stage 的价值是把真实用户反馈接进 full-duplex model alignment。它留下的问题也很明显:preference pair 仍然是离线、相对粗粒度的信号。一个 pair 可以告诉模型「这段回复更好」,但很难精确指出「第 37 帧该停,第 49 帧该重新开口」。

4.2 Stage 2:从 preference 走向 interaction reward

下一步自然是 reward modeling。full-duplex 需要在线或准在线的 scalar reward,才能支撑 rollout-based RL。

ORISE 这条线把 full-duplex SDLM 的互动行为放进 online RL。DuplexPO 的 related work 对它的评价很明确:ORISE 的 rollout-level reward 能改善 spoken interaction,但 sequence-level assignment 仍然偏粗,很难把成功或失败归因到具体实时决策。

Dual-Axis Generative Reward Model(arXiv:2604.14920)进一步把 reward 本身变成研究对象。它指出当时常见自动指标有几个问题:behavioral statistics 只数表面事件,timing-prediction proxy 对内容不敏感,metrics suite 虽然细但高延迟且难以融合成 RL 所需的统一 reward;普通 LLM-as-a-judge 又主要面向 turn-based dialogue,容易误判 full-duplex 里的 simultaneous speaking/listening。

Dual-Axis 的回答是训练一个 interaction-aware generative reward model,同时给出 semantic quality 和 interaction timing 两个轴的评价。它的核心抽象可以写成:

dual_track_dialogue
    -> interaction taxonomy
    -> reward_model(dialogue)
    -> {
        "semantic_quality": score_sem,
        "interaction_timing": score_time,
        "overall_reward": score_all,
    }

这个 stage 解决的是 reward 可用性问题:从 pairwise preference 走向可诊断、可打分的 interaction reward。它留下的问题是 credit assignment。reward model 可以说一段 interaction timing 不好,但 full-duplex policy 需要知道具体哪一小段时间该改。

4.3 Stage 3:timing reward 会把 raw-token policy 带偏

ASPIRin(arXiv:2604.10065)抓住了一个更具体的问题:用标准 GRPO 直接优化 raw token policy,会让模型为了 timing reward 牺牲 semantic coherence。

论文的实验里,Standard GRPO 会让模型变得更积极:turn-taking 和 user interruption 的指标改善,latency 下降;但 pause handling 和 backchanneling 变差,模型更容易持续说话,也会导致 semantic coherence 下降。摘要里还提到,ASPIRin 相比 standard GRPO 把 duplicate n-grams 的比例降低超过 50%,用来说明 raw-token timing RL 带来的 repetition/generative collapse 被缓解。

ASPIRin 的处理方式是 Action Space Projection。它避免让 timing reward 直接作用在完整 vocabulary 上,先把 token 分成两类:

V_pad      -> inactive_silence
V_non_pad  -> active_speech

然后在 projected binary state policy 上做 GRPO:

for token_step in generation:
    raw_logits = model(...)
    state_logits = {
        "inactive": sum_logits(V_pad),
        "active": sum_logits(V_non_pad),
    }
    optimize state_policy(active_or_inactive) with timing reward

这个 stage 的贡献是把 action space 和 reward 对齐。timing reward 本来只关心 active/inactive、interrupt/latency,却被 raw-token RL 强行分摊到每个具体词上;ASPIRin 把优化对象收窄到 state policy,语义 token selection 受到的干扰小很多。

但 ASPIRin 也留下一个限制:binary state 能处理「说/不说」的大方向,对 backchannel 类型、turn initiation 精度、barge-in 后的停止模式,表达能力仍然偏粗。下一步就会自然走向 axis-specific reward。

4.4 Stage 4:把 interactivity 拆成多个轴分别优化

Multi-Faceted Interactivity Alignment(arXiv:2606.11167)接着处理 reward 覆盖范围的问题。它指出,已有 RL 方法通常只覆盖一部分互动行为,比如 barge-in 或 backchannel;full-duplex interactivity 至少要覆盖四个 canonical axes:pause handling、turn-taking、backchanneling、user interruption。

它的训练流程是:

for each RL step:
    axis = sample({pause, turn, backchannel, interruption})
    segment = sample(D_axis)
    completions = policy.sample(segment, G)
    rewards = R_axis(completions)
    advantages = normalize(rewards within group)
    update with GRPO + KL(reference_policy)

每个 axis 都有独立 reward:

  1. pause handling:用户还在自己的 utterance 内停顿,模型应该保持安静;生成超过 1s 的 speech interval 会被惩罚。
  2. turn-taking:用户让出 floor 后,模型越快开始合适回复越好;reward 用 response delay 的负值。
  3. backchanneling:模型应该在参考 backchannel 位置附近给短反馈,同时避免 takeover;reward 用 backchannel F1。
  4. user interruption:用户打断后,模型需要识别 interruption 并及时回应;reward 也按 delay 设计。

它还加了 LLM Judge reward 来保护 response quality,尤其用于 turn-taking 和 user-interruption 轴,避免只优化 delay reward 带来的 semantic degradation。

这个 stage 的重要性在于,它把 Full-Duplex-Bench 的评估轴反过来用作训练轴。评估不再只是 leaderboard,开始变成 reward design 的结构。

4.5 Stage 5:从 short segment 继续收缩到 dynamics-critical window

到 Multi-Faceted 这里,RL 已经有了四轴 reward,也已经用短 audio segment 替代整段对话。但 DuplexPO 还要再往前收一步:full-duplex 的错误往往发生在 event boundary 附近,训练应该集中到 dynamics-critical windows。

DuplexPO 对前面几条路线的取舍可以这样概括:

User Interactions:
    live interaction -> preference pairs

Dual-Axis / ORISE:
    full-duplex interaction -> reward signal

ASPIRin:
    timing reward -> projected action policy

Multi-Faceted:
    interaction reward -> four canonical axes

DuplexPO:
    long dialogue -> event-centered windows
    reward -> factorized temporal credit assignment

这就是 DuplexPO 的位置。它同意 ASPIRin 的判断:when to speakwhat to say 需要拆开;但它没有把 action space 压成 binary state。它也同意 Multi-Faceted 的判断:pause、turn-taking、backchannel、interruption 应该分开给 reward;但它进一步把 policy update 限制到 turn transition、backchannel、barge-in 附近的 window。

所以 DuplexPO 接下来要解决的问题很具体:在保留原 action space 和 SFT 语义能力的前提下,怎样只更新那些真正决定 conversational dynamics 的局部时间窗口。

5. DuplexPO:把 conversational dynamics 单独拿出来优化

DuplexPO(arXiv:2607.07148)的核心判断是:SFT 保留 assistant 的语义能力,RL 只负责修 conversational dynamics。

论文把实时 policy 写成 frame-level formulation。用户音频流记作 x1:T,agent 的互动决策记作 y1:T。每个 frame 上,policy 预测:

DuplexPO 的 frame-level policy:在 causal user context 和历史 agent decision 条件下预测当前 frame 的互动状态。

DuplexPO 的 frame-level policy:在 causal user context 和历史 agent decision 条件下预测当前 frame 的互动状态。

论文 Table 5 给出的 frame duration Δ 是 0.08s,也就是 80ms 做一次决策。这个粒度对 full-duplex 很重要,因为很多 turn-taking 和 barge-in 错误就在几帧内发生。

5.1 dynamics-critical windows

DuplexPO 没有在整段 dialogue 上 rollout。它先从长对话里抽取 dynamics-critical windows,比如 turn transition、backchannel、barge-in 附近的小窗口。窗口之前的历史用 teacher forcing,policy 只在窗口内部采样 continuation,然后计算 reward。

伪代码可以写成这样:

for dialogue in dataset:
    events = detect_turn_transition_backchannel_barge_in(dialogue)
    for window in sample_windows(events):
        prefix = dialogue[:window.start]          # teacher-forced history
        rollouts = policy.sample(prefix, window)  # only sample inside window
        rewards = FCDR(window, rollouts)
        update(policy, rollouts, rewards, reference=SFT)

这个采样单位很小,但上下文没有丢。它的好处是 credit assignment 更干净:reward 评估的就是这个窗口里的开口、短反馈、让出和正则化行为。整段对话 reward 很容易把边界错误冲淡,window-level reward 则能把错误固定在事件附近。

5.2 FCDR 在奖励什么

DuplexPO 的 reward 叫 Factorized Conversational Dynamics Reward,简称 FCDR。它把一个窗口里的互动质量拆成四项:

FCDR:turn initiation、backchanneling、barge-in yielding 和 pattern regularization 分别给信号,再按 event mask 激活。

FCDR:turn initiation、backchanneling、barge-in yielding 和 pattern regularization 分别给信号,再按 event mask 激活。

论文 Table 1 里定义了四个 component:

  1. R_on:奖励 turn initiation 的时机。预测 onset 和参考 onset 越接近,reward 越高;
  2. R_bc:奖励 backchannel 的时机。模型需要在人工标注的 backchannel interval 内或附近发出短反馈;
  3. R_off:惩罚 user barge-in 后仍然继续说。agent 在用户拿回 floor 后说得越久,惩罚越大;
  4. R_reg:惩罚不合适的 pattern,比如不该出现的持续发声。

这里的重点是 factorization。turn initiation、backchannel、yielding 对应不同失败模式。把它们拆开以后,训练时可以分别给信号,debug 时也能看出到底是哪类行为变坏。

5.3 为什么用 GRPO-style objective

每个 dynamics-critical window 内,DuplexPO sample 多个 continuation。论文 Table 5 给出的 group size 是 4。对同一窗口的多个 rollout,先按 reward 做 group normalization,得到 advantage:

DuplexPO 使用 group-normalized advantage,保留同一窗口内多个 continuation 的相对好坏。

DuplexPO 使用 group-normalized advantage,保留同一窗口内多个 continuation 的相对好坏。

训练流程可以写成:

for window in sampled_windows:
    rollouts = policy.sample(window, group_size=4)
    rewards = FCDR(window, rollouts)
    advantages = normalize_within_group(rewards)

    loss = policy_gradient(
        tokens=rollouts.window_tokens,
        advantages=advantages,
        kl_reference=sft_policy,
        beta=0.2,
    )

只更新 window 内 sampled tokens,并加 KL penalty 约束到 reference SFT model。论文 Table 5 给出的 KL coefficient β 是 0.2,RL learning rate 是 1e-5,advantage clipping 是 [-5, 5]

这个选择和 ASPIRin 的方向不同。ASPIRin 收窄 action space,避免 timing reward 影响 raw token generation;DuplexPO 保留原 action space,但把采样和更新限制在 dynamics-critical windows,并用 KL 控制 drift。两者处理的是同一个风险:interaction reward 只关心时机,但模型的动作会牵动语言生成。

论文附录 J 的 ablation 支持 GRPO-style objective。固定 FCDR 和 window sampler 后,GRPO 在多数 window-level dynamics metrics 上优于 DPO-style objective。比如 Fisher 上 backchannel yield 从 DPO 的 71.4% 到 GRPO 的 100.0%,Seamless 上 turn-taking yield 从 77.8% 到 93.6%,FDB-v3 上 yield 从 93.3% 到 100.0%。直观解释是:DPO-style objective 只用最高和最低 reward continuation,丢掉了同一窗口内更多相对排序信息。

5.4 数据和训练怎么搭起来

DuplexPO 的 training pipeline 分成四段:pre-training、SFT、DuplexPO RL、speech-synthesis SFT。实现基于 Nemotron-VoiceChat recipe 和 NeMo Toolkit,backbone 是 Qwen2.5-7B-Instruct;streaming speech encoder 是 600M 参数的 Parakeet-based encoder;speech encoder 和 codec 在训练中 frozen。论文报告所有 runs 使用 64 张 A800 80GB GPU。

数据来源也分工明确:

  1. speech-continuation pre-training:从大文本语料生成 530K 小时 speech-continuation examples;
  2. instruction-following QA:70K 小时 spoken QA data,其中 10K 小时是 single-turn;
  3. synthetic user interruption:agent utterance 超过 4s 时,以 0.1 概率插入 user interruption,并在 interruption 开始后给 agent 8-token reaction delay,约 0.64s;
  4. ASR-QA:用真实录音条件增加 speaker variation、channel effect 和 background noise;
  5. dynamics-aware dialogue reconstruction:从 Fisher 和 Seamless-Naturalistic-HQ 的 word-level timing 恢复对话片段,训练集包含 24.6K Fisher samples 和 43.1K Seamless samples。

这套数据设计的意图很清楚:通用语义能力靠大规模 SFT 和 QA 数据保住,interaction timing 靠自然对话 timing signal 和 window-level RL 调整。DuplexPO 避免让自然对话数据同时承担「会答题」和「会接话」两个任务,把它们拆到了不同训练阶段。

6. 实验结果说明了什么

DuplexPO 的实验需要分两组看:dynamics 有没有变好,intelligence 有没有掉。

先看 dynamics。Fisher 和 Seamless 上,DuplexPO 在 window-level turn-taking 和 backchannel 指标上明显优于 SFT Baseline(Table 2)。

数据集 模型 Onset MAE (s) ↓ Turn-taking yield (%) ↑ Backchannel yield (%) ↑
Fisher SFT Baseline 0.98 92.1 57.1
Fisher DuplexPO 0.69 98.7 100.0
Seamless SFT Baseline 1.22 78.5 79.4
Seamless DuplexPO 1.03 93.6 93.3

FDB-v3 上更能看到 floor-control 的效果(Table 3)。

模型 Latency (s) ↓ VIR (%) ↓ Yield (%) ↑
SFT Baseline 7.33 8.0 64.8
DuplexPO 0.24 5.0 100.0

这组结果值得注意。只让模型少说,可能降低 interruption,但 latency 会变差;只让模型早说,可能降低 latency,但容易抢话。DuplexPO 同时降低 latency 并提高 yield,说明它学到的更接近局部 floor-control policy。

conversation-level judge 也支持这个方向。Gemini pairwise judge 偏好 DuplexPO 的比例如下(Table 8,win rate 已排除 tie):

数据集 Overall Backchannel 维度
Fisher 76.9% 91.7%
Seamless 69.3% 82.9%

再看 intelligence。DuplexPO 没有损伤 SFT Baseline 的 QA、instruction following、speech understanding、reasoning,反而在多数指标上有小幅提升(Table 4;QA / OpenBookQA / MMSU 为准确率 %,AlpacaEval / CommonEval 为 1–5 分 GPT-score)。

指标 SFT Baseline DuplexPO
Llama Questions 72.0 75.3
WebQuestions 44.3 44.5
TriviaQA 48.1 49.9
SDQA 47.2 49.8
OpenBookQA 72.2 73.7
MMSU 54.9 56.2
AlpacaEval (1–5) 3.43 3.68
CommonEval (1–5) 3.48 3.74

论文最核心的论据就在这里:conversational dynamics 和 model intelligence 的冲突可以被缓解。关键在训练目标怎样拆分,以及 RL 更新被限制在什么区域。

7. 对 RL infra 的启发

从 RL infra 视角看,full-duplex model RL 有几个值得单独记下来的点。

第一,sample unit 变短,但 prefix context 不能省。DuplexPO 只在 window 内 rollout,window 前的 history 仍然 teacher-forced。这样能省 rollout 长度,也保留 boundary decision 需要的上下文。

第二,reward engineering 回到行为分解。FCDR 放弃用一个大 reward model 评价整段对话,把 start、backchannel、stop、regularization 分开。这个设计对 debug 友好,也能解释具体指标为什么变化。

第三,reference policy 很关键。full-duplex timing reward 本身不约束语义质量。ASPIRin 用 action projection,Multi-Faceted Alignment 加 LLM-based response-quality reward,DuplexPO 用 window restriction 和 KL penalty。实现不同,目标一致:防止 interaction reward 把 language model 带偏。

第四,trajectory 的结构更复杂。text RL 主要处理 token sequence;full-duplex RL 还要处理 streaming frame、audio/text alignment、用户输入和 agent 输出的 overlap、实时状态切换。后续如果这类训练规模变大,infra 的难点会从「更长 sequence」扩展到「更细粒度、更强时序约束的 trajectory」。

可以把一个 full-duplex rollout 想成下面这种对象:

trajectory = {
    "user_audio_frames": x[0:T],
    "agent_audio_frames": y[0:T],
    "agent_state": ["silence", "backchannel", "speak", "yield", ...],
    "event_windows": [
        {"type": "turn_transition", "start": s1, "end": e1},
        {"type": "barge_in", "start": s2, "end": e2},
    ],
    "rewards": {
        "onset": R_on,
        "backchannel": R_bc,
        "offset": R_off,
        "regularization": R_reg,
    },
}

这比普通 prompt-response RL 多了一层时间结构。训练系统如果只把它看成一串 token,很难把 reward、mask、rollout boundary 和日志分析做好。

8. 结语

回头看这条线,full-duplex spoken model RL 的演进大概是这样:

Moshi:
    让 speech-to-speech 模型具备实时双流形态

Full-Duplex-Bench:
    把 pause / turn-taking / backchannel / interruption 拆成可测行为

User interaction alignment + ORISE:
    把真实互动和在线评估变成 RL 信号

ASPIRin:
    用 action projection 限制 timing RL 对语义生成的影响

Multi-Faceted Interactivity Alignment:
    用多轴 reward 覆盖 full-duplex 的主要互动行为

DuplexPO:
    在 dynamics-critical windows 里做局部 RL,用 FCDR 和 GRPO-style update 单独优化 conversational dynamics

DuplexPO 的价值不只在指标提升。它把 full-duplex 里的一个核心拆分讲清楚了:SFT 负责保住 what to say,RL 负责调整 when to speak。这也是 full-duplex RL 和普通 speech LLM 训练的分界点。模型以后要学的,已经不只是把语音回答生成得更好,还包括在持续变化的 shared speech stream 里学会什么时候开口、什么时候停、什么时候只用很短的声音告诉用户「我还在听」。

References

  • Moshi: a speech-text foundation model for real-time dialogue, arXiv:2410.00037
  • Freeze-Omni: A Smart and Low Latency Speech-to-speech Dialogue Model with Frozen LLM, arXiv:2411.00774
  • Full-Duplex-Bench: A Benchmark to Evaluate Full-Duplex Spoken Dialogue Models on Turn-taking Capabilities, arXiv:2503.04721
  • Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model, arXiv:2505.15670
  • SALMONN-omni: A Standalone Speech LLM without Codec Injection for Full-duplex Conversation, arXiv:2505.17060
  • Aligning Spoken Dialogue Models from User Interactions, arXiv:2506.21463
  • Reinforcement Learning Enhanced Full-Duplex Spoken Dialogue Language Models for Conversational Interactions, OpenReview
  • ASPIRin: Action Space Projection for Interactivity-Optimized Reinforcement Learning in Full-Duplex Speech Language Models, arXiv:2604.10065
  • Dual-Axis Generative Reward Model Toward Semantic and Turn-taking Robustness in Interactive Spoken Dialogue Models, arXiv:2604.14920
  • Multi-Faceted Interactivity Alignment in Full-Duplex Speech Models, arXiv:2606.11167
  • Decoupling Conversational Dynamics in Full-Duplex Spoken Models through Reinforcement Learning, arXiv:2607.07148