这是全双工系列的第三篇解读。Moshi 为了让 7B 模型同时处理 17 条 token 流,发明了一整套机构:RQ-Transformer 的时间深度分工、声学延迟、逐码本独立权重。LSLM 则把打断机制单独拎出来做实验。这一篇的主角走第三条路:2024 年 10 月,阿里通义实验室的 OmniFlatten(arXiv:2410.17799)问了一个反方向的问题——
如果坚持不改 GPT 架构呢?
Moshi 的并行多流毕竟不是 GPT 原生支持的形态;OmniFlatten 的赌注是:全双工需要的一切,都可以塞进「数据怎么排」里——把用户和助手的语音、文字统统摊平(flatten)成一条序列,标准的 next-token prediction 一步不改,配上一套渐进式训练课程,让一个 0.5B 的 Qwen2 学会边听边说。全双工综述一篇把这条路线叫「摊平单流」流派,OmniFlatten 是它的代表作。
一、出发点:GPT 不认识「并行」
先复习问题。全双工要求模型同时维护两个方向的音频流(听用户的、说自己的),外加文字流。Moshi 的解法是空间换结构:17 条流在同一时间步竖着摞,每步由深度 Transformer 一口气吐出全部 17 个 token——代价是标准 GPT 架构装不下它,得为「一步多 token」造新机构。
OmniFlatten 的解法是时间换结构:既然 GPT 天生一步一个 token,那就把并行的流沿时间轴展开、交错、接成一条序列。「同时」不再由架构表达,而由排布表达——只要交错的粒度足够细,模型轮流吐几个自己的 token、再读几个用户的 token,宏观上看就是在边听边说。
摊平的代价也一目了然:序列长度是所有流长度之和,上下文预算被几路信号瓜分。这笔账怎么算得过来,取决于两件事:token 够不够省、排布够不够聪明。
二、材料:语义 token 加一个小 GPT
OmniFlatten 的选材处处透着「算力克制」:
- 底座:Qwen2-0.5B。 不是 7B——论文明说选它是为了低算力消耗。全双工的行为学习被证明不需要巨大底座(后面会看到代价在哪)。
- 语音 token:CosyVoice 的语义 tokenizer。 单码本、4096 个码字,由多语言 ASR 监督训练而来——天生和文字对齐得好,语音理解和内容一致性都占便宜。对比 Moshi 的 Mimi(1 语义 + 7 声学,8 token 一帧),OmniFlatten 每帧只有 1 个 token,摊平才摊得起。音色、韵律这些声学细节怎么办?
- 还原端:OT-CFM 流匹配 + HiFi-GAN。 语义 token 先经流匹配模型变成梅尔谱,再由声码器出波形——声学信息在这一步补回来。这正是语音 tokenizer 一篇里「单码本语义 + 生成式解码」的 CosyVoice 路线。
材料表已经预告了它和 Moshi 的分工不同:Moshi 把「声音长什么样」也交给主干建模(8 层 RVQ 全在序列里),OmniFlatten 的主干只管「说什么」,音色外包给解码器。
三、四步课程:从 ASR 到全双工
OmniFlatten 的核心贡献是一套渐进式后训练配方。四个阶段,每一步都把任务往全双工推近一格,而数据格式始终是同一种:摊平的单条序列。
3.1 第一步:模态对齐——先教会它听和说
拿纯文本的 Qwen2 直接学对话是不行的,它还不认识语音 token。第一阶段用 ASR 和 TTS 两个任务做监督微调,数据模板就是最朴素的序列拼接:
ASR 样本:[ASR] [SOS] 语音token序列 [EOS] [SOT] 文字token序列 [EOT]
TTS 样本:[TTS] [SOT] 文字token序列 [EOT] [SOS] 语音token序列 [EOS]
约 10 万小时中英混合数据(三成开源:LibriTTS、Librispeech、WenetSpeech 等;七成自有)。练完的成绩不惊艳但够用:Librispeech test-clean 上 ASR 7.91% WER(Whisper-Large 是 1.82%),LibriTTS 上 TTS 4.51% WER(CosyVoice 本尊 2.89%)。这一步的意义不在刷榜,在于让语音 token 和文字 token 住进同一个表示空间——后面所有对话学习都踩在这个对齐之上。
3.2 第二步:半双工——级联管线写进一条序列
直接上全双工太陡。第二阶段先学轮次制对话:把一轮对话的四条流——用户语音、用户文字、助手文字、助手语音——按说话轮次摊平成:
[用户语音 → 用户文字] [助手文字 → 助手语音] [用户语音 → 用户文字] ……
看出门道了吗?这条序列就是把传统级联管线「ASR → LLM → TTS」写成了数据:模型先把用户语音转成文字(ASR),再基于文字生成文字回复(LLM),再把回复念出来(TTS)——三个模块的活儿,在一条序列里首尾相接。上一阶段刚学会的两个任务在这里直接复用,课程学习的台阶搭得严丝合缝。
3.3 第三步:全双工三流——分块交错的伪并行
真正的跨越在这一步。半双工的按轮摊平有个致命前提:得等一整轮说完才能处理下一轮,实时性无从谈起。第三阶段把排布切碎:去掉用户文字流(实时转写用户语音等于内置 ASR,不要了),剩下三条流按固定块大小切开、交错:
[用户语音块 10] [助手文字块 2] [助手语音块 10] [用户语音块 10] [助手文字块 2] ……
几个数字都有讲究:
- 文字块 2 : 语音块 10。 文字信息密度高,块小一点,刚好让文字略微领先于对应语音——和 Moshi 内心独白「文字先行」是同一个目的,只是粒度从帧级放粗到块级。论文强调这个比例还兼顾了「文字别超前太多」,否则跟第二阶段的数据格式差异太大,TTS 能力会受损。
- silent token。 助手不说话时,语音流不是空着,而是显式填充 silent_speech_token;文字说完了,文字流用 silent_text_token 垫住。「沉默」是模型主动预测出来的内容——想让位就吐静音 token,和 Moshi 的「自然静音」思路一致,但这里是一个专用符号而不是解码成静音的普通 token。
- 块级流水线。 推理时每收满 10 个用户语音 token 就走一轮解码,理论响应粒度就是一个块的时长。这是摊平路线的时延下限:反应快慢由块大小决定,块越小越灵敏,序列也越碎。
3.4 第四步:全双工两流——一个诚实的负结果
最后一步再砍掉助手文字流,只留「用户语音进、助手语音出」——动机是进一步压时延、彻底摆脱对文本的依赖。结果呢?大幅崩盘:英文对话的 LLM 评分从三流的 3.92 掉到 2.19,中文从 5.15 掉到 3.06,语音结尾频繁出现语义不清的内容。
这个负结果值得单独说。它和 Moshi 的内心独白消融遥相呼应——Moshi 加上文字流,口语问答成绩几乎翻三倍;OmniFlatten 去掉文字流,对话质量掉了近一半。两家用相反的操作证明了同一件事:当前的语音 token 还扛不起独立的语义生成,文字流是语义质量的拐杖,砍不得。
四、数据:一条全合成的流水线
OmniFlatten 没有 Fisher 那样的真实全双工语料,全双工行为完全来自合成数据:
- 文本对话打底:从 Alpaca、Moss、BelleCN、UltraChat 收集多轮对话,过滤掉不适合口语化的样本(代码、数学式、超 200 词的长文、生僻符号),留下约 39 万段。
- CosyVoice 配音:用户音色从 Librispeech 和 3D-Speaker 里随机采,助手固定一个音色——和 Moshi 的「助手声音恒定、用户声音随机」策略完全一致。
- 交互动力学模拟:把每轮音频摆上双通道时间轴,规则化地制造三种情形——用户问完助手立刻答;用户插话,助手戛然而止;助手说完保持沉默等待。
- 加噪:用户通道混入 MUSAN 噪声,信噪比 15–30 dB。训练时还对用户通道做 loss 屏蔽(只算助手侧的损失),论文说这明显稳定了训练——用户通道里全是噪声混语音,硬要模型去预测它反而添乱。
对照 Moshi 的配方很有意思:Moshi 的全双工能力来自 2000 小时真实电话对话(Fisher),OmniFlatten 的来自 2000 小时合成对话——数量巧合地相同,来源本质不同。合成管线可控、可扩,但行为上限就是模拟规则的上限:三种情形里没有用户附和(backchannel),模型自然就不会处理附和——论文的局限一节自己承认了这一点。全双工综述那句「数据的格子覆盖决定行为」,在这里又一次应验。
五、成绩单:课程有效,让位仍难
对话质量(Qwen-max 当裁判,1–10 分,单轮):课程的每一步都涨分。直接用三流数据训练 2.99 分(英文文字侧);先做模态对齐再训,3.89;完整走「对齐 → 半双工 → 三流」,4.88。中文侧同样的阶梯:4.94 → 5.25 → 5.60。渐进课程不是仪式感,每一步都在交付。
横向对比要带着上下文看:OmniFlatten(0.5B)英文 4.88,Moshi(7B)3.92——论文归因于 Moshi 爱反问而不直接回答;但 9B 的 GLM-4-Voice 拿 6.97,纯文本的 Qwen2-0.5B-Instruct 也有 6.75。加上语音模态对小模型的语义损伤肉眼可见,这份榜单更像是在说:0.5B 底座是全双工行为的够用下限,但不是好对话的下限。
轮换性能(模拟测试集,1.5 秒判定窗):
- 助手接话(用户说完,助手多快开口):OmniFlatten 平均 193ms、25 token 内成功率 71.7%;Moshi 平均 553ms、55.1%。
- 用户插话(用户打断,助手多快闭嘴):OmniFlatten 平均 287ms、51.8%;Moshi 平均 753ms、45.7%。
OmniFlatten 的响应速度占优。但注意第二行的绝对值:两家的「让位成功率」都只有一半左右——听到打断能不能停,在 2024 年底仍是全行业没解好的题。这也和 LSLM 的发现互相印证:自由打断(任意人任意词)远比实验室口令难。
六、放回地图:摊平这条路通向哪
回到综述那篇的 L2 三流派地图,现在三篇解读拼齐了两个角:Moshi 的并行多流靠架构创新换时间轴压缩,OmniFlatten 的摊平单流靠数据排布换架构零改动,中间还站着一个 SyncLLM——同样分块交错,但对语音 token 做去重压缩,OmniFlatten 批评它牺牲了重建保真,自己选择保留完整 token、用显式文字流补语义。
摊平路线的账本此刻很清楚。收入:标准 GPT 生态全盘继承,训练、推理、优化一行不用改;0.5B 就能学出全双工行为;渐进课程每步可验证。支出:序列长度是所有流之和,上下文被瓜分(对话学习阶段序列上限 8192);块大小写死了反应粒度;语义能力被小底座和语音模态双重挤压,对话质量距离纯文本模型还有明显差距。
论文列出的未竟事项——backchannel 建模、更快的让位响应、「提前停止」目标与语音文字对齐目标的冲突——每一条都指向同一个深层问题:摊平把全双工变成了数据工程,那么全双工的天花板,就是你能合成出多逼真的对话动力学。架构的问题解决了,数据的问题才刚刚开始。
参考资料
- OmniFlatten: An End-to-end GPT Model for Seamless Voice Conversation(arXiv:2410.17799,Zhang et al., 通义实验室,2024)
- 官方 Demo 页面
- 相关论文:CosyVoice(语音 tokenizer 与配音引擎)、SyncLLM(同为分块交错路线)、Moshi
- 站内相关:深入拆解 Moshi、深入拆解 LSLM、双拆 SALMONN-omni 与 Covo-Audio、全双工语音对话系统三张地图、语音 tokenizer