M21-E7 · 声学归因:强度长在哪些量上,模型复现了多少¶
| 状态 | ✅ 完成(第二轮,非循环设计;2026-09-02) |
| 一句话 | E2 回答"能不能量出强度",E7 回答"强度在声学上是什么"——用 eGeMAPSv02 把强度分解到 88 个声学量上,并给出模型逐特征的达成率 |
| 上游 | ← E2(复用其相对属性排序器 outputs/m21/e2b/ranker.json) |
| 数据 | ESD test 划分 160 条(四情感各 40),每条 6 路音频 = 960 wav |
TL;DR¶
模型在声学上复现了训练目标位移的 93% 方向、102% 幅度,逐特征达成率中位 0.90。
- 🔍 达成率的短板集中在谱包络(MFCC 族 0.43 vs 目标 0.52),共振峰与响度反而过冲—— 不是均匀地"做小了",而是通道之间分配失衡
- ✅ 训练目标本身对真实情感位移的方向保真 cos = 0.990——DTW+R3 的目标构造没有扭曲情感方向
- 🔑 悲伤 d′ 最低(E2 的 1.01)在这里得到机制解释:悲伤的总声学位移只有生气/惊讶的 1/3 (‖Δ‖ 2.87 vs 7.08/8.49),且其中 36% 落在节奏/时长上(其他情感 5–8%)—— 而节奏正是本架构因 DTW 锁定时间轴而表达不了的那条通道
- ⚠️ 方法学:88 维里有 2 维数值退化(变异系数分母过零,原值达 +2013), 不剔除会伪造出"生气 cos 只有 0.48"的假异常——已剔除并公开判据
1 为什么重做¶
首轮(见 §6 附录)在 E2 的构造阶梯上求逐维 ρ(特征, α)。两个问题:
- 循环性:阶梯本身按对数插值 F0 构造,F0 类的高 ρ 是内定的
- 与 E2 重叠:E2 的排序器就建在 eGeMAPS 上,"再造一个 openSMILE 指标"是重复劳动
本轮改为位移分解:不问"特征与 α 相关多少",而问"从中立到情感,每个声学量移动了多少, 模型移动了多少"。α 不再进入计算,循环性消失。
| E2 | E7 | |
|---|---|---|
| 问题 | 能不能量出强度 | 强度在声学上是什么 |
| 产出 | 两个可引用的指标 + 外部验收 | 声学分解 + 逐特征达成率 |
| α 是否入算 | 是(打分对象) | 否(只比两端) |
2 方法¶
2.1 三组位移¶
每条样本生成 6 路 16 kHz 音频,构成三组"中立→情感"的位移:
| 位移 | 定义 | 含义 |
|---|---|---|
| Δ_raw | 真实情感录音 − 真实中立录音 | 自然情感的声学位移(含时长差) |
| Δ_target | 缓存 x1_emo − x1_neu,同过 HiFT |
模型被要求复现的位移 |
| Δ_model | 模型 α=1 − α=0 输出 | 模型实际做到的位移 |
关键在 Δ_target 与 Δ_model 同声码器、同时间轴、同 seed——两者相除时 HiFT 的重建代价与 DTW 的时间轴锁定同时抵消,商即模型自身的达成率。 Δ_raw 只作外部参照,用于检验目标构造有没有跑偏。
全部换算到 E2 排序器的 z 单位(ESD 训练分布的均值/标准差),88 维之间才可比。 Δ_model 的逐维标准误中位 0.083 z(n=160)。
2.2 排序器权重怎么读:Haufe 变换¶
E2b 的排序器是 88 维上的线性函数 \(s=\mathbf{w}^\top \mathbf{x}\)。 权重 \(\mathbf{w}\) 不能直接当解释读——eGeMAPS 各维高度相关,\(\mathbf{w}\) 里的大值可能纯粹是 在抵消相关噪声。按 Haufe et al.(NeuroImage 87:96–110, 2014, "On the interpretation of weight vectors of linear models in multivariate neuroimaging")的标准做法, 须转成 activation pattern:
\(\boldsymbol{\Sigma}_x\) 取排序器实际面对的分布(750 条 ESD 训练音频的 z 化协方差)。 \(\mathbf{A}\) 才是"哪些声学量真的随强度一起动"。
2.3 数值退化维的剔除¶
eGeMAPS 的 stddevNorm 是变异系数 std/mean,均值过零时会爆炸。
实测 logRelF0-H1-H2_sma3nz_stddevNorm 原值区间 −285 ~ +2013,
mfcc1V_sma3nz_stddevNorm 到 +120。这两维单独就能把 Δ 拉到 8.9 z
(中位标准误的 100 倍),伪造出"生气方向保真只有 0.48"的假异常。
判据(跑前固定,非事后挑选):评测集上 |z| 的 99.5 分位 > 8 ⇒ 剔除。
命中 2/88 维,两维均为 stddevNorm,与预期的失效机制一致。下文全部基于剩余 86 维。
3 结果¶
3.1 方向保真与达成率¶
| 情感 | cos(Δ_mdl, Δ_tgt) | ‖mdl‖/‖tgt‖ | 达成率中位 | 回归斜率 | cos(Δ_tgt, Δ_raw) | ‖tgt‖/‖raw‖ | n_big |
|---|---|---|---|---|---|---|---|
| Angry | 0.918 | 1.085 | 0.93 | 1.00 | 0.963 | 0.979 | 57 |
| Happy | 0.869 | 1.137 | 0.99 | 1.00 | 0.967 | 0.994 | 56 |
| Sad | 0.856 | 1.015 | 0.89 | 0.86 | 0.817 | 1.149 | 27 |
| Surprise | 0.942 | 0.947 | 0.93 | 0.89 | 0.980 | 0.989 | 62 |
| 合计 | 0.934 | 1.021 | 0.90 | 0.95 | 0.990 | 1.008 | 50 |
n_big = |Δ_target| > 0.3 z 的维数,即"有实质位移可供复现"的通道数。

