基于 OpenRLHF 的大模型强化训练

OpenRLHF代码细节

https://zhuanlan.zhihu.com/p/12871616401

训练入口

ppo_ray相关的训练入口在:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/cli/train_ppo_ray.py

在main中我们启动了driver进程,并执行训练函数train(args),这里主要做了如下几件事:

  • 在ray集群上部署Actor/Ref/Critic/RM实例
  • 在ray集群上部署vllm_engines实例
  • 配置Actor和vllm_engines之间的通讯,用于传递权重
  • 训练Actor和Critic模型

我们依次来解读这几个关键步骤。同时为了在表述上消除歧义,我们接下来谈到“Actor”时,会使用Ray-Actor和PPO-Actor来做区分,从之前的介绍中可知,Ray-Actor是指部署在Ray集群中的远端class,PPO-Actor/Ref/Critic/RM都属于Ray-Actor。

部署Actor/Ref/Critic/RM实例

(1)非共同部署

针对多个node的情况,我们以PPO-Actor为例,看代码是如何将其部署到Ray集群上的。

  • PPORayActorGroup创建在driver进程上,可将它理解成一种部署方案,专门负责部署PPO中的4类模型
    • PPORayActorGroup中维护着self._actor_handlers,它是一个List[ray.actor.ActorHandle],列表中每个元素表示某个远端Ray-Actor的引用,而这个远端Ray-Actor可以是PPO-Actor/Ref/Critic/RM实例。如前文所说,我们可以在ray集群中的任何位置调用这个handler,来对相应的远端Ray-Actor执行操作。
    • 在本例中,我们创建了4个Ray-Actor(1个master-actor,3个worker_actor)。每个Ray-Actor都运行在一个worker进程中。在创建Ray-Actor的同时,我们也会去修改worker进程的环境变量。后续当我们在这些worker进程中启动ds_zero相关的分布式配置时,ds会读取这些环境变量信息,这样我们就知道哪些Ray-Actor同时又构成ds中的数据并行组。
    • 使用PPORayActorGroup部署模型实例的代码如下:
model = PPORayActorGroup(
        # 为部署该模型的全部实例,我们想用多少台node,例如本例中为2
        args.actor_num_nodes,
        # 为部署该模型的全部实例,我们每台node上想用多少gpu,例如本例中为2
        args.actor_num_gpus_per_node,
        # Actor/Critic/Reward/ReferenceRayActor
        ActorModelRayActor, 
        # pg可理解为,在ray cluster中锁定/预留一片资源,然后只在这片资源上部署该模型全部实例。
        # (pg维护在Head Node的GCS上,参见3.3)
        # 例如本例中,pg锁定的资源为node0 gpu0/1, node1 gpu0/1,
        # 我们只在上面部署ActorModelRayActor全部实例
        pg=pg,
        # 当我们在pg指向的预留资源中分配模型实例时,再进一步指定每个实例占据一张gpu的多少部分
        # 等于1说明每个实例占满一张gpu,即“非共同部署”
        # 小于1说明每个实例只占部分gpu,即“共同部署”,例如PPO-Actor/Ref共同部署在一张卡上
        num_gpus_per_actor=0.75 if pg else 1,
    )

ActorModelRayActor创建在远端worker进程上,是Ray-Actor。它包含了设置ds_zero分布式环境、加载模型权重、数据集准备、optimizer/scheduler准备、训练等一系列操作。

共同部署

针对下图的情况,我们以PPO-Actor为例,看代码是如何将其部署到Ray集群上的

  • PPORayActorGroup:在driver进程上创建2个PPORayActorGroup,分别管理PPO-Actor,PPO-Ref的部署
  • 使用actor_model = PPORayActorGroup(..., pg = pg, num_gpus_per_actor=0.75)创建PPO-Actor部署方案实例;使用ref_model = PPORayActorGroup(..., pg = pg, num_gpus_per_actor=0.25)创建PPO-Ref部署方案实例
  • 这里,两个方案实例使用的pg都是同一个,即这个pg都指向“1台node,每台node 8张卡”这片预留好的资源。
  • num_gpus_per_actor = 0.75/0.25是一种创建trick,虽然我们的最终目的是为了让PPO-Actor和PPO-Ref对半分一张卡(对半=共享,不是指显存上对半分),但是:
    • 假设设置为0.5,当我们实际部署ActorModelRayActor时,Ray先在单卡上部署1个ActorModelRayActor实例,当它准备部署第二个ActorModelRayActor实例时,它发现由于每个实例只占0.5块卡,因此完全可以把第2个实例接着第1个实例在同一张卡上部署,这样就导致最终无法让PPO-Actor和PPO-Ref共享一张卡
    • 假设设置0.75,当我们在单卡上部署完1个ActorModelRayActor实例后,ray发现单卡剩下的空间不足以部署第2个ActorModelRayActor实例,所以就会把第二个实例部署到别的卡上,这样最终实现PPO-Actor和PPO-Ref共享一张卡
    • 所以,这个设置是为了达到不同类型模型的实例共享一张卡的目的,而并非真正指模型实际占据的单卡显存空间。
  • 最后,在这一步中,我们对全部ActorModelRayActor共创建8个worker进程,对全部RefenreceModelRayActor共创建8个worker进程,一共创建16个工作进程。

相关代码依然在:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/launcher.py#L143

部署vllm_engines实例

  • create_vllm_engines:在driver端,我们通过运行该函数来创建vllm_engines,过程相似于4.2节中的介绍,信息都在图中,这里不赘述。
  • LLMRayActor:worker端Ray-Actor,它主要是把vllm实例进行了一些包装,包装的目的是为了让ds_rank0和all vllm ranks间可以进行PPO-Actor的权重通讯(参见2.1(3))
  • 在上面的例子中,我们会创建4个worker进程(不占gpu资源,只占cpu资源),用于运行管理4个vllm_engine。在每个worker进程内,vllm实例还会创建属于自己的worker进程做分布式运行(这些worker进程会实际占据gpu资源)。

相关代码参见:
https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/vllm_engine.py


https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/vllm_worker_wrap.py

ds_rank0与vllm_ranks之间的通讯

PPO-Actor的ds_rank0需要和all_vllm_ranks进行通讯,传递最新的PPO-Actor权重,例如以下ds_rank0要把完整的权重broadcast给16个vllm_ranks:

我们分成如下几步实现这个目标:

(1)创建通信组

Step1:

代码来自:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/ppo_actor.py#L58
这段代码执行在PPO-Actor0(ds_rank0)所在的worker进程中。这个worker进程将通过handler引用,触发远端每个vllm_engine上的init_process_group操作,并将ds_rank0纳入通讯组

 # Create torch group with deepspeed rank 0 and all vllm ranks
        # to update vllm engine's weights after each training stage.
        #
        # Say we have 3 vllm engines and eache of them has 4 GPUs,
        # then the torch group is:
        # [    0,      1, 2, 3, 4,  5, 6, 7, 8,  9, 10, 11, 12]
        # |ds rank 0 |  engine-0  |  engine-1  |   engine-2   |
        #
        # For ZeRO-1/2:
        #   1. Broadcast parameters from rank 0 to all vllm engines
        # For ZeRO-3:
        #   1. AllGather paramters to rank 0
        #   2. Broadcast parameters from rank 0 to all vllm engines
        if self.vllm_engines is not None and torch.distributed.get_rank() == 0:
            ...
            # world_size = num_of_all_vllm_ranks + 1 ds_rank0
            world_size = vllm_num_engines * vllm_tensor_parallel_size + 1
            ...
            # =====================================================================
            # 遍历每个vllm_engines,将其下的每个vllm_rank添加进通讯组中,这里又分成两步:
            # 1. engine.init_process_group.remote(...):
            #    首先,触发远程vllm_engine的init_process_group方法
            # 2. 远程vllm_engine是一个包装过的vllm实例,它的init_process_group
            #    方法将进一步触发这个vllm实例下的各个worker进程(见4.4图例),
            #    最终是在这些worker进程上执行“将每个vllm_rank"添加进ds_rank0通讯组的工作
            # =====================================================================
            refs = [
                engine.init_process_group.remote(
                    # ds_rank0所在node addr
                    master_address, 
                    # ds_rank0所在node port
                    master_port,
                    # 该vllm_engine的第一个rank在"ds_rank0 + all_vllm_ranks“中的global_rank,
                    # 该值将作为一个offset,以该值为起点,可以推算出该vllm_engine中其余vllm_rank的global_rank
                    i * vllm_tensor_parallel_size + 1, 
                    world_size,
                    "openrlhf",
                    backend=backend,
                )
                for i, engine in enumerate(self.vllm_engines)
            ]
            # =====================================================================
            # 将ds_rank0添加进通讯组中
            # =====================================================================
            self._model_update_group = init_process_group(
                backend=backend,
                init_method=f"tcp://{master_address}:{master_port}",
                world_size=world_size,
                rank=0,
                group_name="openrlhf",
            )
            # =====================================================================
            # 确保all_vllm_ranks都已添加进通讯组中
            # =====================================================================
            ray.get(refs)

Step2:

代码来自:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/vllm_worker_wrap.py#L11
这段代码实际运行在每个vllm_engine(即每个包装后的vllm实例)下的worker进程内。例如tp_size=2,那么每个vllm实例下就有2个worker进程,这两个worker进程都会运行这段代码

class WorkerWrap(Worker):
    def init_process_group(self, master_address, master_port, rank_offset, world_size, group_name, backend="nccl"):
        """Init torch process group for model weights update"""
        assert torch.distributed.is_initialized(), f"default torch process group must be initialized"
        assert group_name != "", f"group name must not be empty"
        # =====================================================================
        # torch.distributed.get_rank(): 在当前vllm_engine内部的rank,
        #                               例如在tp_size = 2时,这个值要么是0,要么是1
        # rank_offset:当前vllm_engine中的第一个rank在“ds_rank0 + all_vllm_ranks"中的global_rank
        # 两者相加:最终得到当前rank在“ds_rank0 + all_vllm_ranks"中的global_rank
        # =====================================================================
        rank = torch.distributed.get_rank() + rank_offset
        self._model_update_group = init_process_group(
            backend=backend,
            init_method=f"tcp://{master_address}:{master_port}",
            world_size=world_size,
            rank=rank,
            group_name=group_name,
        )
        ...

(2)_broadcast_to_vllm

构建好通讯组,我们就可以从ds_rank0广播PPO-Actor权重到all_vllm_ranks上了,这里也分成两步。

Step1:PPO-Actor ds_rank0发送权重

代码在:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/ppo_actor.py#L146
这段代码运行在ds_rank0对应的worker进程中

    def _broadcast_to_vllm(self):
        # avoid OOM
        torch.cuda.empty_cache()
        model = self.actor.model.module
        count, num_params = 0, len(list(model.named_parameters()))
        for name, param in model.named_parameters():
            count += 1  # empty_cache at last param

            # Fire all vllm engines for broadcast
            if torch.distributed.get_rank() == 0:
                shape = param.shape if self.strategy.args.zero_stage != 3 else param.ds_shape
                refs = [
                    # 远端vllm_engine的每个rank上,初始化一个尺寸为shape的empty weight张量,
                    # 用于接收广播而来的权重
                    engine.update_weight.remote(name, dtype=param.dtype, shape=shape, empty_cache=count == num_params)
                    for engine in self.vllm_engines
                ]

            # For ZeRO-3, allgather sharded parameter and broadcast to all vllm engines by rank 0
            # ds_rank0发出权重(视是否使用zero3决定在发出前是否要做all-gather)
            with deepspeed.zero.GatheredParameters([param], enabled=self.strategy.args.zero_stage == 3):
                if torch.distributed.get_rank() == 0:
                    torch.distributed.broadcast(param.data, 0, group=self._model_update_group)
                    ray.get(refs) # 确保所有vllm_ranks接收权重完毕

Step2: 各个vllm_ranks接收权重

代码在:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/vllm_worker_wrap.py#L29
代码运行在每个vllm_engine(即每个包装后的vllm实例)下的各个worker进程中。例如tp_size = 2,那么每个vllm实例下有2个worker进程,这2个worker进程都会运行这段代码。

 def update_weight(self, name, dtype, shape, empty_cache=False):
        """Broadcast weight to all vllm workers from source rank 0 (actor model)"""
        if torch.distributed.get_rank() == 0:
            print(f"update weight: {name}, dtype: {dtype}, shape: {shape}")

        assert dtype == self.model_config.dtype, f"mismatch dtype: src {dtype}, dst {self.model_config.dtype}"
        # 创建同尺寸空张量用于接收ds_rank0广播来的权重
        weight = torch.empty(shape, dtype=dtype, device="cuda")
        # 接收权重
        torch.distributed.broadcast(weight, 0, group=self._model_update_group)
        # 使用接收到的权重进行更新
        self.model_runner.model.load_weights(weights=[(name, weight)])

        del weight

 PPO-Actor/Critic Training

正如2.1(4)中所说,我们将部署在ray集群上的PPO-Actor/Ref/Critic/RM实例们进行分组,每组分别负责一份micro-batch的训练,上图刻画了某个组内的训练流程。一组内的训练流程发起自PPO-Actor实例(fit方法),注意不同颜色的worker0表示的是不同工作进程。共分成如下步骤执行。


Step1:发送prompts,并从vllm_engine上收集(prompt, response)。

代码参见:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ppo_utils/experience_maker.py#L627



Step2:从Ref/Reward/Critic上收集并处理exps

代码参见:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ppo_utils/experience_maker.py#L492



Step3: 确保将处理后的exps传送给Critic,并行执行Actor和Critic的训练

将exps传送给Critic:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ppo_utils/experience_maker.py#L470
Actor训练:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/ppo_actor.py#L125
Critic训练:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/ppo_actor.py#L122
我们在Actor实例所在的worker进程上出发Actor和Critic的训练。以上代码只给出了训练入口,更多细节需要顺着入口去阅读。



Step4:vllm_engine权重更新。

代码参见:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ray/ppo_actor.py#L130

RLHF-PPO算法细节

整个RLHF-PPO训练过程大致分成2步:

  • Stage1:收集exps
  • Stage2:使用收集到的exps计算actor_loss和critic_loss,用于训练actor和critic

在OpenRLHF中的核心代码为:https://github.com/OpenRLHF/OpenRLHF/blob/bb46342711a203c457df2fbca5967fd0549557e0/openrlhf/trainer/ppo_trainer.py#L19

下面我们分别解读这2个stage的过程

 Stage2:Training

ASR大模型GRPO训练

