arXiv'26 | 小米 CocktailASR-1 给 ASR 装上“选择性听觉”:参考语音当声纹 prompt,一个模型只录你一个人

arXiv’26 | 小米 CocktailASR-1 给 ASR 装上“选择性听觉”:参考语音当声纹 prompt,一个模型只录你一个人

原文:Xiaomi-CocktailASR-1 Technical Report 代码:xiaomi-research/xiaomi-cocktailasr-1(模型权重与推理代码在 HuggingFace: Ease3/Xiaomi-CocktailASR-1)


1. 前言

大模型把 ASR 带入了一个新阶段:把音频编码器接到 LLM 前面、音频编码成 embedding 当 token 喂进去,由 LLM 自回归地把文字解码出来。这类模型一般叫 SpeechLLM,它不是一个具体模型的名字,而是一类架构的统称——Qwen3-ASR、StepAudio2、Seed-ASR 都属于这一类。它们把多语言、方言、时间戳、上下文理解都收进了一个统一的端到端模型,在干净的单说话人语音上准确率已经高到没什么可优化的。

但这类模型有一个共同的软肋:说话人一多就崩。一段录音里两三个人同时开口,让模型转录其中某一位——这个困扰了语音领域几十年的”鸡尾酒会问题”(cocktail party problem),到现在仍然是 ASR 走向真实场景最硬的那道坎。上面那几个模型在强重叠的多人测试集上,错误率能飙到 60% 甚至 160%,基本等于不可用。

小米这次放出的 Xiaomi-CocktailASR-1 就是冲着这个场景去的,而且它想同时解决四件事:在多人混音里准确转录指定说话人、在只有一个人说话时不掉点、在参考说话人根本不在录音里时老老实实输出空、以及可选地把”为什么选这个人”的推理过程写出来。

这四件事的难点不在于单独做会做——前两件过去十年都有人做,难的是它们的最优解互相打架,而同一个产品里这四种情况是随机出现的。这篇技术报告的价值,就是给出了一个”统一架构 + 分阶段训练”的方案,把四种能力放进同一个模型里还能各自不掉点。下面我们按 需求 → 老方案为什么不行 → 新设计 → 怎么训 → 数据怎么造 → 效果 的顺序完整过一遍。

CocktailASR-1 的四个核心能力

2. 目标说话人识别的两条老路:一个在传递误差,一个在传递噪声

要搞清楚 CocktailASR-1 的设计动机,得先看这个任务过去是怎么做的。

这个任务在学术上叫 TS-ASR(Target-Speaker ASR,目标说话人语音识别):输入是一段混着好几个人的录音,外加一小段”指定是谁”的参考语音,输出只包含那个人的话。注意它和 MT-ASR(Multi-Talker ASR,多说话人识别)不是一回事——MT-ASR 是”把所有人依次转出来”,输出用特殊 token 分隔,但它不告诉你每句话是谁说的,在你只关心某一个特定说话人的场景里就没法用。

TS-ASR 此前主要有两条技术路线:

第一条是级联式:先分离,再识别。 前面挂一个 TSE(Target Speech Extraction,目标语音提取)模型,把目标说话人的声音从混音里剥离出来,后面接一个普通 ASR 模型做转录。这条路的工程直觉很顺,但有两个绕不过去的问题:一是分离模型输出的音频天然带失真和伪影,这些误差会原样传给下游 ASR,一步错步步错;二是两个模块独立训练、独立优化,中间没有任何机制能补偿对方的缺陷。

第二条是端到端注入声纹向量。 不做显式分离,而是用一个独立训练好的说话人验证模型(d-vector / x-vector / ECAPA-TDNN 这一类)把参考语音压成一个定长向量,再把这个向量作为条件信号注入到 ASR 模型的某一层。这条路省掉了分离环节,但它把问题换了个形式:参考语音被压成了一个几百维的向量,说话人音色之外的细节全丢了;更麻烦的是,这个声纹编码器的训练目标是”区分说话人身份”,不是”服务于识别内容”,两边的优化目标从一开始就不一致。后果是,哪怕一段音频里只有一个人在说话、压根不需要”认人”,这个硬塞进来的条件信号依然会干扰模型的正常识别——具体表现就是模型对着单说话人语音也会过度抑制,把本该转出来的内容当成”非目标”给删掉,这种删除错误在错误率上的表现比替换错误更难看。