两个读数:
- cos(Δ_tgt, Δ_raw) = 0.990:训练目标的位移方向与真实情感位移几乎重合。 DTW 对齐 + R3 变速 + HiFT 往返这一整条构造链,没有扭曲情感的声学方向—— 这是对 M19/M20 目标构造的一次独立验收
- 回归斜率 0.95、达成率中位 0.90:模型不是"做了个大概",而是在量上接近逐维等比复现
3.2 强度长在哪些族上¶

| 族 | Δ_raw | Δ_target | Δ_model | 读法 |
|---|---|---|---|---|
| 响度 | 0.649 | 0.682 | 0.708 | 最大载体;模型略过冲 |
| 谱斜率/平衡 | 0.564 | 0.550 | 0.563 | 复现良好 |
| MFCC 包络 | 0.530 | 0.516 | 0.431 | ⚠️ 最大短板(−16%) |
| 音高 F0 | 0.516 | 0.501 | 0.515 | 复现良好 |
| 嗓音质量 | 0.432 | 0.386 | 0.464 | 过冲 |
| 共振峰 | 0.347 | 0.331 | 0.433 | ⚠️ 过冲 +31% |
| 节奏/时长 | 0.128 | 0.146 | 0.137 | 三者都极小(见 §3.4) |
这修正了首轮的结论。 首轮说"强度主要长在 F0 上"——那是阶梯按 F0 构造的循环产物。 非循环测量下 响度 > 谱斜率 > MFCC 包络 > F0,F0 只排第四。
短板的形状值得注意:模型不是均匀地做小了,而是把力气从谱包络(MFCC −16%)挪到了
共振峰(+31%)和嗓音质量(+20%)。欠得最狠的几维是
mfcc2_amean(达成 0.51)、mfcc2V_amean(0.55)、jitterLocal_amean(0.60)、
loudness_percentile50(0.64);过冲最狠的是
loudness_stddevNorm(1.78)、F1bandwidth_amean(1.56)、spectralFluxV_stddevNorm(1.50)。
过冲集中在变异度类统计量(stddevNorm)——模型输出的帧间起伏比目标更大,
与 M19 探针页记录的中段电音是同一现象的两个侧面。
3.3 排序器实际依据什么(Haufe 模式)¶
| 情感 | cos(A, Δ_raw) | top-5 声学量 |
|---|---|---|
| Angry | +0.927 | mfcc1V_amean −1.00 · logRelF0-H1-A3_amean −0.96 · alphaRatioV_amean +0.95 · F0 p80 +0.89 · F0 mean +0.87 |
| Happy | +0.936 | F0 mean +1.00 · F0 p50 +1.00 · F0 p80 +1.00 · mfcc1V_amean −0.98 · F0 p20 +0.95 |
| Surprise | +0.935 | F0 p80 +1.00 · F0 mean +0.99 · F0 p50 +0.98 · mfcc1V_amean −0.97 · F0 p20 +0.93 |
| Sad | +0.524 | HNRdBACF_amean +1.00 · F0 p20 +0.95 · F0 mean +0.92 · F0 p50 +0.90 · F3freq_amean +0.80 |
这是对 E2 排序器的效度检验:三个情感的 A 与真实声学位移方向的 cos 都在 0.93 左右, 说明排序器学到的不是数据集的偶然统计,而是真实的"中立→情感"声学轴。
悲伤是例外(0.524),且其 top-1 不是 F0 而是谐噪比 HNR—— 悲伤靠嗓音质量(气声)而非音高表达。这是它在 E2 里 d′ 最低的第一层原因。
3.4 悲伤为什么最难:一个完整的机制解释¶

