跳转至

探针 · 电音归因与上限(M19–M20 共用)

状态 ✅ §1–4 完成(2026-08-30,WSOLA 归因)· ✅ §5 追加(2026-09-01,GT mel 插值归因)
一句话 把「数据侧目标」和「声码器往返」单独拿出来打分与试听——在不训练任何模型的前提下,界定 M19 的 MOS / delta 天花板,并定位残余电音的来源
上游 ← M19:MOS 卡在 ~1.9、α=0 与中段仍有电音 · M20:中段 α 电音的归因(§5)

TL;DR

电音主犯是 WSOLA 重合成的中立目标,不是模型也不是声码器。

  • 🎯 声码器无罪:HiFT(情感 mel) UTMOS 2.61 ≈ 情感原录音 2.54——mel→波形这一段几乎无损
  • 🔪 WSOLA 目标掉 0.52 MOS:均匀 R3 目标 3.33 → DTW-WSOLA 目标 2.81; mel 空间同口径,重合成伪影占 M19 残差能量的 24%(0.078 中有 0.018 不是情感)
  • 📏 UTMOS 对情感语音有约 −1.0 的系统偏置:自然中立原录音 3.55 vs 情感原录音 2.54—— "MOS 1.9"必须按这把尺子读;M19 90k 的 MOS@α=1 = 2.55 已贴住 2.61 的上限
  • 📈 delta 天花板 = 0.885(不是 1.0):90k 实测 0.835 = 达成 94%
  • ⇒ 下一刀:分段 RubberBand R3 重建中立目标(按 DTW 锚点切段、每段 R3 均匀拉伸后拼接), 预期收回目标端约 0.5 MOS,同时把残差里那 24% 的伪影负担还给情感

1 方法

不训练、不推理,只做「数据 → mel → HiFT → 打分」:

D_emo    情感原录音                       绝对参照
D_neu    自然中立原录音                    UTMOS 的情感偏置标定
V_emo    HiFT(x1_emo)                    α=1 的「完美模型输出」
V_neu19  HiFT(x1_neu of m19_cache)       α=0 的完美输出(DTW+WSOLA 目标)
V_neu13  HiFT(x1_neu of m13_cache)       同上(均匀 R3 目标,M18 口径)

打分模块与主评测同源(emotion2vec_plus_large / UTMOS),n = 175 对(48 组 × ≤4 情感,test 划分)。

2 结果

2.1 上限表

臂 emo 分(对目标情感) UTMOS 读法
D_emo 情感原录音 0.998 2.54 真人情感语音的 UTMOS 就只有这么高
D_neu 自然中立原录音 0.000 3.55 同一批人、同样是真录音,中立高出 1.02
V_emo = HiFT(x1_emo) 0.995 2.61 α=1 的天花板;≈ 原录音 ⇒ 声码器无罪
V_neu13 = HiFT(均匀 R3) 0.121 3.33 M18 的 α=0 天花板
V_neu19 = HiFT(DTW-WSOLA) 0.110 2.81 M19 的 α=0 天花板——比 R3 低 0.52

2.2 与模型实测对照

天花板 M18-λ1.0 实测 M19 90k 实测 达成率(对 M19 天花板)
MOS@α=1 2.61 2.81 2.55 98%
MOS@α=0 2.81(M19)/ 3.33(M18) 2.77 2.00 71%
delta 0.885(M19)/ 0.873(M18) 0.911 0.835 94%
  • α=1 端 M19 已无空间可挖;M18 的 2.81 甚至越过了本口径的天花板(UTMOS 偏爱平滑语音)
  • 缺口集中在 α=0:天花板本身被 WSOLA 砍掉 0.52,模型又只兑现了其中 71%
  • delta 的"差 M18 一截"有一半是天花板差异,实际达成率 94%

2.3 mel 空间的同一结论(n=200)

中立目标构造 GT 残差能量占比
均匀 R3(m13) 0.1155
DTW + WSOLA 重合成(m19) 0.0777
DTW 路径配对原始中立帧(不重合成) 0.0580

差值 +0.018 = M19 残差能量的 24% 是 WSOLA 重合成伪影,不是情感信息—— v_B 必须学它、v_Δ 必须减掉它,两塔的容量都被这部分吃掉。

3 试听 0001_text00010「不是,他住在沃斯盾的老房子里。」

