Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 54 additions & 6 deletions apps/negentropy-influence/pipeline/INDEXTTS-2.5-ADVANCED.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,8 +228,8 @@ GPT 看到的条件方向越偏离说话人身份)。论文的 GRL 只保证 e
| ---- | ------------ | ------------------------------- | ----- | --------- | ---------- |
| bias | 1.0 | 0.9375 | 0.875 | 0.6875 | **0.5625** |

即**同样填 0.5,`calm` 的实际强度只有 `sad` 的 56.25%、`surprised` 只有 68.75%**——
这两个维度「每单位 Σw 预算最贵、见效最差」。
即**在 WebUI 的 bias 口径下**,同样填 0.5,`calm` 的实际强度只有 `sad` 的 56.25%、
`surprised` 只有 68.75%——这两个维度在该口径下「每单位 Σw 预算最贵、见效最差」。

**关键事实**:`normalize_emo_vec`(含 bias 与 0.8 上限)**在 `infer()` 内从不被调用**。
全仓唯一调用点是 `webui.py:665` 的「自定义向量」分支;`apply_bias=False` 那条分支
Expand All @@ -248,6 +248,14 @@ GPT 看到的条件方向越偏离说话人身份)。论文的 GRL 只保证 e
「不采用 emo_bias」是一个**显式的设计选择**而非遗漏:bias 是上游为 WebUI 交互体验做的感知
补偿,而本管线要的是可复现、可缓存、可折算的线性口径。代价就是上述迁移不可靠性。

