把一场会录下来,做成文字,看起来像是 ASR 的老本行。可真正把转写交给参会者,他们马上会追问三件事:

谁,在什么时候,说了什么?

传统 ASR 只回答最后一问;说话人日志(speaker diarization)回答第一问;强制对齐或时间戳模型负责第二问。工程上通常把三套系统串起来,再用规则把结果缝成会议纪要。问题是,每条流水线都可能独自犯错,而且后面的模块只能在前面的错误上继续工作。

OpenMOSS(MOSI.AI)的《MOSS Transcribe Diarize Technical Report》把这个任务重新包装成一句更像大语言模型的问题:既然最终答案本来就是一串带结构的文本,为什么不让一个模型直接把整串答案生成出来?

这串答案长这样:

[0.11][S01]Good morning![1.03]
[1.11][S02]Morning, guys![1.34]
[1.20][S03]Hi, everyone![1.44]

开始时间、匿名说话人、正文、结束时间,全在同一条 token 流里。论文把它称为 SATS(Speaker-Attributed, Time-Stamped Transcription,带说话人归属与时间戳的转写)。MOSS Transcribe Diarize 用 128k 上下文一次处理最长 90 分钟音频,不在会话级切块,也不在 ASR 与说话人聚类之间来回倒手。

本文以 2026 年 7 月 17 日修订的 v7 论文为主,并用官方开源仓库0.9B 模型配置补上论文没有展开的结构细节。哪里是论文明确写出的,哪里来自发布代码,后文会分清。

一、它真正要解决的,不只是 ASR

先看传统方案为什么麻烦。典型的会议转写流水线至少有四步:

  1. ASR 先把声音识别成文字;
  2. 对齐器给词或句子补时间边界;
  3. diarization 系统提取声纹、聚类,得到「这段声音属于谁」;
  4. 合并器把两条时间线拼成 [说话人] 文本

其中任何一步都可能让下一步无从挽救。ASR 把重叠语音漏掉,聚类器便没有词可分;说话人边界偏了 300 毫秒,合并时一个词就可能被安到隔壁人头上;同一个人在第 3 分钟与第 53 分钟的声学条件不同,局部聚类还会把他拆成两个人。

传统级联:四个目标,三个脆弱接口多人录音ASR说了什么时间对齐何时说声纹聚类谁在说规则合并拼成纪要漏词 / 重叠丢失边界偏移身份漂移端到端 SATS:一条输入,一种输出语言整段音频MOSS TranscribeDiarize共享上下文 · 联合目标[0.11][S01]Good morning![1.03][1.11][S02]Morning, guys![1.34][1.20][S03]Hi, everyone![1.44]时间 × 说话人 × 正文,在同一条 token 流里共同生成
传统级联把识别、对齐、聚类和合并分开优化,错误会沿接口传递;MOSS 把音频直接映射成一条同时含时间戳、说话人和正文的结构化序列

这几年已有几种折中:DiarizationLM 用 LLM 对 ASR 与 diarization 的独立输出做全局修补;Sortformer 联合建模词与说话人,但先训 diarization、冻结后再训 ASR;SpeakerLM 更接近统一 MLLM,不过论文所引设置仍局限在约 50–90 秒、最多 4 人,也不原生输出片段时间戳;JEDIS-LLM 用说话人提示缓存把短片训练推广到长音频流式推理,但仍需维护分块与缓存。

MOSS 的立意不是再做一个更强的后处理器,而是删除模块之间的接口

音频  →  [开始时间][说话人]正文[结束时间]  →  下一段……

识别错字、认错人、切错边界不再由三套目标分别优化,而是在同一个自回归目标里共同承担损失。这里的「一次」「单遍」应理解为一次端到端生成流程,不是说长答案只需一次 decoder forward——自回归模型依然逐 token 解码。

二、一条输出序列,装下三种任务

这个看似朴素的输出格式,其实是全文最关键的设计。

[start][speaker] text [end]
  • text 是普通 ASR;
  • [S01][S02] 是说话人归属;
  • 两个数字字段是片段的开始与结束时间;
  • 相邻片段首尾相接,整场会就是一条长序列。

从语言模型视角看,三项任务被统一成同一个 next-token prediction:

P(答案 | 音频, 指令)
= Π P(当前 token | 音频, 指令, 已生成的所有 token)

好处不只在接口少。模型生成第 40 分钟的 [S03] 时,能同时参考这个人之前说过什么、与谁轮流发言、用了哪些专有名词,而不是只看眼前几秒的声纹。语义上下文也能反过来帮 diarization:如果一段话明显是对上一位提问者的回答,谁在接话就不再是纯声学猜测。