从一个 SFT(监督微调)得到的 Qwen3-ASR语音识别模型 出发,用 Ray + DeepSpeed + vLLM 缺省(此处未启用 vLLM,由 actor 自身 generate 的方式做 PPO/GRPO 强化学习: 对每条音频采样多个转写结果 → 用一个 远程 Python 奖励函数(CER、关键词、语言一致性、平滑度等多维打分)给每个结果打分 → 用 group_norm(GRPO 组内归一化) 计算优势 → 用 PPO 策略损失 更新 actor(冻结音频 encoder,只训 LLM/adapter 部分)→ 周期性保存 HuggingFace 权重。

整体调用链:

run_train_v2_from_sft.sh                    # 启动脚本:起 Ray 集群 + 提交 job
  └─ openrlhf.cli.train_ppo_ray             # 入口:解析参数、建 Ray actor 组、驱动训练
       └─ ActorModelRayActor (ray/ppo_actor.py)   # actor 进程:建模型、数据、优化器
            └─ ActorPPOTrainer.fit → PPOTrainer.fit  # PPO 主循环
                 ├─ RemoteExperienceMaker            # 采样 rollout + 打分 + 算优势
                 │    ├─ actor.generate               # 生成转写(rollout)
                 │    ├─ reward_func (远程 py)         # 多维奖励打分
                 │    └─ group_norm 优势               # GRPO 组内归一化
                 └─ PPOTrainer.ppo_train              # 用 PolicyLossV3 更新 actor

ASR语音识别-MOE架构论文

MOE- Conformer :

MoE Adapter: https://arxiv.org/pdf/2601.02967

论文:Mixture-of-Expert Conformer for Streaming Multilingual ASR

这篇论文 Mixture-of-Expert Conformer for Streaming Multilingual ASR 讨论的是一个更偏工业部署的问题:如何让一个流式端到端 ASR 模型同时支持多种语言,又不把推理成本推到端侧设备难以承受的程度。作者选择的路线是把 Mixture-of-Experts 放进 Conformer,把模型总容量做大,但每次推理只激活一小部分参数。

摘要:容量变大,激活参数不线性变大

论文提出的模型是在流式多语种 Conformer 中加入 MoE 层。MoE 层由多个 FFN 专家和一个 softmax gate 组成,每个输入帧只选择权重最高的两个专家参与计算。这样,专家总数可以增加,模型总容量也可以增加,但推理时激活的专家数固定,因此计算和激活参数不会随专家数量线性增长。

论文中的 gate 先对第 l 层输入 x 做线性映射,再通过 softmax 得到专家权重:

\( g_l=\mathrm{Softmax}(W_l\cdot x) \)

随后只取 top-2 expert,并把两个 expert 的输出按 gate 权重加权求和:

\( y=\sum_{i=1}^{2}g_{l,i}\cdot e_{l,i} \)

实验覆盖 12 个语言 locale。相对于 180M 参数的多语种 cascaded Conformer baseline,MoE-End 模型把平均 WER 从 11.33 降到 9.98,约 11.9% 相对改善。与同等总规模的 dense baseline 相比,MoE 达到类似 WER,但推理激活参数约为 211M,对比 dense 的 400M 更省。再结合多语种 neural LM 做 shallow fusion,平均 WER 还能进一步相对降低约 3%。

引言:多语种统一模型的容量问题

多语种端到端 ASR 的吸引力很直接:用一个模型识别多种语言,降低维护和部署复杂度。过去几年,CTC、LSTM、attention-based 模型以及流式 RNN-T 都在多语种 ASR 上取得了进展。尤其是端侧流式场景,模型既要有识别质量,又要满足低延迟和低计算。

经验上,模型容量越大,多语种 ASR 越容易受益。Whisper、USM 等大型模型也说明了大数据和大模型对语音识别质量的推动作用。但大模型的代价是训练和推理成本。对端侧应用来说,不能简单把模型扩大到数十亿参数。

已有一些效率方案依赖语言相关组件,比如按语言选择 adapter 或二阶段模型。但流式场景里,稳定预测语言信息本身就不容易,还可能引入错误传播。本文的 MoE 路线更直接:由输入表示动态选择专家,不需要显式语言标签,也不需要 ground-truth language information。

相关工作:专家模型与语言信息

论文把自己的方法放在几类工作之间比较。第一类是 ASR 中已有的 MoE 模型,但许多工作偏单语种,或者需要额外的共享 embedding 网络来做专家路由。第二类是 NLP 和视觉中的 MoE,比如 Switch Transformer 或 DeepMoE,不过这些结构在 ASR 尤其是流式多语种 ASR 中的直接效果并不确定。

第三类是 informed-expert:模型根据已知语言信息选择某个语言专家、adapter 或二阶段模块。这种做法在有可靠语言标签时很自然,但部署中会遇到两个麻烦:语言信息要么来自外部,要么需要模型先预测;一旦预测错了,后面的专家选择也会受影响。本文的 MoE 不显式使用语言信息,routing 由模型从声学表示中学出来。

MoE Conformer:把专家放在 FFN 位置

基础模块是 Conformer。一个 Conformer layer 通常包含两个 FFN、中间的 self-attention 和 convolution。作者把 MoE 主要用于替换 Conformer 里的 FFN,尤其是 end FFN。每个 MoE 层包含多个 FFN 专家和一个 router。

对每一帧表示,router 通过 softmax 计算各专家权重,然后选出 top-2 专家。两个专家的输出按路由权重加权求和,得到该 MoE 层输出。训练和推理都使用 top-2。为了防止专家使用不均衡,论文加入辅助负载均衡损失,让不同专家都有机会被训练到。

这个设计的关键是稀疏激活。比如总共有 8 个、16 个或 24 个专家时,每帧仍只走两个专家。总参数代表模型潜在容量,激活参数代表推理成本;MoE 的优势就在于让这两者不再完全绑定。

实验设置

模型训练使用 RNN-T loss,并额外加入专家负载均衡项。论文中的 auxiliary loss 写成:

\( l_{\mathrm{aux}}=\frac{1}{N}\sum_{i=1}^{N}c_i\cdot m_i \)

其中 m_i 是第 i 个 expert 的平均 gate,c_i 是 top-2 路由中该 expert 被选择的计数。

数据

实验使用 12 个语言 locale:美式英语、中文、法语、德语、日语、美式西班牙语、西班牙西班牙语、阿拉伯语、意大利语、印地语、葡萄牙语和俄语。训练数据来自 Voice Search、YouTube 等多个域,总计约 139.4M 条人工转写匿名语音。不同语言数据量差异很大,从 0.5M 到 25.2M utterances 不等。

测试集来自 Voice Search 流量,每个语言大约 1.4K 到 10K 条 utterances,与训练集不重叠。评价指标是 WER;对中文等语言,论文按字符计算错误率。

模型细节

baseline 是一个语言无关的多语种 transducer 模型,包含 7 层 causal Conformer encoder 和 10 层 non-causal cascaded encoder。causal 部分保证流式,non-causal cascaded 部分提供约 0.9 秒右上下文。模型使用 separate decoders 分别服务 causal 和 non-causal encoder,以获得更好质量。baseline 总参数约 180M。

MoE 改造主要发生在 cascaded encoder。作者尝试替换 start FFN、end FFN 或两者都替换。最多使用 24 个专家,但每次训练和推理只选 top-2。输入特征为 128 维 log-Mel filterbank,经连续帧堆叠形成 512 维输入,并下采样到 30ms 帧率;训练中使用 SpecAug 增强鲁棒性。

结果与比较

消融实验

首先看 MoE 放在哪里。baseline 平均 WER 为 11.33。把 MoE 放在 start FFN,平均 WER 为 10.10;放在 end FFN,平均 WER 为 9.98;两处都放,平均 WER 最好,为 9.54。不过两处都放会增加推理激活参数。作者最终更多采用 MoE-End,因为它在质量和效率之间更均衡。

专家数量方面,8 experts 的 MoE-End 平均 WER 为 9.98;减少到 4 experts 后为 10.40;减少到 2 experts 后为 10.58。由于推理始终激活 top-2,专家总数减少主要影响总容量而不是激活参数。结果说明,额外专家确实被模型利用了。

MoE 层数也很重要。只在隔层使用 MoE,平均 WER 退到 10.50;只在第一个 Conformer 层使用 MoE,为 10.88。即便只加一个 MoE 层也比 baseline 好,但完整地在 end FFN 位置加入 MoE 才能发挥主要效果。

与 dense baseline 和 adapter 比较

与 180M baseline 相比,MoE-End 模型总参数约 400M,推理激活约 211M,平均 WER 从 11.33 降到 9.98。为了排除“只是模型变大”的因素,作者构造了一个同为 400M 的大 dense baseline。这个 dense 模型平均 WER 也是 9.98,但推理需要激活 400M 参数;MoE 只激活 211M,约为 dense 的 53%。

与基于 ground-truth language information 的 adapter 模型相比,MoE 的意义更明显。Adapter 模型依赖真实语言信息选择对应模块;MoE 不需要语言标签,只根据输入动态路由。把 FFN multiplier 调小并增加专家数后,16 或 24 experts 的 MoE 在平均 WER 上接近 adapter,但部署上少了语言信息依赖。

Shallow Fusion 进一步提升

作者还训练了一个 128M 左右的多语种 neural LM,并在解码时做 shallow fusion。文本数据来自 12 种语言的监督训练文本和额外 text-only 数据。加入 LM 后,MoE 模型平均 WER 从 9.98 进一步降到 9.68,约 3% 相对改善。

不过改善并非所有语言都一致。法语收益最大,中文和印地语出现退化。作者推测,中文退化可能与 text-only 数据里混入粤语转写有关;印地语则可能因为 text-only 数据规模很大但与 Search 域不完全匹配,需要更好的过滤策略。

结论:MoE 的部署价值在于“不需要语言标签”

这篇论文展示了 MoE 在流式多语种 ASR 中的一个清晰用途:用更大的总容量提升多语种识别质量,同时通过 top-2 稀疏激活控制推理成本。最重要的是,模型不依赖语言标签完成专家选择,这比 adapter 或 per-language expert 在真实部署中更省心。

从结果看,MoE-End 相对于 baseline 有 11.9% 平均相对 WER 改善;与同规模 dense 模型相比,达到类似质量但只激活约 53% 参数;与语言标签 adapter 相比,质量接近但路由更自动。对端侧、流式、多语种这三个约束同时存在的场景,这种“动态容量”思路很值得继续跟进。

快手论文:Parameter-Efficient Conformers,利用MOE进行模型裁剪

这篇论文 Parameter-Efficient Conformers via Sharing Sparsely-Gated Experts for End-to-End Speech Recognition 关注一个非常实际的问题:Conformer 在端到端语音识别里效果很好,但模型层数和参数量上来之后,训练、部署、端侧运行都会变重。作者的思路不是简单砍层,也不是只做普通的参数共享,而是把“共享 Conformer 块”和“稀疏门控专家”结合起来,让少量参数被重复使用,同时用 MoE 保住表示容量。

摘要:少参数,不想少能力

论文的核心目标是构造一个参数高效的 Conformer 编码器。传统跨层权重共享可以减少参数,但也会压缩模型容量,导致识别性能下降。作者提出的方案是在共享的 Conformer 块中加入 sparsely-gated MoE:第二个前馈网络不再是单一路径,而是一组专家,由路由器选择其中一个专家参与计算。这样总参数增加了一些,但每次前向只激活一个专家,计算量基本保持在非 MoE 模型的水平。

为了让共享块在不同深度位置仍能适配不同层级的表示,论文还让路由器和归一化层保持独立,而不是所有内容都共享。最后,作者用全参数模型作为 teacher,通过隐藏层表示的知识蒸馏进一步弥补共享模型的能力损失。实验显示,在 AISHELL-1 上,最终模型用约三分之一的编码器参数取得了接近全参数模型的 CER。

引言:Conformer 很强,但部署不轻

端到端 ASR 中,Transformer 和 Conformer 已经是很常见的编码器选择。Conformer 在 Transformer 的全局建模基础上加入卷积模块,更适合语音这种既有长程依赖、又有局部结构的序列。相对位置编码、Macaron 风格 FFN、卷积增强等设计,都让它在语音识别中表现稳定。

问题在于,这类模型往往参数冗余。直接堆很多层可以换来更强表达,但也带来显存、存储和推理成本。已有工作会通过跨层共享参数降低模型规模,类似让同一个 block 被重复调用多次。这个办法省参数,但副作用也明显:自由参数少了,模型容量下降,性能容易掉。

作者的切入点是:既然共享会损失容量,那就在共享块内部引入 MoE 来补容量;既然 MoE 可以稀疏激活,那就只让少数专家参与一次前向,避免计算量跟着总参数线性增长。这个组合特别适合“参数少、计算不能太贵”的场景。

背景:Conformer Seq2Seq ASR

论文使用的是 attention-based encoder-decoder 框架。编码器把声学特征序列变成高层表示,解码器按 token 逐步生成文本序列,训练时优化负对数似然,推理时用 beam search 找更可能的输出。

论文中先把 AED 的逐 token 预测概率写成下面这个形式,其中 y<s 表示当前位置之前的 token 前缀:

\( P(y_s \mid y_{<s}, x)=\mathrm{Trfm}(y_{<s},x) \)

对应的最大似然训练目标,也就是负对数似然损失为:

\( L_{\mathrm{nll}}(\theta)=-\frac{1}{S}\sum_{s=1}^{S}\log P(y_s\mid y_{<s},x) \)

Conformer 块由两个 FFN、一个多头自注意力模块和一个卷积模块组成。两个 FFN 采用半步残差风格,注意力负责长程依赖,卷积负责局部模式。本文的 MoE 改造发生在第二个 FFN:作者把它替换成一个稀疏门控的专家集合,也就是 MoE-Conformer block。

论文把一个 MoE-Conformer block 的计算写成四步。最后一步中,第二个 FFN 被替换成 MoE 版本:

\( \begin{aligned} z_t^{(1)} &= z_t + \frac{1}{2}\mathrm{FFN}(z_t),\\ z_t^{(2)} &= z_t^{(1)} + \mathrm{MHSA}(z_t^{(1)}),\\ z_t^{(3)} &= z_t^{(2)} + \mathrm{Conv}(z_t^{(2)}),\\ \hat{z}_t &= \mathrm{LayerNorm}\left(z_t^{(3)}+\frac{1}{2}\mathrm{FFN}^{(\mathrm{MoE})}(z_t^{(3)})\right). \end{aligned} \)

方法:共享稀疏门控专家

Conformer 参数共享

作者把连续的 C 个 Conformer 块看作一组,再堆叠 G 组。不同组中相同位置的块共享参数,相当于一组块被递归调用 G 次。这样做的好处很直接:如果想要 12 次变换,不一定真的保存 12 套编码器参数,可以用更少的块反复计算。

但是共享不是白来的。共享块在浅层和深层面对的表示分布不一样,如果完全用同一套参数、同一套路由、同一套归一化统计,模型会很难同时适配不同深度的表示。因此后面两个设计,也就是独立路由器和独立归一化,就变得很关键。

MoE 动态路由

MoE 模块由 E 个并行 FFN 专家和一个 router 组成。对每个时间步的表示,router 输出各专家的概率,论文采用 top-1 选择,只激活得分最高的专家。也就是说,虽然模型里存着多个专家参数,但每次计算只走其中一个 FFN。

top-1 MoE 的路由过程如下。router 先产生各 expert 的 gate 分数,再选择最大分数对应的 expert:

\( \begin{aligned} g &= [g_0,\cdots,g_{E-1}]=\mathrm{softmax}(\mathrm{router}(z_t^{(3)})),\\ i^* &= \arg\max_{0\le i\le E-1} g_i,\\ \mathrm{FFN}^{(\mathrm{MoE})}(z_t^{(3)}) &= g_{i^*}\mathrm{FFN}_{i^*}(z_t^{(3)}). \end{aligned} \)

这个设计把“容量”和“计算”部分解耦:总参数更多,潜在表达空间更大;但激活参数不增加太多,推理计算仍接近普通 FFN。为了避免所有样本都挤向同一个专家,作者加入 load balancing loss,同时在训练时给 router 加高斯噪声,让专家选择更分散。

负载均衡损失用于鼓励 expert 被更均匀地使用:

\( L_{\mathrm{balance}}=E\sum_{i=0}^{E-1}f_i\bar{g}_i \)

独立路由器与归一化

论文没有把所有 MoE router 都一起共享,而是让每个 MoE 模块拥有自己的 router。直觉上,同一个共享块在第 1 次、第 6 次、第 12 次递归调用时,输入表示已经处在不同层级;如果路由路径完全一致,就会限制专家选择的灵活性。

归一化层也类似。LayerNorm、BatchNorm 的统计和缩放偏移参数对表示分布很敏感。作者让归一化模块保持独立,使不同层级的表示能够维持各自合适的统计状态。论文还把归一化中的 scale 和 offset 看作一种轻量 adapter,用很少参数增强共享块的适配能力。

隐藏层知识蒸馏

共享模型再聪明,毕竟参数少。作者用全参数 Conformer 编码器作为 teacher,让共享模型的编码器输出尽量接近 teacher 的隐藏表示。这里不是只蒸馏最终预测分布,而是直接约束隐藏 embedding 的 L2 距离。这样做的目的,是让小模型学习 full model 的中间表征轨迹。

hidden embedding 蒸馏损失直接约束 student encoder 输出 h_t 与 teacher encoder 输出 h_t' 的距离:

\( L_{\mathrm{kd}}=\frac{1}{T}\sum_{t=0}^{T-1}\lVert h_t-h_t’\rVert_2 \)

训练目标

最终损失由三部分组成:主任务的负对数似然、MoE 的负载均衡损失、隐藏层知识蒸馏损失。负载均衡项负责让专家不塌缩,蒸馏项负责让共享模型贴近全参数 teacher。论文还在实验中加入 CTC loss 来辅助对齐。

\( L=L_{\mathrm{nll}}+\frac{\alpha}{C}\sum L_{\mathrm{balance}}+\beta L_{\mathrm{kd}} \)

这里 C 是 MoE module 的数量,αβ 分别控制负载均衡损失与蒸馏损失的权重。

与已有工作的关系

MoE 常被用来扩大模型容量,尤其是在 NLP 大模型里,通过条件计算扩展到很大的参数规模。但这篇论文不是追求超大规模,而是把 MoE 当作参数高效工具:共享专家、重复使用专家,让少量模块发挥更大作用。

跨层权重共享也不是新想法,ALBERT、Universal Transformer 以及若干 ASR 工作都用过类似机制。本文的不同点在于,它没有只做朴素共享,而是在共享结构里加入稀疏专家,同时让 router 和 normalization 独立,从而减少共享带来的容量和分布适配问题。

实验:

实验设置

实验使用 AISHELL-1 普通话语音识别数据集:约 150 小时训练语音、18 小时开发集、10 小时测试集。输入特征为 80 维 FBANK,窗口 25ms、步长 10ms,并使用全局 CMVN、速度扰动、SpecAugmentation 和 time stretch 等增强手段。词表包含 4235 个中文字符以及起止符号。

模型前端是两层 CNN subsampling,把帧率降到 25Hz。编码器维度为 256,MHSA 使用 4 个头,卷积核大小 15,FFN 中间维度 1024。MoE-Conformer 的第二个 FFN 使用 4 个专家,解码器是 4 层 Transformer。训练 80 个 epoch,使用 PyTorch 和 FastMoE 实现。

结果与分析

主表里,全参数 C12 编码器参数量为 21.58M,测试集 CER 为 4.93。最终的 C2-MoE4-G6-KD 只有 6.95M 编码器参数,测试集 CER 为 5.03。换句话说,它用大约三分之一的编码器参数,做到了非常接近 full-parameter 模型的结果。

消融实验显示,单独减少块数会明显损伤效果,例如 C2 的测试 CER 为 6.50;加入 MoE 后,C2-MoE4 降到 6.22,说明专家机制确实补了一部分容量。再加入跨层共享递归计算后,C2-G6 为 5.62,而 C2-MoE4-G6 达到 5.08,说明“共享 + MoE”的组合比任一单独机制更有价值。

独立路由器和归一化的作用也很明显。C2-MoE4-G6 如果全部共享,测试 CER 为 6.00;只让归一化独立,降到 5.21;归一化和 router 都独立后,进一步到 5.08。这说明共享模型最怕的不是参数少本身,而是不同深度表示被迫使用完全相同的适配路径。

知识蒸馏带来的提升相对温和,但在 C2-MoE4-G6 上仍把测试 CER 从 5.08 推到 5.03。作者还通过输入输出 L2 距离观察模型内部变化:带独立 router 和 normalization 的共享模型更接近全参数 C12 的变化曲线,而全共享模型曲线更不稳定。

结论与未来方向

这篇论文的价值在于,它给出了一个较完整的参数高效 Conformer 方案:用跨层共享压缩参数,用稀疏 MoE 恢复容量,用独立路由器和归一化适配不同深度表示,再用隐藏层蒸馏补齐小模型表现。最终模型在 AISHELL-1 上以约三分之一编码器参数接近全参数模型。

它也留下了自然的后续问题:方法是否能在更大规模、多语种或更复杂的 ASR 数据集上保持优势?能否迁移到 RNN-T、CTC 或其他端到端 ASR 架构?从工程角度看,这类方案的吸引力很强,因为它不是单纯追求小模型,而是在“参数、计算、表达容量”之间做更细的拆分。

MoEAdapter for Large Audio Language Models: Sparsity, Disentanglement, and Gradient-Conflict-Free

这篇论文 MoE Adapter for Large Audio Language Models: Sparsity, Disentanglement, and Gradient-Conflict-Free 的问题意识很明确:大语言模型要理解真实世界,不能只看文本,音频是很重要的输入模态。但音频并不是一种均匀信号。语音、音乐、环境声承载的信息结构不同,如果用一个 dense adapter 把所有音频都压进同一个文本 embedding 空间,很容易出现参数更新方向互相冲突。

摘要:用专家分工处理异质音频

论文提出 MoE-Adapter,用稀疏 Mixture-of-Experts 替代传统的 dense audio adapter。它不是让所有音频 token 都通过同一套 FFN,而是用动态门控把 token 路由到若干专门专家,同时保留一定共享能力来捕捉全局上下文。这样,语音、音乐、环境声等不同属性可以在不同专家子空间中被建模,从而减轻梯度冲突。

实验基于 Qwen3-1.7B 骨干,音频前端使用 Whisper-VQ tokenizer 和 Whisper Encoder。作者在相同参数预算下比较 dense adapter 和 MoE-Adapter:两者总参数约 94.4M,但 MoE 因稀疏激活,推理时只激活约 70.8M 参数。结果显示,MoE-Adapter 在 MMSU、OBQA、MMAU 等音频理解和推理任务上均优于 dense baseline,并减少音频输入与文本输入之间的 modality gap。

引言:音频不是一种单一分布

大语言模型在文本推理上已经非常强,但只处理文本会限制它们感知现实世界的能力。音频包含人类说话、环境声音、音乐和情绪韵律等信息,是多模态智能绕不开的一环。当前许多大音频语言模型的主流做法,是加一个 adapter,把声学特征投影到 LLM 的文本语义空间里。

问题在于,很多 adapter 是 dense、参数共享的:所有音频都经过同一套投影层。这隐含一个假设,即不同音频类型可以被同一种映射均匀处理。作者认为这个假设过强。语音主要承载语义和语言结构,音乐更关注节奏、旋律和情感,环境声又有自己的声学模式。它们在表示空间中可能位于不同流形。

如果一个 dense adapter 同时学习这些相互差异很大的目标,不同数据类型的梯度可能朝相反方向更新同一组参数。这就是论文强调的 gradient conflict。MoE-Adapter 的贡献,就是用动态专家路由把这些冲突拆开:相似属性共享专家,冲突属性进入不同专家。

相关工作

大音频语言模型

早期音频问答或语音交互系统常采用级联管线:先 ASR 转文字,再交给 LLM。这样的系统容易受到识别错误传播影响,也会丢失语调、情绪、音乐和环境声等非文字信息。后来的端到端 LALM 通过可学习 adapter,把声学特征映射到文本空间,让 LLM 直接条件化在音频表示上。

现有 adapter 大致分为 Q-Former 类和 linear projector / MLP projector 类。后者结构简单、效率高,因此被许多最新模型采用。但这种全局共享投影层难以面对音频内部的分布差异。本文正是针对这个瓶颈,把稀疏 MoE 引入 audio-text alignment 阶段。

MoE 架构

MoE 的基本思想是让不同专家处理不同样本或不同 token,通过稀疏门控实现条件计算。它已经在语言模型、多模态模型、视觉语言模型等方向证明了对异质数据和任务冲突的缓解能力。音频领域也开始出现 MoE 相关工作,例如生成、医疗音频特征选择等。

不过,在通用 audio-text alignment 这个环节,主流 LALM 仍大量依赖静态、共享参数 adapter。本文的 MoE-Adapter 不只是借用 MoE 扩容量,而是把 MoE 作为一种“解耦工具”,专门处理音频属性之间的冲突。

方法

整体框架

模型采用类似 Kimi-Audio 的 dual-stream 音频前端:一条路径用冻结 tokenizer 提取离散语义 token,另一条路径用 speech encoder 提取连续声学特征。两类表示经过投影和融合后,进入 adapter。

传统方案会用 dense adapter 把融合音频特征映射到 LLM embedding 空间。本文则用 MoE-Adapter 完成这一步。最终,adapted audio embeddings 与文本 token embeddings 拼接,作为 LLM 的输入,并用标准自回归 next-token prediction 训练。

稀疏 MoE Adapter

Dense adapter 可以看作一个单体 FFN:所有音频 token 都通过同一组权重。作者指出,这种设计强制同一组参数同时容纳异质音频,会形成不必要的优化干扰。

论文先把 dense adapter 写成单体 FFN 投影。给定音频 token x,输出 embedding 为:

\( y=\mathcal{N}\left(W_{d2}\cdot\sigma\left(W_{d1}\cdot\mathcal{N}(x)\right)\right) \)

MoE-Adapter 把单体 FFN 替换成专家集合。每个专家都是轻量 FFN,router 根据输入 token 计算各专家得分,并通过 Top-k 选择保留若干活跃专家。被选中的专家输出按门控权重聚合,形成中间表示。随后再经过输出投影和 LayerNorm,对齐到 LLM embedding 维度,用来替换输入序列中的音频占位 token。

每个 expert 本身也是一个轻量 FFN:

\( E_i(x)=W_{e2}^{(i)}\cdot\phi\left(W_{e1}^{(i)}\cdot\mathcal{N}(x)\right) \)

router 根据 logits s=xW_g 做 Top-k 稀疏选择,再 softmax 得到门控概率:

\( G(x)=\mathrm{softmax}\left(T_k(s)\right),\quad s=xW_g \)

被选中的 expert 输出按 gate 权重聚合,并经过最终投影对齐到 LLM embedding 空间:

\( h_{\mathrm{MoE}}=\sum_{i\in I}G(x)_i\cdot E_i(x) \) \( y_{\mathrm{MoE}}=\mathcal{N}\left(W_P\cdot h_{\mathrm{MoE}}\right) \)

这套机制有两个效果:一是稀疏激活降低推理成本,二是专家分工让不同音频属性进入不同子空间。对于语音、音乐、环境声这种天然异质输入,第二点尤其重要。

训练目标

训练目标由 next-token prediction loss 和 auxiliary load-balancing loss 组成。前者让模型基于音频上下文预测后续文本 token,是主任务;后者用于避免 expert collapse,即所有 token 都涌向少数专家。

总训练目标为 next-token prediction 与负载均衡项的加权和:

\( L=L_{\mathrm{NTP}}+\lambda L_{\mathrm{aux}} \)

其中主任务 NTP loss 写成:

\( L_{\mathrm{NTP}}=-\sum_{t=1}^{T}\log P(y_t\mid y_{<t},X;\theta) \)

负载均衡损失会同时考虑专家的重要性和实际负载,让不同专家都被充分训练。这里有一个微妙的取舍:过强的均衡可能压制某些自然形成的专家偏好,但完全不均衡又会损害高层语义推理的泛化。论文后面的消融和分析专门讨论了这个矛盾。

论文将 expert importance 与 expert load 分别定义为:

\( \bar{P}_e=\frac{1}{B}\sum_{b=1}^{B}p_{b,e} \) \( \bar{f}_e=\frac{1}{B}\sum_{b=1}^{B}r_{b,e} \)

最终 auxiliary loss 为:

\( L_{\mathrm{aux}}=|\mathcal{E}_R|\sum_{e\in\mathcal{E}_R}\bar{P}_e\cdot\bar{f}_e \)

实验

实验设置

LLM 骨干是 Qwen3-1.7B,音频前端使用 Whisper-VQ tokenizer 和 Whisper Encoder。训练语料规模为 40B token,优化器为 AdamW,学习率调度采用 Warmup-Stable-Decay。为了公平比较,dense adapter 与 MoE-Adapter 的总参数预算都限制在约 94.4M。

评测覆盖几类能力。MMAU 用于音频感知和副语言理解,覆盖 speech、sound、music 等场景;VoiceBench 中的 MMSU 和 OpenBookQA 子集用于世界知识和语义推理,它们是从文本推理基准改造来的音频版本。所有评测采用 greedy decoding,避免采样随机性干扰比较。

主结果

在知识推理任务上,MoE-Adapter 明显超过 dense baseline。MMSU 的 audio accuracy 从 35.03 提升到 38.19,OBQA 从 50.10 提升到 53.85。对比文本输入准确率,音频输入仍存在明显 gap,但 MoE 把这个差距分别缩小了约 3.16 和 3.75 个点。

在 MMAU 这类副语言和音频感知任务上,MoE-Adapter 也从 59.79 提升到 61.50。这个提升说明专家路由不仅对知识推理有用,也能帮助模型捕捉更复杂的声学线索。论文强调,MoE 的收益不是单纯参数变多,而是在相近总参数预算下更合理地分配表示能力。

消融实验

专家配置方面,默认的 “8 choose 4” 表现最均衡:MMAU 61.50、MMSU 38.19、OBQA 53.85。把专家数扩大到 “16 choose 4” 反而变差,说明专家总数不是越多越好。把路由变得过稀疏,例如 “8 choose 1”,也会显著伤害音频推理。论文的结论是,专家数量、激活数量和专家容量之间需要平衡,而不是盲目扩某一个维度。

负载均衡损失的消融更有意思。去掉 EBL 后,MMAU 从 61.50 升到 63.01,但 MMSU 和 OBQA 分别下降到 37.37 和 52.31。作者解释说,MMAU 很异质且含有大量低层声学感知样本,不加均衡时 router 会集中使用少数“强专家”,反而有利于这类感知任务;但这会减少专家多样性,损害需要世界知识和语义推理的任务

专家分工与优化动态分析

专家均衡如何影响路由

作者在 MMAU 上分析 speech、sound、music 三类样本的专家激活热力图。结果显示,模型确实学出了模态相关的专家分工:有些专家主要服务单一类别,有些专家在 sound 与 speech 或 sound 与 music 之间共享。值得注意的是,几乎没有专家同时专门服务 speech 和 music。

这个现象符合直觉:环境 sound 和 speech/music 都可能共享一些低层声学特征,因此可以作为“桥”;但 speech 和 music 在时间结构、语义组织上差异更大,不适合强行塞进同一个专家。EBL 并不会消灭这种分工,而是防止少数专家过度支配,保留一定均衡。

梯度冲突与缓解机制

论文用两个指标分析优化过程。第一个是不同音频类别梯度之间的 cosine similarity。dense adapter 中,不同类别的梯度经常出现负相似度,意味着一个类别的更新方向可能伤害另一个类别。MoE-Adapter 则把这些相似度推向更正的方向,说明专家路由减少了破坏性干扰。

第二个是 gradient influence score,用来衡量基于某一任务梯度做更新后,对另一个任务损失是帮助还是伤害。dense adapter 中,speech 的更新会明显伤害 music 和 sound;MoE-Adapter 中,影响分数更多为正,说明它不是简单隔离任务,还能通过共享专家保留有益迁移。例如 speech 对 sound 的更新可以产生正向帮助,而 music 的冲突被更好地隔开。

结论

这篇论文把 MoE-Adapter 定位为解决 LALM 音频异质性的结构工具。相比 dense adapter,它用动态专家分工缓解语音、音乐、环境声之间的梯度冲突,在相近参数预算下提升音频知识推理、副语言理解和跨模态对齐表现。更重要的是,论文不仅给出指标提升,也通过路由热力图、梯度相似度和影响分数解释了为什么 MoE 有效。

局限性

作者也明确指出了几个限制。第一,实验目前只在 Qwen3-1.7B 骨干上验证,方法是否适用于其他 LLM 家族或更大规模模型,例如 70B,还需要实验。第二,论文没有系统研究稀疏路由随训练数据规模增长的 scaling law。第三,当前任务集中在音频理解与推理,没有扩展到生成式音频任务。

附录:超参数和工程含义

附录强调,dense baseline 与 MoE-Adapter 在总参数预算上被严格对齐,约为 94.4M。MoE-Adapter 的活跃参数约为 70.8M,大约是 dense baseline 的 75%。共同音频前端包含 speech encoder、audio hidden projection 和 feature fusion;MoE 端则包含专家集合、gate network 和 aggregation block。

从工程角度看,这个设置很关键。它把论文的结论从“MoE 参数更多所以更强”拉回到“在可比预算下,稀疏专家分工更适合异质音频”。如果未来大音频语言模型要同时处理语音问答、环境声推理、音乐理解和情绪韵律,adapter 层可能不该再是一个单体投影器,而应该具备更细粒度的路由和分工能力。

Mega-ASR 面向“全场景复杂环境”高噪语音识别

Mega-ASR 是一个专门解决”真实世界语音识别翻车”问题的开源框架——它用涵盖54种噪声、回声、丢帧等复合场景的240万条数据训练,让模型在嘈杂现实环境下的词错误率降低30%+,同时大幅减少”听没了”和”乱编内容”这两种高频故障。解决的核心问题是:在各种嘈杂、失真、回声、断连的现实场景下,尽可能准确地把语音转成文字。模型基于 Qwen3-ASR-1.7B进行后训练,通过一套专门设计的数据集和训练方法来强化”恶劣环境下的识别能力”。

一、ASR 在「现实世界环境」为什么不行?

  • 场景覆盖太窄:只解决噪音 / 远场单一问题,真实环境是复合干扰(噪音 + 混响 + 丢包一起上)。
  • 复合鲁棒性缺失: 缺乏对复杂环境的适应性,现实世界中的环境往往是多种因素共同作用的结果,很少模型能同时扛住多种失真叠加。
  • 训练与真实不匹配:训练数据太简单(WER 4%–10%),遇到高难度场景(WER>30%)直接崩

二、数据:Voices-in-the-Wild-2M

大规模、高难度、物理合理的复合声学仿真数据集

现有语音数据集的 3 大致命问题:

  1. 只覆盖单一干扰:噪音 / 混响 / 远场分开做,不模拟真实复合环境
  2. 难度太 “温柔”:平均 WER 只有 4%–10%,训练不出强鲁棒模型
  3. 真实录音太少太贵:收集覆盖所有场景的真实录音成本极高、不可扩

为了推动这一更具挑战性场景下的研究,提出了 Voices-in-the-Wild-2M,一个基于频谱级代码驱动仿真(spectrogram-level code-based simulation)构建的大规模数据集。这种设计使得超大规模数据生成成为可能。

首先识别并定义了 7 类经典的现实声学效应,这些基础效应用于模拟各种物理环境或设备引起的退化现象:

真实退化现象对应 Primitive
背景噪声Additive Noise
延迟反射Echo Delay
房间混响Reverberation
削波失真Nonlinear Distortion
带宽受限Resampling
高频衰减Spectral Filtering
音量不一致Loudness Transformation
丢包/卡顿Frame-level Stutter

设计了专门的频谱处理流水线,持续调整仿真参数,并利用 Qwen3-ASR 的监督微调(SFT)结果进行验证,直到模拟器在真实数据上的表现达到最佳拟合效果。

将这些原子效应组合成 54 种经过 Agent 验证的复杂声学配置,最终生成了 240 万条(2.4M)合成语音样本

与直接枚举各种复杂真实环境不同,将野外环境(in-the-wild)中的语音退化过程划分为三个层级:

  • Primitive Acoustic Effects(基础声学效应)
  • Atomic Acoustic Effects(原子声学效应)
  • Compound Acoustic Scenarios(复合声学场景)

第一层:Primitive Acoustic Effects(基础声学效应)

用 DSP 手段实现最基本的声学退化组件

原子效应核心基元组合模拟真实场景
噪声(Noise)加性噪声 + 响度归一街道、咖啡馆、车内、人群
远场(Far-field)混响 + 低通滤波 + 响度衰减远距离说话、智能音箱远场
遮挡(Obstructed)低通滤波 + 混响 + 衰减隔门、隔窗、口罩、墙后说话
回声 + 混响(Echo&Reverb)强混响 + 回声 + 高通大厅、车库、体育馆、空旷房间
录制染色(Recording)重采样 + 噪声 + 双带通滤波手机外放再录制、设备串音
电子失真(Electronic Distortion)非线性失真 + 低通麦克风过载、削波、劣质录音
传输丢包(Transmission Dropout)帧卡顿 + 响度归一网络丢包、蓝牙不稳、流媒体卡顿

第二层:Atomic Acoustic Effects(原子声学效应)

在中间层,我们利用上述 Primitive Effects 构建了 7 种原子声学效应

Atomic Effect中文
Noise噪声环境
Far-field远场录音
Obstructed遮挡语音
Echo & Reverb回声与混响
Recording录音链路效应
Electronic Distortion电子失真
Transmission Dropout传输丢失

一个 Atomic Effect 并不一定只对应一个 Primitive Effect。而是一个主导 Primitive + 若干辅助 Primitive。

比如:Far-field(远场)真实远场录音不仅仅是声音变小。通常同时具有:

  • 声压衰减(Loudness)
  • 高频损失(Spectral Filtering)
  • 房间混响(Reverb)

第三层:Compound Acoustic Scenarios(复合声学场景)

最高层将多个 Atomic Effects 进行组合,比如视频会议

Far-field + Echo&Reverb + Recording

无论构建 Atomic Effect 还是 Compound Scenario,都保持 Primitive Effect 的固定执行顺序。为的是避免物理上不合理的处理链

关键创新:不是随机乱组合,而是按物理规则合成

组合规则(保证真实不违和)

  • 锚点效应(3 种):远场 / 回声混响 / 遮挡(互斥,不同时出现)
  • 修饰效应(4 种):噪声 / 录制染色 / 电子失真 / 丢包(可叠加)

为了让难度 “均匀且可学习”,团队设计了全局 severity 参数 m ∈ [0,1]

  • 同一个音频里,所有失真共用一个 m
  • 保证:要么整体简单,要么整体难,不会出现 “强混响 + 零噪音” 这种不自然组合

最终选用 Linear 线性分布

  • 简单、中等、困难样本均匀覆盖
  • 训练最稳定、泛化最强

严格过滤保证可学习

  • 剔除 WER > 70% 的样本(太难学不动)
  • 保留物理合理组合
  • 统一响度、统一格式、对齐标注

三、Mega-ASR

 Qwen3-ASR 的基础上开发了 Mega-ASR-Base 模型

1. A2S-SFT:从声学 → 语义递进微调

解决:高失真下「听不清 → 猜不对」的连锁崩溃。分三阶段训练:

  1. 声学感知阶段:编码器 + 对齐器,按难度递进(WER<30% → <50% → <70%)
  2. 语义恢复阶段:冻结声学,只微调 LLM,学会从残缺信号还原语义
  3. 联合对齐阶段:全模块一起微调,声学与语义对齐

2. DG-WGPO:双粒度 WER 门控策略优化

解决:普通 WER 奖励在高失真下失效(只看词错,不管语义崩没崩)。设计两套奖励,按 WER 动态切换:

  • 低 WER(<30%):侧重词级别精细修正(软错误 / 硬错误区分)
  • 高 WER(≥30%):侧重句子级结构恢复(主干语义、长度、最长公共子串)

最终奖励 = 基础规则奖励 + 双粒度动态奖励

3. 环境感知路由(Router)

解决:鲁棒模型在干净音频上略有下降。

  • 训练一个轻量二分类器,判断音频是否恶劣
  • 恶劣 → 走 Mega-ASR
  • 干净 → 走原生 Qwen3-ASR
  • 推理开销 <1%,几乎无感

三、Experiments

Main results 

采用自适应路由的通用 ASR 性能具有竞争力:MEGA-ASR 在干净语音和多语言基准测试上,相较于 Qwen3-ASR、Seed-ASR 和 Kimi-Audio 仍保持极强的竞争力。

声学扰动条件下达到当前最佳鲁棒性:相较于最强基线 Qwen3-ASR,MEGA-ASR 的错误率进一步降低了 17.4%;相较于 Gemini-3-Flash,则降低了 64.5%

在组合式真实环境中的鲁棒性表现更优

在 Voices-in-the-Wild-Bench 基准测试中,MEGA-ASR 在多种真实世界退化条件下均取得了最佳性能,包括:

  • 混合退化(mixed degradations)
  • 远场语音(far-field speech)
  • 录音伪影与设备缺陷(recording artifacts)

Analysis

通过消融实验,我们总结出五个关键观察([Obs.1]–[Obs.5]),涵盖了语义层面收益、训练策略、奖励函数设计以及超参数敏感性等方面。相关证据分别来自表 5–9。下面对各项发现进行详细说明。

[Obs.1] MEGA-ASR 的收益不仅体现在 WER 上,也体现在语义层面指标上

表 7 显示,相比 Qwen3-ASR,MEGA-ASR 在语义层面指标上也取得了持续提升:

  • 漏识内容(Missed Content)从 14.2 降低到 5.9

这表明,MEGA-ASR 的改进不仅仅是降低词错误率(WER),还带来了更高层次的语义和整体理解能力提升,例如:

  • 减少幻觉(Hallucination);
  • 减少整句或整段语音遗漏(Dropped Utterances);

因此,MEGA-ASR 实现的是语义层面和整体层面的质量提升,而不仅是字词级别的识别优化。

[Obs.2] A2S-SFT 与 DG-WGPO 组件的消融分析

在 Voices 和 Noizeus 数据集上,对 A2S-SFT 各阶段以及 DG-WGPO 各组成部分进行了消融实验(表 5)。

  • 分阶段的“声学到语义(Acoustic-to-Semantic)适配”过程是有效且必要的。
  • DAPO 作为强化学习阶段的基础优化框架。
  • 句子级重构奖励对于中高错误率样本尤为关键。

[Obs.3] 基于规则的奖励函数与 LLM Judge 效果相当,但训练成本降低 3.2 倍

规则奖励已经能够充分捕获 LLM Judge 所提供的监督信号。

[Obs.4] 超参数消融实验

动态门控权重 αdyn 语义奖励权重 αs对模型性能的影响(表 8)

αdyn 所控制的权衡关系远比 αs 更敏感。

最终采用:

(αdyn, αs) = (0.6, 0.4)

因为它在所有测试子集上都达到最佳或接近最佳表现。

[Obs.5] 门控阈值 τ 的影响

过高的门控阈值会使门控机制过于严格(over-restrictive gating),从而限制奖励信号的有效传播,最终导致识别性能下降。

通过消融实验,得到以下核心结论:

  1. MEGA-ASR 的收益不仅体现在 WER,还体现在语义完整性与内容保真度上。
  2. A2S-SFT 的渐进式声学→语义适配以及 DG-WGPO 的各奖励组件均对性能提升至关重要。
  3. 规则奖励能够以接近 LLM Judge 的效果实现训练,同时将计算成本降低 3.2 倍。
  4. 动态门控权重 αdyn 是最敏感的超参数,最佳设置为 0.6。
  5. 门控阈值 τ=0.3 能在不同场景下取得最均衡的鲁棒性表现。

NIM4-ASR: 高效鲁棒可定制的实时LLM语音识别

paper: https://arxiv.org/abs/2604.18105

面向生产部署的 LLM-ASR 框架,系统解决轻量化、幻觉抑制、热词定制三大痛点。基于 phoneme-level encoder 预训练减少模态差距,引入 Iterative Asynchronous SFT(IA-SFT)防止 representation drift,设计 ASR 专用 RL 提升识别质量,并以 phoneme RAG 实现百万量级热词定制。

音频 → 600M Conformer Encoder(phoneme CTC 预训练,CKA 监控 drift)
                    ├── 流式:dynamic-chunk mechanism(预训练期内嵌)
                    └── phoneme CTC head → 音素假设
         MLP Adapter(4x 下采样,160ms/token)
                    ↓
              Qwen3-1.7B(LLM 解码器)
                    ↑
         Phoneme RAG:音素假设 → 检索热词数据库(<1ms)→ Prompt 注入

训练 pipeline:
    Stage1: Encoder 预训练(phoneme CTC,CR-CTC)
    Stage2: Alignment(仅训练 Adapter,冻结其余)
    Stage3: IA-SFT(异步并行,CKA 监控 encoder 稳定性)
    Stage4+5: Late Joint SFT + Context SFT + ASR-RL

Challenge

1、Limited downward scalability

在实际部署中,尤其是实时语音交互场景下,轻量级 ASR 模型由于推理延迟更低、计算成本更小因此更受青睐。然而,基于 LLM 的 ASR 在模型缩小后的性能表现并不理想:比如Qwen3-ASR-0.6B、Fun-ASR-nano这类轻量版本相比完整大模型存在明显性能差距。除了模型缩小本身带来的性能下降外,LLM-ASR 还额外承担了一种:模态税(modality tax),

即:模型中有相当一部分参数并不是直接用于 ASR 任务,而是用于跨模态对齐(cross-modal alignment)。这种结构性开销会导致轻量 LLM 真正可用于 ASR 的有效容量更少,从而带来不成比例的性能下降。

2、幻觉问题(Hallucination)

除了自回归 LLM 天生存在的 hallucination(幻觉)问题之外,encoder–adaptor–LLM 联合训练范式还会引入额外风险。

在联合优化过程中由于:LLM 梯度更强、LLM 语言先验更强。 encoder 会逐渐被拉向LLM 的优化目标,导致 encoder 的表示逐渐偏移到 LLM 的文本特征空间,称之为representation drift(表示漂移),导致encoder 会越来越依赖语言捷径(linguistic shortcuts)而不是精细声学信息(fine-grained acoustic fidelity)。在噪声、发音模糊、音频不清晰的声学歧义场景下会加重幻觉问题。

3、缺乏工业级热词定制能力(Lack of production-ready hotword customization)

为了解决上述问题,提出了面向工业部署的 LLM-ASR 框架 NIM4-ASR,重点优化推理效率和系统鲁棒性。

  • 提出了一种基于原则的多阶段训练范式
  • 优化了流式处理支持
  • 音素级 RAG 用于热词定制

Methodology

Model

encoder–adaptor–LLM 架构

1、音频特征提取

80 维 log-Mel 频谱,窗长(window):25 ms 帧移(frame shift):10 ms,全局均值方差归一化

2、Streaming speech encoder

编码器采用FireRedASR-AED Conformer,一个 4 倍下采样卷积模块 多层 Conformer Block 堆叠,输出帧率 25Hz,为了支持流式推理,训练阶段会模拟streaming 约束,将其改造成chunk-based streaming encoder

3、Speech adaptor

两层 MLP,将 encoder 输出映射到 LLM 的 embedding 空间,4倍下采样,将连续 4 帧特征进行拼接,帧率从 25 Hz 降到 6.25 Hz,每个 token 160ms。

4、Phoneme-level CTC head and RAG module

三层 MLP,将 encoder 表示解码为 phoneme hypothesis(音素假设),greedy decoding。RAG 模块会根据这些音素序列检索 hotword 数据库,将热词作为上下文提示注入 prompt

5、LLM decoder: Qwen3-1.7B

Training Recipe

与以往主要依赖经验微调的工作不同,首先对当前基于 LLM 的 ASR 系统的实际局限性及其根本原因进行了系统性的分析  ,结果表明跨模态差距和表征漂移问题仍未得到充分解决。基于这些见解,我们对训练流程进行了全面重新设计。如图 2 所示,NIM4-ASR 的方法论改进主要体现在四个核心训练阶段:编码器预训练、对齐、IA-SFT 和后期联合 SFT。除了这四个阶段的流程之外,我们在后期联合 SFT 之后进一步加入了上下文 SFT 和强化学习(RL),以增强上下文建模和鲁棒性。具体步骤如下所述。

 第一阶段:编码器预训练

为了缩小编码器表征与 LLM 嵌入空间之间的模态差异,采用了一种改进的连接主义时间分类(CTC)变体  ——即 CR-CTC 作为预训练目标。如图 2 所示,预训练期间的模型架构由编码器和 CTC 头组成。与先前工作中常用的基于注意力机制的编码器-解码器(AED) 相比,CTC 鼓励编码器生成低熵、音素区分性强的表征,使其与 LLM 的嵌入空间更自然地对齐,从而减少跨模态对齐的开销,并为自动语音识别(ASR)任务保留更多模型容量

将监督标签从字符级转移到音素级 ,明确地将编码器的容量用于声学到音素的映射,而不是过早地进行语义锚定,同时鼓励语言学习模型(LLM)更多地关注语义推理。这种设计实现了声学建模与语义推理的更清晰解耦,提高了两个模块的角色专业化程度。此外,采用音素预测作为预训练目标,鼓励编码器学习语言依赖性较弱的底层声学表征,从而为扩展到新的语言和方言提供更大的潜力。

为了赋予编码器原生流媒体处理能力,在预训练阶段引入了动态分块机制。具体来说,编码器在分块流媒体约束下处理完整的语音,其中每个批次的块大小和可见左侧上下文块的数量都是动态采样的。这使得编码器能够适应各种流媒体配置,从而实现灵活操作,以适应不同部署场景下不同的延迟预算。

Stage 2: Alignment & Stage 3: IA-SFT

在传统的训练范式中,对齐和联合 SFT 是在预训练完全完成后依次执行的。如图 2 所示,我们为 NIM4-ASR 提出了一种编码器迭代机制,该机制允许在预训练完成之前开始对齐,而 IA-SFT 在对齐完成后启动,并与剩余的预训练过程异步进行。为了确定何时初始化或更新对齐和 IA-SFT 使用的编码器,我们使用中心核对齐(CKA) 跟踪编码器表示的动态变化。CKA 将不断演化的编码器与在整个预训练过程中初始化并定期更新的参考检查点进行比较。给定从同一评估集中提取的两组编码器表示 E(a),E(b) ,CKA 定义为

第二阶段:对齐。 预训练达到 50 万步后,我们开始监测编码器,此时编码器开始呈现相对稳定的优化趋势。我们将 50 万步时的编码器快照作为初始参考检查点,之后每隔 1 万步预训练评估一次 CKA。当演化中的编码器与当前参考检查点之间的 CKA 分数首次低于预定义阈值.在对齐过程中,编码器和 LLM 均被冻结,仅训练适配器。在我们的设置中,首次触发发生在预训练约 101 万步时,对齐阶段持续 130 万步

第三阶段:IA-SFT。 对齐完成后,我们在联合 SFT 之前执行 IA-SFT 作为中间阶段。IA-SFT 保持编码器冻结,并基于异步预训练过程生成的编码器快照序列训练适配器-LLM 堆栈。具体步骤如下:

(i)初始化与监控。IA -SFT 在对齐完成后开始,使用从对齐过程中继承的编码器进行 100 万步的训练,同时编码器预训练并行进行。CKA 评估从之前更新的参考检查点恢复,并每隔 1 万步预训练步骤重复进行一次,监控表征偏移。

(ii)CKA 触发更新。 每当 CKA 分数低于预定义阈值时,当前预训练编码器的快照就会热插拔到 IA-SFT 分支中,并相应地更新参考检查点。

(iii)最终更新。 更新周期(ii)重复进行,直到预训练达到其 200 万步的​​最大值。预训练完成后,无论 CKA 得分如何,都将应用最终编码器更新,并且 IA-SFT 运行最后 200 万步。

在我们的实现中,IA-SFT 使用 101 万步预训练时的编码器检查点进行 100 万步训练,再使用 132 万步预训练时的编码器检查点进行 100 万步训练,最后使用完全预训练的编码器进行 200 万步训练——总共在三个编码器版本上进行了 400 万步训练。在 IA-SFT 过程中,编码器保持冻结状态,但会定期从异步预训练过程中更新,从而保持声学基础。这使得模型能够在不出现表征漂移风险的情况下加深跨模态对齐。从课程学习的角度来看,IA-SFT 逐步将 LLM 暴露于更精细的编码器表征中,使其能够学习不变模式并提高对声学扰动的鲁棒性。此外,由于对齐和 IA-SFT 与预训练异步运行,因此整个训练流程仍然保持高效。

Stage 4: Late Joint SFT

在编码器预训练和 IA-SFT 完成后,语音表征与 LLM 嵌入空间之间建立了稳健的初始跨模态映射。随后,我们执行后期联合 SFT,其中编码器、适配器和 LLM 以端到端的方式联合优化。与传统的联合训练相比,由于前期阶段已经最小化了模态差异,LLM 梯度引起的表征漂移风险显著降低。因此,这些梯度主要作为微调信号,无缝地优化声学到音素的映射以及音素到语义的关联。从几何角度来看,前期的对齐阶段建立了一个稳定的跨模态流形,使后续优化处于损失函数曲面的低曲率区域。在该区域内,梯度更新是对决策边界和流形几何结构的局部优化,而不是引起大规模的拓扑重构。

Stage 5: Context SFT

首先从训练语料库构建关键词集 S 。所有转录文本均被解析以提取候选短语,然后使用 Qwen3-30B-A3B-Instruct进行过滤,以保留命名实体,例如人名、兴趣点(POI)、媒体名称和专有名词。在训练过程中,我们提高长时长话语的采样比例,并按照以下模板,将从 S 中采样的关键词以概率方式注入到提示中作为上下文提示:

每个训练实例,我们首先从转录文本中存在的 S 中提取相关关键词。此外,对于每个关键词,我们以一定的概率从 S 中提取发音相同或高度相似的另一个关键词作为干扰项。相关关键词和干扰项被连接起来,然后添加到 {context} 字段中。干扰项的加入可以防止语言学习模型 (LLM) 过度依赖上下文线索而牺牲语义合理性。在此阶段,编码器、适配器和 LLM 会进行联合训练。

此阶段的设计目的在于实现热词定制,而非跨回合对话的一致性。对于多回合场景,还可以将从对话历史中提取的关键词添加到当前提示中。这种策略以紧凑的形式保留了关键的上下文信息,同时保持了比句子层面方法更低的推理延迟。

Stage 6: ASR Specialized RL

GRPO,奖励函数:

  • Accuracy reward
  • Hallucination reward
  • Context reward

Additional Stage: Phoneme Head Training for RAG

完成强化学习(RL)阶段后,主训练流程结束。接下来,我们引入一个额外的阶段来训练图 1 所示的 RAG 模块所需的音素头。在该阶段,编码器继承强化学习后检查点的结构和权重并保持冻结状态,而音素头则从预训练的 CTC 头初始化并保持可训练状态。训练目标和配置与预训练阶段一致。经过微调后,音素头可以将编码器表示转换为音素假设,供后续检索模块使用。

Training Setup

Robustness enhancement under noisy and silent conditions。应用了多种数据增强技巧来提高模型的鲁棒性。除了标准的 SpecAugmentation  和速度扰动之外,我们还随机地将一些真实的声学干扰(例如人声、车辆噪声和背景音乐)注入到 20%的干净训练样本中,以模拟具有挑战性的真实世界环境。这些噪声注入的信噪比(SNR)是从均值为 10 dB、标准差为 5 dB 的正态分布中随机抽取的。

Inference

优化流式推理

Encoder 与 LLM 解耦部署,Encoder 部署在 Triton,Adaptor + LLM 部署在 vLLM,CTC Head + RAG 部署在 CPU

Prompt 结构设计

[Static Prefix]
↓
[Streaming Speech Embeddings] 增量 append 到 context
↓
[Dynamic Hotword Context] 动态更新热词

两种 Streaming ASR Paradigm

增量假设刷新(hypothesis refresh)
vs
incremental context extension(增量上下文扩展)

| 方案                  | hypothesis refresh | incremental extension |
| ------------------- | ------------------ | --------------------- |
| 历史是否重复 decode       | 是                  | 否                     |
| KV Cache 是否重建       | 经常                 | 基本不                   |
| 是否实时 partial output | 强                  | 弱                     |
| TTFT                | 更低                 | 略高                    |
| Tail latency        | 高                  | 低                     |
| 适合场景                | 长会议                | 实时语音助手                |

Phoneme-based RAG(音素级热词检索)

文本 -> 音素序列,使用 Aho-Corasick 自动机,采用 Hard Matching不做模糊匹配,Retrieval Error 比 Retrieval Miss 更危险。

为了实现高效的热词定制,NIM4-ASR 构建了一个基于音素的热词数据库以及相应的检索算法,如图 1 所示。将每个热词文本预先转换为音素-词元序列,并将其存储为键值对,其中键是音素序列,值是对应的热词文本。这些音素序列首先根据音素词汇表转换为离散索引,然后使用 Aho-Corasick 自动机算法重构为带有失败链接的 trie 树。在推理过程中,编码器上的音素头通过贪婪解码生成音素假设,这些假设被转换为索引序列,并由自动机在一次遍历中扫描完成。当无法扩展部分匹配时,自动机将沿着失败链接找到最长的有效后缀状态,而不是从头开始重新搜索,从而能够以假设长度的线性时间复杂度检索所有候选热词。

为了减少冗余的上下文提示,我们采用了一种最长匹配过滤策略:被较长跨度完全覆盖的较短匹配项将被丢弃,仅保留最长的实体。例如,如果热词“NIO”和“NIO House”在同一假设中同时匹配,则仅保留“NIO House”。检索到的热词文本随后被连接起来,并与语音嵌入一起作为上下文提示注入到 LLM 提示中,从而为解码提供上下文感知的偏置。由于索引级映射的存储效率以及 Aho-Corasick 自动机的线性时间复杂度(仅取决于查询长度而非数据库大小),热词数据库可以轻松扩展到数百万条记录,同时保持每次查询的亚毫秒级检索延迟。

值得注意的是,我们的热词定制旨在优化命名实体(例如地点名称和媒体标题)的识别,这类热词数据库可能非常庞大,并且可能包含大量语音相似甚至同音的条目。为了确保在这种大规模环境下的检索精度,我们在 RAG 模块中采用了硬匹配策略,仅检索精确的音素序列匹配,而非近似匹配或编辑距离最小的匹配。经验表明,检索漏检通常比检索错误危害更小,因为 LLM 仍然可以利用内部语言知识和上下文恢复正确的实体。相比之下,软匹配更容易引入相似但错误的热词,即使模型在一定程度上能够应对噪声上下文提示,这些错误热词仍然会干扰解码。

Evaluation

总结:

NIO 车载场景出发的工业论文,偏向工程落地。phoneme-level encoder 预训练、IA-SFT 防 drift、ASR-RL、百万热词 RAG——每个模块都是真实生产痛点的解法。CKA 动态监控 encoder 表示偏移这个手段很细。但核心数据不公开,学术可复现性为零;”25 个 benchmark SOTA”要打折——主要赢在内部实体密集场景;Streaming 支持是”优化了”而非”重新设计了”。热词检索口音/方言效果差。未来将对话历史作为附加上下文信息纳入多轮交互场景,以提高跨轮次转录的一致性。

Qwen3.5-Omni:新一代大规模原生全模态大模型

Qwen3.5-Omni 是 Qwen 最新一代全模态大模型,支持文本、图片、音频、音视频理解。结构上,Qwen3.5-Omni 的 Thinker 与 Talker 均采用 Hybrid-Attention MoE 架构。Qwen3.5-Omni 系列包含 Plus、Flash、Light 三种尺寸的 Instruct 版本,支持 256k 长上下文,模型支持超过 10 小时的音频输入及超过 400 秒的 720P(1 FPS)音视频输入。模型在海量文本、视觉以及超过 1 亿小时的音视频数据上进行原生多模态预训练,该模型展现出卓越的全模态感知与生成能力。相比 Qwen3-Omni,Qwen3.5-Omni 多语言能力大大增强,能够支持 113 种语种和方言的语音识别和 36 种语种和方言的语音生成。

Qwen3.5-Omni 延续采用 Thinker-Talker 架构,Thinker 通过 Vision Encoder 和 AuT 接受视觉和音频信号输入,音视频信号通过 interleave 交织并搭配 TMRoPE 编码位置信息。Thinker 负责处理全模态信号并输出文本,Talker 负责接收来自 Thinker 的多模态输入以及文本输出,进行 contextual 语音生成,语音表征通过 Qwen3-Omni 提出的 RVQ 编码来替代繁重的 DiT 运算。由于 chunk-wise 的流式输入设计和流式 Talker 设计,整个模型可以进行 realtime interaction。不同于上一代 Qwen3-Omni 的双轨 Talker 输入,Talker 在输入的组织方式上采用了 ARIA(自适应速率交错对齐,Adaptive Rate Interleave Alignment)来动态对齐文本与语音单元,然后进行交错排布,以避免由于文本与语音 Token 编码效率差异导致的语音不稳定性,如漏读、误读或数字发音模糊等问题。

论文最重要的结论可以概括为三点:第一,模型规模扩展到数千亿参数级,并支持 256k 上下文;第二,训练使用了异构图文数据和超过 1 亿小时的音视频数据;第三,Qwen3.5-Omni-Plus 在 215 个音频与音视频理解、推理、交互子任务上达到强竞争力,尤其在音频理解、ASR、语音翻译和语音生成上表现突出。

1. 模型定位:从多模态理解走向全模态交互

Qwen3.5-Omni 处理的输入包括文本、图像、音频、无声视频和带音频的视频,输出则覆盖文本和流式语音。论文强调它是“native omni agent model”:模型不仅能感知和回答,还能进行 WebSearch、FunctionCall、实时语音交互和 Audio-Visual Vibe Coding,也就是从音视频指令中直接生成可执行代码。

从输入建模上看,不同模态会被转换为统一 token 序列。可以把它抽象为:

\( X = [x_{\mathrm{text}};\ f_{\mathrm{audio}}(a);\ f_{\mathrm{vision}}(v)] \)

其中 \(f_{\mathrm{audio}}\) 是 AuT 音频编码器,\(f_{\mathrm{vision}}\) 是视觉编码器,Thinker 在统一序列上生成文本级高层表示,Talker 再基于 Thinker 的输出生成流式语音 token。

2. 模型设计:Thinker-Talker + Hybrid MoE

Qwen3.5-Omni 延续 Qwen2.5-Omni 和 Qwen3-Omni 的 Thinker-Talker 架构,但在可扩展性、长上下文和流式语音上做了明显升级。

  • Thinker:负责文本生成和跨模态理解。它接收文本、音频、图像、视频的统一表示,并支持 chunk-wise streaming input processing。
  • Talker:负责语音生成。它接收 Thinker 的高层表示和当前轮文本输出,生成 RVQ codec token,再由 Code2Wav 渲染为波形。
  • Hybrid Attention MoE:Thinker 和 Talker 都采用 Hybrid MoE Transformer。论文特别提到其中的 Gated Delta Net 有助于长音视频序列建模,降低 KV-cache I/O 压力,提高吞吐和并发。
  • 长上下文能力:模型输入支持 256k token,约等价于超过 10 小时音频,或 400 秒 720P 视频(1 FPS)。

在感知端,文本使用 Qwen3.5 tokenizer,词表从 150k 扩到 250k,论文称多数语言的编解码效率提升 10% 到 60%。音频被重采样到 16kHz,转成 128 通道 Mel 频谱,使用 25ms 窗口和 10ms hop。AuT 音频编码器从头训练,使用 40M 小时音频文本对,经过 4 个 Conv2D block 下采样 16 倍,输出约 6.25Hz 的音频 token,也就是每个输出帧约对应 160ms 原始音频。

在视频和音视频同步上,论文不再只依赖稀疏的绝对时间位置 ID,而是在每个视频或音视频 temporal patch 前插入秒级 timestamp 文本,并在音频序列中随机插入 timestamp。这会略微增加上下文长度,但能让模型更自然地学习时间码,尤其适合长视频和长音频场景。

3. ARIA:解决流式语音中的文本-语音速率错配

论文中最值得关注的创新之一是 ARIA(Adaptive Rate Interleave Alignment)。在流式语音生成中,文本 token 和语音 codec token 的编码效率不同。如果二者对齐不好,就容易出现跳词、发音错误、数字读法混乱、语音不自然等问题。

Qwen3.5-Omni 不再采用固定 interleaving 速率,也不依赖 MFA 这类外部对齐,而是把文本和语音 token 统一到一个单通道交错序列中,并施加自适应速率约束。可简化表示为:

\( \frac{N_{\mathrm{speech}}(y_{\le t})}{N_{\mathrm{text}}(y_{\le t})} \le \frac{N_{\mathrm{speech}}(y)}{N_{\mathrm{text}}(y)} \)

这里 \(y_{\le t}\) 表示当前生成前缀,\(N_{\mathrm{speech}}\) 和 \(N_{\mathrm{text}}\) 分别表示前缀中的语音 token 数和文本 token 数。直观理解是:任何前缀中的语音生成进度都不能跑得比该样本整体文本-语音比例更快。这样既保留流式输出,又减少双轨同步开销。

Talker 的语音 codec 采用 RVQ 多码本表示,并通过 MTP 模块预测当前帧的残差码本。可以抽象为:

\( P(c_t^1,\ldots,c_t^K \mid c_{<t}, h) = \prod_{k=1}^{K} P(c_t^k \mid c_t^{<k}, c_{<t}, h) \)

其中 \(h\) 是 Thinker 提供的上下文表示,\(c_t^k\) 是第 \(t\) 帧第 \(k\) 个 codec codebook token。随后 causal ConvNet 逐帧把 codec token 转为波形,从而支持低延迟流式合成。

4. 数据与训练流程

Qwen3.5-Omni 的训练覆盖纯文本、图文、视频文本、音频文本、视频音频和视频音频文本等数据。论文披露了几个关键规模:

  • 总体使用超过 1 亿小时音视频内容。
  • AuT 音频编码器使用 40M 小时音频文本对训练,由 Qwen3-ASR 生成监督信号。
  • Talker 初始阶段使用超过 20M 小时多语言语音数据,并配合多模态上下文。
  • 第二阶段预训练使用约 4T token,其中 text 0.92T、audio 1.99T、image 0.95T、video 0.14T、video-audio 0.29T。
  • 支持范围:文本 201 种语言/变体,语音输入 113 种语言/方言,语音输出 36 种语言/方言。

预训练分为三阶段。S1 是 Encoder Alignment,冻结 LLM,分别训练视觉和音频编码器及 adapter;S2 是 General Stage,解冻所有参数,用多模态混合数据训练,序列长度为 32,768;S3 是 Long Context Stage,把最大长度提升到 262,144,并提高长音频、长视频占比。

后训练也分 Thinker 和 Talker。Thinker 使用三阶段策略:专门教师模型蒸馏、on-policy distillation,以及面向多轮交互的强化学习。Talker 使用四阶段策略:通用训练、长上下文 CPT、DPO/GSPO 偏好优化,以及轻量 speaker fine-tuning,用于增强自然度、表现力、语音可控性和零样本/定制音色能力。

5. 流式延迟与并发

论文给出了端到端首包延迟。单并发下,Qwen3.5-Omni-Flash 的音频输入首包延迟为 235ms,视频输入为 426ms;Qwen3.5-Omni-Plus 分别为 435ms 和 651ms。8 并发下,Flash 的音频/视频整体延迟为 352ms/1625ms,Plus 为 955ms/1980ms。

需要注意,论文明确说明 Flash 和 Plus 因模型规模、部署资源和并行策略不同,不适合做严格横向延迟比较。更关键的结论是:ARIA、chunked prefilling、MTP 和 streaming ConvNet 共同把首包语音延迟控制在可交互范围内。

6. 实验结果:理解能力基本不牺牲,音频能力明显增强

文本能力:Qwen3.5-Omni-Plus 基本保持了 Qwen3.5-Plus-NoThinking 的文本能力。比如 MMLU-Pro 为 85.9 vs 86.8,MMLU-Redux 为 94.2 vs 94.3,C-Eval 为 92.0 vs 92.3,LiveCodeBench v6 为 65.6 vs 67.1。值得注意的是 IFBench 上 Omni-Plus 为 52.6,略高于文本基线的 51.1。

音频理解与 ASR:与 Gemini-3.1 Pro 相比,Qwen3.5-Omni-Plus 在多个音频任务上更强。MMAU 为 82.2 vs 81.1,MMSU 为 82.8 vs 81.3,RUL-MuchoMusic 为 72.4 vs 59.6,VoiceBench 为 93.1 vs 88.9。ASR 方面,Fleurs top60 WER 为 6.55,低于 Gemini-3.1 Pro 的 7.32;LibriSpeech clean/other 为 1.11/2.23,也明显低于 3.36/4.41。

视觉与视频:Qwen3.5-Omni-Plus 在视觉任务上接近 Qwen3.5 文本/视觉基线,并在部分视频任务上更好。例如 RealWorldQA 为 84.1,高于基线 79.1;VideoMME w/o subtitles 为 81.9,高于 81.0;MLVU 为 86.8,高于 85.1;LVBench 为 71.2,高于 68.6。这说明音视频联合训练没有明显损伤视觉能力,反而增强了动态视觉场景的表现。

音视频理解:在 AudioVisual → Text 任务中,Qwen3.5-Omni-Plus 在 DailyOmni 上达到 84.6,高于 Gemini-3.1 Pro 的 82.7;Qualcomm IVD 为 68.5,高于 66.2;Omni-Cloze 为 64.8,高于 57.2。但它在 WorldSense、AV-SpeakerBench、VideoMME with audio 和 OmniGAIA 上仍低于 Gemini-3.1 Pro,说明音视频综合推理和工具使用仍有改进空间。

语音生成:在 SEED-TTS 零样本语音生成中,Qwen3.5-Omni-Plus 的 WER 为 test-zh 0.99、test-en 1.26,优于 Qwen3-Omni-30B-A3B 的 1.07/1.39,也在英文子集上超过 CosyVoice 3 的 1.45。多语言语音生成中,论文称 Qwen3.5-Omni 在 29 个评测语言中有 22 个取得最低 WER,并在多数语言上有更高 speaker similarity。

跨语言与定制音色:跨语言语音生成中,Qwen3.5-Omni 在 12 个方向中 10 个最好。比如 Chinese-to-Korean 错误率为 4.03,而 CosyVoice3 是 14.4,相对降低约 72%。定制音色方面,论文在 2026 年 3 月通过官方 API 对比 ElevenLabs、Gemini-2.5 Pro-Preview-TTS、GPT-Audio-2025-08-28 和 MiniMax-Speech-2.8-HD,Qwen3.5-Omni 在 29 种语言中有 10 种取得最佳 WER,并在日语、韩语等场景表现突出。

7. 关键创新点

  • 全模态 Agent 化:模型不只回答问题,还能执行 WebSearch、FunctionCall,并展现 Audio-Visual Vibe Coding 能力。
  • Thinker-Talker 的 MoE 升级:Thinker 和 Talker 都采用 Hybrid MoE,兼顾长上下文、多模态建模和服务并发。
  • ARIA 对齐机制:用自适应文本-语音速率约束替代固定对齐,改善流式语音的稳定性、韵律和发音自然度。
  • 多码本流式语音生成:RVQ token、MTP 和 causal ConvNet 组合,让语音可以从首个 codec frame 开始增量合成。
  • 时间戳显式建模:在音视频 patch 中插入文本 timestamp,提升长视频、长音频的时间感知和跨模态同步。
  • 大规模多语言训练:覆盖 113 种语音输入语言/方言和 36 种语音输出语言/方言,扩展了 ASR、TTS、跨语言 voice cloning 的边界。

8. 局限

这篇技术报告给出了大量指标,但仍有几个需要谨慎理解的地方。第一,Qwen3.5-Omni-Plus 和 Flash 的延迟数字不适合严格横比,因为部署资源和并行策略不同。第二,音视频综合任务并非全面领先 Gemini-3.1 Pro,尤其 WorldSense、AV-SpeakerBench、VideoMME with audio 和 OmniGAIA 仍有差距。第三,模型训练数据规模很大,但数据构成和过滤细节仍是技术报告级披露,不等于完全可复现。

总体来看,Qwen3.5-Omni 的意义在于把全模态模型从“看图、听音、回答”推进到“实时听看、连续说话、保持长上下文、能调用工具”的阶段。它的架构亮点不只是参数更大,而是通过 Hybrid MoE、ARIA、多码本 codec 和显式时间戳,把模型服务、流式交互和多语言语音生成这些工程难点一起纳入设计。

SoulX-Duplug 面向全双工语音对话系统即插即用流式状态预测模型

SoulX-Duplug —— 一款面向 全双工语音对话系统的即插即用流式状态预测模块。SoulX-Duplug 旨在解决当前语音对话系统中 实时交互能力不足、系统响应延迟高、模块耦合严重 等问题。通过将 语音活动检测(VAD)、语音识别(ASR)与对话轮次判断(Turn Detection)统一建模,SoulX-Duplug 可以帮助传统的半双工语音系统在 无需修改原有模型架构的情况下,快速获得 全双工语音交互能力。 项目还开源了 SoulX-Duplug-Eval,一个面向全双工语音对话系统的 双语评测基准,以促进该领域更标准化和可比较的研究。

Introduction

传统语音对话系统通常采用 半双工(Half-Duplex)交互模式:系统在用户说话时只能“听”,而在系统回答时用户则无法打断。这种严格分离的听说流程,使得交互节奏显得机械,也限制了真实对话中常见的打断(interruption)、停顿(pause)、附和(backchannel)等行为。 相比之下,全双工语音对话系统允许系统在生成回复的同时持续监听用户输入,从而支持更加自然的实时互动体验。

近年来,一些端到端全双工语音模型开始出现,但这类方法通常将 语言生成与交互控制强耦合 在同一个模型中,带来了新的挑战:

  • 模型训练难度高
  • 数据需求巨大
  • 交互策略难以控制
  • 系统扩展性受限

在实际工业系统中,更常见的方案是通过 VAD + ASR + Turn Detection 等模块组成级联流水线,为半双工系统提供基本的全双工能力。然而,这种方式也存在明显问题:

  • 传统 VAD 仅依赖声学特征,缺乏语义理解
  • 非流式 ASR 会带来额外延迟
  • 多模块级联导致系统响应速度下降

领域内目前仍缺乏开源的流式 semantic VAD 方案。SoulX-Duplug 正是在这样的背景下提出的一种独立、可扩展的解决方案。通过将语音交互中的双工控制能力从对话模型中解耦为独立模块并进行开源,SoulX-Duplug 旨在缓解全双工模型在数据规模与系统扩展性方面的挑战,使语音对话模型的优化能够更多聚焦于记忆能力、推理能力与共情能力等核心智能能力,而不必始终受到全双工交互机制的复杂约束。与此同时,通过引入文本引导的流式状态预测机制,SoulX-Duplug 能够更准确地理解用户语义意图,并在模块化架构下尽可能降低系统延迟,从而实现更自然、高效的实时语音交互体验。

SoulX-Duplug

Overview

SoulX-Duplug 是一个面向实时语音交互场景设计的 统一流式状态预测模块。与传统基于多模块级联的全双工语音系统不同,SoulX-Duplug 在单一模型框架中同时完成:

  • 语音活动检测(VAD)
  • 流式语音识别(ASR)
  • 对话状态预测(Dialogue State Prediction)

通过统一建模这些任务,SoulX-Duplug 能够在持续音频输入的情况下实时理解用户语音内容,并动态预测对话交互状态,从而实现更自然的全双工语音互动。总体架构上,SoulX-Duplug 采用 GLM-4-Voice speech tokenizer 以12.5Hz 的频率提取离散语音 token,取 160ms  (2 token)  的处理窗口流式交替生成语音识别文本与对话状态 token。这种设计使模型能够通过语音识别理解语义并判断当前对话状态,从而实现低延迟的交互控制。

State Token Design

为了刻画全双工语音对话中的交互动态,SoulX-Duplug 定义了五种核心状态 token:

  • user_idle 表示当前音频片段不包含语义信息,例如静音或背景噪声。
  • user_nonidle 表示用户正在进行具有语义内容的语音输入。
  • user_backchannel 表示用户“嗯”“对”等 backchannel 行为。
  • user_complete 表示用户当前语句在语义上已经完成,系统可以接管对话轮次并进行回复。
  • user_incomplete 表示用户虽然暂时停顿,但语句在语义上仍未结束,系统需要继续等待用户输入。 通过这种定义方式对对话状态进行了清晰、结构化的建模。

Speech Input Modeling

采用 GLM-4-Voice tokenizer,以 12.5 Hz 的频率提取音频 token:

Ad​=[ad,1​,ad,2​,…,ad,N​]

该 tokenizer 是一种 block-causal(块因果)语音 tokenizer,在大规模语音数据上预训练,可作为双语语音理解的基础编码器

在流式推理中:

  • 使用 block size = 12 进行音频 token 生成
  • 每一步处理:
    • 目标窗口(target window):160 ms
    • 左上下文(look-back):960 ms
    • 右上下文(look-ahead):40 ms

因此总感受野(receptive field)为: 1160 ms,共提取 15 个 token目标区域对应的 token 与 block 中的倒数第二和倒数第三个 token 对齐。随后,通过一个线性 encoder projector,将 Ad​ 的 embedding 映射为特征 A,以匹配 LLM 的 embedding 维度:

A=MLP(Ad)

文本引导的流式状态预测

为了在流式状态预测中显式引入语义信息,我们创新性地引入了联合 ASR 目标,并设计了交错预测范式(interleaved prediction)

{A1,T1,S1,A2,T2,S2,…,AT,TT,ST}

每个 160 ms 音频块对应两个音频 token:

At​=[at,1​,at,2​]

在历史上下文 Ht−1条件下,模型首先预测当前块的 ASR token 序列:

Tt​∼P(Tt​∣A≤t​,T<t​,S<t​)

其中Tt​:与第 t 个音频块对齐的流式 ASR 输出,在生成 Tt​ 之后,模型进一步预测对话状态 token:

St​∼P(St​∣A≤t​,T≤t​,S<t​)

  • St​:当前音频块对应的全双工对话状态

这种交错式设计在保持流式推理能力的同时,使状态预测能够获得显式的语义引导

Training Objective

由于不同类型的 token(例如文本 token、<asr_eos> 以及各种状态 token)在长序列中的出现频率差异较大,我们采用加权的 token 级训练目标

设:

  • Y:完整的目标 token 序列
  • yj​:第j 个 token

整体损失定义为:

其中:

  • LCE(yj​):预测 token yj​ 的交叉熵损失
  • τ(yj​):将 token 映射到其所属类型(如 ASR token / state token)
  • λτ(yj​)​:针对不同 token 类型设置的权重系数,用于在不同类别之间进行训练平衡

三阶段混合训练+ Teacher-Forced 推理

设计了三个顺序训练阶段:

  • 非流式 ASR 预训练。目标:学习基础语音识别能力
  • 流式 ASR 适配。目标:让模型适应 streaming 场景
  • 全双工状态预测微调。目标:强化实时对话管理能力(state prediction)

Hybrid 训练-推理策略。SoulX-Duplug 采用训练与推理不完全一致(hybrid)的策略:

训练阶段(第 3 阶段):

  • 端到端联合优化:
    • VAD + ASR + 状态预测

推理阶段:

  • 使用一个轻量级外部 ASR 模型(如 SenseVoice Small)
  • 为每个 chunk 提供:
    • teacher-forced 的流式 ASR 输出

这个设计的本质

训练时学“联合建模能力”,推理时用更强/更稳的 ASR 来“喂语义”,提升稳定性和效率。

算法延迟

  • 每个 audio chunk = 160 ms
  • 用户语音在 chunk tit_iti​ 内结束

由于模型是流式的:

必须等到下一个 chunk ti+1​ 才能确认“后面没有语音”

在处理ti+1​ 时:

  1. 检测到没有语音(VAD = silent)
  2. 判定 <|user_nonidle|> 结束
  3. 决策:
    • <|user_complete|>(语义完成)
    • <|user_incomplete|>(语义未完成)

由于语音结束点在 chunk 内均匀分布:

  • 平均等待时间:80 ms(= 160 / 2)
  • 再加一个 chunk:160 ms

最终:

Latencyavg=80 ms+160 ms=240 ms

SoulX-Duplug-Eval

为了解决现有全双工语音对话基准中跨语言评测资源不足的问题,我们构建了补充性的测试集,用于提升不同模型之间的可比性,并在对话状态预测系统级全双工对话两种评测设置下,实现标准化与公平比较。

提出 Easy Turn testset-En,作为原始 Easy Turn testset 的英文对应版本。

该数据集主要用于全双工状态预测(duplex state prediction),包含两类数据:

Complete(完整句)

  • 318 条样本
  • 内容为语义完整的 utterance
  • 由 ChatGPT 生成,并使用 ChatTTS2 [36] 合成

Incomplete(不完整句)

  • 299 条样本
  • 内容为语义不完整的 utterance
  • 同样由 ChatGPT 生成并通过 ChatTTS2 合成

为了支持中文场景下的系统级评测,我们构建了 Full-Duplex-Bench-Zh,作为 Full-Duplex-Bench的中文版本。

该数据集覆盖四种具有代表性的交互场景,所有文本均由 ChatGPT 生成,并通过最先进的 TTS 系统合成。

包括:

  • Turn-Taking 子集(轮次切换):用户连续说话数秒随后 15 秒静音,评估是否正确判断用户说完
  • Pause Handling 子集(停顿处理):单条 utterance 中插入多个停顿,区分自然停顿和语义未结束
  • User Backchannel 子集(用户附和):短 backchannel(如“嗯”“对”),防止模型误抢话
  • User Interruption 子集(用户中断/续说):是否识别“用户未说完”,是否正确预测 <|user_incomplete|>

实验

训练设置

中文数据总计约 47,000 小时。英文数据共计约 31,000小时。

在流式 ASR 训练中:

  1. 首先获取 字符级或词级对齐(alignment)【使用 Paraformer3 /WhisperX 生成时间戳】
  2. 将数据重组为 基于 chunk 的交错格式(interleaved chunk-based format)

状态预测训练阶段(State Prediction Stage):

英文数据:

  • 使用 Fisher 数据集 [14]
  • 规模:千小时级

中文数据:

  • 使用内部构建的约 万小时级语料
  • 构造方式与 Fisher 保持一致

数据标注与清洗流程

  1. 先进行对齐(alignment)
  2. 中文数据:
    • 使用 双 ASR 一致性过滤
  3. 数据增强:
    • 全局添加 Musan 噪声
    • 在静音片段加入 ESC-50 噪声
  4. 状态标签:
    • 使用 Qwen2.5-72B-Instruct进行自动标注

SoulX-Duplug 模型:

  • 语音编码器:预训练 GLM-4-Voice tokenizer
  • LLM backbone:Qwen3-0.6B [48]
  • speech tokenizer:全程冻结(frozen)

训练策略

  • ASR 预训练 LLM:全量微调 adapter:全量微调
  • 状态预测阶段对 LLM 使用 LoRA ,rank = 32,训练数据:双语 trainsets

推理设置

使用 teacher-forcing ASR 提供更准确文本引导 【中文:Paraformer,英文SenseVoice Small】

为了评估 SoulX-Duplug 的对话状态控制能力:Qwen2.5-7B-Instruct + IndexTTS-1.5

评测指标(Metrics)

  • Takeover Rate (TOR)
  • Response Latency (RL)
  • Resume Rate (RsR)
  • Respond Rate (RpR)
  • Stop Latency (SL)

结果

为了验证 SoulX-Duplug 在真实系统中的效果,团队以 SoulX-Duplug 作为对话状态控制模块构建了一个完整的全双工语音对话系统,并在中英双语的 Full-Duplex-Bench 基准上对系统进行了全面评测,该 benchmark 涵盖了:Turn Taking(轮次切换)、Pause Handling(停顿处理)、User Backchannel(用户附和)、User Interruption(用户打断)等多种全双工对话关键场景。

实验结果表明,基于 SoulX-Duplug 构建的系统在多个评测维度上取得了稳定且均衡的整体表现。在整体的 turn management 能力上优于现有模型,并在总体响应延迟指标上同样表现优异。这一结果充分验证了 SoulX-Duplug 的对话状态控制能力以及在系统构建中的实用价值。

同时,实际部署环境中 SoulX-Duplug 的独立模块的平均延迟约为 250ms,接近其理论延迟 240ms。这一结果显著优于传统基于 VAD 的方案(约 500ms),也低于近期提出的 FlexDuo 模块(约 343ms)。

Further Discussion

围绕全双工语音对话系统(FD-SDS)的设计与部署形成了若干观察与思考:

1、小 chunk 流式 ASR 识别效果较差

采用非常小的 chunk size 进行流式 ASR 在本质上仍然具有较大挑战。当 chunk 时长较短时,声学片段经常会跨越音素、音节或词边界被切分。这一问题在英语中尤为明显,因为单词很容易被切分到相邻的多个 chunk 中,从而导致识别不稳定以及瞬时错误。因此,在严格低延迟约束下,预测波动在一定程度上是不可避免的。此外,在实时流式场景中,基于 LLM 的方法虽然具有较强的上下文建模能力,但其上下文仍受限于增量解码(incremental decoding)以及有限的未来信息。因此,基于 LLM 的 ASR 模型在“解码速度与识别准确率的综合权衡”方面,并不一定优于传统结构(如 RNN-T)。

2、模块化系统 vs 端到端系统

尽管近年来端到端全双工语音对话模型(FD-SDMs)在经验表现上取得了较强效果,并展现出较大潜力,但它们通常需要大规模训练数据与较高计算资源。相比之下,模块化系统更易于实现与维护。当系统出现性能问题时,可以在不重新训练整个系统的情况下,对单个模块进行调整或替换。这种灵活性使得模块化设计在实际部署中可能更具优势

最后,目前的研究工作对实时应用的支持仍然相对有限。仍然需要更加成熟且易用的开源流式语音编码器与 ASR 模型。持续推进这一方向的发展,将有助于真正实现可落地的全双工语音对话系统(FD-SDSs)。

阿里音频大模型强化学习 RL 框架

在语音技术领域,ASR(语音识别)和 TTS(语音合成)早已进入 LLM 时代,但 “能用” 和 “好用” 之间,还隔着一道难以逾越的鸿沟:ASR 会出现幻觉、漏检关键词;TTS 发音虽准,却缺自然韵律,甚至越优化语速越慢。

问题的核心在于:LLM 的 “文本 RL” 经验,没法直接套用到音频领域。音频是连续信号,既要处理声学特征,又要对齐语义,传统 RL 框架又笨重又低效。

阿里通义实验室的论文《Explore the Reinforcement Learning for the LLM based ASR and TTS system》,给出了一套 “轻量、高效、通用” 的解决方案。它不仅设计了适配音频大模型的 RL 框架,还在 ASR 和 TTS 任务上做了深度探索:ASR 用 GRPO + 规则奖励,WER 相对下降 5.3%;TTS 把 GRPO 和 DiffRO 结合,既提升发音准确率,又保住自然度,彻底解决了 “顾此失彼” 的问题。实验结果表明,即使在训练数据有限且优化步骤较少的情况下,RL 也能显著提升 ASR 和 TTS 系统的性能。

相关概念

  • GRPO(组相对策略优化):轻量化 RL 算法,对一组(G 个)模型输出打分,通过组内奖励归一化计算优势函数,无需单独训练 Critic 网络。降低计算成本,适配音频大模型的多输出评估。ASR、TTS 均适用
  • DiffRO(可微分奖励优化):直接对 TTS 生成的声学 token 打分,通过 Gumbel-Softmax 采样实现梯度回传,无需合成完整音频即可优化。奖励函数:Token2Text 模型(类 ASR)训练一个Token2Text 模型(输入语音 token,输出文本概率分布),作为核心奖励器。以WER(词错误率) 为核心奖励信号:Token2Text 预测文本与目标文本的差异,转化为可微分奖励。解决 argmax 不可导问题:用Gumbel Softmax对 token 分布采样,实现端到端梯度回传。
对比维度GRPODiffRO
核心逻辑组内对比打分,优化 “相对优势”单样本 token 级打分,优化 “绝对奖励”
奖励来源规则函数(如 WER、关键词准确率)或简单奖励模型可微分模型(如 token 级 ASR)
依赖数据少量标注数据 + 硬样本(如 ASR 的 hallucination 样本)无需大量配对音频 – 文本数据
优势适配主观体验优化(如韵律、多样性)发音准确率提升明显,训练稳定
劣势训练步数过多易退化难以优化主观体验指标
  •  强化学习的训练框架 TRL 提供了简单的强化学习实现方案,但效率较低;它在训练和推理阶段均直接依赖 PyTorch,并采用手动资源管理方式。 相比之下,VeRL 和 OpenRLHF 等更先进的工业级框架利用 Ray 灵活的分布式计算原语,简化了分布式操作与部署流程。这些框架进一步集成了 VLLM、SGLang 等高效推演引擎用于响应生成,并采用搭载 ZeRO 策略的 Deepspeed/FSDP 进行策略优化。

轻量音频 RL 框架设计

音频领域 RL 的 3 大核心难题,这也是其技术方案的出发点:

  • 模态复杂:音频大模型既要处理连续声学嵌入,又要生成离散文本 /token,比纯文本 LLM 的 RL 复杂得多;
  • 框架笨重:传统 RL 框架(如 TRL)需要同时维护 Actor、Critic、Reward Model 等多个模块,GPU 资源冲突严重,训练效率低;
  • 奖励难设计:ASR 的幻觉、TTS 的韵律自然度等痛点,没法用单一指标(如 WER)衡量,复杂奖励模型又难以训练。

为了简化计算资源的管理,设计了一个强化学习(RL)训练框架,该框架可以交替地在不同的组件之间分配 GPU 资源。整个框架如图1 所示。

轻量音频 RL 框架 —— 交替调度 GPU,效率翻倍。核心思路是:按训练步骤交替分配 GPU 资源,避免多模块抢占,具体流程如下:

1)框架核心设计

