VoxCPM 微调指南
本文档介绍如何对 VoxCPM 模型进行微调,支持全量微调和 LoRA 微调两种方式。
目录
数据准备
训练数据需要准备为 JSONL 格式的 manifest 文件,每行包含一条训练样本:
{"audio_path": "/path/to/audio1.wav", "text": "对应的文本内容"}
{"audio_path": "/path/to/audio2.wav", "text": "另一条文本"}
要求:
- 音频格式:WAV,采样率 16kHz
- 文本:与音频对应的转录文本
全量微调
全量微调会更新模型的所有参数,适合数据量较大、需要显著改变模型行为的场景。
配置文件
创建配置文件 conf/voxcpm/voxcpm_finetune_all.yaml:
pretrained_path: /path/to/VoxCPM-0.5B/ # 预训练模型路径
train_manifest: /path/to/train_manifest.jsonl # 训练数据
val_manifest: null # 验证数据(可选)
sample_rate: 16000
batch_size: 16
grad_accum_steps: 1 # 梯度累积步数,显存不足时可增大
num_workers: 2
num_iters: 2000
log_interval: 10
valid_interval: 1000
save_interval: 1000
learning_rate: 0.00001 # 全量微调建议较小的学习率
weight_decay: 0.01
warmup_steps: 100
max_steps: 2000
max_batch_tokens: 8192
save_path: /path/to/checkpoints/finetune_all
tensorboard: /path/to/logs/finetune_all
lambdas:
loss/diff: 1.0
loss/stop: 1.0
启动训练
python scripts/train_voxcpm_finetune.py --config_path conf/voxcpm/voxcpm_finetune_all.yaml
LoRA 微调
LoRA(Low-Rank Adaptation)是一种参数高效的微调方法,只训练少量额外参数,显著降低显存需求。
配置文件
创建配置文件 conf/voxcpm/voxcpm_finetune_lora.yaml:
pretrained_path: /path/to/VoxCPM-0.5B/
train_manifest: /path/to/train_manifest.jsonl
val_manifest: null
sample_rate: 16000
batch_size: 16
grad_accum_steps: 1
num_workers: 2
num_iters: 2000
log_interval: 10
valid_interval: 1000
save_interval: 1000
learning_rate: 0.0001 # LoRA 可以使用较大的学习率
weight_decay: 0.01
warmup_steps: 200
max_steps: 2000
max_batch_tokens: 8192
save_path: /path/to/checkpoints/finetune_lora
tensorboard: /path/to/logs/finetune_lora
lambdas:
loss/diff: 1.0
loss/stop: 1.0
# LoRA 配置
lora:
enable_lm: true # 对 Language Model 加 LoRA
enable_dit: true # 对 Diffusion Transformer 加 LoRA
enable_proj: false # 对投影层加 LoRA(可选)
r: 32 # LoRA 秩(rank),越大容量越大
alpha: 16 # LoRA alpha,scaling = alpha / r
dropout: 0.0 # LoRA dropout
# 目标模块
target_modules_lm: ["q_proj", "v_proj", "k_proj", "o_proj"]
target_modules_dit: ["q_proj", "v_proj", "k_proj", "o_proj"]
LoRA 参数说明
| 参数 | 说明 | 建议值 |
|---|---|---|
enable_lm |
对 LM(语言模型)加 LoRA | true |
enable_dit |
对 DiT(扩散模型)加 LoRA | true(音色克隆必须) |
r |
LoRA 秩,越大容量越大 | 16-64 |
alpha |
缩放因子,scaling = alpha / r |
通常设为 r/2 或 r |
target_modules_* |
要添加 LoRA 的层名 | attention 层 |
启动训练
python scripts/train_voxcpm_finetune.py --config_path conf/voxcpm/voxcpm_finetune_lora.yaml
Checkpoint 结构
LoRA 训练保存的 checkpoint 只包含 LoRA 参数:
checkpoints/finetune_lora/
└── step_0002000/
└── generator.pth # 仅包含 lora_A, lora_B 参数
推理测试
全量微调推理
python scripts/test_voxcpm_ft_infer.py \
--pretrained_path /path/to/VoxCPM-0.5B/ \
--ft_ckpt /path/to/checkpoints/finetune_all/step_0002000 \
--text "你好,这是微调后的效果。" \
--output output.wav
LoRA 推理
python scripts/test_voxcpm_lora_infer.py \
--config_path conf/voxcpm/voxcpm_finetune_lora.yaml \
--lora_ckpt /path/to/checkpoints/finetune_lora/step_0002000 \
--text "你好,这是 LoRA 微调后的效果。" \
--output lora_output.wav
带参考音频(音色克隆)
python scripts/test_voxcpm_lora_infer.py \
--config_path conf/voxcpm/voxcpm_finetune_lora.yaml \
--lora_ckpt /path/to/checkpoints/finetune_lora/step_0002000 \
--text "这是带参考音色的合成效果。" \
--prompt_audio /path/to/reference.wav \
--prompt_text "参考音频对应的文本" \
--output cloned_output.wav
LoRA 热切换
LoRA 支持在推理时动态加载、卸载和切换,无需重新加载整个模型。
API 说明
from voxcpm.model import VoxCPMModel
from voxcpm.model.voxcpm import LoRAConfig
# 1. 加载模型(包含 LoRA 结构)
lora_cfg = LoRAConfig(enable_lm=True, enable_dit=True, r=32, alpha=16, ...)
model = VoxCPMModel.from_local(
pretrained_path,
optimize=True, # 启用 torch.compile 加速
lora_config=lora_cfg
)
# 2. 加载 LoRA 权重(支持 compile 后调用)
model.load_lora_weights("/path/to/lora_checkpoint")
# 3. 禁用 LoRA(使用基础模型)
model.set_lora_enabled(False)
# 4. 重新启用 LoRA
model.set_lora_enabled(True)
# 5. 卸载 LoRA(重置权重为 0)
model.reset_lora_weights()
# 6. 热切换到另一个 LoRA
model.load_lora_weights("/path/to/another_lora_checkpoint")
方法说明
| 方法 | 功能 | 兼容 torch.compile |
|---|---|---|
load_lora_weights(path) |
从文件加载 LoRA 权重 | ✅ |
set_lora_enabled(bool) |
启用/禁用 LoRA | ✅ |
reset_lora_weights() |
重置 LoRA 权重为初始值 | ✅ |
get_lora_state_dict() |
获取当前 LoRA 权重 | ✅ |
常见问题
1. 显存不足
- 增大
grad_accum_steps(梯度累积) - 减小
batch_size - 使用 LoRA 微调代替全量微调
2. LoRA 效果不好
- 增大
r(LoRA 秩) - 调整
alpha(建议alpha = r/2或alpha = r) - 确保
enable_dit: true(音色克隆必须) - 增加训练步数
3. 训练不收敛
- 降低
learning_rate - 增加
warmup_steps - 检查数据质量
4. 推理时 LoRA 不生效
- 确保推理配置与训练配置的 LoRA 参数一致
- 检查
load_lora_weights返回的skipped_keys是否为空