说话人编号本身没有真实姓名含义。预测把甲叫 [S01]、乙叫 [S02],参考答案反过来编号,两份结果在语义上仍完全一致。后文的 cpCER 指标会专门处理这种标签置换。

时间不是位置编号,而是一把明写出来的尺子

长音频还有一个难题:第 60,000 个音频 token 到底对应第几分钟?如果只依赖 Transformer 的 position id,模型要自己把离散位置换算成物理时间,而且音频压缩率一变,换算关系也变。

论文的办法是把时间信息写成文本时间标记,插进音频表示之间。公开的 0.9B processor 更具体:音频最终是 12.5 token/s,配置每隔约 5 秒插入一次十进制数字 token,相当于在长长的声学 embedding 上铺一把刻度尺。

只有位置编号:知道「排第几」,不知道「第几秒」123······6749967500同一个序号体系很难直接表达「这是真实世界的第 4,387.2 秒」文本时间标尺:12.5Hz 声学表示之间,周期性写入数字锚点51015… 5400 秒
位置编号只告诉模型这是第几个 token;MOSS 在音频表示之间周期性插入 5、10、15…这样的文本时间锚点,让 90 分钟音频拥有可直接读出的物理时间标尺

于是模型既可以用局部声学特征找边界,也可以借最近的时间锚点输出 [1234.56] 这样的秒数。时间不再被绑死在稀疏的绝对位置上,而变成 LLM 熟悉的数字文本。

这个思路有点像在没有刻度的卷尺上直接印数字:位置编码仍告诉模型 token 之间相隔多远,文本锚点则告诉它「这里大约是第几秒」。两者分工,不让 RoPE 独自承担物理计时。

三、0.9B 开源模型:Whisper 的耳朵,Qwen3 的脑子

论文正文对架构写得很克制:音频编码器提取多说话人声学表示,投影模块把它映射到预训练文本 LLM 的特征空间,LLM 再统一完成长上下文建模与结构化生成。所幸 2026 年 7 月发布的 0.9B 权重与代码把每个部件都摊开了。

声学前端:先听懂长录音16kHz 波形80-bin log-mel100 帧/秒30 秒前端窗口Whisper encoder24 层 · d=1024 · 16 头2× 下采样 → 50Hz跨块拼接恢复整场顺序不重置 speaker4 帧拼接4096 维12.5Hz音频—文本桥:把声音写进 LLM 的 embedding 序列MLP adaptor4096 → 1024 → 1024SiLU · LayerNorm统一输入序列5masked_scatter语言主干:在一条 128k 记忆里认字、认人、报时Qwen3-0.6B 风格 causal decoder28 层 · d=1024 · 16Q/8KV · full attention131,072 token · RoPE θ=1,000,000自回归结构化输出[0.11][S01] Good…[1.03][1.11][S02] Morning…[1.34]总参数约 0.9B · 全模型可训练
MOSS Transcribe Diarize 0.9B 开源实现:16kHz 波形经 Whisper-Medium 配置的 encoder 编成 50Hz 特征,4 倍时间合并后成为 12.5Hz 音频 token,由两层 MLP 投影到 Qwen3 风格 0.6B decoder 的 1024 维空间,在 128k 上下文中自回归生成时间戳、说话人与正文

按公开配置,从左到右是:

部件公开实现规格作用
音频前端16kHz,80 维 log-mel,30 秒窗口把波形变成 Whisper 输入特征
音频编码器Whisper-Medium encoder 配置:24 层、d=1024、16 头提取声学、内容与说话人线索
时间合并连续 4 帧拼接,4096 维从 50Hz 压到 12.5Hz
适配器Linear(4096→1024) → SiLU → Linear(1024→1024) → LayerNorm映射到文本模型 embedding 空间
文本主干Qwen3-0.6B 风格 causal decoder:28 层、d=1024、16 个查询头 / 8 个 KV 头在统一上下文里生成结构化转写
上下文131,072 token,full attention,RoPE θ=1,000,000容纳长音频与长输出

Whisper 的 mel 特征是 100 帧/秒,encoder 前端再做 2 倍降采样,得到约 50 帧/秒;随后 time_merge 每 4 帧拼成一个向量,最终正好 12.5 个音频 token/秒,也就是一个 token 约管 80 毫秒。

这笔账解释了 90 分钟为什么塞得进 128k:

90 × 60 × 12.5 = 67,500 个音频 token

