Spaces:
Running
Running
File size: 12,561 Bytes
bc9c638 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 | # ACE-Step 1.5 LoRA 训练教程
## 硬件需求
| 显存 | 说明 |
|------|------|
| 16 GB(最低) | 通常可用,但处理较长歌曲时可能出现显存不足 |
| 20 GB 及以上(推荐) | 可处理全曲长度,训练时显存占用通常维持在 17 GB 左右 |
> **提示:** 在训练开始之前的预处理阶段,需要多次重启 Gradio 以释放显存,具体时机会在后续步骤中说明。
## 免责声明
本教程使用 **Nayutan星人 (NayutalieN)** 的专辑 *ナユタン星からの物体Y*(共 13 首歌曲)作为演示,训练了 500 个 epoch(batch size 为 1)。**本教程仅用于理解 LoRA 微调技术的教育目的,请使用您的原创作品训练 LoRA。**
作为开发者,我本人非常喜欢 Nayutan星人 的作品,因此选用了其中一张专辑作为示例。如果您是权利持有者并认为本教程侵犯了您的合法权益,请立即联系我们,我们将在收到有效通知后移除相关内容。
技术应当被合理合法地使用,请尊重艺术家的创作,不要做出**损害或伤害**原创艺术家的声誉、权利或利益的行为。
---
## 数据准备
> **提示:** 对于程序脚本操作部分,如果您不熟悉编程,可以将本文档交给 Claude Code / Codex CLI / Cursor / Copilot 等 AI 编程工具,让它来帮助您完成。
### 概述
每首歌的训练数据包含以下内容:
1. **音频文件** — 支持 `.mp3`、`.wav`、`.flac`、`.ogg`、`.opus` 格式
2. **歌词** — 与音频同名的 `.lyrics.txt` 文件(也兼容 `.txt`)
3. **标注数据** — 包含 `caption`、`bpm`、`keyscale`、`timesignature`、`language` 等元信息
### 标注数据格式
如果您已拥有完整的标注数据,可以构造 JSON 文件,与音频、歌词放置在同一目录。文件结构如下:
```
dataset/
├── song1.mp3 # 音频
├── song1.lyrics.txt # 歌词
├── song1.json # 标注(可选)
├── song1.caption.txt # caption(可选,也可写在 json 中)
├── song2.mp3
├── song2.lyrics.txt
├── song2.json
└── ...
```
JSON 文件结构(所有字段均为可选):
```json
{
"caption": "A high-energy J-pop track with synthesizer leads and fast tempo",
"bpm": 190,
"keyscale": "D major",
"timesignature": "4",
"language": "ja"
}
```
如果没有标注数据,可以通过后续章节介绍的方案获取。
---
### 歌词
将歌词保存为与音频同名的 `.lyrics.txt` 文件,放置在相同目录下。请确保歌词内容的准确性。
扫描时的歌词文件查找优先级:
1. `{文件名}.lyrics.txt`(推荐)
2. `{文件名}.txt`(向后兼容)
#### 歌词转录
如果您没有现成的歌词文本,可以通过以下工具转录获取:
| 工具 | 结构化标签 | 准确性 | 使用难度 | 部署方式 |
|------|-----------|--------|---------|---------|
| [acestep-transcriber](https://huggingface.co/ACE-Step/acestep-transcriber) | 无 | 可能有错别字 | 较高(需部署模型) | 自部署 |
| [Gemini](https://aistudio.google.com/) | 有 | 可能有错别字 | 低 | 付费 API |
| [Whisper](https://github.com/openai/whisper) | 无 | 可能有错别字 | 中等 | 自部署 / 付费 API |
| [ElevenLabs](https://elevenlabs.io/app/developers) | 无 | 可能有错别字 | 中等 | 付费 API(有免费额度) |
本项目在 `scripts/lora_data_prepare/` 下提供了对应的转录脚本:
- `whisper_transcription.py` — 调用 OpenAI Whisper API 转录
- `elevenlabs_transcription.py` — 调用 ElevenLabs Scribe API 转录
两个脚本均支持 `process_folder()` 方法批量处理整个文件夹。
#### 检查与清洗(必须)
模型转录出来的歌词可能包含错别字,**必须人工检查并修正**。
如果您使用的是 LRC 格式的歌词,需要移除其中的时间戳。以下是一个简单的清洗示例:
```python
import re
def clean_lrc_content(lines):
"""清洗 LRC 文件内容,移除时间戳"""
result = []
for line in lines:
line = line.strip()
if not line:
continue
# 移除时间戳 [mm:ss.x] [mm:ss.xx] [mm:ss.xxx]
cleaned = re.sub(r"\[\d{2}:\d{2}\.\d{1,3}\]", "", line)
result.append(cleaned)
# 移除末尾空行
while result and not result[-1]:
result.pop()
return result
```
#### 结构化标签(非必须)
如果歌词包含结构化标签(如 `[Verse]`、`[Chorus]` 等),能够帮助模型更好地学习歌曲结构。没有结构化标签也可以正常训练。
> **提示:** 可以使用 [Gemini](https://aistudio.google.com/) 为已有歌词添加结构化标签。
示例:
```
[Intro]
La la la...
[Verse 1]
Walking down the empty street
Echoes dancing at my feet
[Chorus]
We are the stars tonight
Shining through the endless sky
[Bridge]
Close your eyes and feel the sound
```
---
### 自动标注
#### 1. 获取 BPM 和 Key
使用 [Key-BPM-Finder](https://vocalremover.org/key-bpm-finder) 在线获取 BPM 和调式标注:
1. 打开网页后点击 **Browse my files**,选择待处理的音频文件(一次处理过多可能会卡住,建议分批处理后合并 CSV)。处理在本地完成,不会上传至服务器。

2. 处理完成后,点击 **Export CSV** 下载 CSV 文件。

3. CSV 文件内容示例:
```csv
File,Artist,Title,BPM,Key,Camelot
song1.wav,,,190,D major,10B
song2.wav,,,128,A minor,8A
```
4. 将 CSV 文件放置到数据集文件夹中。如需附加 caption 数据,可在 `Camelot` 列后新增一列。
#### 2. 获取 Caption
可通过以下方式获取歌曲的 caption 描述:
- **使用 acestep-5Hz-lm**(0.6B / 1.7B / 4B)— 在 Gradio UI 中通过 Auto Label 功能调用(见后续操作步骤)
- **使用 Gemini API** — 参考脚本 `scripts/lora_data_prepare/gemini_caption.py`,支持 `process_folder()` 批量处理,会为每个音频生成:
- `{文件名}.lyrics.txt` — 歌词
- `{文件名}.caption.txt` — caption 描述
---
## 数据预处理
准备好数据后,即可使用 Gradio UI 进行数据检查与预处理。
> **重要:** 如果使用启动脚本启动,需要修改启动参数以禁用服务预初始化:
>
> - **Windows** (`start_gradio_ui.bat`):将 `if not defined INIT_SERVICE set INIT_SERVICE=--init_service true` 修改为 `if not defined INIT_SERVICE set INIT_SERVICE=--init_service false`
> - **Linux/macOS** (`start_gradio_ui.sh`):将 `: "${INIT_SERVICE:=--init_service true}"` 修改为 `: "${INIT_SERVICE:=--init_service false}"`
启动 Gradio UI(通过启动脚本或直接运行 `acestep/acestep_v15_pipeline.py`)。
### 步骤 1:加载模型
- **需要使用 LM 生成 caption 的情况:** 在初始化时勾选想要使用的 LM 模型(acestep-5Hz-lm-0.6B / 1.7B / 4B)。

- **不需要使用 LM 的情况:** 不要勾选 LM 模型。

### 步骤 2:加载数据
切换到 **LoRA Training** 选项卡,输入数据集目录路径,点击 **Scan**。
扫描时会自动识别以下文件:
| 文件 | 说明 |
|------|------|
| `*.mp3` / `*.wav` / `*.flac` / ... | 音频文件 |
| `{文件名}.lyrics.txt`(或 `{文件名}.txt`) | 歌词 |
| `{文件名}.caption.txt` | Caption 描述 |
| `{文件名}.json` | 标注元数据(caption / bpm / keyscale / timesignature / language) |
| `*.csv` | 批量 BPM / Key 标注(由 Key-BPM-Finder 导出) |

### 步骤 3:预览并调整数据集
- **Duration** — 自动从音频文件读取
- **Lyrics** — 需要存在同名 `.lyrics.txt` 文件(也兼容 `.txt`)
- **Labeled** — 如果有 caption 则显示 ✅,否则显示 ❌
- **BPM / Key / Caption** — 从 JSON 或 CSV 文件中加载
- 如果数据集并非全部为纯音乐(Instrumental),请取消勾选 **All Instrumental**
- **Format Lyrics** 与 **Transcribe Lyrics** 功能当前暂时禁用(未接入 [acestep-transcriber](https://huggingface.co/ACE-Step/acestep-transcriber),直接使用 LM 容易产生幻觉)
- 输入 **Custom Trigger Tag**(当前效果尚不明显,只要不选 `Replace Caption` 即可)
- **Genre Ratio** 表示使用 genre 替代 caption 的比例。由于当前 LM 生成的 genre 描述能力远不及 caption,建议保持为 0

### 步骤 4:Auto Label Data
- 如果已有 caption,可跳过此步骤
- 如果数据缺少 caption,可通过 LM 推理生成
- 如果缺少 BPM / Key 等数值,请先使用 [Key-BPM-Finder](https://vocalremover.org/key-bpm-finder) 获取,直接由 LM 生成会产生幻觉

### 步骤 5:预览并编辑数据
如有需要,可以逐条检查并修改数据。**每条数据修改后请记得点击保存。**

### 步骤 6:保存数据集
输入保存路径,将数据集保存为 JSON 文件。

### 步骤 7:预处理生成 Tensor 文件
> **注意:** 如果此前使用了 LM 生成 caption 且显存不足,建议先重启 Gradio 释放显存,重启时**不要勾选 LM 模型**。重启后,在输入框中填入已保存的 JSON 文件路径并加载。
输入 Tensor 文件的保存路径,点击开始预处理,等待生成完成。

---
## 训练
> **注意:** 生成 Tensor 文件后,同样建议重启 Gradio 以释放显存。
1. 切换到 **Train LoRA** 选项卡,输入 Tensor 文件路径并加载数据集。
2. 如果您对训练参数不熟悉,通常使用默认值即可。
### 参数参考
| 参数 | 说明 | 建议值 |
|------|------|--------|
| **Max Epochs** | 根据数据集大小调整 | 约 100 首歌 → 500 epoch;10–20 首歌 → 800 epoch(仅供参考) |
| **Batch Size** | 显存充足时可适当增大 | 1(默认),显存足够的话 可尝试 2 或 4 |
| **Save Every N Epochs** | Checkpoint 保存间隔 | Max Epochs 较小时可设小一些,较大时可设大一些 |
> 以上数值仅供参考,请根据实际情况调整。
3. 点击 **Start Training**,等待训练完成。

---
## 使用 LoRA
1. 训练完成后**重启 Gradio**,重新加载模型(不要勾选 LM 模型)。
2. 模型初始化完成后,加载训练好的 LoRA 权重。

3. 开始合成音乐。
恭喜!您已完成 LoRA 训练的全部流程。
---
## 高级训练:Side-Step
如果你需要更精细地控制 LoRA 训练——包括修正的时间步采样、LoKR 适配器、命令行工作流、显存优化和梯度敏感度分析——社区开发的 **[Side-Step](https://github.com/koda-dernet/Side-Step)** 工具包提供了高级替代方案。其文档已收录在本仓库的 `docs/sidestep/` 目录下。
| 主题 | 说明 |
|------|------|
| [Getting Started](../sidestep/Getting%20Started.md) | 安装、前置条件和首次运行设置 |
| [End-to-End Tutorial](../sidestep/End-to-End%20Tutorial.md) | 从原始音频到生成的完整流程 |
| [Dataset Preparation](../sidestep/Dataset%20Preparation.md) | JSON 格式、音频要求、元数据字段、自定义标签 |
| [Training Guide](../sidestep/Training%20Guide.md) | LoRA vs LoKR、修正模式 vs 原始模式、超参数指南 |
| [Using Your Adapter](../sidestep/Using%20Your%20Adapter.md) | 输出目录结构、在 Gradio 中加载、LoKR 限制 |
| [VRAM Optimization Guide](../sidestep/VRAM%20Optimization%20Guide.md) | 显存优化策略和 GPU 分级配置 |
| [Estimation Guide](../sidestep/Estimation%20Guide.md) | 梯度敏感度分析,用于针对性训练 |
| [Shift and Timestep Sampling](../sidestep/Shift%20and%20Timestep%20Sampling.md) | 训练时间步的工作原理,Side-Step 与内置训练器的区别 |
| [Preset Management](../sidestep/Preset%20Management.md) | 内置预设、保存/加载/导入/导出 |
| [The Settings Wizard](../sidestep/The%20Settings%20Wizard.md) | 完整的向导设置参考 |
| [Model Management](../sidestep/Model%20Management.md) | 检查点结构和微调模型支持 |
| [Windows Notes](../sidestep/Windows%20Notes.md) | Windows 特定的设置和注意事项 |
|