跳转至

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等能量对照;bodyonset 的互补
判据 逐段 **
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
288 条 / 628 s / 卡 7 / 0 报错。产物 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 坑

  1. 图与表的统计量必须一致。 初版图画的是带符号 Δ 的中位数,跨情感相消后接近 0, 完全看不出定位效应 —— 而表里用的是 |Δ|。渲染出来一看就发现两者矛盾。
  2. alpha 传张量能直接工作是运气好(广播),但这是隐式契约 —— dual_ref_solve_euler 的签名标注是 alpha: float。已在 M6 的代码注释里写明。
  3. cosine ramp 让 onset_eq 的总量为 95 而非 100(ramp 吃掉一点), 故 metadata 里记录实测的 α 均值而非标称值。

8 引出

这是本项目第一个不依赖 emotion2vec 的可控性证据。 G1 度量瓶颈挡不住它,因为判据是物理量。 → 下一步可做:\(\alpha(k)\) 连续曲线、按语言学单元分段(需 MFA)。 → 若要证明感知上句首也足够,仍需解决 G1 或做人工听测。