再加周期性时间锚点、提示词与输出文本,才有机会留在 131,072 token 的总预算内。长上下文不是一句装饰性的参数,而是由音频压缩率、最长时长与输出预算共同倒推出来的系统设计。

融合方式也非常直接。processor 先把 <|audio_pad|> 展开成与音频 token 数相同的占位符;音频特征过适配器后,用 masked_scatter 替换这些位置的文本 embedding。对 Qwen3 主干来说,音频与普通文本从此就是同一条序列里的不同 embedding。

「不切块」到底是什么意思?

公开实现确实会把原始波形按 30 秒送进 Whisper 前端,这是 Whisper 特征提取器的固定窗口;各段 encoder 特征随后会按原顺序重新拼接、统一做时间合并,再整体送进 128k LLM。

所以论文所谓「90 分钟不切块」,更准确地说是:不会把整场会议拆成彼此独立的 SATS 推理任务。声学前端仍做工程分块,但说话人记忆、全局语境与最终输出共享一条长上下文,不会每 30 秒重置一次 [S01]

四、真实世界不够乱,就在模拟器里把它弄乱

端到端 SATS 最缺的不是单人录音,而是高质量的「多人 + 逐字稿 + 说话人 + 时间边界」联合标注。论文用两类数据补齐。

第一类是真实数据。作者从互联网与公开语料中收集多语种、多人录音;AISHELL-4 同时有会议室远场与每位说话人的近场通道,训练和评测取远场信号的平均通道。Podcast 与影视片段则补充长访谈、快节奏轮换、重叠说话、方言和多语言场景。

第二类是可控模拟数据。它不是简单把几条语音从头叠到尾,而是专门模拟「一场对话如何发生」。

1. 从单人语料池抽 2–12 位说话人···每人一条连续话语按片段数 + 对数正态权重,切成连续词组2. 在同一条时间线上安排轮换、停顿与受控重叠S01S02S03高斯间隔允许重叠 ≤ 较短段的 80%3. 让拼接听起来像真的边界吸附到附近低能量点50ms 交叉淡化真实噪声 + 混响 · SNR 0–15dB
可控多人对话模拟器:抽取 2–12 位说话人,把单人话语切成连续词组,在统一时间线上安排轮换、停顿与受控重叠,再把边界吸附到低能量点、做 50ms 交叉淡化,最后加入噪声和混响

完整配方如下:

  1. 从内部单人语料池随机抽 2–12 位不同说话人,每人取一条话语;
  2. 按采样的片段数与对数正态权重,把每条话语切成连续词组;
  3. 把词组放到同一时间轴上,用高斯分布采样段间空隙,强制说话人轮换;
  4. 允许重叠,但重叠长度最多是较短片段的 80%
  5. 切点吸附到附近的低能量位置,并做 50ms cross-fade,避免硬切爆音;
  6. 加入真实噪声与混响,SNR 从 0–15dB均匀采样。

这套模拟器控制的其实是对话的「属性分布」:多少人、谁接谁、空多久、重叠多深、环境多吵。模型不只见过干净的轮流念稿,也见过插话、抢话、远场混响和低信噪比。

不过要留意论文没有报告训练数据总时长、真实与模拟数据占比、语种分布、训练步数、优化器或损失细节。「大规模真实野外数据」是一个方向描述,还不是可复现配方。开源权重能用,不等于训练过程已经完整复现。

五、实验先学会看三把尺子

论文使用四个测试集,但数据统计表只列了前三个:

数据集时长平均时长说话人数主要难点
AISHELL-4 Test36.6–39.9 分钟38.2 分钟5–7真实会议、远场、重叠
Podcast25.5–60.6 分钟44.3 分钟2–11长访谈、说话人反复回归
Movies0.4–29.9 秒11.5 秒1–6快速轮换、密集重叠、多语种/方言
Alimeeting论文未给统计另一组会议域外测试

AISHELL-4 是公开语料;Podcast 与 Movies 是作者内部整理的测试集。Movies 以中英文为主,也含韩语、日语、粤语等,由专业标注员给真值;论文写明计划公开这两套数据。

CER:只管说了什么

CER(Character Error Rate,字符错误率)把说话人信息拿掉,只比较全文需要多少次插入、删除、替换才能变成参考文本:

CER = 编辑距离(预测全文, 参考全文) / 参考字符数

它衡量 ASR,却看不出一句完全正确的话是否安错了人。

cpCER:先给匿名说话人对号入座,再算错字

cpCER(concatenated minimum-permutation CER)先把每位说话人的所有话按顺序拼起来,再尝试预测标签与参考标签的所有匹配方式,取总编辑距离最小的一种。

