跳转至

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 的构造阶梯上求逐维 ρ(特征, α)。两个问题:

  1. 循环性:阶梯本身按对数插值 F0 构造,F0 类的高 ρ 是内定的
  2. 与 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:

\[\mathbf{A} \;\propto\; \boldsymbol{\Sigma}_x\,\mathbf{w}\]

\(\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

三条互相独立的证据指向同一结论:

  1. 悲伤在声学上离中立最近——总位移 2.87,只有惊讶的 1/3;有实质位移的通道只有 27 个(其他 56–62)
  2. 悲伤把 36% 的位移放在节奏上,其他情感只有 5–8%;真实录音里悲伤拖长 19%, 而生气/高兴反而说得更快(0.85 / 0.90)
  3. 节奏恰是本架构表达不了的通道: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 封装。

讨论