> ⚠️ **这条事实最容易被反向误用**(2026-09-02 实录):既然 bias 不生效,就**不能**再用
> 「`surprised` 只兑付 68.75%、`calm` 只兑付 56.25%」去论证「这两维不划算、该砍」——那是
> WebUI 路径的语义。`tts.py` 里 `sunny-pure`(#10)的原始立论正是这么写的,已勘误。
> 正确读法只有两条:**(a)** 跨来源迁移参数时要按 bias 换算;**(b)** 本管线内名义权重
> 即实际权重,数值口径一致;各维的听感收益仍受原型基底与参考片段影响,取舍只能靠试听。
> 反向线索:bias 表里被下调的恰是 `surprised`/`calm`;这只能说明上游做了尺度补偿,
> 不能单独推出听感强弱,本管线拿到的是未经该衰减的版本。

### 3.3 73 个情感原型:为何「换选段则标定失效」是必然

情感原型不是「每种情感一个均值」,而是 **73 个「(情感, 具体说话人)」实例**:
Expand Down Expand Up @@ -598,7 +606,47 @@ s2mel 权重截至 2026-08-20 未公开发布。
并记录了判据被现实纠正的三次(秩相关无标度 → 量级判据;只裁头部 → 最长稳定窗口;
静态内存硬门 → 降级为提示)。

### 6.4 Apple Silicon 上不可用的加速面(逐条已核实)
### 6.6 内容侧的噪声地板:本协议下韵律 A/B 的操作门槛 ≈ 21%(2026-09-02)

§6.4–6.5 解决的是**耗时**可测量性。**内容**侧是另一回事,且结论更省钱:

**前提**:固定 `--seed` 后音频内容是确定性的——同参数两次合成 sha256 逐字节相同(本轮实测,
与路线图 #3 一致;机制是 `tts_server.py:343-347` 每次 infer 前 `set_seed`、`:357`
`use_random=False`)。热节流污染耗时,**不污染采样轨迹**。⇒ **内容指标的 A/B 不需要 75 s
冷却、不需要交替顺序**,可以连续跑完。这把一轮 35 次合成的预算从数小时压到约 18 分钟。

**但确定性 ≠ 低方差**。种子换一条(`--seed-offset 1`)就是另一条 take,而 take 间的韵律
波动很大。实测(`sunny-steady` @ `me-bright`,7 句配对,同档同样本只换 take):

| 量 | 中位 | 逐句绝对值范围 |
| --- | --- | --- |
| `\|ΔIQR_rel\|`(起伏÷音高中位) | **10.4%** | 2.6% … 21.3% |

⇒ **在本次协议下,任何 <10% 的韵律「改善」都无法与换一条 take 区分**;按「效应量 ≥ 2×噪声」
得到的**操作门槛是 ≈21%**,不外推为所有韵律类 A/B 的通用最小效应量。这一条直接废掉了
一批看起来诱人的小改动:
本轮五个 `surprised` 加载档在单句剂量筛里的档间差(−14%…+2%)**全部落在噪声内**,
排序甚至把 `sunny` 与 `sunny-steady` 的已知高低关系倒置。

**配套的三条判据设计教训**:

1. **主指标必须无量纲**。`f0_iqr` 与 `f0_med` 在 Hz 量纲上耦合(音高整体抬高 20%,
四分位距通常同比抬高,而听感音程跨度没变),故一律用 `IQR_rel = f0_iqr / f0_med`。
否则「把 alpha 推上去」这条假路径必然「赢」——但那是换了个人(§3.1)。
2. **身份护栏用中位,不用逐句最大值**。§3.1 的 alpha→音高标定曲线(169 / 188 / 199–223 Hz)
报的是**样本级中位**,拿它去卡逐句 `f0_med` 最大值是量纲错配:生产档 `sunny-steady`
自己就有单句冲到 186.9 Hz。本轮曾按逐句最大值误判三个候选「撞 180 Hz 红线」,
改回中位口径后三者反而**低于**基线。
3. **小样本下看符号一致性,不只看中位**。n=7 时中位数不稳定,不能用固定的「噪声/√7」
作为标准误公式;其误差还取决于中位点附近的分布密度。预先指定方向后,`胜出 k/n` 的
符号检验更透明(7/7 → p=0.008,5/7 → p=0.23);需要区间时应使用配对 bootstrap。
本轮出现过「中位最高(+18.1%)但只有 5/7 一致、靠两句离群值撑起来」的臂,若只看中位就会选错。

复现脚本不入库(一次性分析),取数口径全部复用
[prospect_ref.py](./scripts/prospect_ref.py) 的 `window_stats` 与
[tts_bench.py](./scripts/tts_bench.py) 的 `asr_metrics`,无第二份指标定义。

### 6.7 Apple Silicon 上不可用的加速面(逐条已核实)

`use_bf16`(MPS 分支 `:106-109` 硬编码 `False`,注释称 bf16 在 MPS 上是开销)、
`use_cuda_kernel`(同处置 `False`)、`use_deepspeed`(三条分支都以 `torch.cuda.is_available()`
Expand Down Expand Up @@ -630,13 +678,13 @@ TensorRT-LLM)。仓库内**无 vLLM 后端**,README 只给外链 recipe。
| 7 | `length_penalty>0`(长句吞尾) | 机制成立(§4.2)但**实测在本工作负载上惰性** | — | 11 对配对样本(含 −2/+2 全区间极值):尾覆盖改善 **0/11 句**,秒/字仅 +0.4% | ✅ **已做 → 维持默认 0.0**:束间长度差异太小,除数成公共因子。若日后合并多句成单请求需重测 |
| 8 | `repetition_penalty` 定向扫描 | 上游自 v1 沿用 10.0 且无任何测试支撑(§4.3) | — | 11 对样本:3.5–10 是**稳定平台**(8/8 逐项相同);极值两端更差(`1.0` 尾覆盖 0.889、`20.0` 有单句崩到 0.56) | ✅ **已做 → 维持默认 10.0**:上游选择事后成立,它处在避开「无惩罚拖音」与「过强压掉韵尾」的中间带 |
| 9 | 预设名义向量归一到 Σvec°=1.0 | 让 alpha 跨预设可比(§3.1) | 零——只动 `lively`/`confident`/`positive`,三集**都不用**这三档 | 有效注入 `w=vec×alpha` 在上游 4 位量化的 1 单位内一致(单测钉死) | ✅ **已做** |
| 10 | 砍掉 `calm`/`surprised` 配料 | bias 只 0.5625/0.6875,占预算却不兑付表达力(§3.2) | 零(**新增** `sunny-pure` 候选档,不动生产档) | 待 A/B:比 F0 中位/起伏/音节率/限带质心 + 人耳 | 🟡 **候选档已就位**,待定档 |
| 10 | 评估是否砍掉 `calm`/`surprised` 配料 | 本管线不应用 WebUI 的 `emo_bias`,删配料收益不能由 0.5625/0.6875 推出(§3.2) | 零(**新增** `sunny-pure` 候选档,不动生产档) | 待 A/B:比 F0 中位/起伏/音节率/限带质心 + 人耳 | 🟡 **候选档已就位**,待定档 |
| 11 | 密集技术句改 `df>1` | 方向勘误(§3.4) | 零(**新增** `sunny-clear` 候选档 df=1.05);定档后须重渲(牵动 beat) | 待 A/B:ASR 回转写 CER 作清晰度代理(ASR 通路已就绪,见 §2.3) | 🟡 **候选档已就位**,待定档 |
| 12 | 重录目标风格参考样本 | 换段落即 F0 +12~16%、起伏 +25~40%(VOICE-CLONING §3.3);好段落必须放开头(§5) | 一次录制(**须本人操作**) | 工具已就绪:`prospect_ref.py --accept` 判保真度(削波/底噪/动态/带宽/超 15s),再跑纯克隆小样比风格(合格线 F0 ≥155 Hz、起伏 ≥34) | 🟡 **工具就绪,待录音** |
| 13 | `prospect_ref.py` 增保真度门 | 现公式 5 项全是「风格」、0 项「保真度」;谱质心把「亮」与「噪」混淆 | 排名口径变更(质心改限带、静音改绝对阈) | 成片在用的 180s 段**被放行** ✅,且正确标出更脏的窗口(底噪 −46 dB/动态 29 dB);超 15s 与 5 kHz 带限反例均被拦 | ✅ **已做** |
| 14 | 进程级分片并行(双实例) | 原假设「瓶颈是发射/同步开销」 | — | — | ⛔ **不做**:#6 已定因为**热节流**而非吞吐受限(换页/分配器/泄漏均排除)。两个进程只会更快撞上同一个热墙——单实例都已在 6 次调用内漂 2.4× |
| 15 | 降 `diffusion_steps` / 关 CFG | s2mel 占 45–73%,步数 25→12 本可省该段一半 | — | — | ⛔ **不可做**:二者是 `infer()` **函数体内的局部字面量**(`:829-830`),既非参数也非模块常量 ⇒ 无法传入、无法 monkeypatch,只能改上游源码——那是 `glossary.yaml` 被否决的同一模式(不受本仓版本控制、换机即静默失效) |
| 16 | 迁 MLX / 换栈 | 见 §6.3 | 砍掉全部情感控制 ⇒ 7 档风格体系失效 | — | ⛔ **不推荐**:#4 已完成分母校准,缺口基本可归因,无大块性能余量支持换栈 |
| 16 | 迁 MLX / 换栈 | 见 §6.3 | 砍掉全部情感控制 ⇒ 整套风格体系失效 | — | ⛔ **不推荐**:#4 已完成分母校准,缺口基本可归因,无大块性能余量支持换栈 |
| 17 | 升级到 2.5-RL 权重 | 论文中文 WER 4.36→3.93、SS 77.10→77.92 | 整集重录 | — | ⛔ **权重未公开**(见下);订阅 upstream release 即可,无需本仓工程 |

### 7.1 候选档怎么定档(#10 / #11 的收尾动作)
Expand Down Expand Up @@ -681,7 +729,7 @@ release 比自行复现 GRPO 经济得多**——同时也在等 Zipformer 版 s
| 迁 CUDA + 开 `--accel` | `model_v2_5.py:761-772` 的 accel 旁路**只认 `temperature`**,其余采样参数全部静默失效 | 「参数明明传了却毫无效果」 |
| 迁小显存 CUDA(<10 GB) | `low_vram` 触发,`:509` 把 >40 字符的行按标点**硬切并插 200 ms 静音** | 旁白行中间莫名多出停顿 |
| 迁 Linux | 中文归一化引擎从 wetext 换成 `tn.chinese.normalizer`(`front.py:130-142`) | 读法行为可能变化——**必须在 Linux 上重跑空格矩阵**(§2.2) |
| 换 MLX 栈 | 主动放弃 `emo_vector`/`emo_audio_prompt`/`emo_text` 与束搜索 | 本仓 7 档风格体系、alpha 标定、`sunny`/`sunny-steady` 双档全部失效 |
| 换 MLX 栈 | 主动放弃 `emo_vector`/`emo_audio_prompt`/`emo_text` 与束搜索 | 本仓风格体系、alpha 标定、`sunny`/`sunny-steady` 双档全部失效 |
| 原地覆盖参考样本 | 上游按路径缓存条件张量 | 「sha1 是新的、音色是旧的」(§5 末) |
| 合并多句成单请求 | 118 字段预算与 1815 mel token 同时变成活约束 | 单请求上限约 36 s 语音;溢出表现为**文本尾部未被念出** |
| 想调 S2M 扩散步数 / CFG | 二者是 `infer()` 体内的**局部字面量**(`:829-830`),不在签名里、也不是模块常量 | 无法从外部传入或 monkeypatch;只能改上游源码,而那份改动不受本仓版本控制、换机即静默失效(同 `glossary.yaml` 被否决的理由) |
Expand Down
Loading