参考答案S01S02今天讨论发布计划稍后我把方案发出好的,收到预测 A:编号整体换名,内容与归属关系都正确S02S01今天讨论发布计划稍后我把方案发出好的,收到最优置换:预测 S02 ↔ 参考 S01CER = 0;cpCER = 0。匿名编号叫什么不重要,人物对应关系才重要。预测 B:字全对,但最后一句分错人S01:今天讨论发布计划  S02:好的,收到 稍后我把方案发出CER = 0cpCER > 0(归属错误被看见)
CER 忽略说话人,只看全文字符;cpCER 先寻找预测 speaker ID 与参考 speaker ID 的最优置换,再按每位说话人的拼接文本计算错误,因此纯粹把 S01/S02 整体换名不会扣分,但把一句话分错人会扣分

用最优置换是必要的:[S01] 只是匿名编号,不该因为系统把两位说话人的号码整体互换就判错。cpCER 同时受转写与归属影响,因此通常比 CER 更接近「会议纪要到底能不能直接用」。

Δcp:一个好用但不能过度解读的差值

论文再定义:

Δcp = cpCER − CER

作者把它解释为说话人归属额外造成的退化。直觉上,CER 很低而 cpCER 很高,说明字都听对了,却分错了人。

但它不是严格的「纯 diarization 错误率」。CER 与 cpCER 使用不同的拼接和最优匹配问题,二者不是嵌套目标,并不保证 cpCER ≥ CER。论文自己的 Alimeeting 结果就是 CER 24.86、cpCER 22.17、Δcp = -2.69。负数不可能代表「分说话人让错误减少了 -2.69%」这种物理量,只能说明两种对齐口径产生了反常差值。

所以 Δcp 适合当诊断信号,不宜当成可精确分离出来的说话人错误质量。

六、结果:联合转写确实强,但时间戳还没参加考试

论文把 MOSS 与 Doubao、ElevenLabs Scribe v1、GPT-4o Transcribe Diarize、Gemini 2.5 Pro、Gemini 3 Pro、VibeVoice ASR 对比。下面先抓最重要的 cpCER:每个数据集都拿 MOSS 对比该列最强的其他系统。