这两条路还共享一个更根本的缺陷:它们都没有任何环节负责判断”目标说话人到底在不在这一段里”。分离模型总会输出点东西,声纹条件信号总会被注入,下游 ASR 自然也总会给出一段转录——即便参考说话人压根没出现在混音里,模型也会一本正经地”编”一段不存在的话出来,而不是老实说”没有这个人”。在智能音箱、耳机这类实时交互设备上,这种误触发比识别错词更伤用户体验。

到这里,CocktailASR-1 要解决的核心矛盾就清楚了:为多人场景做的优化会拖累单说话人的保真度,而且不管怎么优化,拒识能力都不是靠调参能调出来的。

3. CocktailASR-1 的解法:参考语音不做压缩、不走独立模块,直接和目标语音进同一套表征

既然老方案的问题出在”中间要过一道独立的声纹模块”,CocktailASR-1 的做法就是把这道中间环节整个拿掉——没有独立的声纹验证模型,也没有独立的语音分离模块。

它的信息通路是这样设计的:参考语音和待识别的混合语音被拼接成一整段波形,一起送进同一个 Data2Vec2(D2V2)音频编码器,编码结果直接喂给 Qwen3-8B。于是”这段混音里哪一段是目标说话人”这件事,不再由某个专门模块提前算好再交接给 ASR,而是变成了 LLM 在自己 self-attention 里做的事:参考语音那一段的帧级表征,和混合语音里每个候选说话人对应时间段的帧级表征,被平等地摆进同一个序列,模型跨位置比较相似度、锁定该转录哪一段——这本来就是 Transformer 最擅长干的活。

这个设计里有三处值得单独说清楚的判断:

第一,为什么用 D2V2 这种自监督学习(SSL)编码器,能顺便省掉声纹模块。 D2V2 的预训练目标是掩码预测(mask prediction):把输入的一段语音特征遮住,让模型根据上下文把被遮的部分重建出来。要做这件事,模型必须同时理解”说了什么内容”和”这段声音像谁”——前者给语义,后者给音色。所以 SSL 模型天然把语义和说话人信息融合在了同一套表征里,不需要再外挂一个只认身份的编码器。论文在架构一节把这点讲得很直白:正是这个机制让模型在提取目标说话人语音特征时能自适应地增强目标、抑制干扰。

第二,为什么保留帧级表征比压缩成声纹向量更划算。 前面说的级联方案和声纹向量方案,本质上都在做同一件事:把参考语音压缩成一个中间表示(一段分离出来的音频,或者一个定长向量)。任何压缩都会丢信息,而这里丢掉的恰好是判断”像不像”最需要的细粒度线索。CocktailASR-1 选择不压缩——参考语音保留完整的帧级序列,和目标语音的表征摆在同一个空间里直接比对。

第三,为什么这套设计能给单说话人场景留退路。 因为编码通路是共享的:只有一个人说话时,模型走的是一条和普通 ASR 几乎一样的路径,不存在”额外的条件信号来扰乱正常识别”这回事。这也是为什么后面第 5 节的第一个训练阶段,本质上就是在训一个普通 ASR 模型。

至于拒识,这套设计给出的答案是:参考音、目标音、输出文本全部处于同一个自回归序列里,只要训练数据里放了”参考说话人缺席”的负样本,模型自然有地方去学会把输出收敛成空,不需要推理时再加阈值判断逻辑。

4. 一段拼接波形怎么变成一段文本:编码、贴 token、生成的完整链路

上面说的是设计思路,具体到实现,结合 HuggingFace 上开源的 modeling_mic_asr.py 和 feature_extraction_mic_asr.py(通过 trust_remote_code 加载)能看得很清楚。

CocktailASR-1 框架总览

下面这套流程涉及不少维度变化和模块先后顺序,光看文字容易绕,先给一张完整链路图,再逐步展开说细节:

输入拼接→编码→贴入LLM的完整流程