| 情感 | ‖Δ_raw‖ 总位移 | 节奏族 |Δ_raw| | 节奏占比 | 真实时长比 | n_big | E2 的 d′ |
|---|---|---|---|---|---|---|
| Surprise | 8.49 | 0.255 | 8.2% | 1.017 | 62 | 1.54 |
| Angry | 7.08 | 0.128 | 4.7% | 0.850 | 57 | 1.69 |
| Happy | 6.34 | 0.184 | 7.5% | 0.900 | 56 | 1.40 |
| Sad | 2.87 | 0.414 | 36.4% | 1.185 | 27 | 1.01 |
三条互相独立的证据指向同一结论:
- 悲伤在声学上离中立最近——总位移 2.87,只有惊讶的 1/3;有实质位移的通道只有 27 个(其他 56–62)
- 悲伤把 36% 的位移放在节奏上,其他情感只有 5–8%;真实录音里悲伤拖长 19%, 而生气/高兴反而说得更快(0.85 / 0.90)
-
节奏恰是本架构表达不了的通道:DTW 把中立目标对齐到情感时间轴,时长被锁死。 悲伤的节奏族逐维可见符号都被改写——
维度 Δ_raw Δ_target Δ_model VoicedSegmentsPerSec−0.39(语速变慢) +0.11(反成变快) +0.10 MeanUnvoicedSegmentLength+0.72(停顿拉长) +0.35(只剩一半) +0.43 模型忠实复现了目标(+0.10 vs +0.11、+0.43 vs +0.35)——错的不是模型,是目标。
⇒ 悲伤的天花板由架构设定,不由训练量设定。 要做好悲伤必须放开时长这条通道 (风格条件 + cross-attn 路线,M20 页已登记未立项), 继续堆步数不会改善。
这也顺带给"节奏泄漏"这笔旧账定了价:对生气/高兴/惊讶,节奏只占位移的 5–8%, 锁死时间轴的代价很小;代价几乎全部由悲伤承担。
3.5 逐维随 α 怎么变:模型输出上的 eGeMAPS 轨迹¶
补充实验 S4(提案待验收)。
§3.1–3.4 只比两端(α=0 与 α=1),刻意让 α 不进计算。本节反过来把 α 当横轴,看模型输出的每个声学量怎么随 α 移动—— 特征来自 E4 直路的 13 档 × 160 条输出,不来自构造阶梯,所以没有 §1 说的循环性。z 分以 ESD 训练集为 0;□ = 真实中立录音,◆ = 真实情感录音。