自然中立原录音:

情感 情感原录音 HiFT(情感 mel) HiFT(均匀 R3 中立) HiFT(DTW-WSOLA 中立)
Angry
Happy
Sad
Surprise

第 2 列 ↔ 第 3 列:声码器往返的损耗(很小)。 第 4 列 ↔ 第 5 列:同一句中立、同样过声码器,唯一差别是变速引擎—— WSOLA 的 overlap-add 相位毛刺就是模型 α=0 输出里那层金属感的来源。

4 结论与下一刀

项 结论
声码器 / mel 表征 ✅ 无罪:往返损耗 ≈ 0(2.61 vs 2.54)
WSOLA 变速 ❌ 主犯:目标端 −0.52 MOS、残差能量里 24% 是伪影
模型本身 α=1 已达 98% 天花板;α=0 兑现 71%,仍有空间但先修目标
UTMOS 口径 对情感语音系统性低 ~1.0 分——跨情感/中立比较 MOS 时必须记住
建议 ✅ 已实现并实测 → R3 试听页(UTMOS 2.78→3.05,对齐不变)。原设想的分段 RubberBand R3 重建 x1_neu:按 DTW 锚点切段 → 每段 R3 引擎均匀拉伸 → 拼接。
绕开 pylibrb 的 keyframe-map binding bug,同时拿回 R3 的音质(3.33 档)与 DTW 的对齐(≤1 帧)。
代价:段界处需交叉淡入淡出,缓存重建约 1 小时;训练可从 90k ckpt 续,不必从零

5 追加探针:GT mel 插值(2026-09-01)

问题:中段 α(0.25–0.5)的电音,是模型分离不够好,还是"情感 = 中立 + α·Δ"这个 建模假设本身在中段失效?

方法:完全不含模型——直接取 GT 的中立 mel 与情感 mel 按 α 线性混合,过 HiFT 打分。 n = 48 对(test 划分)。附一个对照臂:在功率域平均(exp → 加权和 → log)而非 log 域。

α GT 混合(log 域) GT 混合(功率域) 参照:M20@380k 模型输出 GT 混合的情感分
0.0 3.14 3.14 2.80 0.212
0.25 2.07 2.36 1.89 0.385
0.5 1.42 1.74 1.54 0.656
0.75 2.02 1.47 2.09 0.957
1.0 2.79 2.79 2.65 0.985

5.1 结论:中段电音与模型无关

  • α=0.5 处 GT 混合只有 1.42,低于模型输出的 1.54—— 模型在中段已达到、甚至略微超过这个目标定义所允许的上限
  • V 形谷(3.14 → 1.42 → 2.79)在零模型参与下就存在,与对齐引擎(M18 均匀 R3 / M19 WSOLA / M20 R3 三种)无关、与训练量(40k–420k)无关
  • ⇒ 病根在插值公式:中立 + α·Δ ≡ (1−α)·中立 + α·情感, 这要求 Δ 是一个可缩放的加性位移。该假设对"某频率上有多少能量"(谱倾斜、响度)成立, 对"能量长在哪个频率上"(基频谐波、共振峰位置)不成立—— 位移乘 0.5 不会把谱峰移到中间,而是把一个峰变成两个半高的峰, 声码器只能把它渲染成金属感(听觉上像两个人同时说同一句话)
  • 这也解释外推为何反而好:α=1.5 的权重是 (−0.5, +1.5),一方绝对主导、另一方被减去(类似锐化), 仍像一个人说话;α=0.5 两边等权,谁也不主导,歧义最大 —— 故谷底精确落在 0.5

5.1b 机理图解:两套梳齿 vs 一套梳齿

梳齿图解

取 0002_text00150 Angry 的第 452 帧(浊音,两边都发声)。该帧中立的基频 239 Hz、 情感的 499 Hz——谐波(梳齿)位置完全不同。

量化:各条谱在三套梳齿位置上的"凸显度"(谐波峰 − 相邻谷,dB,越高表示该套梳齿越明确):