训练阶段占用 GPU 的模块核心任务资源释放逻辑
阶段 1:特征处理PyTorch-based 音频编码器(ASR)/ 解码器(TTS)ASR:将音频转为嵌入;TTS:将文本转为声学 token处理完后释放 GPU,嵌入 /token 存入主存
阶段 2:生成候选输出SGLang-based LLM 生成引擎基于特征生成多组候选(ASR 生成文本,TTS 生成声学 token)生成完成后释放 GPU
阶段 3:奖励计算PyTorch-based 奖励模型 / 规则函数对候选输出打分(如 ASR 的 WER、TTS 的 ASR 准确率)打分完成后释放 GPU
阶段 4:策略优化FSDP-based LLM 策略模型用 GRPO/DiffRO 更新模型参数,同步回生成引擎一轮更新后进入下循环

(2)关键优势

  • 效率高:8 张 A100 GPU 上,ASR 单步训练仅需 54.6 秒,TTS 仅 16.73 秒,远超 VeRL 等开源框架;
  • 通用性强:一套框架适配 ASR 和 TTS,无需为不同任务单独搭建;
  • 资源省:避免多模块同时占用 GPU,显存消耗降低 30% 以上。

ASR 的 RL 优化 —— GRPO + 规则奖励

ASR 的核心痛点是 “基础准确率(WER)达标,但幻觉、关键词漏检影响实际使用”,因此奖励函数聚焦 “准确率 + 抗幻觉 + 关键词保障” 三大目标,采用 “基础奖励 + 惩罚性奖励 + 强化奖励” 的组合逻辑:

