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 | 单分支配方,零截断 |
定性 —— 直接听
text00060的mix_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 同一量级。