M6 · 分段 α:句首 vs 句身¶
| 状态 | ✅ 成立 |
| 日期 | 提出 2026-08-15,跑完 2026-08-17 |
| 一句话 | α 改成沿时间的函数后定位精确(仅句首档的句身残留 0.05 dB),且判据全程不经过情感分类器 |
| 上游 | ← 用户想法「在前 K/2 和后 K/2 分别作用」;← M5 的能量分布 |
| 下游 | → 第一次拿到不依赖饱和分类器的可控性证据 |
1 动机¶
用户提出把 α 作用得更细:「在前 K/2 和后 K/2 分别作用」。
M5 恰好测了 \(A\) 的能量沿时间怎么分布:能量集中在句首(2.04×),
其余九段基本持平,去掉句首后前半/后半比值仅 1.026。
于是本实验既做用户的原方案(half),也做由 M5 数据导出的 onset / body。
2 假设¶
H1(可控性):α 改为逐帧函数 \(\alpha(k)\) 后,只在某段施加 α, 只有该段的声学量改变。
H2(能量 vs 功能):\(A\) 的能量集中在句首 ⟹ 只在句首施加就够。
3 设计¶
| 自变量 | \(\alpha(k)\) 的形状(5 档) |
| 控制量 | 同句、同情感 token 骨架、同种子、同 \(K\)、同 ckpt |
| 对照 | neutral(α≡0)为基线;onset_eq 为等能量对照;body 为 onset 的互补 |
| 判据 | 逐段 ** |
| n | 12 句 × 4 情感 = 48 条语句 × 10 段 |
| 档 | \(\alpha(k)\) |
|---|---|
full |
全句 1(现状基线) |
onset |
前 10% 为 1,其余 0 |
onset_eq |
前 10% 为 10(等总能量),其余 0 |
body |
前 10% 为 0,其余 1 |
half |
前 K/2 为 1,后 K/2 为 0(用户原方案) |
实现:dual_ref_solve_euler 里的 alpha 是广播乘到 \((1,80,K)\) 上的,
传 \((1,1,K)\) 张量即可,核心求解器一行未改。
所有跳变处加 cosine ramp(8 帧 / 160 ms),把单帧最大跳变从 1.000 压到 0.191。
4 运行¶
CUDA_VISIBLE_DEVICES=7 python emo/exp/M6_segmented_alpha/run.py \
--ckpt _incoming/v4_epoch5.pt --manifest manifests/esd_parallel.jsonl \
--out_dir outputs/m6_segmented_alpha --n_keys 12
python emo/exp/M6_segmented_alpha/analyze.py
outputs/m6_segmented_alpha/。
5 结果¶
定量(n=48 条语句,单位 dB,统计量 = 跨语句中位数)¶
| 档 | 句首 |Δ| | 句身 |Δ| | 定位比 | 判定 |
|---|---|---|---|---|
full(全句) |
2.42 | 3.07 | 0.8 | 全局作用 |
onset(仅句首) |
2.09 | 0.05 | 42.3 | ✅ 强定位 |
onset_eq(等能量) |
19.89 | 0.20 | 100.3 | ✅ 强定位 |
body(仅句身) |
0.85 | 2.44 | 0.3 | 互补,方向正确 |
half(用户原方案) |
2.42 | 0.74 | 3.3 | ✅ 定位 |
趋势¶

onset(橙)在第 1 段抬到 2.09 dB,之后九段全部压在 0.05–0.2 dB。 body(绿)是它的镜像;half(黄)在第 6 段处干净地掉下来 —— 正好是 K/2 的位置。 full(蓝)全段都在 2.5–4.2 dB。 纵轴用 |Δ|:带符号的 Δ 会跨情感相消(有的情感抬能量、有的压能量), 与判据口径不一致。
定性 —— 直接听¶
同一句(0001_text00000)、同一情感(Sad)、同种子,只改 \(\alpha(k)\) 的形状:
| 中性(α≡0) | full(全句) | onset(仅句首) | half(前 K/2) |
|---|---|---|---|
onset 只在开头几个字有情感,后面听起来和中性一样 —— 定位是能听出来的。 没有咔哒声,cosine ramp 起了作用。 等能量档破坏明显(句首 19.89 dB 的能量变化):
6 结论¶
H1 成立,而且很干净。 onset 档的句身残留只有 0.05 dB —— 定位比 42×。
onset_eq 排除了「施加得少所以破坏得少」的假象:等总能量下句首变化放大到 19.89 dB,
句身仍只有 0.20 dB(定位比 100×)。定位性来自 \(\alpha(k)\) 的形状,不是施加总量。
H2 不成立(或至少不必要)。 onset 在句首拿到 2.09 dB,而 full 在句首是 2.42 dB ——
只做句首拿到了 86% 的句首效果。但这不等于"句首足够传达情感":
情感强度是否也保住了,现有指标读不出。
本实验只能证明声学上的定位,不能证明感知上的等效。
⚠️ 我在 proposal 里的预测错了一处¶
proposal 写道 half 「预期与 body 差异不大」,理由是 M5 测出前半/后半的
\(A\) 能量比值仅 1.026。实测 half 定位良好(比值 3.3,图上第 6 段处干净断开),
与 body 在句身上差 2.27 dB,两者完全可区分。
错在混淆了两件事:M5 说的是「\(A\) 的能量天然在前后半没有差异」, 而 M6 问的是「人为在某段施加 α 能否只改那段」。 前者是观测,后者是干预 —— 没有天然结构,不妨碍施加人工结构。
→ 提炼进方法论。
7 坑¶
- 图与表的统计量必须一致。 初版图画的是带符号 Δ 的中位数,跨情感相消后接近 0, 完全看不出定位效应 —— 而表里用的是 |Δ|。渲染出来一看就发现两者矛盾。
alpha传张量能直接工作是运气好(广播),但这是隐式契约 ——dual_ref_solve_euler的签名标注是alpha: float。已在 M6 的代码注释里写明。- cosine ramp 让
onset_eq的总量为 95 而非 100(ramp 吃掉一点), 故 metadata 里记录实测的 α 均值而非标称值。
8 引出¶
→ 这是本项目第一个不依赖 emotion2vec 的可控性证据。 G1 度量瓶颈挡不住它,因为判据是物理量。 → 下一步可做:\(\alpha(k)\) 连续曲线、按语言学单元分段(需 MFA)。 → 若要证明感知上句首也足够,仍需解决 G1 或做人工听测。