第一步,输入怎么拼。 MicAsrFeatureExtractor.prepare_audio 先把参考音频和目标音频各自做峰值归一化(统一到 0.99),然后处理参考音频的长度:短于 1 秒就补零到 1~4 秒中的一个随机长度;长于 4 秒就在 1~4 秒区间里随机采样一个目标长度,再从原音频里随机截取一段(不是固定截头或截尾)。处理好的参考片段记作 ref_cut,目标音频前面拼上 1 秒静音,最终喂给模型的是一整条 1D 单声道波形:

waveform = ref_cut ⊕ [1秒静音] ⊕ target

顺序是参考在前、目标在后,中间的 1 秒静音是刻意插进去的——它的作用是明确切开”参考”和”待识别”这两段信号,给声纹特征一个锚点,否则模型很难判断参考片段在哪里结束。

第二步,怎么编码。 这整条波形送进 MicAsrAudioEncoder。里面的 D2V2 编码器(0.6B 参数),先把波形转成 FBank 声学特征(25ms 窗、10ms 步长、80 维),再过两层 stride=2 的卷积做时间维下采样(合计 4 倍),于是帧率从 10ms 降到 40ms 一帧——一段 6 秒的拼接音频,大概会变成 150 个左右的帧级表征。这里有个论文提到的工程改动:原始 D2V2 是吃裸波形的,小米在编码器前端加了一个 FBank 处理模块来替换波形输入,训练和推理速度都能明显加快,而性能不掉。

这些表征经过两层线性映射:in_proj 是 Linear(1280, 1280),out_proj 是 Linear(1280, 4096),4096 正好是 Qwen3-8B 的隐藏维度。这两层就是论文说的 Adapter,做的事情很直接:把音频编码器的输出维度对齐到 LLM 能吃的维度,完成跨模态对齐。

第三步,怎么”贴”进 LLM。 拿到形状为 [1, seq_len, 4096] 的音频向量后,代码构造了一条输入 token 序列:

input_ids = [audio_token_index] * seq_len + prompt_ids

audio_token_index 是词表里预留的一个占位 id(值 151669),先占住音频对应的每一个位置,后面接文本 prompt 编码出的 token id。真正的音频向量不是拼进 embedding 序列的,而是通过在 Qwen3 的 embed_tokens 模块上挂一个 forward hook 塞进去的:hook 在词嵌入查表完成之后,把 input_ids 里等于 audio_token_index 的那些位置,用 masked_scatter 直接替换成前面算出来的音频向量。这样就把连续的音频表征”贴”进了离散 token 序列里,不需要改动 Qwen3 本身的 embedding 层。替换后的整条序列送进 Qwen3 做标准自回归生成,从输入长度之后的部分开始解码,就是最终文本。

有一点容易看漏:实际拼进模型的是 prompt_prefix + prompt,prompt_prefix 是一个 <|im_end|> 特殊 token。标准模式和 CoT 模式用的是两套 prompt,除此之外前向计算逻辑完全一样,生成配置也共用:贪心解码(do_sample=False)、重复惩罚 1.1、标准模式 max_new_tokens=256、CoT 模式 512。

第四步,不同模式下输入输出分别长什么样。 这张表把三种情况说清楚:

场景 输入(音频) 输入(prompt) 输出
标准模式 · 单人 ref_cut ⊕ 静音 ⊕ target prompt_standard 目标说话人的转录文本
标准模式 · 多人 同上 prompt_standard 目标说话人的转录文本
标准模式 · 拒识 同上(但参考说话人不在 target 里) prompt_standard 空字符串
CoT 模式 同上三种 prompt_cot:额外要求分步推理,结果放进 <think> / <answer> 标签 <think> 内是推理过程,<answer> 内是最终转录(拒识时 <answer> 内为空)

这里最值得强调的是”拒识”那一行:代码里没有任何显式的相似度阈值判断去触发拒识,走的和标准模式完全一样的代码路径,模型只是在训练阶段学会了在”参考说话人缺席”这种输入模式下,把生成结果收敛成空。换句话说,拒识这件事在 CocktailASR-1 里是一个训出来的行为,不是一段推理时的 if-else——这也解释了为什么它在其他方案里天然缺失:不是加个阈值就能补上的,得是训练目标里就有这一项。

