关键词:ChatML 数据格式、Thinker 指令微调、Talker 三阶段(ICL 语音续写 → DPO 强化 → 多说话人微调)、音色解耦、WER/停顿奖励、同时生成“文本+语音”


一、Post-training策略

1、Data Format(数据格式)

目的:统一多模态对话样本的组织方式,便于“思考模块(Thinker)”与“发声模块(Talker)”共同学习。

ChatML 样例要点

  • 使用 <|im_start|> ... <|im_end|> 封装一轮角色发言;角色如 user / assistant

  • 视觉/音频内容用特殊标记嵌入,例如:

    • <|vision_start|>Video.mp4 [内容描述]<|vision_end|>
    • 文本问题与视觉/音频提示并列出现,形成混合上下文
  • 样例显示两类监督:

    1. 转述/听写类:用户给出“视频里两人说什么?”,助手输出转写内容。
    2. 描述类:用户提供“视频里有人说:请描述你前面的那个人”,助手输出视觉描述(衣着、场景、光照等)。

这意味着:同一条样本里可以既训练语言理解/生成,也训练听视信息的对齐能力;后面 Talker 阶段就会接续这些上下文去继续生成语音


2、Thinker(指令微调)

目标:让“大脑”学会在多模态上下文下理解指令并形成语义计划

  • 使用 ChatML 组织的 纯文本、多模态(图像/音频/视频/混合)对话数据instruction-tuning
  • 输出仍以文本 token为主(语义计划/答复内容),为后续 Talker 的语音合成提供高质量语义条件

可以把 Thinker 看作“语义控制中心”:收到文本+视觉/音频提示 → 产出内容准确、上下文一致的文本响应或中间语义。


3、Talker(三阶段,让模型会“说话”)

Qwen2.5-Omni 的 Talker 负责把 Thinker 的语义实时说出来,并实现“文本与语音同步生成”。训练分三步:

阶段一:ICL 训练(语音续写/下一 token 预测)

做什么

  • 和 Thinker 类似,也有文本监督;额外进行语音续写:把多模态上下文 + 目标口语回复(通常是语音编解码后的语音离散token/codec token)拼在一起做 next-token 预测(NTP)
  • 通过大量“带口语回复的对话”,学习单调映射:语义序列 → 语音序列(时序基本对齐,不倒序、不跳跃)。

学到什么

  • 基本的发音正确性可懂度

  • 韵律/情感/口音上下文合适的可变属性(prosody/emotion/accent);

  • 音色解耦(timbre disentanglement):防止把“罕见文本模式”与“某特定说话人音色”错误绑定(例如遇到少见符号就固定成某个说话人的声音)。

    • 常见实现思路(属通用技术点,论文此处未细述):对说话人表示做正则/对抗,或用瓶颈建模,让“内容表示”难以泄露音色信息,从而内容与音色解耦

阶段一主要让模型会说会随上下文变换风格,但由于预训练数据包含噪声(口误、对齐误差、错字等),会引入幻觉/误读风险。

阶段二:DPO 强化学习(稳定化语音生成)

痛点:预训练数据里不可避免的标注噪声/发音错误会诱发幻觉(说错词、停顿不当)。
策略:引入DPO(Direct Preference Optimization),用偏好对提升稳定性,而不用显式奖励模型或近端策略优化。

数据:构造三元组 (x,yw,yl)(x, y_w, y_l)(x,yw,yl)

  • xxx:输入上下文(文本/多模态);

  • ywy_wyw的语音生成序列(更低错误、更合理停顿);

  • yly_lyl的语音生成序列。

  • 对这些候选用与可懂度强相关的指标打分排序:

    • WER(词错误率)
    • 标点停顿错误率(表达节奏/断句合理性)。

**目标函数(论文式 (1))**已在上图展示:

LDPO(Pθ;Pref)=−E(x,yw,yl)∼D[log⁡σ(βlog⁡Pθ(yw∣x)Pref(yw∣x)−βlog⁡Pθ(yl∣x)Pref(yl∣x))]. \mathcal{L}_{\text{DPO}}(P_\theta;P_{\text{ref}}) = - \mathbb{E}_{(x,y_w,y_l)\sim \mathcal{D}}\Big[\log \sigma\big(\beta \log \frac{P_\theta(y_w|x)}{P_{\text{ref}}(y_w|x)} - \beta \log \frac{P_\theta(y_l|x)}{P_{\text{ref}}(y_l|x)}\big)\Big]. LDPO(Pθ;Pref)=E(x,yw,yl)D[logσ(βlogPref(ywx)Pθ(ywx)βlogPref(ylx)Pθ(ylx))].

解释

  • 让当前模型 PθP_\thetaPθ 相比参考模型 PrefP_{\text{ref}}Pref更偏向“好样本” ywy_wyw压低“差样本” yly_lyl 的条件概率;
  • σ\sigmaσ 是 logistic 函数,β\betaβ 控制温度/分离度
  • 不直接训练奖励模型,稳定且简单
  • 放到语音领域,就是让模型在相同语义条件下,对低 WER、停顿合适的语音序列给更高似然,从而减少读错/卡顿/乱停顿