谱 在中立梳齿(239Hz) 在情感梳齿(499Hz) 在形变梳齿(345Hz)
中立 37.0 1.4 −14.6
情感 2.1 51.2 −8.4
相加(现在的 α=0.5) 19.6 26.3 −11.5
形变(F0 插值后重新生成) −3.1 0.3 50.4
  • 两个端点各自只有一套梳齿(37.0/1.4 与 2.1/51.2)
  • 相加后两套梳齿同时存在(19.6 与 26.3)——这就是"双重曝光",听觉上像两个人同时说话
  • 形变后只有新的一套(50.4),原来两套几乎归零(−3.1 / 0.3)

跨全句的验证(CPP 谐波清晰度,有声帧):中立 1.23 · 情感 1.03 · 相加 0.76(最低) · 形变 1.44(最高)。 相加破坏谐波结构不是个别帧的现象,是全句性的。

为什么 WORLD 的插值不会产生双梳齿:它把语音拆成 F0 / 谱包络 / 非周期成分三样, 而谱包络里不含梳齿(CheapTrick 估计时已抹掉谐波纹波)。梳齿只在合成那一刻由单个 F0 值现场生成, 因此包络相加是安全的。mel 谱则把梳齿与包络揉在一起,平均 mel 就把梳齿一并平均了。

"位置类"的量其实有两个(本轮只治了主因):

量 谁决定 线性平均的后果 严重程度
谐波位置 F0(= 梳齿间距) 两套尖梳齿并存 主因(齿尖、数量多)
共振峰位置 谱包络里的宽包 宽包变胖/出双峰 次要(包宽,听感偏"闷"而非"电")
各频段能量大小 包络高度 无问题 —

完整的形变(STRAIGHT 式)会把包络的频率轴也一并 warp,把次因也治掉;本轮未做。

⚠️ 一处实测到的限制:谱包络只能在谐波位置上被采样到。本例情感侧 F0=499 Hz, 1000 Hz 以下仅两根谐波,包络在低频是欠定的(共振峰测不准)。 高音调语音的谱采样本就稀疏——这也是 mel 域混合在高激动度语音上更吃亏的原因之一。

5.1c 试听:同一条 mel→HiFT 路径,只差插值方式

α=0.5 音频
相加(现在的做法)
形变(F0 对数插值 + 包络线性插值,WORLD 合成后同样过 mel→HiFT)

两条都是纯 GT 数据、都经过 mel → HiFT,唯一差别是 mel 怎么造出来的。

5.1d 候选修法的基础操作:倒谱截断

倒谱截断图解

若要在推理端修掉双梳齿,最基础的一步是把 mel 里的"包络"与"谐波纹波"分开。 mel 域的标准做法是倒谱截断(即 MFCC 只取前若干维的同一原理):

① 取一帧 log-mel(80 个数)
② 做 DCT → 80 个倒谱系数:低阶 = 沿频率轴变化慢的成分(包络/共振峰)
                          高阶 = 变化快的成分(谐波梳齿)
③ 高阶置零 → 逆 DCT 回到 80 维:纹波消失、包络原样

实测(0002_text00150 Angry 第 49 帧):

量 数值
第 0 个倒谱系数占总能量 91.6%
前 13 个 / 前 20 个 99.5% / 99.6%
第 20 个之后(被丢弃的全部纹波) 仅 0.4%
截断后与原始的 RMS 差(log-mel 单位) 保 20:0.313 · 保 13:0.354
  • 丢掉的信息很少(0.4% 能量),包络完整保留——回应"截断是不是丢太多"的疑虑
  • 但 0.4% 的能量 ≠ 0.4% 的听感权重:谐波结构正属于"能量小、听感关键"的细节, 所以单纯截断不够,还需把正确的单套梳齿加回来(由 HiFT 的正弦源按插值 F0 生成)
  • 图①另可看出:双梳齿主要存在于前 15–20 个 mel 频带;第 40 带以上带宽已超过谐波间距, 那里的起伏是真实谱形而非梳齿 ⇒ 更稳妥的做法可能是只在低频段截断

⬜ 上述修法(注入 F0 / 频率平滑 / 倒谱截断 / 组合)尚未跑完整对照实验。

5.2 插值域是个便宜的改进方向

功率域平均在 α=0.5 白捡 +0.32(1.42 → 1.74)、α=0.25 +0.29;但 α=0.75 反而掉 (2.02 → 1.47),故不能直接替换。它证明的是:插值域的选择本身就能显著改变中段音质, 值得作为下一步的低成本实验(例如按频带分别选择插值域,或基频与包络分开插值)。