5. 四个能力为什么要放在一个模型里:它们的最优解在互相打架

到这里有必要停下来,把”这个模型要同时做四件事”讲透,因为这是整篇报告的问题起点。

论文在训练一节开头就把这四件事列了出来,按重要性分别是:

多人识别——这是 TS-ASR 的本职工作:在重叠语音里准确转录目标说话人,同时压住其他说话人的干扰。智能音箱、随身耳机、会议系统这类场景里,用户开口时旁边有人在说话是常态。

单说话人识别——论文给了一个很实际的数字:真实会议数据集 AliMeeting 的重叠率只有 30%~40%,也就是说大多数时候现场只有一个人在说话,而这个人可能正在使用一个专门为”抗多人干扰”设计的系统。更关键的是,系统事先并不知道这一段音频里有几个说话人,所以一个只为多人场景优化的 TS-ASR 模型,必然在单人场景下吃亏。

负样本拒识——用户可能只是路过,或者暂时没开口,此时录音里只有别人的声音。一个没有拒识能力的模型会把这些无关内容强行转录出来,造成严重的误触发。

CoT 推理——输出显式的中间推理步骤(有几个说话人、每个候选人的性别和声纹相似度),提升可解释性,同时给下游任务提供结构化信息。这一项论文自己也在强调它的定位是”可解释性和扩展性”,而不是单纯刷指标。

四件事放在一起,真正的难点就浮现了:它们的目标函数互相拉扯。

  • 拒识能力的训练,本质是在教模型”输出可以为空”。这个信号一旦给多了,模型在正常识别时也可能动不动就输出空——拒识和保真度打架。
  • 多人抗干扰的训练,本质是在教模型”抑制一部分语音内容”。这个能力泛化到单说话人场景,就会变成前面说的过度抑制,把正常内容删掉——多人能力和单人能力打架。

这就是第 2 节结尾那个”核心矛盾”在训练侧的体现。CocktailASR-1 给出的解法不是设计一个更复杂的损失函数去平衡它们,而是用四个训练阶段把冲突拆开,一次只加一种约束。

四阶段训练流程

Stage 1:先训一个普通 ASR 模型(ASR Base)。 这一阶段完全不带参考语音,只用标准的 ASR prompt 和普通单说话人数据,把预训练音频编码器和 Qwen3 base 通过 Adapter 对齐起来,让一个本来只会读文本的 LLM 学会听写。这一步得到的其实就是一个标准 ASR 模型——它的存在是为了让”单说话人识别”这条路径有一个干净的起点,后面的训练都是在这个基础上叠加能力,而不是从头学习怎么听清内容。

Stage 2:正式引入参考语音(TS-ASR Base)。 数据换成”参考 + 静音 + 目标”的拼接形式,配 TS-ASR 专属 prompt,让模型学会提取声纹特征、定位目标说话人。这一阶段做了两件关键的加料:一是以 50% 的概率对训练数据施加噪声混合策略,把一半的干净数据直接变成多人重叠语音,同时注入环境噪声和人声干扰,保证重叠的随机性和多样性;二是掺入少量负样本,让模型第一次接触”拒识”这个信号,但比例控制得很低——原文的措辞是”在不损害核心识别性能的前提下”获得初步拒识能力。

Stage 3:加入推理能力(TS-ASR + CoT)。 CoT 数据和原来的 TS-ASR 数据等比例混合做联合训练。这里的重点是联合训练而不是替换训练:模型要学会看 CoT prompt 就在 <think> 标签里写推理过程,看标准 prompt 就直接输出转录文本。这样标准模式的能力不会被 CoT 训练冲掉,用户可以按需开关 CoT。

Stage 4:精调收尾(Fine-tuning)。 在精心挑选的高质量数据上做 SFT,再叠加强化学习(RL,论文引的是 DeepSeekMath 那篇的做法)做进一步优化。这一阶段的核心动作是控制各类训练数据的混合配比,让多人识别、单人泛化、拒识三方面能力达到平衡。