cpCER:带说话人归属的转写错误率(越短越好)MOSS该数据集最强其他基线0102030%AISHELL-415.8324.99 · VibeVoicePodcast7.3710.23 · Gemini 2.5 ProMovies12.7614.73 · Gemini 3 ProAlimeeting22.1729.33 · VibeVoice数据:论文 Table 2
四个数据集的 cpCER(越低越好):MOSS 分别为 15.83、7.37、12.76、22.17,均低于该数据集最强的其他基线 24.99、10.23、14.73、29.33
数据集MOSS CER ↓MOSS cpCER ↓MOSS Δcp ↓cpCER 最强的其他基线
AISHELL-414.8415.830.99VibeVoice 24.99
Podcast5.977.371.40Gemini 2.5 Pro 10.23
Movies6.3612.766.40Gemini 3 Pro 14.73(其 Δcp 为 6.11
Alimeeting24.8622.17-2.69VibeVoice 29.33

四组结果可以分开读。

AISHELL-4:长会议优势最明显。 这些录音平均约 38 分钟、5–7 人。MOSS 的 cpCER 从最佳基线的 24.99 降到 15.83,相对下降约 36.7%;CER 也从最佳基线的 18.18 降到 14.84。更关键的是 Δcp 只有 0.99,说明在这套口径下,加入说话人归属后几乎没有额外恶化。

Podcast:长距离说话人回归也稳。 音频最长超过一小时、最多 11 人。MOSS 的 CER/cpCER 为 5.97/7.37,最佳其他系统为 7.38/10.23;cpCER 相对下降约 28.0%。这正是 128k 全局上下文最想拿下的场景:嘉宾隔了几十轮再次开口,标签仍要接回原来那个人。

Movies:不是靠「长」才赢。 影视片段平均只有 11.5 秒,却有快速轮换和重叠。MOSS 的 cpCER 仍以 12.76 最低,说明收益不只来自长上下文,也可能来自端到端训练与重叠模拟。不过论文正文说它在 Movies 的 Δcp 也优于所有基线,这与表格不完全一致:MOSS 是 6.40,Gemini 3 Pro 是更低的 6.11。准确说法应是 MOSS 赢 CER 与 cpCER,Δcp 排第二。

Alimeeting:总体 cpCER 领先,但负 Δcp 暴露了指标边界。 MOSS 的 cpCER 22.17,比最佳其他系统 29.33 低约 24.4%;与此同时 cpCER 竟低于 CER,正好提醒我们别把 Δcp 当作严格可加减的错误分解。

还有一个现实层面的结果:GPT-4o 因音频输入长度限制,只在 Movies 上得到结果;Gemini 3 Pro 在 Podcast 等长音频上经常不能稳定遵守指定的说话人输出格式,因此被排除。对生产系统来说,「能否完整处理并稳定吐出机器可解析格式」本来就是能力的一部分;但从纯模型质量比较看,这也意味着各列并非所有系统在完全相同条件下的齐整对决。

最大的证据缺口:时间戳被评测脚本删掉了

论文的卖点写着 Time-Stamped,但三项指标都不评时间。

附录的归一化流程会:

  1. 删除圆括号内容;
  2. 删除 <emotion><ovl><ins> 等尖括号标签;
  3. 删除所有不是 [S数字] 的方括号内容。

第三步会把 [0.11][1.03] 这些时间戳全部删掉,再计算 CER/cpCER/Δcp。Movies 提示词要求的事件、情感、重叠与插入标签也同样不计分。

因此实验扎实证明的是:MOSS 的文字识别和说话人归属很强,并且能稳定生成规定格式。 它没有证明时间边界比 WhisperX、强制对齐器或商业系统更准,也没有量化起止时间偏差。论文在未来工作中写「更细粒度的时间戳评估」,等于作者自己也承认这块尚未完成闭环。

七、论文证明了什么,又还没有证明什么

先给正面结论。MOSS Transcribe Diarize 最有价值的贡献,不是发明了一个陌生的神经网络模块,而是把任务、数据和上下文对齐到同一个目标:

  1. 任务统一:文字、说话人、时间戳序列化成 LLM 能直接生成的文本;
  2. 上下文统一:最长 90 分钟共享一段 128k 记忆,说话人不会在应用层分块时被迫重置;
  3. 数据统一:真实长录音负责分布真实性,属性可控模拟负责覆盖重叠、轮换、噪声与多人组合;
  4. 指标结果强:四个集合上的 CER 与 cpCER 都优于表中基线,尤其长会议上的 cpCER 优势明显;
  5. 落地完整:0.9B 权重、推理代码、解析器与字幕导出工具已经公开,不只停留在概念图。

但如果把它当一篇研究论文来审视,证据链仍有四个洞。

第一,没有时间戳指标。 这是标题级能力,却在归一化时被删掉;事件与重叠标签也没测。

第二,没有消融实验。 论文没有比较 128k 与短上下文、端到端与级联、真实数据与加入模拟数据之后的差异。表 2 证明整套系统强,却不能把提升分别归因于「长上下文」「统一训练」或「模拟器」。

第三,训练配方披露有限。 数据规模、混合比例、优化器、学习率、batch、训练算力与训练损失都没有报告。开源模型可以推理和微调,但难以从论文复刻预训练。

第四,部分测试仍不可完全复现。 Podcast 与 Movies 是内部整理数据,论文承诺公开;Alimeeting 又出现在结果表却缺少同页数据统计。商业基线的调用版本、生成参数与失败样本处理也交代得不够细。

这不抹掉系统结果,但会改变我们该下多大的结论:可以说「这是目前很强、很实用的端到端 SATS 系统」,暂时不该说「实验已经证明每个设计选择都必要,时间戳也达到 SOTA」。

八、写在最后:把会议当成一种语言

回看整篇论文,MOSS 做的事情可以浓缩成一句话:把会议从三张互相对齐的表,改写成一种模型可以直接说出的语言。

这种语言有自己的语法:数字表示时间,[Sxx] 表示话语归属,普通 token 表示内容;输入侧也有时间刻度,让输出的数字知道该落在哪里。Whisper encoder 负责听,Qwen3 风格 decoder 负责在 128k 记忆里维持人物与话题,模拟器则教它适应现实里那些不守秩序的插话、重叠和噪声。

它最漂亮的地方,是删除了 ASR、对齐、聚类之间的交接成本;最需要补上的地方,是给时间戳本身安排一场真正的考试。下一步若能加入毫秒级边界误差、重叠区间 IoU、说话人计数误差,再配上长上下文与模拟数据的消融,这条证据链才算完整。

论文列出的未来方向是流式 SATS、更细粒度的时间戳评测与更广的多语种鲁棒性。也很合理:128k 让模型记住整场会,下一道题就是——能否在会议还没结束时,边听、边记、边把正确的人名牌挂上去。

参考