# 《深呼吸》女声翻唱版 · 制作记录

**日期**：2026-09-16
**源曲**：羽泉《深呼吸》（用户提供的 MP3，4:59 / 44.1kHz）
**声线参考**：金莎《星月神话》（用户提供的 MP3，4:09）—— 只作**音色/音区**参考
**管线**：SheetSage2 提取旋律 → 整谱移调 → YuE2 `cot=melody` 重渲染（人声+伴奏全新生成）

---

## 一、交付清单

| 文件 | 时长 | 格式 | 说明 |
|---|---|---|---|
| `01-深呼吸-女声翻唱-金莎音区.flac` / `.mp3` | 4:56 | 48kHz 立体声 | **主推**：旋律升 5 半音，落在金莎的声线区间 |
| `02-深呼吸-女声翻唱-原调版.flac` / `.mp3` | 5:01 | 48kHz 立体声 | 备选：保持原调，仅换音色 |
| `脚本/` | — | — | 本次用到的全部脚本（可复现） |

> 歌词文件是流水线**输入**，未随交付发布。

---

## 二、先说清技术边界（重要）

**YuE2 不做音色克隆。** 官方 README 明确写：

> Reference audio is used to extract a symbolic score; it does not clone the original singer.
> This is **not voice cloning** and does not preserve the original waveform.

所以"借金莎的少女声线"我落实为**两件可验证的事**，而不是克隆：

1. **音区对齐**：测出金莎在《星月神话》里的人声基频区间，把翻唱旋律移调到同一音区（客观可测）；
2. **音色描述**：在风格提示词里用文本描述她的音色特征（纤细、纯净、气声、清亮、少女感），由模型据此塑造音色。

**不能保证**的是"听起来就是金莎本人"——那需要专门的音色克隆/转换模型（如 RVC、so-vits 之类），YuE2 链路做不到。

---

## 三、管线（这版和第 2 首"战场纯音乐"不同的地方）

```
源曲 MP3
  └─ ffmpeg 去 ID3 转 FLAC          ← 见"坑 1"
      └─ SheetSage2 转谱（melody_only=true）
          └─ 得到纯旋律 ABC（无人声、无和弦，只有 Vocal 声部 + Ins 休止）
              ├─ ABCModifier 整谱移调 +5 半音（调号 Ab→Db 同步）
              ├─ MelodyCleanup light（清理过短/离群音符）
              └─ YuE2 Sampler（cot=melody + abc + 新歌词段落 + 新风格提示词）
                  └─ 48kHz 立体声翻唱
```

关键点：**`cot=melody` 且只喂旋律 ABC**（不给和弦）→ 伴奏由模型按新风格自由生成，所以移调不会与伴奏打架。

---

## 四、客观验收数据

### 1) 人声基频（YIN 算法，同一把尺子量三条轨）