5.3 试听(0002_text00150 Angry,全 GT 混合,无模型)

原始录音参照(未过声码器):情感  自然中立

下表中 α=0 与 α=1 两列即为 GT(GT mel 直接过 HiFT,无模型);注意 α=0 是R3 对齐后的中立(训练目标),与上面的自然中立在节奏上不同。

α log 域混合 功率域混合
0.00
0.25
0.50
0.75
1.00

另两组(0009_text00160 Sad、0001_text00010 Happy)同名文件在 media/audio/gtinterp/ 下,命名规则 <key>_<情感>_a<α>_<log|pow>.mp3。

读法:α=0 与 α=1 是真实录音的 mel 经声码器往返(3.14 / 2.79), 中间三档是纯粹的数学混合——它们听起来有多糟,就是这条建模路线在中段的天花板有多低。


6 中段修法的四轮实验(2026-09-01)

§5 证明中段电音源于加性插值假设失效。本节记录尝试过的四类修法,三负一正。

6.1 ❌ 注入 F0(绕过 HiFT 的 F0 预测器)

HiFT 是源–滤波器(HnNSF)结构:f0_predictor 从 mel 预测 F0 → SineGen 生成谐波源 → 网络滤波。 猜想:双梳齿让 F0 预测器锁不住音高,直接注入插值 F0 即可修复。

在 M20@420k 模型输出上实测(mel 完全不动,只换源的 F0):

α 0 0.25 0.5 0.75 1.0
Angry 现状(两端差 10.9 半音) 3.42 2.67 1.57 1.92 2.37
Angry 注入 F0 3.27 2.35 ↓ 1.69 1.93 2.50
Sad 现状(两端差 0.1 半音) 3.47 2.65 2.06 2.73 3.14
Sad 注入 F0 3.44 2.69 2.06 2.84 3.11

结论:无效。 即使在音高差 10.9 半音的最坏情形,α=0.5 也只 +0.12(噪声量级),α=0.25 反而 −0.32。 ⇒ 在 HiFT 里 mel 说了算,源修对了也救不回来。

附带发现:Sad 那组两端 F0 几乎相同(0.1 半音,无双梳齿)却照样有中段谷 (2.06 vs 端点 3.47/3.14)——双梳齿不是唯一成因。 60 对统计:两端 F0 差异中位 4.8 半音、72% >3 半音,故 Sad 属少数派,但它证明还存在第二成因。

6.2 ❌ 抹平 mel(五种由轻到重,全部有害)

保留全部插值,只把并存的双齿抹成单齿。同时在 α=0/1(本无双齿)上施加同样处理以量化伤害:

臂 中段 MOS vs 基线 端点 MOS vs 基线
A 现状 2.07 — 2.96 —
高斯 σ=1 频带 1.46 −0.61 1.68 −1.28
高斯 σ=1.5 1.36 −0.71 1.39 −1.56
中值滤波 3 点 1.51 −0.56 1.77 −1.18
只抹低频 25 带 1.48 −0.59 1.79 −1.16
倒谱软加权 1.51 −0.56 1.71 −1.24

结论:没有"伤害较小的方法",五种全负。 与 §5.1d 的测量一致—— 混合谱的纹波本就比真实语音少 25%(RMS 0.58 vs 0.74),再减只会更off-distribution。 ⇒ HiFT 既依赖 mel 的精细结构、又对它敏感,任何"减法"式修补都砸音质。

6.3 ✅ 先对齐音高再混合(用户方案,唯一正向)

不修 mel、不动插值,而是在混合之前把两端的音高都变到目标值,使梳齿天然重合:

中立 ──WORLD 分解──> (F0_n, 包络_n, 非周期_n) ──用 F0_α 重合成──> A'
情感 ──WORLD 分解──> (F0_e, 包络_e, 非周期_e) ──用 F0_α 重合成──> B'
mel_α = (1−α)·mel(A') + α·mel(B')  ──> HiFT
其中  F0_α = exp( (1−α)·log F0_n + α·log F0_e )      ← 按 α 插值,非固定平均

F0 目标随 α 变化(以 239↔499 Hz 为例):

α 0 0.25 0.5 0.75 1.0
F0 目标 (Hz) 239 288 345 416 499