这个顺序的用意,说白了就是把”听清楚 → 认人 → 说理由 → 精调”拆成四步走,每一步都在前一步已经稳定的能力上叠加新目标,而不是一上来就让模型同时应付所有相互冲突的约束。

6. 数据从哪来:三类数据解决三个问题,配比随训练阶段动态变

四阶段能成立,前提是每一阶段都有对应的数据。CocktailASR-1 训练数据一共三类,每一类对应一个要解决的问题:

多说话人 TS-ASR 数据(约 40 万小时),用来训核心能力。来源有三部分:开源多人数据,包括真实重叠录音(AMI、AliMeeting)和合成混音(LibriMix);用自有的单说话人 ASR 数据合成出来的模拟重叠数据;以及自采的日常对话录音。合成方式是按概率往干净语音里注入环境噪声和人声干扰,制造随机重叠的多说话人场景——这个噪声混合策略就是 Stage 2 里以 50% 概率施加的那个。

单说话人 TS-ASR 数据(约 60 万小时),用来防止过抑制。构造方式和多人数据正好相反:参考语音和待识别语音取自同一个说话人的不同录音片段。这个设计的意思很直白——让模型在”参考和目标其实是同一个人”的大量样本上,学会识别而不是拒绝,从而把多人训练带来的过度抑制倾向压下去。论文特意点出,单人和多人数据的采样比例是需要调优的,模型就是靠这个比例在”压住多人干扰”和”保住单人内容完整性”之间找到平衡点。

负样本数据(约 1 万小时),用来训拒识。构造方式是把参考语音换成一段和目标音频完全无关的说话人录音,制造”参考说话人缺席”的场景。规模比前两类小两个数量级,但论文强调它的采样比例在不同训练阶段是逐步提高的——这正是 Stage 2 到 Stage 4 逐步加码的机制。如果一上来就给大量负样本,模型会过度倾向输出空,把正常识别也带崩。

CoT 数据不需要新录音,而是在上述三类样本上套模板生成的,按单说话人正样本、多说话人正样本、负样本三种格式分别构造。以开源代码里给的样例为例,一段 CoT 标注长这样:

<think> Audio information: 0-2.15s is enrollment speech; 2.15-3.15s is silence;
3.15-18.1s is 2-speaker mixture audio; total duration 18.1s.
Enrollment speech: male.
Speaker1 information: male; similarity to the enrollment speech is 4.
Speaker2 information: female; similarity to the enrollment speech is 2.
Target speaker: Speaker1 and the enrollment speech are both male; 4(Speaker1) > 2(Speaker2);
Speaker1 has the highest similarity score ... since 4 >= 3, it is identified as the target speaker.
Final output:</think> <answer>THIRTY OR FORTY MILES EASTWARD FROM SEATTLE</answer>

推理链条是固定的四段:先给出拼接音频的分段信息(参考语音段、静音段、待识别语音段各自的时间戳)、参考说话人的性别,然后逐个列出混合音频里每个候选说话人的性别和相似度打分,最后比较分数、给出结论。

其中相似度打分是这套 CoT 数据生成的关键:用 CAM++ 声纹模型(一个说话人验证模型)分别提取各说话人和参考语音的 embedding,算余弦相似度,得到 0~1 之间的连续分数,再按均匀量化映射到 1~5 五个离散等级写进标注。论文解释了为什么要做这个离散化:连续分数里那些细微的数值差异对模型是噪声,离散成五个等级反而让训练更稳、收敛更快。判定规则是取相似度最高的候选说话人作为目标,若最高分低于等级 3,就标注为”目标说话人缺席”。

这里要接上第 4 节那句话:这个等级 3 的阈值只出现在训练数据的标注阶段,是用来生成 CoT 监督信号的规则,不是模型推理时跑的代码逻辑。真正让模型学会拒识的,是这些带阈值标注的样本本身。

三类数据的分工可以用一句话概括:多人数据教它”挑人”,单人数据教它”别乱删”,负样本教它”该闭嘴时闭嘴”,CoT 模板则把这些判断过程写成可监督的文本。

7. 效果:多人场景拿到 SOTA,同时单人和拒识两项都没塌