(1)奖励函数设计:3 条规则,精准打击幻觉与关键词漏检

基础奖励 R1:ASR 识别准确率(核心基础)

  • 设计逻辑:以 “词错误率(WER)” 为核心指标,奖励与准确率正相关,确保模型优先优化基础识别能力。
  • 计算公式1 − WER(y, y), 其中 y:音频对应的真实标注文本,y:ASR 模型的输出文本,WER:词错误率(插入、删除、替换错误的综合指标,范围 0~1)。
  • 数值范围:0~1(WER=0 时R1=1,完全错误时R1=0)。
  • 核心作用:保证 RL 训练不偏离 “提升基础识别准确率” 的核心目标,避免为了优化其他指标而牺牲 WER。
  • 惩罚性奖励 R2:幻觉检测(优先级最高)
    • 设计逻辑:ASR 的幻觉(无中生有、重复生成、翻译错误)对用户体验伤害极大,因此采用 “一票否决” 式惩罚,检测到幻觉直接将奖励设为 – 1,强制模型规避该行为。
    • 幻觉判定规则
      • 无中生有:生成文本中包含音频中不存在的词(如音频说 “苹果”,ASR 输出 “苹果手机”);
      • 重复生成:连续重复相同短语(如 “今天今天今天天气好”);
      • 翻译错误:将一种语言误译为另一种(如英文音频被识别为中文)。
    • 奖励逻辑:若检测到上述任意一种幻觉 →R2 = -1 ;无幻觉 →R2 = 0 (不额外加分,仅避免惩罚)。
    • 核心作用:针对性解决长音频、噪声环境下的 ASR 幻觉问题,实验中长音频插入错误率(Ins)从 2.72 降至 0.86。
  • 强化奖励R3 :关键词准确率与召回率(工业场景关键)
    • 设计逻辑:人名、品牌名、专业术语等关键词的识别准确率,直接影响 ASR 的工业实用性(如智能客服、语音助手),因此单独强化该维度。
    • 数值范围:0~1(关键词完全命中时R3 = 1 ,完全漏检 / 误检时 R3 = 0)。
    • 核心作用:保证基础准确率的同时,重点强化关键信息的识别能力,提升模型的工业落地价值。
  • ASR 最终奖励聚合
    • 聚合逻辑:惩罚性奖励优先级最高,其次是基础奖励和强化奖励的加权求和(论文未明确权重,实验中采用等权求和)。
    • 最终公式:1) 若存在幻觉 → RASR = R2 = -1;2) 无幻觉 → RASR = (R1+R3) / 2 (范围 0~1)。
    • 设计巧思:通过 “惩罚优先” 避免模型 “为了加分而牺牲关键词 / 抗幻觉”,平衡基础性能与工业需求。

