# 古代战场 · 纯音乐三风格（YuE2 生成记录）

**日期**：2026-09-16
**模型**：YuE2-3B（+ YuE2-Vae）+ Demucs 4.1.0（人声分离）
**机器**：GPU 机 192.168.31.31（RTX 5060 Ti **16GB**）
**交付**：3 首纯器乐，古风 2:33 / 哥萨克 3:04 / 8bit 2:10

---

## 一、交付清单

| 文件 | 时长 | 格式 | 说明 |
|---|---|---|---|
| `01-中国古风-古代战场-纯器乐.flac` / `.mp3` | **2:33** (152.8s) | 44.1kHz 立体声 | 战鼓+唢呐+二胡+琵琶，带男声战吼合唱（已分离） |
| `02-哥萨克风-古代战场-纯器乐.flac` / `.mp3` | **3:04** (183.7s) | 44.1kHz 立体声 | 巴扬手风琴+巴拉莱卡+马蹄+鞭响+铜管 |
| `03-8bit电子风-古代战场-纯器乐.flac` / `.mp3` | **2:10** (129.9s) | 44.1kHz 立体声 | NES/FC 方波+三角波+噪声通道鼓，快速琶音 |
| `原始生成版/*.flac` | 同上 | 48kHz 立体声 | YuE2 直出原始版（未做人声分离），供对比 |

> 器乐轨是 44.1kHz —— Demucs 内部按 44.1kHz 处理，源头 48kHz 见「原始生成版」。

---

## 二、三首的风格提示词（生成用原文）

**1) 中国古风**
```
Epic ancient Chinese battlefield score, thunderous Chinese war drums and taiko, blaring suona and dizi,
erhu, pipa, guzheng, deep brass and low strings, male war-chant choir, galloping fast rhythm,
cinematic, ferocious, 138 BPM, instrumental
```

**2) 哥萨克风**
```
Cossack folk battle music, furious sabre dance tempo, bayan accordion, balalaika and domra,
male Cossack chorus shouting, whip cracks, galloping hoofbeats, brass fanfare, timpani,
wild and fierce, 152 BPM, instrumental
```

**3) 8bit 电子风**
```
8-bit chiptune battle theme, NES Famicom style, square and triangle wave leads, fast arpeggios,
noise channel drums, driving heroic fanfare, frantic and intense, 160 BPM, instrumental
```

**歌词位（三首相同，走 `[instrumental]` 段落标签）**：
```
[intro]
[instrumental]

[verse]
[instrumental]

[chorus]
[instrumental]

[bridge]
[instrumental]

[outro]
[instrumental]
```

---

## 三、生成参数

| 参数 | 值 |
|---|---|
| 模式 | `cot=off`（不做乐谱规划，直接生成） |
| `semantic_max_tokens` | 9000 |
| `attention_backend` | `sdpa`（本机必须，auto 会切 cuDNN 报错） |
| 显存档 | 16 GB + `offload_ar=True` + `vae_decode=tiled` + `tile=384` |
| seed | 古风 111111 / 哥萨克 222222 / 8bit 333333 |
| 输出 | 48kHz 立体声 FLAC（YuE2 原生） |

---

## 四、两个关键结论（**纯器乐并不好做**）

### 1. YuE2 没有"纯器乐"开关

翻遍运行时（`yue2_infer-0.1.5` 的 pipeline / tokenization / modeling），**没有任何 instrumental 开关或分轨输出**——它是歌曲模型，AR 阶段必然会生成"人声+伴奏"两路内容。唯一可用的手段是歌词位写段落标签 `[instrumental]`。

### 2. `[instrumental]` 标签**效果不稳定**，必须逐首验证

用 Demucs 把人声轨分离出来测能量（人声/器乐能量比）：

| 曲目 | 人声轨 RMS | 人声/器乐比 | 判定 |
|---|---|---|---|
| 中国古风 | 0.0788 (−22.1 dBFS) | **−4.9 dB** | ❌ 有明显人声化内容 |
| 哥萨克风 | 0.00025 (−72.0 dBFS) | −57.4 dB | ✅ 基本无人生 |
| 8bit 电子风 | 0.00019 (−74.2 dBFS) | −57.1 dB | ✅ 基本无人生 |

同样写了 `[instrumental]`，古风那首照样生成了**人声化的男声战吼合唱**（提示词里确实点名了 war-chant choir）。所以：**"纯器乐"不能靠标签保证，必须生成后检测 + 分离。**

> 有意思的交叉验证：SheetSage2 对古风的原始版和器乐版都转出 `vocal_notes=0`（器乐音符 428 / 374，和弦 92 / 94）。说明 Demucs 抓到的"人声"**不是旋律性唱腔**，而是合唱式/吟唱式的人声 —— 与"战吼合唱"的预期一致。两个判据不矛盾，只是量纲不同。

### 3. 解决办法：Demucs 后处理

对每首跑 `htdemucs --two-stems=vocals`，**交付 `no_vocals` 轨**。这样无论模型是否唱了，交付物都保证是纯器乐。代价：器乐轨采样率变 44.1kHz，且分离可能轻微影响人声频段附近的乐器（如唢呐/二胡的领奏）。

---

## 五、客观验收

| 指标 | 古风 | 哥萨克 | 8bit |
|---|---|---|---|
| 时长 | 152.8s | 183.7s | 129.9s |
| 生成耗时 | 4.0 min | 4.8 min | ~4 min |
| 峰值显存 | ~9–12.9 GiB | — | — |
| 交付版人声残留 | 已分离（≤ −57 dB 量级） | −57.4 dB | −57.1 dB |

（Demucs 分离在 16GB 卡上与生成串行执行，避免显存冲突。）

---

## 六、复现命令

```bash
# 1) 生成（DSH 机，走 GPU 机 ComfyUI API）
python3 yue2-run.py --cot off --sem-mx 9000 --attn sdpa --seed 111111 \
  --lyrics-file yue2-battle/lyrics-instrumental.txt \
  --style "$(cat yue2-battle/style-cn.txt)" \
  --tag battle-cn-guofeng --outdir <输出目录>

# 2) 分离人声、取纯器乐轨（GPU 机）
bash /home/zyw/yue2-demucs.sh battle-cn-guofeng
#   -> /home/zyw/yue2-battle/<tag>-instrumental.{flac,mp3}
#   -> 同时投放到 ComfyUI/output/YuE2_battle/（便于相册与 /view）
```

脚本：`yue2-battle-run.sh`（三首串行驱动）、`yue2-demucs.sh`（分离+测量+导出）。

---

## 七、可以继续做的

- **让模型干脆不唱**：用 `cot=full` 先出乐谱，把 ABC 里 `V: Vocal` 声部整体改成等长休止（`z`），再用 `abc_override` 重渲染 —— 比事后分离更"原生"，但未实测。
- **换风格再出**：同一套参数改风格词即可（如蒙古呼麦、斯巴达、赛博战场）。
- 想要**更激烈**：把 `sem_mx` 提到 12000+ 拉长，或风格词里加 `double-time, 180 BPM, death choir`。