论文的评测分了四类测试集:合成的多人混音、真实的多人会议录音、单说话人测试集,以及专门构造的负样本测试集。指标这里先交代清楚,后面看表会顺畅很多:

  • WER / CER(Word / Character Error Rate,词 / 字错误率):把识别结果改成参考答案需要改动的词数(或字数)占参考答案长度的比例,替换、删除、插入三类错误都计入,越低越好。中文按字算所以用 CER,英文按词算用 WER。这里要提醒一句:因为插入错误会膨胀分子,WER 是可以超过 100% 的——所以下面表里那些 110%、160% 的数字,意思是模型输出的内容比参考答案长得多、且大部分是错的,基本等于完全不可用。
  • RR(Rejection Rate,拒识率):负样本里被正确拒识(输出空)的比例,越高越好。
  • FRR(False Rejection Rate,误拒率):本该有内容的正样本被错误拒识的比例,越低越好——这个指标直接决定了模型在日常使用中会不会动不动就”装聋”。
  • Non-empty WER:把输出为空的样本剔除之后再算的 WER,避免拒识行为干扰对转录准确率的判断。

先看合成多人数据集(LibriMix 和 LibriSpeechMix,都是一段音频里叠 2 人或 3 人的混音):

Model LibriMix 2mix LibriMix 3mix LibriSpeechMix 2mix LibriSpeechMix 3mix
Xiaomi-CocktailASR-1 4.11 12.29 2.90 4.91
Qwen3-ASR-1.7b 68.75 106.04 92.17 160.82
StepAudio2 71.23 121.08 92.72 164.66
Gemini-2.5-pro 48.41 76.10 30.69 52.34
TCP 4.84 12.23 - -
CONF-TSASR - - 5.40 7.60
MT-LLM 6.70 16.2 - -
TS-VAD(460h) 6.61 14.81 7.92 15.97
Whisper-SS-TTI 7.97 21.97 - -
Transformer-SA-ASR - - 6.40 8.50

这张表里最有信息量的不是第一名,而是两类失败的对比。Qwen3-ASR 和 StepAudio2 这些通用语音大模型在强重叠数据上直接崩到 60%~160% 的区间,这其实不是它们”弱”,而是它们从来没有被训练去做”在多人里挑一个人”这件事,输入一段重叠语音,它们会试图把所有内容都转出来,于是输出长度爆炸、错误率爆表。Gemini-2.5-pro 稍好一些——它能通过 prompt 理解”只转某个人”这个要求,所以在合成集上做到了 30%~80%,说明通用多模态模型确实有这个潜力,但缺乏针对性训练还是差得远。

另一类对比是过去的 TS-ASR 专用 SOTA 模型,比如 TCP 和 CONF-TSASR:它们各自在自己擅长的数据分布上很强,但一个模型很难同时覆盖所有数据集。TCP 在 LibriMix 2mix 上做到 4.84%,CONF-TSASR 在 LibriSpeechMix 2mix 上是 5.40%,但表中它们的其他格子大多是空的。CocktailASR-1 的价值在于用一个模型把整张表都填上了:LibriMix 2mix 从 4.84% 降到 4.11%(相对下降 15.1%),LibriSpeechMix 2mix 从 5.40% 降到 2.90%(相对下降 46%)。3mix 那一列例外——LibriMix 3mix 上 12.29% 略高于 TCP 的 12.23%,基本可以看作打平或微弱落后。

再看真实会议录音(AMI-SDM 是英文远场单麦克风会议,AliMeeting-Far 是中文远场 8 麦阵列会议,都带严重的混响和自发重叠):

Model AMI SDM AliMeeting Far
Xiaomi-CocktailASR-1 21.81 20.63
Qwen3-ASR-1.7b 38.18 39.64
StepAudio2 110.50 76.82
Whisper Large-v2 36.40 -
Gemini-2.5-pro 52.95 56.75
SQ-Whisper 22.0 -
MC-TS-ASR - 27.50

