Ace-Step-Munk / docs /zh /LoRA_Training_Tutorial.md
OnyxMunk's picture
Add LoRA training assets: scripts, docs (no binaries), ui, my_dataset
bc9c638
# 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)。处理在本地完成,不会上传至服务器。
![key-bpm-finder-0.jpg](../pics/key-bpm-finder-0.jpg)
2. 处理完成后,点击 **Export CSV** 下载 CSV 文件。
![key-bpm-finder-1.jpg](../pics/key-bpm-finder-1.jpg)
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)。
![](../pics/00_select_model_to_load.jpg)
- **不需要使用 LM 的情况:** 不要勾选 LM 模型。
![](../pics/00_select_model_to_load_1.jpg)
### 步骤 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 导出) |
![](../pics/01_load_dataset_path.jpg)
### 步骤 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
![](../pics/02_preview_dataset.jpg)
### 步骤 4:Auto Label Data
- 如果已有 caption,可跳过此步骤
- 如果数据缺少 caption,可通过 LM 推理生成
- 如果缺少 BPM / Key 等数值,请先使用 [Key-BPM-Finder](https://vocalremover.org/key-bpm-finder) 获取,直接由 LM 生成会产生幻觉
![](../pics/03_label_data.jpg)
### 步骤 5:预览并编辑数据
如有需要,可以逐条检查并修改数据。**每条数据修改后请记得点击保存。**
![](../pics/04_edit_data.jpg)
### 步骤 6:保存数据集
输入保存路径,将数据集保存为 JSON 文件。
![](../pics/05_save_dataset.jpg)
### 步骤 7:预处理生成 Tensor 文件
> **注意:** 如果此前使用了 LM 生成 caption 且显存不足,建议先重启 Gradio 释放显存,重启时**不要勾选 LM 模型**。重启后,在输入框中填入已保存的 JSON 文件路径并加载。
输入 Tensor 文件的保存路径,点击开始预处理,等待生成完成。
![](../pics/06_preprocess_tensor.jpg)
---
## 训练
> **注意:** 生成 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**,等待训练完成。
![](../pics/07_train.jpg)
---
## 使用 LoRA
1. 训练完成后**重启 Gradio**,重新加载模型(不要勾选 LM 模型)。
2. 模型初始化完成后,加载训练好的 LoRA 权重。
![](../pics/08_load_lora.jpg)
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 特定的设置和注意事项 |