(2)训练数据构建:专挑 “硬骨头”,少而精 RL 训练不用海量数据,重点在于 “针对性”。论文构建了 4 类训练集,每类 2 万条,精准命中 ASR 的失败模式:

数据集数据来源训练目标
D0:随机样本普通语音数据作为对照,保证基础性能
D1:难样本不同 ASR 系统输出不一致的音频(如歧义句、噪声环境)提升复杂场景鲁棒性
D2:长音频样本时长 > 20 秒的音频解决长语音的幻觉、漏检问题
D3:关键词样本含人名、品牌名、专业术语的音频强化关键词识别能力

(3)训练配置与实验结果

  • 核心参数:batch size=32,组大小 G=12,学习率 = 1e-5,KL 系数 = 0.1,训练 1 天即可收敛;
  • 评估指标:WER(词错误率)、Ins(插入错误率)、Del(删除错误率);
  • 关键结果
    • 短音频(<10 秒):最优配置(全奖励 + 全数据集)WER 从 10.25 降至 9.71,相对下降 5.3%;
    • 长音频(>20 秒):Ins 错误率从 2.72 降至 0.86,幻觉问题大幅缓解
    • 结论硬样本 + 关键词奖励是提升 ASR 性能的关键,单纯增加长音频样本效果有限

TTS 的 RL 优化 —— GRPO+DiffRO 融合,发音与自然度双提升