阶段三:多说话人指令微调(自然度&可控性)

做什么

  • 在阶段二的基础上做多说话人/多风格的指令跟随微调;
  • 目标是让 Talker 听起来自然,并且可控(例如指定“女声/男声/某角色音色/更活泼/更沉稳”等)。

结果

  • 同时生成文本与语音:Qwen2.5-Omni 的 Talker 能与 Thinker 并行,输出文本答复的同时实时说出来
  • 稳定、自然、可被控制的口语化回答。

4、公式与训练落地要点(实践视角)

  1. ICL / 语音续写

    • 语音建议使用离散化编解码器(如神经 codec)token 做 NTP;
    • 训练时把文本 token 与语音 token 混排到同一序列,或使用双头(文本头/语音头)共享部分骨干参数;
    • 对齐策略:保持“内容→语音”的单调性,避免乱序对齐;可用简单前后窗/CTC-式辅助对齐(若需要)。
  2. 音色解耦

    • 常见做法:在内容表征后接说话人分类器 + 梯度反转层,或加入信息瓶颈/互信息最小化正则,让内容难以携带音色信息。
    • 目的:同一句话可在不同音色下稳定表达,不把稀有文本模式绑到单一声音。
  3. DPO 阶段

    • 参考模型 PrefP_{\text{ref}}Pref 固定,一般取阶段一/二早期快照;

    • 关键在于构造好/坏成对样本

      • 好样本低 WER、停顿/标点合理,坏样本相反;
      • 可从同一上下文下的多次采样得到候选,再据指标打分选 yw,yly_w, y_lyw,yl
    • β\betaβ 可做网格/分层搜索,避免过强/过弱拉扯。

  4. 多说话人微调

    • 加入说话人提示/嵌入(speaker id、参考语音条件或描述性指令);
    • 关注跨说话人泛化风格可迁移(few-shot 指令更换音色/风格)。

5、评估与风控

  • 听写准确:WER(含数字、专有名词);
  • 韵律/停顿:基于标点/短暂停顿的错误率或韵律边界匹配度;
  • 自然度与可控性:MOS、ABX 主观测评 + 指令一致性;
  • 鲁棒性:嘈杂背景、口音变化、长上下文串讲;
  • 幻觉监控:文本-语音对齐审计(例如关键实体错读、凭空添加)。

6、你可能没想到的改进选项

  • 奖励组合:除 WER/停顿,可加入韵律相似度(F0/能量轨迹)、对齐稀疏性/稳定性指标,构造更贴合“可懂且自然”的偏好对。
  • 多参考对齐:以 Thinker 文本为锚,约束 Talker 在关键词时间位置附近对齐(软约束),减小长句漂移。
  • 轻量个性化:LoRA 对 说话人/风格 做小样本适配,上线时按需热插拔。
  • 采样策略:推理端用温度分段/韵律先验约束,减少“平铺直叙”或“过度夸张”。
  • 实时性:流式解码下采用前瞻极短的 look-ahead 与分块重叠,在不卡住的前提下保证稳定停顿。

7、小结(直给结论)

  • Thinker 先用 ChatML 多模态指令微调,学“理解+计划”。

  • Talker 再用三阶段:

    1. ICL 语音续写学“会说”和“会变风格”;
    2. DPO(以 WER/停顿为偏好信号)抑制幻觉、稳住表达
    3. 多说话人指令微调提升自然度可控性
  • 结果是 文本与语音同步生成、稳定且自然,并能按指令切换音色/风格。

二、Mermaid 详细流程图

下面给出Qwen2.5-Omni 后训练(Post-training)Mermaid 详细流程图(含分阶段与关键信号/损失),随后是逐段中文说明

flowchart TD
  %% ========= 数据入口 =========
  A[ChatML 多模态指令数据<br/>• 纯文本对话<br/>• 视觉会话(图片/视频)<br/>• 音频会话(语音/环境音)<br/>• 混合模态] --> B{预处理与打包}
  B --> B1[文本:分词/Tokenize]
  B --> B2[视觉/视频:特征或帧级编码<br/>(如视觉编码器输出)]
  B --> B3[音频/语音:Codec 离散 token<br/>或声学特征]
  B --> B4[对话轮封装:<br/>&lt;|im_start|&gt;角色…&lt;|im_end|&gt;]

  %% ========= Thinker =========
  subgraph S1[Thinker:指令微调]
    C[多模态指令跟随(Instruction Tuning)<br/>目标:在多模态上下文下生成高质量“语义文本”]
  end

  B1 --> C
  B2 --> C
  B3 --> C
  B4 --> C

  %% ========= Talker 三阶段 =========
  C --> D

  subgraph S2[Talker:三阶段让模型“会说话”并与文本同步]
    direction TB

    D[阶段1|ICL + 语音续写(NTP)<br/>• 任务:Next-Token Prediction<br/>• 输入:多模态上下文 + 文本语义 + 语音token<br/>• 学到:语义→语音的单调映射;韵律/情感/口音的上下文适配] --> E

    R1-. 正则/对抗 .-> D
    R1[音色解耦(Timbre Disentanglement)<br/>• 防止“稀有文本模式 ↔ 特定音色”错误绑定<br/>• 内容表征与音色表征去相关]

    E[阶段2|DPO 稳定化(偏好优化)<br/>• 构造三元组 (x, y_w, y_l)<br/>• 依据:WER 与 标点/停顿错误率打分排序<br/>• 目标:提升好样本似然,抑制差样本] --> F

    F[阶段3|多说话人指令微调<br/>• 说话人/风格/情感可控<br/>• 进一步提自然度与可控性] --> G
  end

  %% ========= 输出与部署 =========
  G --> H[推理与服务化<br/>• 同步生成“文本+语音”(可流式)<br/>• 支持说话人/风格指令控制]

  %% ========= 评估回路(可选持续学习) =========
  H --> I{评估与数据回流}
  I --> I1[客观指标:WER、停顿/标点错误、时长/速率稳定性]
  I --> I2[主观指标:MOS/ABX 自然度与指令一致性]
  I -->|挖掘难例/纠错| A

