| # VoxCPM 微调指南 | |
| 本文档介绍如何对 VoxCPM 模型进行微调,支持全量微调和 LoRA 微调两种方式。 | |
| ## 目录 | |
| - [数据准备](#数据准备) | |
| - [全量微调](#全量微调) | |
| - [LoRA 微调](#lora-微调) | |
| - [推理测试](#推理测试) | |
| - [LoRA 热切换](#lora-热切换) | |
| - [常见问题](#常见问题) | |
| --- | |
| ## 数据准备 | |
| 训练数据需要准备为 JSONL 格式的 manifest 文件,每行包含一条训练样本: | |
| ```json | |
| {"audio_path": "/path/to/audio1.wav", "text": "对应的文本内容"} | |
| {"audio_path": "/path/to/audio2.wav", "text": "另一条文本"} | |
| ``` | |
| **要求**: | |
| - 音频格式:WAV,采样率 16kHz | |
| - 文本:与音频对应的转录文本 | |
| --- | |
| ## 全量微调 | |
| 全量微调会更新模型的所有参数,适合数据量较大、需要显著改变模型行为的场景。 | |
| ### 配置文件 | |
| 创建配置文件 `conf/voxcpm/voxcpm_finetune_all.yaml`: | |
| ```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 | |
| ``` | |
| ### 启动训练 | |
| ```bash | |
| 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`: | |
| ```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 层 | | |
| ### 启动训练 | |
| ```bash | |
| 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 参数 | |
| ``` | |
| --- | |
| ## 推理测试 | |
| ### 全量微调推理 | |
| ```bash | |
| 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 推理 | |
| ```bash | |
| 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 | |
| ``` | |
| ### 带参考音频(音色克隆) | |
| ```bash | |
| 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 说明 | |
| ```python | |
| 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` 是否为空 | |