七个族的共同形状是 V:最低点在 α≈0,往负 α 走和往正 α 走都让特征离开中立、而且幅度相当—— α=−1 时响度 z≈+2、谱斜率 z≈+1,与 α=+2 同量级。负 α 不是"比中立更平静",而是更响、更亮、更毛,只是方向乱了。这与 E4 §3.7 的"负 α 离开流形"是同一件事的声学版本。
| 族 | 模型 α=0 vs 真实中立 □ | 模型 α=1 vs 真实情感 ◆ | 读法 |
|---|---|---|---|
| 音高 F0 | −0.4 vs −0.3 ✓ | 0.3 vs 0.2–0.35 ✓(悲伤 ◆ −0.1,模型 0.15,偏高) | 复现好;悲伤被抬高 |
| 响度 | −0.75 vs −0.5 | 0.1 vs 0.4(悲伤 ◆ −0.65,模型 −0.5 ✓) | α=1 略欠,1.25 才追上 |
| 谱斜率/平衡 | −0.3 vs −0.25 ✓ | 0.2 vs 0.17–0.28 ✓ | 复现最准的族 |
| MFCC 包络 | +0.5 vs +0.25(过冲) | −0.1 vs −0.1~−0.3 | α=0 的谱包络比真实中立更"中立"——中立化过头 |
| 共振峰 | 0.03 vs −0.05 | 0.06 vs 0.1 | 小量,方向对 |
| 嗓音质量 | −0.2 vs −0.1 | 0.05 vs 0.05 ✓ | 复现好 |
| 节奏/时长 | 无趋势,噪声 | 无趋势 | 通道锁死(§3.4) |
悲伤单独一条线:响度和 MFCC 几乎不随 α 动(真实悲伤本来也不靠它们),F0 上升幅度只有其他情感的一半。这是 §3.4 结论的逐 α 版本。