flowchart LR
  %% ========== DPO 子流程细化 ==========
  X[输入上下文 x(文本+多模态)] --> SAMP[采样/生成多个语音候选 y_i]
  SAMP --> SCORE[打分:<br/>• 词错误率 WER<br/>• 标点/停顿错误率]
  SCORE --> RANK[排序与配对:选“好样 y_w”与“差样 y_l”]
  RANK --> DPO[计算 DPO 偏好损失:<br/>鼓励 Pθ(y_w|x) 相对参考模型更高;<br/>抑制 Pθ(y_l|x)]
  DPO --> UPDATE[反向传播更新 Talker 参数 θ]
  UPDATE --> SAMP

逐段说明(中文)

请添加图片描述

1) 数据与格式(ChatML)

  • 目的:把文本、图像/视频、音频/语音和对话轮统一到一种可训练的样式。
  • 做法:使用 ChatML 封装对话轮(<|im_start|>user ... <|im_end|> / <|im_start|>assistant ...),并用 <|vision_start|>…<|vision_end|> 等标记嵌入视觉/视频提示,语音侧使用 codec 离散 token 或声学特征承接到 Talker。
  • 收益:同一条样本既能训练“理解与规划”(文本)也能训练“发声与表情达意”(语音)。

2) Thinker(指令微调)

  • 定位:多模态语义中枢
  • 训练:在 ChatML 格式的多模态数据上做 instruction-tuning,学会在复杂上下文中输出高质量文本答复/语义计划
  • 输出:稳定、正确、可控的“文本语义”,后续被 Talker 消化成“语音”。

3) Talker · 阶段 1 —— ICL + 语音续写(NTP)

  • 任务:把“文本语义 + 上下文”续写为“语音 token 序列”(Next-Token Prediction)。
  • 关键:学习语义→语音单调映射(时序基本一致),并从大量对话-口语数据中吸收韵律/情感/口音的上下文依赖。
  • 音色解耦:通过对抗/正则/信息瓶颈等方法,降低“文本稀有模式被某固定音色绑死”的风险,提升说话人可迁移性

4) Talker · 阶段 2 —— DPO 稳定化(Direct Preference Optimization)

请添加图片描述

  • 为何需要:真实数据常有口误/对齐噪声,模型易出现读错词/乱停顿等幻觉。
  • 数据构造:对同一上下文 xxx 生成多个候选语音 yiy_iyi,用 WER标点/停顿错误率 打分,形成偏好对 (好样 ywy_wyw, 差样 yly_lyl)
  • 优化目标:用 DPO 让当前模型在参考模型基础上更偏好好样本抑制差样本,无需显式奖励模型与 PPO 稳定技巧,简单高效。
  • 效果:显著提升可懂度与稳定停顿,降低发音幻觉。

5) Talker · 阶段 3 —— 多说话人指令微调(SFT)

  • 目的:在稳定可懂的前提下,提升自然度可控性
  • 方式:加入“说话人/风格/情感”指令或嵌入,让模型能按需求切换男女声、口音、风格强弱、情绪色彩等。

6) 推理与服务

  • 同步输出:Thinker 与 Talker 协同,**

  • 控制接口:通过提示词或参数切换说话人/风格,满足多场景交互。

7) 评估与数据回流(可持续优化)

  • 客观:WER、标点/停顿错误、时长/速率稳定性、对齐一致性。
  • 主观:MOS/ABX、指令一致性(是否按要求的音色/情感/节奏说话)。
  • 闭环:把难例与错误样本回流,继续 ICL/DPO/SFT 微调。

提示与可选增强

  • 奖励更丰富:在 DPO 中加入韵律相似度(F0/能量轨迹)、关键词对齐约束等,可进一步优化“自然度 + 准确性”平衡。
  • 个性化轻量适配:用 LoRA/Adapter 做小样本说话人快速定制。
  • 实时性优化:流式分块解码 + 极短前瞻,保证低时延与稳定停顿。

以上流程图与说明既覆盖了论文中“Post-training”的核心脉络,也补充了工程落地要点,便于你把 Qwen2.5-Omni 的“同时文本+语音生成”训练管线复现或迁移到自己的多模态系统中。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