真实数据上的优势更能说明问题,因为这里的语音是自发的、重叠是不规则的、还叠着远场混响。Qwen3-ASR 这类模型的错误率在真实集上反而比合成集更低一些(因为真实录音里有大量单人片段,缓解了它们的崩溃),但依然在 30% 以上,离可用还有距离。对比专用 TS-ASR 模型,AMI-SDM 上前一版最好的 SQ-Whisper 是 22.0%,CocktailASR-1 做到 21.81%——属于小幅超越;AliMeeting-Far 上前一版最好的 MC-TS-ASR 是 27.50%,CocktailASR-1 把错误率砍到 20.63%,这个提升就很实在了。这两个数字也说明它跨数据集泛化得比较均匀,不是只在某个数据分布上过拟合出来的结果。

接下来是单说话人场景——这部分才是检验那个”设计取舍”的地方:

Model LibriSpeech
FRR / WER
AliMeeting-near
FRR / WER
AMI-ihm
FRR / WER
WenetSpeech(meeting)
FRR / WER
CommonVoice(zh)
FRR / WER
Xiaomi-CocktailASR-1 0.36 / 1.73 0.38 / 6.57 0.01 / 8.89 0 / 5.81 0.73 / 4.95
Qwen3-ASR-1.7b 0 / 1.87 0 / 6.39 0 / 10.56 0 / 5.84 0 / 5.39
StepAudio2 0 / 1.58 0 / 6.82 0 / 37.54 0 / 5.46 0 / 5.07
Whisper Large-v2 0 / 2.70 - 0 / 16.90 - 0 / 26.8
Gemini-2.5-pro 21.31 / 6.77 14.95 / 16.10 24.30 / 21.02 0 / 27.58 0.003 / 14.01

结论很清楚:CocktailASR-1 在单说话人场景下的 WER 和专门做单人 ASR 的 Qwen3-ASR、StepAudio2 基本处于同一水平线(LibriSpeech 上 1.73% vs 1.87% / 1.58%),在 AMI-ihm 这种远场会议场景上还大幅领先(8.89% vs StepAudio2 的 37.54%),同时 FRR 控制在 0.36%~0.73% 这个量级。“给模型加拒识能力”这件事,没有以牺牲正常识别为代价。

作为对照,Gemini-2.5-pro 展示了另一种失衡:它在单说话人场景下的 FRR 高达 21.31%,说明它倾向于”宁可拒识也不乱转”,代价是把大量正常语音也拒掉了,WER 直接崩掉。这就是论文反复强调的”拒识能力和保真度要平衡”的现实意义。

最后是负样本上的拒识表现:

Model LibriSpeech Neg Aishell Neg Chinese in-house Neg
Xiaomi-CocktailASR-1 79.59 75.35 68.54
Qwen3-ASR-1.7b 0 0 0
Gemini-2.5-pro 81.79 64.20 54.7
StepAudio2 0 0 0

没有专门设计过拒识机制的模型,拒识率清一色是 0——Qwen3-ASR 和 StepAudio2 遇到参考说话人缺席的情况,会一本正经地把不存在的人说的话”编”出来。Gemini 在英文负样本上做到 81.79%,比 CocktailASR-1 的 79.59% 还高一点,但结合上一张表看,它是靠”普遍倾向于拒识”换来的,误拒率高达 21.31%;CocktailASR-1 则是在 0.36% 误拒率的前提下做到 79.59% 的拒识率,中文场景(Aishell Neg 75.35%、自采中文数据 68.54%)也稳定领先 Gemini。两个指标要放在一起看才说明问题:单看拒识率,Gemini 在英文上更好;单看误拒率,所有基线都”完美”(因为它们压根不拒识);只有同时看,才知道谁真的把这件事做成了。

8. CoT 的真实价值:不是把 WER 压下去,是把”选人过程”变成看得见、能复用的中间结果

前面把 CoT 放在四能力里讲了它在训练上怎么和其他能力共存,这里单独看看它到底值多少。先看数据——报告在合成多人集上对比了标准模式和 CoT 模式:

Test Set Standard mode CoT mode
LibriMix 2mix 4.11 3.87
LibriMix 3mix 12.287 12.285
LibriSpeechMix 2mix 2.90 2.88
LibriSpeechMix 3mix 4.91 4.81