TTS 的核心痛点是 “发音准确率与自然度失衡”(如 DiffRO 提升发音但牺牲语速,GRPO 优化自然度但易发音不准),因此奖励函数聚焦 “发音准确率 + 语速控制 + 韵律多样性”,覆盖客观指标与主观体验:

(1)单一算法对比:各有优劣

先分别用 GRPO 和 DiffRO 做实验,结果如下:

方法核心优势核心劣势中文 WER中文 SS(说话人相似度)
基线(无 RL)4.28077.64
DiffRO发音最准(WER 最低)SS 下降最多(77.00)3.41877.00
GRPOSS 下降少(77.26)发音提升有限3.71077.26

(2)GRPO 的奖励扩展:3 条规则,兼顾准确率与自然度

  • 核心奖励 R1:ASR 识别准确率(保证发音准确)
    • 设计逻辑:TTS 合成音频的 “可懂性” 是基础,通过 ASR 模型反向验证发音准确率,ASR 能准确识别的音频,说明发音无明显错误。
    • 两种计算方式(适配不同场景): 
      • 方式 1(音频级):用标准 ASR 模型识别 TTS 合成的完整音频,计算识别准确率(同 ASR 的R1); 
      • 方式 2(token 级):直接用 DiffRO 的 token-based ASR 模型,对 TTS 生成的声学 token 打分,无需合成完整音频(效率更高)。
    • 数值范围:0~1(ASR 完全识别正确时R1=1,完全无法识别时 R1= 0)。
    • 核心作用:锚定 TTS 的发音准确性,避免 RL 优化过程中出现 “自然但听不懂” 的问题。
  • 约束奖励 R2:音频时长控制(防止语速变慢)
    • 设计逻辑:论文发现 “TTS 为提升 ASR 识别率,会主动放慢语速”,导致语音不自然,因此通过时长约束强制模型保持合理语速。
    • 计算公式
  • 其中|oi|:第 i 个 TTS 候选输出的音频时长;Tm同组候选输出的音频时长中位数;abs:绝对值函数。
    • 数值范围:-1~0(时长与中位数完全一致时=0,偏差越大越接近 – 1)。
    • 核心作用:惩罚语速过快 / 过慢的输出,实验中成功避免 TTS “为准确率牺牲语速”,说话人相似度(SS)也同步提升。
  • 增强奖励 R3:token 与音调多样性(提升韵律自然度)
    • 设计逻辑:TTS 的 “机械感” 源于韵律单一,因此奖励模型生成多样化的声学 token 和音调变化,模拟人类自然 speech 的韵律波动。
    • 计算公式(双维度加权求和)
  • 第一部分(token 多样性)
  • 其中G:GRPO 的组大小(实验中 G=8),:第 i 个与第 j 个候选输出的声学 token 编辑距离;dist(oi,oj):第 i 个候选的 token 长度;组内候选的 token 差异越大,得分越高。 
  • 第二部分(音调多样性)std(F0),其中F0:归一化后的基频(音调);std:标准差函数;音调波动越大(标准差越高),韵律越丰富,得分越高。
    • 数值范围:0~+∞(无上限,多样性越高得分越高)。
    • 核心作用:提升 TTS 的主观自然度,实验中该奖励虽未优化客观 WER,但人类主观评估中 “韵律自然度” 得分最高。
  • TTS 最终奖励聚合
    • 聚合逻辑:核心奖励(R1)保证基础发音,约束奖励(R2)控制语速,增强奖励(R3)优化韵律,三者加权求和(论文实验中采用等权)。
    • 最终公式:Rtts = R1+R2+R3
    • 设计巧思:通过 “核心 + 约束 + 增强” 的组合,平衡客观准确率与主观体验,为 GRPO 与 DiffRO 的融合奠定基础。

实验验证

训练效率:新框架碾压开源方案

在 8 张 A100 GPU 上,论文提出的交替调度框架,训练速度远超基于 VeRL 的开源方案:

  • ASR 单步训练时间:54.6 秒(RTF=0.015),是开源方案的 2.3 倍快;
  • TTS 单步训练时间:16.73 秒(batch size=128),是开源方案的 1.8 倍快;
  • 关键原因:避免了多模块 GPU 资源冲突,SGLang 和 FSDP 的并行优化大幅提升效率

ASR 关键结论

  • 奖励设计比数据量更重要仅用R1(WER)效果有限,加入R2(幻觉惩罚)和R3(关键词奖励)后,性能大幅提升;
  • 长音频训练需针对性数据单纯增加长音频样本(D2)无法解决幻觉,需结合困难样本(D1)和关键词样本(D3);
  • 工业场景优先选 “全奖励 + 全数据集” 配置,WER 和抗幻觉能力均最优。

TTS 关键结论

  • 发音准确率:DiffRO > 融合方案 > GRPO > 基线;
  • 说话人相似度:GRPO > 融合方案 > 基线 > DiffRO;
  • 稳定性:DiffRO > 融合方案 > GRPO;
  • 落地推荐:优先选择 “样本过滤 +R1+R2” 融合方案,兼顾准确率、自然度和稳定性。

研究价值与未来展望

核心价值

  • 技术层面:首次提出适配音频大模型的轻量 RL 框架,解决了模态复杂、资源冲突的核心难题;同时探索了 GRPO 与 DiffRO 的融合方案,为 TTS 的 “准确率 + 自然度” 双优化提供了可落地的范式;
  • 工业层面:规则型奖励 + 困难样本训练的思路,无需标注海量偏好数据,降低了 RL 在 ASR/TTS 中的落地成本;实验结果可直接复用,加速工业产品迭代。

未来展望

  • 多语言扩展:当前实验主要基于中英双语,未来可扩展至低资源语言,优化小语种 ASR/TTS 的性能;
  • 奖励模型融合:将规则奖励与训练后的奖励模型结合,进一步提升奖励的精准度;
  • 多模态扩展:将框架适配到语音翻译、语音情感合成等更复杂的音频任务;
  • 轻量化部署:在保证性能的前提下,优化框架的显存占用,适配边缘设备训练。

GLCLAP:用于ASR热词检索的对比学习预训练模型

小米团队提出了一个叫GLCLAP的预训练模型,专门解决ASR(自动语音识别)里的“上下文偏向”问题——简单说就是让ASR更准地识别那些领域特定词汇(比如人名、地名),还不用微调原ASR模型。

传统的上下文偏置 ASR 解决方案中,主要存在两种范式。第一种依赖发音词典,例如基于加权有限状态转换器(WFST)的相关方法。这类系统利用预先定义的发音信息来提升特定术语的识别准确率。第二种范式是将偏置机制直接融入 ASR 模型结构中,通过与 ASR 模型进行联合训练来实现 ,典型代表包括 SeAco-Paraformer。

然而,这两类系统都不利于在支持 prompt 的 ASR 场景中处理偏置词。对于基于 WFST 的系统而言,获取少数语言或方言的发音词典往往十分困难;而端到端的上下文偏置方法通常需要修改 ASR 模型结构并进行联合训练,这在 prompt 支持的大模型范式下缺乏灵活性,难以快速更新和迭代。同时,大模型训练本身需要大量时间和计算资源,成本较高。

大语言模型(LLMs)中引入的提示机制与检索增强生成(Retrieval-Augmented Generation,RAG)为此提供了重要启示。RAG 通过优化提示来获得期望输出,而无需修改 LLM 的网络结构或进行微调。受这一范式的启发,偏置提示的生成可以作为一个独立模块,与识别过程进行解耦。这样,模型既不需要依赖发音词典,也不必在训练阶段依赖 ASR 模型本身。该方法与当前的大模型框架高度契合,能够利用 RAG 思路实现大规模的上下文偏置增强。