| 轨道 | 中位 F0 | 5–95% 音域 | 判定 |
|---|---|---|---|
| 原唱·羽泉（男） | 223 Hz (A3) | A2 – G#4 | 高音男声 |
| 参考·金莎（女） | **299 Hz (D4)** | A3 – **A#4** | 甜美女声 |
| 翻唱 v2·金莎音区 | **312 Hz (D#4)** | G3 – **A#4** | 与参考中位差 **0.7 半音**，上限**完全一致** |
| （对照）翻唱 v1·原调 | 236 Hz (A#3) | D#3 – F4 | 比参考低 4.1 半音 |

→ **v2 把翻唱搬进了金莎的音区**，这是"借鉴声线"里唯一能客观验证的部分。

### 2) 旋律保真度（确认是同一首歌，不是另写一首）

对翻唱重新转谱后与原曲旋律对比：

| 指标 | 值 | 含义 |
|---|---|---|
| 旋律**音程**分布余弦相似度 | **0.988** | 接近 1.0 → 旋律走向与原曲一致（移调不变量） |
| 转谱音符数 | 原 613 / 翻唱 550 | 同一量级 |
| 中位音高差（ABC 口径） | +3 半音 | 与移调设定同向（口径不同于 F0 帧加权） |

### 3) 生成开销

| 版本 | 端到端 | semantic tokens | 峰值显存 |
|---|---|---|---|
| v1（原调） | 6.2 min | 7520 | 11.38 GiB |
| v2（+5 半音, cfg=1.2） | 9.2 min | ~7500 | — |

cfg 从官方默认 1.0 提到 **1.2** 会算两遍前向，耗时明显增加（这也是 v2 慢 3 分钟的原因）。

---

## 五、踩到的坑（含一个**通用 bug**）

### 坑 1：带 ID3 标签的 MP3 会让 ComfyUI 的 LoadAudio 直接崩 ⚠️

```
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 0: invalid continuation byte
  at comfyui nodes_audio.py LoadAudio.execute -> load(audio_path)
```

你上传的两首 MP3 都带 **GBK 编码的中文 ID3 标签**，ComfyUI 读元数据时按 UTF-8 解码 → 炸。
**绕过办法（已验证）**：

```bash
ffmpeg -y -i input.mp3 -map_metadata -1 -c:a flac input.flac
```

即"先去掉元数据转成 FLAC"。以后凡是中文歌的 MP3 走 ComfyUI，都建议先过这一步。

### 坑 2：`YuE2SaveABCFile` 的参数叫 `filename` 不是 `filename_prefix`

写错会得到 HTTP 400（`/prompt` 的报错体不打印出来，只看得到 400）。已在脚本里补上错误体打印。
另：ABC 工具的产物**不出现在 `/history`**，要落盘在 `output/YuE2_ABC/<时间戳>/` 里手动取。

### 坑 3：基频测量选错算法会得出相反结论

先用"自相关取全局峰"测，金莎被测成 167 Hz（比男声还低）——**强二次谐波导致降八度错误**。
改用 **YIN**（累积均值归一化差值 + 第一谷值 + 抛物线插值）后数值才合理。**做男女声判定必须用 YIN 类算法。**

### 坑 4：我自己写错参数导致一次空跑

`--cfg` 当时还没实现，脚本直接报 `unrecognized arguments`，白等 1 分钟（已给脚本补上 `--cfg`）。

---

## 六、复现命令

```bash
# 1) 源曲转谱（去掉 ID3 的 FLAC）
ffmpeg -y -i 源曲.mp3 -map_metadata -1 -c:a flac 源曲.flac     # 放进 ComfyUI/input/
python3 yue2-sheetsage.py --audio 源曲.flac --melody-only --tag cover-src

# 2) 整谱移调 + 清理（+5 半音，调号同步）
python3 yue2-abc-shift.py --abc melody-source.abc --semitones 5 --scope whole_score --out melody-p5.abc

# 3) 重渲染（cot=melody + 旋律 ABC + 目标音色提示词）
python3 yue2-run.py --cot melody --abc-file melody-p5.abc --lyrics-file 歌词.txt \
  --sem-mx 8500 --attn sdpa --cfg 1.2 --seed 999999 \
  --style "Mandarin pop, sweet youthful girl lead vocal with the delicate timbre of Jin Sha, ..." \
  --tag cover-female-p5 --outdir <输出目录>

# 4) 验收：分离人声 + YIN 测基频
venv/bin/python -m demucs --two-stems=vocals -n htdemucs -o /home/zyw/demucs-out <成品.flac>
python3 yin-f0.py /home/zyw/demucs-out/htdemucs/<名>/vocals.wav 标签
```

---

## 七、还可以继续调的

- **多跑几版挑声音**：音色由提示词+随机种子决定，建议固定 `seed` 扫 3–5 版试听挑选（我无法试听，只能保证音区/旋律指标）。
- **更"少女"一点**：把 `sem_mx` 提到 9000 不解决问题；更有效的是**再升 2 个半音**（+7）或风格词加 `teenage girl, light head voice, pure and bright`。
- **想要真·音色克隆**：需要换链路（Vocal 分离 → RVC/so-vits 音色转换 → 混音），与 YuE2 无关，要另做方案。
- **`cfg` 扫描**：1.0 / 1.2 / 1.4 三档对比风格的"贴不贴"。