坦白说,这个提升很小:LibriMix 2mix 上从 4.11% 降到 3.87%,是目前看到的比较明显的一处;LibriMix 3mix 上 12.287% 到 12.285%,等于没有变化;剩下两个测试集都是 0.1 个点以内的波动。如果只看这张表,CoT 的性价比确实不高——而且代价是真实的:CoT 模式下生成长度上限翻倍到 512 个 token,推理开销和延迟都要相应增加。

那论文为什么还把 CoT 列为四大能力之一?报告自己给的定位是两件事:

一是结构化推理过程会引导模型显式关注声纹这类关键特征,在复杂场景下减少一部分识别错误——这对应上表里那点有限的提升。

二是推理过程本身产出的中间结果——说话人数量、每个人的性别、各自的声纹相似度水平——对需要更深层语音理解的下游任务是可以直接复用的辅助信息(会议摘要、说话人日志这类任务本来就要先算这些东西)。也就是说,用 CoT 模式跑一遍,等于顺手把 diarization 的部分产物也拿到了。

所以对 CoT 这块,比较诚实的评价是:它的价值主要体现在把”为什么选中这个人”的判断过程变成一份可读、可复用的结构化输出,而不是换取更低的 WER。它的真实代价(延迟、token 消耗)和真实收益(可解释性、下游可用性)都需要一并放进决策里——好在训练时 CoT 和标准模式是联合训练的,用户可以在推理时按需开关,不必为不需要的场景付这份开销。

9. 总结

CocktailASR-1 这份技术报告的思路,一句话概括:把”认人”这件事从独立模块里拿出来,交给 LLM 自己在一套统一表征里完成。参考语音不做压缩、不走声纹编码器,直接和目标语音拼在一起进同一个 D2V2 编码器,让 Qwen3-8B 用自己的 attention 去比对、去定位、去决定转录哪一段,以及要不要转录。

这套设计之所以能成立,靠的不只是架构上的简化,而是两件事的配合:

  • 架构上,D2V2 这种 SSL 编码器本身就融合了语义和声纹信息,所以不需要外挂声纹模块;参考语音保留帧级表征而不是压缩成定长向量,信息损失小;共享编码通路又让单说话人场景不会因为”多加了条件信号”而退化。
  • 训练和数据上,四个互相拉扯的能力被拆成了四个阶段、三类数据:多人数据(40 万小时)教它挑人,单人数据(60 万小时)教它别乱删,负样本(1 万小时)教它该闭嘴时闭嘴,负样本比例在阶段间逐步提高以平衡拒识率和误拒率,CoT 数据则用 CAM++ 打分加量化模板把”选人”的判断过程变成可监督的文本。

效果上,它在合成和真实的多说话人基准上拿到 SOTA(LibriSpeechMix 2mix 相对下降 46%,AliMeeting-Far 从 27.5% 降到 20.63%),同时单说话人场景和专用 ASR 模型基本持平、拒识率 79.59% 而误拒率只有 0.36%。要挑刺的话,CoT 对 WER 的贡献确实有限(LibriMix 3mix 上基本为零),40 万 / 60 万小时这个数据规模也不是普通团队能复刻的——它更像是小米把自家数据资产和工程能力一次性兑现出来的产物。

不过好消息是权重和推理代码都放出来了:Ease3/Xiaomi-CocktailASR-1 上 trust_remote_code=True 直接能跑,仓库里 tools/test_batch_scp.py 也给了现成的批量测试脚手架。如果你手头有多说话人的会议或对话数据,想在真实分布上试一把”只转录某个人”,复现成本并不高。


如果这篇文章涉及的语音多模态架构设计、SSL 编码器与 LLM 的 adapter 对齐方式想系统深入,可以看看之前出版的《动手学 AutoML:从 NAS 到大语言模型优化实战》,书里 LLM 架构自动化和参数高效微调那部分内容,和本文讲的 encoder-adapter-LLM 三段式架构、以及用 forward hook 做模态拼接的思路有一定呼应——角度不同,但底层都是”怎么把一个模态的表征对接到 LLM 的可消费空间里”这个问题。

动手学AutoML书籍封面

Flag Counter