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)。处理在本地完成,不会上传至服务器。
   ![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 特定的设置和注意事项 |