之前常用的多模态预训练模型CLAP(对比语言-音频预训练),只能做“句子级”的音频-文本匹配——但偏向词往往只是音频里的一小段(比如句子里的“Taylor Swift”),CLAP抓不住这种局部信息。所以就搞了GLCLAP,同时抓“全局”(整句语义)和“局部”(偏向词细节)的信息,专门适配偏向prompt生成。

本文的主要贡献如下:

  • 利用音频-语言预训练模型生成用户自定义的偏置提示;
  • 提出全局-局部对比式语言-音频预训练模型(GLCLAP),能够在不同尺度上提取音频信息,显著提升句内偏置提示的准确性;
  • 将基于 GLCLAP 的偏置提示生成组件集成到 ASR 模型中,在无需微调的情况下对解码结果进行纠正。

Proposed Method

Local Subtext Extraction for CLAP

主要目标是将音频嵌入与从用户定义的偏向列表生成的嵌入进行对齐。通过计算这些嵌入之间的相似度,可以确定提供最佳匹配的偏向。如图1所示,原始的CLAP模型旨在捕捉整个音频和文本输入的语义信息。然而,它与偏向词检索任务并不完全兼容,因为偏向词通常是整个句子的一部分。为了克服这一限制,对训练过程进行了修改。具体来说,从原始文本注释中随机提取子文本。这种方法有助于增强模型对句子中短语境的表示能力。

全局-局部对比学习模型(GLCLAP)

文本分支:在文本处理方面,除了原始的处理方法(称为全局分支),还添加了一个局部分支来处理子文本。设ft(.)为文本编码器。局部分支和全局分支共享相同的权重,其后均连接一个平均池化层p(.)以降低词维度。全局分支从完整文本Xt ∈ RB×N 中捕获嵌入Et,而局部分支专注于为子文本Xt′∈ RB×N′提取嵌入Et’,其中N表示文本标记N’ ≤N的数量 :

