跳转至

M7 · 把 α 搬到情感 embedding 上

状态 🔵 提案
日期 2026-08-18
一句话 把我们的 α 插值原样搬到「有显式情感 embedding 的未训练模型」上,看它是什么响应
上游 ← 用户澄清:M7 要问的是这件事(前一轮问错了题,结果改编号为 M9)
下游 → 判断我们的贡献是「新的控制量」还是「新的控制层级

1 动机

我们的 α 作用在速度场上,那是 flow-matching 特有的位置。 但很多 instruct TTS 把情感编码成一个显式的全局向量,那里同样能放 α。

这个方法搬过去会怎样? —— 本实验只回答这一个问题。

2 方法原理

2.1 这类模型的情感是怎么进去的

有显式情感 embedding 的 TTS,结构大致是:

flowchart LR
    P["情感提示<br/>「悲伤」"] --> ENC["提示编码器"] --> E["e ∈ ℝᵈ<br/>情感向量"]
    T["目标文本"] --> TE["文本编码器"] --> H["h"]
    E --> CAT["拼接 / 调制"]
    H --> CAT --> AM["声学模型"] --> MEL["mel"] --> V["声码器"] --> W["波形"]

关键是 e 是一个全局向量:整句话共用同一个 \(e\),不随时间变化。

2.2 α 插在哪

与我们的做法完全同构,只是换了层级:

\[\underbrace{e_{\text{ctrl}} = e_{\text{neu}} + \alpha\,(e_{\text{emo}} - e_{\text{neu}})}_{\text{本实验:情感向量, } d \text{ 维, 全局}} \qquad \underbrace{v_{\text{ctrl}} = v_{\text{neu}} + \alpha\,(v_{\text{emo}} - v_{\text{neu}})}_{\text{我们:速度场, } 80\times K, \text{ 逐帧}}\]
  • \(\alpha=0\) → 中性
  • \(\alpha=1\) → 该模型原本的情感输出
  • \(\alpha>1\) → 外推(超出它训练见过的范围)

2.3 具体怎么做(四步)

1. 用「中性」提示跑一遍,在提示编码器输出处 hook 出  e_neu
2. 用「悲伤」提示跑一遍,同一位置 hook 出            e_emo
3. 算 e_ctrl = e_neu + α(e_emo − e_neu),**替换**回该位置
4. 让推理照常走完 → mel → 波形;扫一遍 α

只改一个张量,模型权重与其余推理路径一律不动 —— 与我们在 CosyVoice3 上的做法一致。

2.4 两个层级的本质差别

我们(速度场) 本实验(情感 embedding)
形状 \(80 \times K\),逐帧 \(d\) 维,全句一个
能否只改句首 能(M6 定位比 42.3) 结构上做不到
时长 随 α 连续变(F2) 由时长预测器决定,不随 α 变

这两条差别是结构性的,不用做实验也知道。 本实验要看的是: 在 embedding 层做插值,输出到底怎么变 —— 平滑吗?外推崩不崩?情感真的变了吗?

3 设计

自变量 α ∈ {0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5}
控制量 同目标文本、同情感类别、同种子;只改 \(e\) 这一个张量
对照 该模型自己的 α=0 与 α=1;横向参照我们的 α 阶梯
判据 逐档 F0 / 能量 / 时长 / UTMOS 随 α 怎么走。不经过 emotion2vec
n 12 句 × 4 情感 × 7 α

模型怎么选

本实验要求模型满足三条,缺一不可:

  1. 有可定位的显式情感向量 —— 能 hook 出来、能替换回去
  2. 支持中文 —— 否则与我们的 ESD 中文数据不可比
  3. 权重可下载 —— 能在本机跑

按这三条筛下来:

模型 情感怎么表示 中文 判断
InstructTTS(Yang et al.) 自然语言风格提示 → 跨模态对齐的 style embedding 概念上最贴题,但权重未公开 —— HF / ModelScope 均无官方发布,NLSpeech 数据集也未放出
OV-InstructTTS 名字相近,实为基于 Step-Audio 2 的 LLM 架构 ⚠️ 与原版 InstructTTS 不是一回事;LLM 式模型的情感多在 token 空间,是否存在独立可插值向量需验证。下载量 11,可作 EmotiVoice 失败后的备选
EmotiVoice 情感提示 → 编码器 → 风格/情感向量 首选 —— 三条都满足
Parler-TTS 自然语言描述 → T5 描述向量 多语版存疑 ⚠️ 描述向量把情感、音色、语速、录音环境混在一起,插值等于同时动四样,拆不出纯情感分量
StyleTTS2 扩散采样的 style 向量 ❌ 仅英文 ❌ 语种不匹配;且 style 同样混着音色
CosyVoice instruct 没有独立向量 —— 情感在指令文本里 ❌ 没有可插值的对象。这条路已由 M8 单独做过
F5-TTS / GPT-SoVITS 靠参考音频,无显式情感 embedding ❌ 情感与音色纠缠在同一个参考里,无法只动情感

⚠️ 表中的架构描述来自各模型的公开说明,内部是否真有一个可替换的纯情感向量尚未验证 —— 这正是 §4 步骤 0 要做的事。若 EmotiVoice 不通过,依次退到 OV-InstructTTS(需先确认有无独立向量)、 再退到 Parler-TTS(并在报告里写明"描述向量混杂"这一口径损失)。

为什么不干脆多测几个:本实验只想知道「这个方法搬过去是什么响应」, 一个满足三条的模型就够回答。多测几个只会引入更多不可比的基座差异 (见方法论 §5.8),不会让结论更强。

4 运行(计划)

步骤 0 — 可行性验证(先做,不通过就换模型)

找到那个情感向量,并确认插值后输出确实变化。若插值后输出几乎不动, 说明它不是有效的控制点,本实验不成立 —— 这是唯一的硬门槛。

步骤 1 12 句 × 4 情感 × 7 α,卡 7

5 结果(待跑)

产出契约

  • metrics.json —— 逐档 F0/能量/时长/UTMOS,含 n 与口径
  • curves.png —— α 曲线,与我们的阶梯同图对比
  • 音频 —— α ∈ {0, 0.5, 1, 1.5} 嵌入本页,可直接听外推崩没崩

6 结论(待定)

7 风险

  1. ⚠️ 找不到可替换的情感向量。 很多模型的"情感"混在 style/prompt 向量里拆不出来。 步骤 0 不通过就换模型 —— 这是成败关键,不能事后补
  2. 绝对值不可比。 EmotiVoice 与 CosyVoice3 的基座能力、数据、音质都不同 (见方法论 §5.8)。 只能比各自相对自己 α=0 的变化趋势,不能比分数高低。

8 引出

→ 若 embedding 层的插值也平滑好用,说明 α 插值是个通用手法, 我们的价值在于把它放到了能时变的层级(M6)。 → 若 embedding 层很快就崩(尤其 α>1),说明速度场层更稳,那是另一条实打实的优势。