实测(3 条,GT 数据):

α 基线(直接混合) 音高对齐后混合 差
0.0 3.42 2.88 −0.55 ← WORLD 往返损耗
0.25 2.55 2.55 +0.01
0.5 1.68 2.17 +0.49
0.75 2.07 2.20 +0.13
1.0 2.58 2.07 −0.51 ← WORLD 往返损耗

逐条:Angry(差 9.6 半音)+0.77 · Happy(差 10.4)+0.29 · Sad(差 1.2)+0.41 —— 音高差越大收益越大,与机理预测一致。

关键读法:α=0/1 处目标 F0 即其自身、并未变调,掉的 0.5 分纯粹是 WORLD 分解→重合成的往返损耗(固定开销)。倒扣这笔开销后,音高对齐本身在 α=0.5 值约 +1.0 分。 而两端本就不需要走这条路 ⇒ 实际策略是"两端走直路、中段走对齐路":

α 0 0.25 0.5 0.75 1.0
原来 3.42 2.55 1.68 2.07 2.58
混合策略 3.42 2.55 2.17 2.20 2.58

试听:α 从 0 到 1 的完整对拍

先验证"只换 F0、音色不动"(0002_text00150):

中立原音(F0≈243,时间已对齐) 只把 F0 换到 328 情感原音(F0≈499)

中间那条应当听起来是同一个人、同一句话、同样的音色,只是音调升高。 若听感上变了个人,说明变调不够干净(重新分析的包络与原包络 RMS 差 5.2 dB, 作参照中立↔情感的包络差为 16.0 dB)。

α 全网格对拍(左=现状直接混合,右=先对齐音高再混合;括号内为 UTMOS):

0002_text00150 Angry —— 两端 F0 差 9.6 半音****

α 现状(直接混合) 音高对齐后混合 差
0.00
3.83

2.87
-0.96 ←端点,无变调,差值即 WORLD 往返损耗
0.25
2.33

2.49
+0.16
0.50
1.46

2.23
+0.77
0.75
2.09

2.30
+0.21
1.00
2.65

1.92
-0.73 ←端点,无变调,差值即 WORLD 往返损耗

0009_text00160 Sad —— 两端 F0 差 1.2 半音(反例:几乎无音高差)

α 现状(直接混合) 音高对齐后混合 差
0.00
3.65

3.06
-0.59 ←端点,无变调,差值即 WORLD 往返损耗
0.25
3.19

2.77
-0.42
0.50
2.26

2.67
+0.41
0.75
2.51

2.80
+0.29
1.00
3.21

2.67
-0.54 ←端点,无变调,差值即 WORLD 往返损耗

0010_text00310 Happy —— 两端 F0 差 10.4 半音****

α 现状(直接混合) 音高对齐后混合 差
0.00
2.79

2.70
-0.09 ←端点,无变调,差值即 WORLD 往返损耗
0.25
2.12

2.39
+0.27
0.50
1.32

1.61
+0.29
0.75
1.61

1.51
-0.10
1.00
1.89

1.61
-0.28 ←端点,无变调,差值即 WORLD 往返损耗

读法:两端(α=0/1)目标 F0 即其自身、并未变调,那里的差值是 WORLD 分解重合成的固定往返损耗; 中段的正收益是在倒扣这笔损耗之后得到的。实际部署应"两端走直路、中段走对齐路"。

全量评测已完成(2026-09-01)

本方案已在 11 组 × 7 α 上跑完 → 音高对齐混合 · 全量评测: 中段 α=0.5 的 MOS 从 1.58 抬到 2.21、α=0.25 从 1.94 到 2.48; 但外推档崩坏、CER 变差 ⇒ 仅应在 0<α<1 启用。

6.4 待办与风险

  • ⬜ 样本量不足:仅 3 条,需扩到 12 组全 α 网格
  • ⬜ 过路费可压:WORLD 往返 −0.5,换 RubberBand R3 变调(保共振峰,本项目已在用)可能更低
  • ⚠️ 部署成本:需"两端 mel → 各自声码 → 变调 → 重提 mel → 混合 → 再声码", 比现状多两次声码 + 两次变调
  • ⚠️ 情感分不可靠:混合音频上 emotion2vec 输出在 0.00/1.00 间跳变,情感是否保留须靠听感判定

讨论