音频分支:音频输入是“梅尔频谱”(Mel spectrogram),用Data2Vec2.0-large当编码器(Transformer结构,自监督预训练过,支持中英)。这里有个巧思:在平均池化前后都做对比学习——因为音频的局部信息是“时序相关”的,直接池化会丢信息。

  • 局部音频embedding(Ea’)包含时序(局部信息):编码器输出的原始结果,形状[B, T//4, D]T是音频帧数,//4表示编码器做了4倍下采样);
  • 全局音频embedding(Ea)包含全局信息:对Ea’做“时间维度平均池化”,形状[B,D]。

分别对文本和音频的局部表示全局表示计算对比损失。音频与文本嵌入之间的全局对比损失 Lg定义为:

局部 最大池化损失:

其中,maxt​ 表示沿时间维度取最大值。
l(⋅)=−B1​∑log(diag(softmax(⋅))),其中, diag 表示在对矩阵应用 softmax 函数之后,取其对角元素。该函数用于度量预测分布与目标分布之间的相似性

GLCLAP for Contextual Biasing ASR

GLCLAP 模型能够检索出与音频最匹配的偏置词,并将其作为提示(prompt)输入 ASR 模型,从而帮助 ASR 更准确地识别那些容易被误识别的低频词

  1. 先准备“用户定义的偏向词列表”(比如[“Catherine”, “Katherine”]),把这些词输入GLCLAP的文本分支,生成文本embedding(形状[K,C],K是列表长度);
  2. 把要识别的音频输入GLCLAP的音频分支(不做平均池化,保留时序信息),得到局部音频embedding(E^a’,形状[T,D]);
  3. 算“相似度矩阵”(Sim = 文本embedding × 音频embedding转置),形状[K,T]——每个元素代表“第k个偏向词”和“第t帧音频”的相似度;
  4. 对相似度矩阵做“时间维度max池化”,得到一个[K]的向量——每个值是“某个偏向词和整段音频的最大相似度”;
  5. 把超过“预设阈值”的偏向词挑出来当prompt,和原音频一起喂给ASR(比如Whisper),最后得到更准的识别结果。

实验

关键参数

  • 学习率:5e-4;
  • batch size:64;
  • 训练轮次:100轮(早停防过拟合);
  • 对比模型:Base ASR(Conformer架构,1.3亿参数,训过4个训练集)、Base CLAP、Subtext CLAP(只加了子文本提取的CLAP)、LCLAP(只算局部损失)。

音频编码器(Audio Encoder)
我们采用与 Data2Vec2.0-large 相同的网络结构和预训练方式。具体而言,使用的是 Data2VecAudioModel,这是一种基于 Transformer 的架构,专门用于语音表示的自监督学习。该模型在一个私有数据集上进行了预训练,数据集同时包含英文和中文语音数据。

文本编码器(Text Encoder)
文本编码器初始化为 bert-base-multilingual-uncased。该模型由 12 层 Transformer 组成,能够有效地捕获文本中的上下文信息 。

评估指标

  • 偏向词检索:用“Top-1召回率”(找对最匹配的偏向词的比例)和“F1分数”;
  • ASR性能:用“词错误率(WER)”——越低越好。

(1)偏向词检索效果(表1)对比不同模型的Top-1召回率(%)

  • Base ASR和Base CLAP效果都差,尤其是Base CLAP在STOP2上才19.4%;
  • 加了“子文本提取”后明显提升,说明局部信息有用;
  • LCLAP已经比Base好很多,再加上“全局分支”的GLCLAP,直接冲到97%左右,不管是人名还是地名场景都稳赢。

还有表2(Aishell-1 test NT的F1):

  • SeACo-Paraformer(传统偏向模型):96%;
  • LCLAP:96%(打平);
  • GLCLAP:96.96%(+0.96%)——比传统模型还强一点。

多模态对齐效果(图4):局部匹配很准

  • 图4a(词级):每个词(比如“NEW”“YORK”)都能和音频里对应的时序片段对齐,相似度高的地方很集中;
  • 图4b(短语级):“NEW YORK CITY”这种短语也能准确匹配音频片段,不会跟其他部分混;
  • 图4c(音频-文本对齐):即使文本有小错误(比如“EVETS”“YOR”),音频还是能和正确的文本片段对齐——说明GLCLAP的局部匹配能力很稳,不会因为文本小错跑偏。

对比Whisper Small加不同prompt模块的WER(%):

这篇论文最核心的贡献是:用“全局+局部对比学习”解决了ASR上下文偏向的“prompt匹配”问题

  1. 不用依赖发音词典,也不用改ASR模型、做微调,直接加个独立的GLCLAP模块就行,灵活又省资源;
  2. 不管是中文还是英文,不管是人名还是地名,GLCLAP的偏向词检索 accuracy都很高,还能实实在在降低ASR的WER;
  3. 给大模型时代的ASR个性化提供了新思路:用多模态预训练做检索增强,比传统方法更高效。

基于大语言模型的语音识别上下文偏置:热词检索与强化学习方法

在真实业务里,如果你做过语音识别落地,大概率会遇到类似的崩溃瞬间:

  • 在医疗场景,医生口述一长串药品名、病理名,模型能把普通口语识得很好,一到专业名词就开始「编」,还经常把词表里没出现的药名硬说出来;
  • 影视媒体、短视频领域,剧名、角色名、艺人名每天都在更新,热词词表轻轻松松几十万条,模型一旦“认不住、认不准”,用户搜不出东西。

即使对于LLM-ASR这种强大的语音识别模型,在落地过程中也绕不开热词这个话题。

通义最新工作中提出了一个面向 LLM-ASR 的可扩展上下文偏置框架,把“热词检索 + LLM 自适应 + 强化学习”串成一套系统,在大规模热词场景(近 10 万规模词表)下显著提升了热词识别能力,同时提升了整体识别效果。具体来说,首先,扩展了 Global–Local Contrastive Language–Audio Pre-trained(GLCLAP)模型,通过具备鲁棒性的数据增强与模糊匹配机制,从大规模词表中检索出一个紧凑的 top-k 热词候选集合。其次,将检索到的候选热词以文本提示的形式注入到 LLM-ASR 模型中,并采用GRPO进行强化微调,使用任务驱动的奖励函数同时优化热词识别性能和整体转写准确率

总体框架:检索 + 强化学习,两阶段协同

  1. 热词检索(Hotword Retrieval):
    从大词表中,为当前语音检索出一小撮最相关的 top-k 热词;
  2. 热词感知 ASR 适配(Hotword-aware ASR Adaptation):
    把检索出的热词以 prompt 形式喂给 LLM-ASR,并用强化学习优化其使用策略。

整体结构可以类比为语音版的 RAG(Retrieval-Augmented Generation):

  • 检索侧:基于改进版 GLCLAPGlobal–Local Contrastive Language–Audio Pre-trained Model做音频 ↔ 热词文本的匹配
  • 识别侧:把检索到的热词放到 LLM-ASR的文本 prompt 中,用 GRPO(Generative Rejection-based Policy Optimization)做 RL 微调,让模型学会:
    • 对真正出现的热词要“认得准”;
    • 对没出现的热词不要“瞎猜”;
    • 兼顾整体转写的 WER / 句子准确率。

增强版 GLCLAP 热词检索

GLCLAP 检索器以音频信号 x 及候选偏置词集合 G={g1,g2,…,gN}作为输入,其中 N 表示候选词表的规模。该检索器由两个组件构成:音频编码器(A-enc)和文本编码器(T-enc)。对于输入音频,A-enc 提取一个固定维度的音频嵌入表示,记为 haudio。同时,候选集合中的每一个偏置词 gi∈G 通过 T-enc 编码为对应的语义向量 ei​,从而得到文本嵌入集合 E={e1,e2,…,eN}。随后,我们计算 haudio 与集合 E 中所有文本嵌入之间的相似度得分,并选取得分最高的 top-k 个偏置词,构成子集 G′。这些被选中的偏置词随后被拼接到偏置提示(bias prompt)中,以引导模型进行上下文感知的转写。

本文对 GLCLAP 又做了两方面增强。

Robustness-Aware Data Augmentation(RADA)

为缓解热词规模扩大会导致召回率下降及干扰项增多的问题,我们构建了一套鲁棒性感知数据增强(RADA)流程,用于缩减热词词表规模。初始热词词表通过网络爬取领域相关的热词构建得到。对于候选集合 G 中的每一个偏置词 gi,我们首先利用TTS系统合成对应语音(在必要时由大语言模型生成上下文文本),随后使用现有的 ASR 系统对合成语音进行解码,以检测原始 LLM-ASR 是否已具备对该热词的稳定识别能力。若该热词能够被可靠识别,则将其从热词词表中移除;反之,则保留该词作为后续偏置建模的目标。通过该流程,模型训练与推理阶段仅需关注真正具有识别难度的热词,从而提升整体检索与偏置效果。结果:词表规模从 60 万缩减到约 9.8 万。

  • 检索难度显著降低;
  • 减少大量“干扰”的词,后面 LLM-ASR也不会被这些词干扰。

模糊匹配策略(Fuzzy Matching Strategy)

在实际应用场景中,热词往往难以通过严格的词面匹配进行约束,否则将导致热词词表规模急剧膨胀,进而降低系统的可扩展性。然而,在 GLCLAP 的训练过程中,热词通常通过严格的词汇级匹配进行约束,这与真实部署环境存在不一致性。在真实场景中,用户可能会使用目标热词的不同形态(如屈折变化)、语义改写(paraphrases)或仅部分提及目标术语。为弥合训练与部署之间的差异,我们在 GLCLAP 训练阶段引入模糊匹配策略,使模型能够学习到更具语义与发音鲁棒性的热词表示,从而提升在复杂真实场景下的检索与上下文偏置能力。

真实场景中,用户说的热词常常不是词表里的标准形式,比如:

  • 说一个药品名,可能有胶囊、颗粒、口服液等。
  • 说一个影片名,可能有第二部、续、新xxx等。

如果训练中的监督只允许严格的字面匹配,检索模型就会对这些变体缺乏鲁棒性。因此,本文引入了 fuzzy matching(模糊匹配策略),在训练阶段引入了由生成式上下文句子嵌入以及经过刻意扰动的偏置词变体所构成的数据增强

  • 在训练数据中增加多种变体:人为扰动词形,如Tongyi → Tongyi abc等;

这样做的效果:

  • 更贴合真实业务中“词形变动、说法多样”的场景;
  • 检索模型对热词的语义及形态变体更鲁棒。

LLM-ASR

LLM-ASR 网络由音频编码器、适配器以及LLM三部分组成。本文选用 Qwen2.5-7B 作为 LLM 主体。在音频编码器方面,将原始的 Conformer 编码器扩展为 Conformer-MoE 编码器,具体做法是在每一层 Conformer 中,将第二个前馈网络(FFN)模块替换为混合专家(MoE)结构。我们定义了 KC个候选专家,并通过router从中选择 KS个专家进行加权聚合,同时保留一个专用的共享专家以提供通用建模能力。

LLM-ASR 模型总参数规模为 10.5B,其中推理阶段的有效激活参数量为 8.7B。整体架构由一个 3.5B 参数规模的音频编码器和一个 LLM 解码器组成。编码器采用 CNN 前端并接入 20 层 Conformer-MoE 结构。CNN 前端首先对输入特征进行 4× 的时间维下采样,随后将得到的特征送入 Conformer-MoE 堆叠模块。每一层 MoE 采用 3-of-8 的专家路由策略,隐藏层维度为 3584。

编码器的输出进一步经过一次 2× 的帧级下采样与特征拼接操作,随后通过一个两层线性适配器(adapter),最终作为输入送入 LLM 解码器。在基础训练阶段,仅对 LLM 部分施加 LoRA微调,其中 LoRA 的秩(rank)设置为 64,缩放系数(alpha)为 32。在上下文偏置训练阶段,学习率设为 1×10−5,并联合更新音频编码器、适配器以及 LLM 的 LoRA 参数。在 GRPO 训练阶段,继续使用相同的学习率(1×10−5),但冻结编码器和适配器,仅更新 LLM 的 LoRA 参数。此外,我们将 KL 散度正则项的权重设置为 0.04,并在每个训练步骤中生成 6 个候选响应用于策略优化。

基于强化学习引导判别的上下文 ASR

为抑制由上下文偏置引入的误检(false positives),我们充分利用 ASR 模型在解码阶段对偏置词进行判别的能力。模型采用结构化提示(structured prompt)进行训练,形式如下:

“<Audio> 请将音频转写为文本。可使用的偏置词包括:<g₁> <g₂> … <gₖ>”。

其中,提供的偏置词列表刻意包含与当前语音无关的词项或干扰词,以避免模型过度依赖偏置词并提升其判别能力。

除上述数据层面的增强策略外,我们在 LLM-ASR 训练过程中进一步引入生成式拒绝式策略优化(Generative Rejection-Based Policy Optimization,GRPO) 这一强化学习方法,以增强模型对偏置词的区分能力。所设计的奖励函数联合优化多个目标,具体包括:

  • 匹配奖励(match reward):若某候选偏置词同时出现在模型输出与参考标注中,或同时未出现在二者中,则奖励值为 1;否则奖励值为 0;
  • 基于 WER 的奖励(WER-based reward):奖励定义为 1−WER,以保证整体转写准确率。

在推理阶段,为进一步提升性能,我们采用联合束搜索(joint beam search)策略,同时解码无上下文约束(context-free)与上下文条件化(context-conditioned)的候选假设。在保留检索增强生成(Retrieval-Augmented Generation,RAG)优势的同时,该策略有效降低了由无关偏置词引发的幻觉问题

数据集和效果

Context-Biasing Training Datasets

LLM-ASR 系统在总计数百万小时的语音数据上进行训练。本文重点关注上下文偏置相关的数据设置。在完成基础 LLM-ASR 训练之后,进一步使用约 200 万条与热词和/或上下文历史相关的语句对模型进行微调,这些语句主要通过 RADA 流程生成。在训练数据构成上,包含热词/上下文的语句与不包含热词/上下文的语句按 1:8 的比例进行混合,其中非偏置数据占主导,以避免模型对上下文偏置的过度依赖。对于包含热词的语句,每条语句包含 1–10 个热词,其中约一半语句包含正确的目标热词,另一半不包含目标热词,从而在正、负热词样本之间形成 1:1 的比例平衡。

GLCLAP微调数据

在大规模通用 ASR 数据上对模型进行训练,其中文本标注通过从完整转写中随机裁剪短语的方式获得。随后,在第二阶段对 GLCLAP 检索器进行微调时,我们构建了一个面向特定领域的音频–文本数据集,规模约为 25 万对,以更好地使检索结果与偏置词所属领域对齐

热词词表(Hotword Vocabulary)

热词词表通过网络数据构建,主要覆盖医疗和媒体(影视)两个领域。在得到初始词表后,进一步采用 RADA 策略进行过滤。经过基于 RADA 的筛选,热词词表规模由约 60 万条缩减至 9.8 万条,有效降低了词表规模并提升了可用性。

评测设置(Evaluation)

构建了两个面向特定领域的测试集:MediaMedical,每个测试集包含 240 条语句,主要来源于实际系统中的错误案例(bad cases)。每条语句均由人工标注其真实偏置词,并将这些偏置词加入偏置词列表中。此外,我们还构建了一个回归测试集 General Task,包含约 5,000 条标准 ASR 语句,用于评估通用识别性能。

ASR 评测中,我们采用两项指标:(i)句级识别准确率(Sentence-level Accuracy,SACC),以及(ii)关键词错误率(Keyword Error Rate,KER)。

结果

MediaMedical 测试集上评估基于 GLCLAP 的热词检索性能。如表 1 和表 2 所示,鲁棒性感知数据增强(RADA)与模糊匹配策略均对整体性能产生了正向贡献。具体而言,原始热词词表约包含 60 万条词项,在应用 RADA 筛选后缩减至 9.8 万条。模糊匹配不仅更契合我们的评测指标,同时也更真实地反映了实际应用场景中的偏置词使用情况。此外,结果显示,随着 top-kkk 值的增大,召回率呈持续上升趋势。

将 GLCLAP 与 LLM-ASR 模型结合,并以句级识别准确率(SACC)和关键词错误率(KER)报告最终识别性能。Base 列显示了在不使用任何偏置提示(bias prompt)的情况下,经过上下文感知微调的 LLM-ASR 模型的结果。

召回率随着 top-k 的增加持续上升,但在热词测试集上的 KER 和 SACC 并未呈单调改善。这是因为较大的 top-k 会向 LLM-ASR 模型引入更多干扰候选词,从而增加识别干扰

General Task 测试集上,大多数结果略低于未使用热词的基线表现。综合两个热词测试集的结果,我们认为 top-2 是更为合适的选择。

GRPO 训练的结果表 4,引入 GRPO 可以在媒体和医疗设备上的 KER 中产生明显的性能提升。 此外,得益于GRPO中使用的基于准确性的奖励,通用任务的句子准确性也得到了显着提高。

工程与落地视角的一些启发

从工程落地的角度,这篇工作有几个特别值得实践参考的点:

  1. 不要盲信“全量热词表”:
    • 用 RADA 先筛一遍“模型已熟练掌握”的词,再做偏置,能大幅降低复杂度与干扰;
  2. 检索与解码要协同设计:
    • 仅有高召回的检索还不够,要与 LLM 的使用策略共设计,否则容易“给了武器但不会用”;
  3. RL 对 ASR 也非常有用:
    • 传统 ASR 多用 CE/CTC/Transducer 等损失,很难直接对接任务级指标;
    • 引入类似 GRPO 这样的 RL 方法,可以在“热词识别 + 句子准确”这样的组合目标上做更直接的优化;
  4. top-k 是个关键的“工程超参”:
    • k 太小,召回不足;
    • k 太大,干扰过多;
    • 最优点依赖业务场景、词表质量与 LLM 容量,需要通过系统性实验来选。

Fun-Audio-Chat:端到端语音交互模型

Fun-Audio-Chat 是为自然、低延迟语音交互构建的大型音频语言模型。它引入了双分辨率语音表示(一个高效的 5Hz 共享主干 + 一个 25Hz 的精炼头)以在降低计算的同时保持高语音质量,并采用 Core-Cocktail 训练以保留强大的文本 LLM 能力。它在语音问答、音频理解、语音函数调用以及语音指令遵循和情感共鸣基准上都取得了顶级成果。

现有模型面临的挑战:语音 Token(通常约 25Hz)与文本 Token(约 3Hz)在时间分辨率上的不匹配会削弱语义信息,同时带来高计算成本、限制实际部署,并在多模态训练过程中导致文本 LLM 知识的灾难性遗忘。

Fun-Audio-Chat采用 双分辨率语音表征(Dual-Resolution Speech Representations, DRSR) 架构:共享的 LLM 主干以高效的 5Hz 帧率 处理音频(通过语音 Token 分组实现),而 Speech Refined Head(SRH) 则以 25Hz 分辨率 生成高质量语音 Token。该双分辨率设计在计算效率与语音生成质量之间实现了有效平衡,使 GPU 训练时长降低近 50%

不同于某些语音模型的大规模音频-文本预训练与后训练方法,Fun-Audio-Chat基于预训练模型,全量监督微调阶段采用 Core-Cocktail Training 策略缓解灾难性遗忘问题,后训练使用多任务 DPO 训练以增强模型在鲁棒性、音频理解、指令遵循及情感化语音共情能力方面的表现。Fun-Audio-Chat 在有效保留原始文本 LLM 知识的同时,获得了强大的音频理解、推理与生成能力。

模型在语音转文本与语音-语音生成任务上取得了具有竞争力的性能,并在多项口语问答基准测试中位列同规模模型的领先水平。同时,其在音频理解、语音函数调用、语音指令遵循以及语音共情等任务上亦展现出媲美甚至优于同类模型的表现。构建了 Fun-Audio-Chat-Duplex,一种全双工变体,在口语问答基准与全双工交互场景中均取得了优异性能。

Spoken QA tasks:其中Mimo-Auido 进行大规模语音预训练
other tasks

Introduction

现有语音大模型面临以下挑战:

  • 语音token与文本token速率不匹配,跨模态对齐时多个语音帧映射到单个文本 token 的语义空间,会影响语义信息且LLM 难以复用其原生 token-level 推理能力;
  • 多模态的预训练与后训练,会导致其原有知识发生灾难性遗忘;
  • 频帧率通常较高(如 12.5Hz 或 25Hz),整体计算成本偏高,限制了模型在实际场景部署。

针对以上问题,提出 Fun-Audio-Chat

  • 大规模后训练与模型扩展能力。基于DrVoice的两项关键创新——双分辨率语音表征(DRSR)架构Core-Cocktail 训练策略——基础上,进一步扩展到显著更大的数据与模型规模,包括覆盖 数百万小时的多样化音频数据,以及 dense  8B 参数模型与 MoE 30B-A3B 参数模型。DRSR 依托于 主干 LLM 的高效 5Hz 处理25Hz 生成头,即使在更大规模训练中,仍能保持高计算效率(训练 GPU 时长约 降低 50%);同时,Core-Cocktail 训练策略 通过 两阶段训练、分阶段学习率及中间模型合并机制,在 8B 与 30B-A3B 模型 中均有效缓解了灾难性遗忘问题。
  • 多任务 DPO 训练以提升鲁棒性与泛化能力。DPO 训练增强 Fun-Audio-Chat 的能力,包括:对真实语音数据的鲁棒性、指令遵循能力、音频理解能力以及语音共情能力。通过多任务 DPO 训练,Fun-Audio-Chat 获得了超越基础语音-文本交互的高级能力,包括 语音函数调用、语音指令遵循,以及语音共情(识别并推理用户情绪状态并生成具有共情特质的响应),使模型能够以适当的情感智能与功能执行能力,理解并应对复杂语音交互场景。
  • 全双工语音交互能力。Fun-Audio-Chat-Duplex,一种支持双向同时语音通信的全双工变体。该模型在口语问答基准任务上表现出具有竞争力的性能,同时在全双工交互指标上亦取得优异结果,展现出在自然对话与轮流发言(turn-taking)方面的强大能力。

Methodology

语音输入经过 MLLM(多模态大语言模型)Tokenization分组处理编码,分别用于两种自回归预测任务:Text Head:预测文本 token,Speech Refined Head(SRH):预测语音 token。生成的语音 token 随后通过 speech detokenizer 转换为语音波形。需要注意的是:SRH 通过 5 次自回归前向传播 生成 5 个语音 token,其中 5 为分组因子。
Fun-Audio-Chat 的全双工通信模式

上图展示了 Fun-Audio-Chat 及其全双工变体 Fun-Audio-Chat-Duplex 的架构。

Fun-Audio-Chat 的框架主要由三个模块组成:

  1. 语音输入处理模块:通过 Speech EncoderSpeech Tokenizer 将原始音频波形转换为结构化表示,分别用于用户端(User)和助手端(Assistant)。
  2. 多模态大语言模型:整合 共享 LLM 主干 与专门的 Text HeadSpeech Refined Head(SRH),用于生成文本 token 与语音 token。
  3. Speech Detokenizer:将生成的语音 token 重建为音频波形。

该架构实现了统一的音频-文本编码同步的语音-文本生成。在推理阶段,无论输入为文本还是语音,均会被转换到一个统一的语义表示空间,由 MLLM 处理,从而通过 SRHText Head 同时生成语音和文本输出。

Speech Tokenization and Detokenization

Fun-Audio-Chat 采用 Whisper-Large-v3作为 语音编码器,从用户语音输入中提取连续表征。随后, Adapter 模块 对这些特征进行时间分辨率降采样,并将其维度匹配到 LLM 的隐藏空间。

鉴于语义 token 在语音表征中的有效性其,尤是其与文本内容的高度对应性,采用 S3Tokenizer 作为 语音分词器,将音频波形转换为离散的语义 token 序列。S=[s0​,s1​,…,sT−1​]其中 T 表示序列长度,用于助手端(Assistant)的输出。

S3Tokenizer 最初是在 CosyVoice [论文] [代码库] 中引入的,它是一个基于预训练的 SenseVoice-Large 模型的监督语义语音分词器,它增强了提取的词元与文本和副语言信息的语义关系,对数据噪声具有鲁棒性,并减少了对干净数据收集的依赖,从而使模型训练可以使用更广泛的数据来源

在逆向过程中,Speech Detokenizer [CosyVoice3的模型解码合成音频]利用 speaker-specific embeddings 编码音色等声学特征。随后,Flow Matching 模型 将这些 token 转换为 Mel 频谱表示,再通过 HiFi-GAN 声码器 将 Mel 频谱重建为音频波形。

Dual-Resolution Speech Representations (DRSR)

为了在支持跨模态能力的同时 保持预训练文本 LLM 的文本能力,Fun-Audio-Chat 采用了先前工作 DrVoice中提出的 双分辨率语音表征(Dual-Resolution Speech Representations,DRSR) 架构。该架构有效解决了 语音 token(通常约 25Hz)与文本 token(约 3Hz)之间的时间分辨率不匹配问题,同时提升计算效率,并实现高质量语音生成。

语音 Token 分组。为弥合时间分辨率差异,采用 DrVoice中的分组技术,将 25Hz 的语音 token 转换为 5Hz 的表示,并输入至 共享 LLM 主干。该分组变换可表示为:

其中 𝐬j 表示单个语音 Token ,Concat 表示串联,k=5 是基于语音 Token 频率 (25Hz) 与所需 LLM 处理频率 (5Hz) 之比的分组因子。这种机制将序列长度从T减少到T/k,允许共享LLM以5Hz帧速率运行,这大大减少了计算开销(训练GPU时间减少了大约50%),同时保留了LLM的语义推理能力。

Speech Refined Head (SRH).分组机制提升了计算效率,但其同时会丢失对自然语音合成至关重要的细粒度声学信息。为弥补这一不足,Fun-Audio-Chat 引入了一个专用的 SRH,用于在 完整的 25Hz 分辨率下生成语音 token。SRH 执行一种反分组(ungrouping)操作,来自 共享 LLM 的最终隐藏状态hL[SLLM]首先通过线性投影被转换为与分组大小一致的嵌入表示:

接下来分解为 k 段:

生成的 𝐇 为 SRH 提供条件上下文,SRH 以 25Hz 自回归方式生成语音标记。 训练目标优化语音标记预测:

其中 si 表示第 i 个语音标记。 这种双分辨率框架允许 Fun-Audio-Chat 遵循 DrVoice 中建立的设计原则,同时实现计算效率(共享 LLM 层中的 5Hz 处理)和高保真语音合成(通过 SRH 生成 25Hz)。

Multimodal Large Language Model (MLLM)

MLLM 架构在预训练文本 LLM 的基础上进行扩展,使其具备统一的音频-文本处理能力,从而能够接收语音或文本任一模态输入,并同时生成语音与文本输出。Fun-Audio-Chat 属于并行式联合语音-文本模型。借鉴 Moshi 的做法,我们在模型中引入 显式文本流,用于为语音生成提供语义引导。模型设计仅在 助手侧进行模态对齐,这反映了人机对话中的固有非对称性:用户通常只提供单一模态输入(文本或语音),而助手则能够输出协调一致的多模态响应(即联合语音-文本输出或仅文本输出)。

模型利用 LLM 的自回归特性,在每一步迭代地将 语音 token st文本 token tt​ 一并输入至 共享 LLM 层。两类 token 的嵌入向量通过逐元素相加(addition)进行融合,形成统一的输入表示。第 t步的复合嵌入:

其中,EspeechEtext​ 分别表示语音与文本 token 的嵌入函数。为解决语音序列与文本序列在长度上的不匹配问题,我们对较短的序列进行填充,并在每个话语中使用特殊静音标记 <|SIL|>作为填充值。

模型的生成过程遵循自回归范式:

其中,x 表示输入,yt​=(st​,tt​) 表示在时间步 t 的联合语音–文本输出。该建模方式在同一自回归过程中统一了语音与文本的联合生成。

Post-Training

Fun-Audio-Chat 基于已有的预训练模型构建,并采用多阶段后训练流程进行训练,利用覆盖多领域、多任务的数百万小时语音数据,其中包括对话语音与多语言语音,以及面向语音理解任务的音频数据,从而保证对多种应用场景与使用需求的全面覆盖。自建数据则包括文本、ASR、TTS、音频理解、语音指令跟随以及语音共情数据。

整个多阶段训练流程包括以下三个阶段:
(1) Pre-alignment:利用大规模语音-文本配对数据,对 Speech Encoder、Adapter 与 Speech Refined Head 进行对齐训练
(2) Core-Cocktail 训练阶段:用于监督式全参数微调,采用由 CosyVoice 3基于数十亿文本 token 合成的高质量语音数据,并通过合成语音的词错误率(WER)阈值筛选得到
(3) 多任务 DPO 训练阶段:引入多样化真实语音数据以提升鲁棒性,引入音频理解与 ASR 数据以增强理解与感知能力,同时使用指令跟随数据(包含情感、风格与韵律控制)以提升语音指令跟随能力,并结合语音共情数据以强化情感理解与共情式响应生成能力。

预对齐阶段

Speech Encoder 采用 Whisper-Large-v3的权重进行初始化,从而提供稳健的语音理解能力。Shared LLM Layer 使用 Qwen3-30B-A3B进行初始化,或可替代性地采用视觉-语言基础模型 Qwen3-VL-8B,以充分利用预训练文本 LLM 强大的语义理解能力。此外,来自 CosyVoice 3的预训练 Speech Tokenizer Speech Detokenizer 被直接引入,并在 Fun-Audio-Chat 的整个训练过程中保持冻结。

预对齐训练:使用大规模语音-文本配对数据,对 Speech Encoder、Adapter 与 Speech Refined Head 进行联合对齐学习。在该阶段中,Shared LLM Layer 被保持冻结,以确保其预训练能力不受破坏。

Core-Cocktail 训练阶段

实验观察到,多模态模型训练过程中存在一个基础性的学习率折衷问题:学习率过高将导致 MLLM 性能退化,并加剧基础文本 LLM 知识的灾难性遗忘;而学习率过低则会导致收敛缓慢,甚至训练停滞。为解决这一优化难题并避免知识流失,采用了此前在 DrVoice中提出的 Core-Cocktail Training 方法论,其核心是一种 两阶段训练策略

阶段一:高学习率微调。 在该初始阶段,我们对全部 MLLM 参数、Audio Encoder 与 Adapter 进行全量微调,并采用较高的学习率。对于 Fun-Audio-Chat,在阶段一中学习率按照余弦退火策略从 1×10−4 逐步衰减至 1×10−5。该阶段的目标是使模型参数能够快速迁移至更有利于多模态学习的损失曲面区域,从而实现快速任务适配。

中间模型合并。 为缓解阶段一高强度训练可能带来的 MLLM 性能退化问题,引入中间模型合并操作。将阶段一训练后的 MLLM 参数 M1​ 与原始预训练 LLM 参数 M0 进行加权插值,得到合并模型: Mr​←αM1​+(1−α)M0

其中 α用于控制插值平衡。该合并过程重新引入基础 LLM 的核心知识,从而保护其原有的文本理解能力。较小的 α值将更有利于保留基础 LLM 的知识。在我们的实现中,α=0.5。

阶段二:低学习率精调。 在阶段二中,我们对合并后的模型 Mr 以更低的学习率进行全量微调。对于 Fun-Audio-Chat,学习率同样按余弦退火策略从 1×10−5 衰减至 1×10−6。该阶段实现了稳定且精细的优化,在避免高学习率相关不稳定性的同时进一步提升模型性能。Core-Cocktail Training 策略在快速适配与知识保持之间实现了有效平衡,显著缓解了灾难性遗忘问题,并促进高效的多模态学习。

多任务 DPO 训练

在完成 Core-Cocktail 训练之后,采用多任务 DPO 训练提升模型在真实语音数据上的鲁棒性、音频理解能力、语音指令遵循能力以及语音共情能力。多任务 DPO 阶段引入了多维度的偏好学习目标:(1)鲁棒性偏好:更偏好在噪声环境或多样化语音输入下仍能保持输出质量的响应;(2)指令遵循偏好:更偏好能够准确遵循语音指令(包括情绪、风格与韵律控制)的响应;(3)音频理解偏好:更偏好体现对音频内容进行准确理解与推理的响应;(4)语音共情偏好:更偏好能够展现恰当情绪理解与富有共情反馈的响应。DPO 训练损失在这些偏好维度上联合计算,从而使模型能够学习到一个在多种能力之间取得平衡的统一偏好信号。该多任务 DPO 训练阶段使模型能够更好地对齐人类偏好,并在真实世界会话场景中表现出更优性能,从而区别于主要依赖监督微调的既有工作。

全双工交互训练

为实现实时全双工语音交互,提出并采用并行语音–文本输入流架构,并将 Fun-Audio-Chat 扩展为全双工变体 Fun-Audio-Chat-Duplex,从而支持自然、类人化的无缝双向通信。具体而言,并行语音–文本输入流允许模型在助手生成语音的同时继续接收用户语音输入,从而有效利用原本空闲的时间片。该并行输入机制能够同时处理来自用户与助手的语音输入,使模型能够应对重叠语音片段并保持会话语境一致性。全双工交互训练从 Core-Cocktail 阶段得到的检查点继续训练,在其已具备的多模态能力基础上进一步强化。该阶段采用通过数据增强方式构造的全双工对话数据进行训练:即基于高质量半双工对话数据,并按照 OmniFlatten中的方法模拟全双工交互行为将传统轮流发言的文本对话转化为并行双流式交互,其中用户与助手均可同时发声。通过全双工训练,模型能够学习自然的轮次切换、打断处理与跟进反馈等交互行为。

OmniFlatten:https://aclanthology.org/2025.acl-long.709.pdf

Experiments

评估任务和指标:

  • 语音转文本 (S→T) 评估。VoiceBench 、OpenAudioBench两种类型的口语问答基准
  • 语音到语音 (S→S) 评估。UltraEval-Audio 用于端到端语音转语音问答评价。
  • 音频理解。 MMAU、MMAU-Pro 和 MMSU来评估综合音频理解能力。
  • 语音识别。验证英语和普通话 (ZH) 性能
  • 语音功能调用。 Speech-ACEBench、Speech-BFCL 和 Speech-SmartInteract评估模型基于语音指令执行函数调用的能力。
  • 语音指令跟随和语音同理心。 VStyle 基准评估模型理解和执行语音指令的能力,以控制语音生成属性,如情绪、说话风格、速度、音调和音量。

评估指标

对于全双工交互评估,我们使用S2M-T(多模态响应中的文本输出准确性)和S2M-S(多模态响应中的语音输出准确性)来衡量知识理解性能,并使用轮流成功率来衡量模型在全双工场景下正确处理轮流的交互百分比。

结果

语音问答:Fun-Audio-Chat-8B 在 OpenAudioBench 上取得 76.61% 的整体最佳成绩,在 VoiceBench 上取得 83.21% 的整体最佳成绩,居于约 8B 规模模型中的领先水平;同时,Fun-Audio-Chat-30B-A3B 在与大规模基线模型(含顶级闭源模型)的比较中亦展现出具有竞争力的结果。

语音理解:Fun-Audio-Chat 在综合音频理解基准(包括 MMAU、MMAU-Pro 和 MMSU)上取得了最优表现,优于多种强大的开源基线模型

语音功能调用

Fun-Audio-Chat-30B-A3B 在所有评测模型中取得了最高的总体得分(79.63%),并在 Speech-ACEBench(单轮:76.40%)和 Speech-SmartInteract(84.13%)等任务上表现尤为突出。该模型在理解基于语音的函数调用指令并准确执行方面展现出强大能力,这对于构建实际可用的语音控制应用至关重要。 在并行函数调用场景中(Fun-Audio-Chat-8B 在 ACEBench-Parallel 上取得 54.50%,在 BFCL-Parallel 上取得 87.63%),结果进一步凸显了 Fun-Audio-Chat 在语音交互中处理复杂、多步骤指令的能力。

语音指令跟随和语音同理心

全双工交互

全双工知识理解。 表7展示了Fun-Audio-Chat-Duplex的全双工知识理解性能。 结果表明,Fun-Audio-Chat-Duplex 在全双工对话场景中保持了强大的知识理解能力。全双工架构成功地保留了模型的知识理解能力,同时实现了同步双向通信,使系统即使在处理重叠的语音输入和输出时也能保持上下文和理解。

Fun-Audio-Chat-Duplex-30B-A3B 实现了完美的轮流成功率(100.00%),优于 Moshi(99.77%)和 FreezeOmni (93.87%)。 Fun-Audio-Chat-Duplex-8B 达到了 99.94%,也展现了出色的轮流能力。 这些结果表明,Fun-Audio-Chat-Duplex 成功实现了自然高效的全双工语音交互,该模型能够处理同时语音并保持适当的对话流程,密切反映了人与人对话的动态。

计算效率双分辨率设计显着降低了计算要求和潜在延迟,经验测量显示,与以更高帧速率运行的模型相比,训练期间的 GPU 时间减少了约 50%,且不影响语音质量

限制

多轮对话中的复杂问题回答,该模型有时会表现出上下文记忆丢失,其中先前轮次的信息可能无法一致保留。

语音指令跟随能力在表达方面表现出一些不稳定。 

语音共情能力表现出一定的不稳定。