88 维怎么选出这 16 维(回答「为什么选这几个」):对每一维,在 α∈[0, 1.5] 内取四情感合并的 z 分均值对 α 做线性回归,得斜率 k(单位 z/α)。 上两行 = |k| 最大的 8 维(随 α 变化最明显);下两行 = |k| 最小、且拟合残差正常的 8 维(最不变)。不再画四情感均值线,四情感各一条。
| 最明显的 8 维 | 斜率 z/α | 最不变的 8 维 | 斜率 z/α |
|---|---|---|---|
loudness_sma3_stddevRisingSlope |
+2.27 | mfcc2_sma3_stddevNorm |
-0.000 |
loudness_sma3_meanRisingSlope |
+2.24 | mfcc4V_sma3nz_stddevNorm |
-0.002 |
loudness_sma3_meanFallingSlope |
+2.08 | mfcc3_sma3_stddevNorm |
-0.010 |
spectralFlux_sma3_amean |
+2.01 | StddevUnvoicedSegmentLength |
-0.013 |
loudness_sma3_stddevFallingSlope |
+1.98 | mfcc4_sma3_stddevNorm |
-0.020 |
spectralFluxV_sma3nz_amean |
+1.96 | mfcc2V_sma3nz_stddevNorm |
+0.021 |
loudness_sma3_stddevNorm |
+1.83 | mfcc3V_sma3nz_stddevNorm |
-0.022 |
equivalentSoundLevel_dBp |
+1.72 | slopeV500-1500_sma3nz_stddevNorm |
-0.023 |
读法:
- 变得最快的全是响度的起落斜率、谱通量、等效声级——拧 α 时最先动的是「响度怎么起落」和「谱变化有多快」,不是音高。这些维在 α≈1 处穿过真实情感录音的水平(红虚线),到 1.5–2 冲到 z=3–5,真实录音里没有这么陡的起落——外推区「毛刺」的声学内容,也是 E4 §3.2 里 stddevNorm 类过冲的来源
- 最不变的全是 MFCC 2–4 的变异系数与无声段长度标准差:整条 α 轴上贴着真实录音的水平几乎不动(|k| ≤ 0.02),说明 α 没有碰谱包络的「稳定性」和停顿结构——与 §3.4 的节奏通道锁死一致
- 两组合起来就是「哪些声学量真正承载了 α 的情感强度」:响度动态与谱通量承载,包络稳定性与停顿不承载
完整斜率表:outputs/m21/e7/alpha_slopes.json;脚本 m21_e7_alpha_dims.py。
全量复核(M21-F,2026-09-10)
汇总页 补充 S7(提案待验收,验收后回填)。 位移分解在全量 1276 条上重算(M21-F):
| 情感 | n | cos(Δ_mdl, Δ_tgt) | ‖mdl‖/‖tgt‖ | 达成率中位 | 斜率 | cos(Δ_tgt, Δ_raw) | n_big |
|---|---|---|---|---|---|---|---|
| Angry | 337 | 0.948 | 1.084 | 1.02 | 1.02 | 0.957 | 59 |
| Happy | 337 | 0.944 | 0.991 | 0.97 | 0.94 | 0.807 | 59 |
| Sad | 267 | 0.879 | 1.039 | 0.94 | 0.90 | 0.790 | 25 |
| Surprise | 335 | 0.933 | 0.963 | 0.93 | 0.91 | 0.984 | 60 |
| ALL | 1276 | 0.937 | 1.013 | 0.95 | 0.96 | 0.972 | 51 |
族层面 |Δ|(Δ_raw / Δ_target / Δ_model):音高 F0 0.55/0.51/0.51;响度 0.65/0.70/0.71;谱斜率/平衡 0.51/0.50/0.51;MFCC 包络 0.55/0.51/0.39;共振峰 0.33/0.33/0.42;嗓音质量 0.43/0.39/0.46;节奏/时长 0.20/0.25/0.24 与 160 条版一致:合计 cos 0.937(160 条 0.934)、幅度 1.01、达成率中位 0.95;MFCC 包络仍是最大短板(−24%),共振峰过冲(+27%);悲伤 cos 最低(0.879)且有实质位移的通道最少(25)。
4 结论¶
| 项 | 结论 |
|---|---|
| 模型达成率 | ✅ 方向 cos 0.934、幅度 1.02、逐特征中位 0.90、回归斜率 0.95 |
| 目标构造效度 | ✅ cos(Δ_tgt, Δ_raw) = 0.990——DTW+R3+HiFT 未扭曲情感方向 |
| 强度的声学载体 | 🔍 响度 > 谱斜率 > MFCC 包络 > F0(推翻首轮"F0 主导",那是循环产物) |
| 短板形状 | ⚠️ 非均匀:谱包络 −16%,共振峰 +31%、变异度类统计量普遍过冲 |
| 随 α 最先变的量 | 🔍 响度的起落斜率与谱通量(斜率 1.5–2.3 z/α),不是音高;负 α 与 α≥2 对称地把这些量推到 z=3–5,真实录音里不存在(§3.5) |
| 排序器效度 | ✅ 三情感 cos(A, Δ_raw) ≈ 0.93;Sad 0.52 且以 HNR 为首 |
| 悲伤 | 🔑 d′ 最低已归因:总位移仅 1/3 + 36% 落在被架构锁死的节奏通道 ⇒ 架构天花板 |
| 方法学 | ⚠️ 2/88 维变异系数退化(原值达 +2013),不剔除会伪造假异常 |
5 复现¶
source scripts/env.sh
CUDA_VISIBLE_DEVICES=0 $PY emo/exp/M17_editor/m21_e7_gen.py # 160×6 = 960 wav
$PY emo/exp/M17_editor/m21_e7_acoustic.py # 位移 + Haufe(纯 CPU)
$PY emo/exp/M17_editor/m21_e7_plot.py
产物:outputs/m21/e7/{gen_meta,acoustic}.json、{train,eval}_feats.npz、wav/。
6 附录:首轮结果(已被 §3.2 修正)¶
首轮在 E2 构造阶梯上求 ρ(特征, α),top-4 全部是 F0 统计量(ρ 0.805–0.847),
equivalentSoundLevel_dBp 为 负(−0.648)。
现已确认:F0 的高 ρ 是阶梯按对数插值 F0 构造的循环产物;
响度的负号是 WORLD 重合成的副作用,不是声学事实——
非循环测量下响度是最大的正向载体(Δ 0.649 z)。首轮数据保留在 outputs/m21/e7/rho.json 备查。
7 本轮未做¶
跨库声学归因(CREMA-D 上重做位移分解,验证结论是否跨语言成立);
强度回归器;emo/eval/intensity.py 封装。