跳转至

M1 · 截断调色板

状态 ⚠️ 作废
日期 2026-08-14
一句话 让各情感贡献自己的 token 骨架,再截断到最短对齐 —— 帧级音素错位,失真明显
上游 原调色板由单一「主导情绪」提供骨架,混合结果总被它带跑
下游 M2(能否靠挑参考解决)、M3(重采样与对齐)

1 动机

原版 inference_palette_mix.py 里 LLM 只跑一次,由单一主导情绪提供 token 骨架, 所有 flow 分支共享它。后果是分类器跟着骨架走,混合形同虚设。 本实验让每个情感贡献自己的骨架

2 假设

各情感各自跑 LLM 得到自己的 gen_token,截断到最短长度后逐帧混合, 即可在保留骨架多样性的同时完成混合。

若不成立,说明截断带来的内容丢失不可接受,长度对齐必须用别的手段。

3 设计

自变量 每分支是否使用自己的 token 骨架
控制量 同 ckpt(v4_epoch5)、同种子、同 11 配方
对照 原版共享 token 的调色板
判据 人工试听:混合结果是否仍然可懂、是否听得出两种情感
n 2 句 × 11 配方 = 22 条

\(K^* = \min_e K_e\),各分支的条件截断到该长度。

4 运行

experiments/svd_emotion/inference_palette_pertoken.py --merge_mode truncate 产物:outputs/palette_pertoken_trunc/(22 条 wav + manifest + samples.csv)

5 结果

定量 —— 各情感的 LLM token 长度(1 token = 40 ms):

句子 Neutral Happy Angry Sad Surprise max/min
text00030 108 83 152 110 89 1.83×
text00060 76 54 59 108 76 2.00×

截断损失(n=22):

严重度 样本数 典型
🔴 最狠分支保留 <75% 11 mix_Sad.5_Hap.5:Sad 只保留 50%,输出从 4.3 s 砍到 2.16 s
🟡 75–95% 8
🟢 >95% 3 单分支配方,零截断

定性 —— 直接听

text00060mix_Sad.5_Hap.5:Sad 分支只保留 50%,4.3 s 被砍到 2.16 s。 句子在中途断掉,且断口前已开始糊 —— 这不是"变短",是两个分支在同一帧上说不同的音。 对照音质天花板(纯情感,同一模型):

人工试听结论:失真明显。截断不只是把句子变短,更导致帧级音素错位 —— 某一帧上快分支已说到句尾、慢分支还在句中,逐帧相加得到的是不同音素的声学平均。

6 结论

假设不成立。 截断以丢内容换对齐,代价不可接受。

边界:这条不蕴含「各情感贡献自己骨架」这个方向错了 —— 它只说明截断这个对齐手段错了。后续 M3 证明换成重采样/对齐后 同一方向可行。

7 坑

  • 连「纯情绪」配方也被截断:pure_Angry 里 Angry 只保留 71%,因为代码无条件把 权重为 0 的 Neutral 分支也算进 \(\min\)权重为 0 的分支不该参与长度约束 —— 此缺陷在 M3 中修正,这也是 M3 的纯情感配方能六臂完全一致的原因。
  • 起初以为换成真实录音的 token 就能缓解(长度更整齐)。 实测说话人 0003 的 120 组平行录音后推翻:真实录音 5 情绪 max/min 中位 1.55×, 与 LLM 采样的 1.83/2.00 同一量级。

8 引出

M2:能否靠挑时长整齐的参考回避长度失配? → M3:把截断换成重采样 / 内容对齐