Upload 2 files
Browse files- 实验三:基于VoxCPM的音色克隆(实验指导).md +242 -0
- 实验三:基于VoxCPM的音色克隆(实验指导).pdf +3 -0
实验三:基于VoxCPM的音色克隆(实验指导).md
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 实验三:基于VoxCPM的音色克隆(实验指导)
|
| 2 |
+
|
| 3 |
+
本文件是THUHCSI课程实验三:基于VoxCPM的音色克隆的实验指导文档
|
| 4 |
+
|
| 5 |
+
## 设置环境
|
| 6 |
+
|
| 7 |
+
1. [从http://sox.sourceforge.net/](http://sox.sourceforge.net/)安装 sox或使用 apt install sox
|
| 8 |
+
2. [从https://www.ffmpeg.org/download.html#build-linux](https://www.ffmpeg.org/download.html#build-linux)安装 ffmpeg ,或者使用 apt install FFmpeg安装。
|
| 9 |
+
3. 通过以下方式设置 Python 环境:首先需要建立一个具有PyTorch 2.5.0版本以上以及与之对应的 CUDA 版本的环境,建议大家使用Conda进行搭建,以避免出现错误。接下来执行下面脚本安装
|
| 10 |
+
|
| 11 |
+
```
|
| 12 |
+
conda create -n voxcpm python=3.10
|
| 13 |
+
conda activate voxcpm
|
| 14 |
+
pip install torch==2.8 torchaudio
|
| 15 |
+
pip install voxcpm
|
| 16 |
+
pip install tensorboardX argbind
|
| 17 |
+
```
|
| 18 |
+
|
| 19 |
+
4. 使用VoxCPM/src/voxcpm中的版本替换python环境中安装的版本(训练用)
|
| 20 |
+
|
| 21 |
+
```
|
| 22 |
+
rsync -avP src/voxcpm/* /usr/local/python3/lib/python3.10/site-packages/voxcpm/(请输入自己的voxcpm包安装文件)
|
| 23 |
+
```
|
| 24 |
+
|
| 25 |
+
## 数据准备
|
| 26 |
+
|
| 27 |
+
下载HuggingFace(https://huggingface.co/lglg666/dpss-exp3-TTS)中的文件,所有数据存储在VoxCPM/datasets.zip文件中,请解压缩保存到VoxCPM/datasets中,实验需要用到的数据目录文件已经整理在VoxCPM/datasets/metadatas文件中,包含以下文件
|
| 28 |
+
|
| 29 |
+
- single_speaker_test_datas.txt:用于完成任务二第一个要求的测试集文本合集,已经设置好了每条文本的名字和内容,可以直接使用VoxCPM/inference.py中提供的脚本进行批量合成。
|
| 30 |
+
- single_speaker_train_datas.jsonl,single_speaker_test_datas.jsonl:用于任务二和三中模型训练和测试的单一目标说话人数据集,数据来自原神角色“八重神子”的语音。
|
| 31 |
+
- all_train_datas.jsonl,all_test_datas.jsonl:用于任务四中模型训练和测试的多说话人数据集,数据来自原神游戏中不同角色的语音。
|
| 32 |
+
|
| 33 |
+
## 任务一:VoxCPM 能力探索与 Zero-shot 克隆
|
| 34 |
+
|
| 35 |
+
在该任务中,主要帮助同学们熟悉VoxCPM的推理流程和Zero-shot能力,我们在VoxCPM/inference.py中提供了一个基础的推理脚本,更多自由的推理方式请参考文件VoxCPM/README.md
|
| 36 |
+
|
| 37 |
+
### 单条音频推理
|
| 38 |
+
|
| 39 |
+
单条音频推理只需使用下面的命令,这里我们以文本“恭喜你们通过了第三轮试胆大会,小家伙们。”和参考音频“./prompt_sample.wav”为例
|
| 40 |
+
|
| 41 |
+
```
|
| 42 |
+
python3 inference.py --model_path ckpts --text 恭喜你们通过了第三轮试胆大会,小家伙们。 --output_dir outputs --cfg_value 2 --inference_timesteps 10 --prompt_wav_path ./prompt_sample.wav --prompt_text 海奇岛的鱼类多样性异常丰富,确实不可多得。
|
| 43 |
+
```
|
| 44 |
+
|
| 45 |
+
Notes:
|
| 46 |
+
|
| 47 |
+
- --model_path:当前推理待使用模型的存储路径,在VoxCPM/ckpts中已经为大家提供了预训练好的模型,后续也可以替换成自己微调的checkpoint
|
| 48 |
+
- --text:当前轮次合成的语音文本
|
| 49 |
+
- --output_dir:本次生成的音频存储位置,单条推理时默认存储音频名字为"output.wav"
|
| 50 |
+
- --cfg_value & --inference_timesteps:可调节的推理参数
|
| 51 |
+
- --prompt_wav_path:用于Zero-shot的参考音频路径,当对于特定说话人进行微调后不用再提供
|
| 52 |
+
- --prompt_text:对应参考音频的文本内容,**当使用参考音频时必须提供**。
|
| 53 |
+
|
| 54 |
+
### 多条音频推理
|
| 55 |
+
|
| 56 |
+
我们以参考音频“./prompt_sample.wav”为例进行多条音频推理。首先需要将我们本次推理的所有文本内容组织成下面格式的文件
|
| 57 |
+
|
| 58 |
+
```
|
| 59 |
+
1||简要说明文字输入在VoxCPM中是如何被一步步转变成了输出语音的?
|
| 60 |
+
2||简要说明提示音频在模型中起到了什么作用?
|
| 61 |
+
3||自己录制一段语音,对自己的声音进行克隆,合成5个以上不同文本
|
| 62 |
+
4||对比和分析合成结果的效果及可能存在的问题
|
| 63 |
+
```
|
| 64 |
+
|
| 65 |
+
其中每行包含文件名和文本内容两个信息,用‘||’进行隔开,然后使用下面命令进行对同一参考音频的多条文本进行合成
|
| 66 |
+
|
| 67 |
+
```
|
| 68 |
+
python3 inference.py --model_path ckpts --text_file ./test.txt --output_dir outputs --cfg_value 2 --inference_timesteps 10 --prompt_wav_path ./prompt_sample.wav --prompt_text 海奇岛的鱼类多样性异常丰富,确实不可多得。
|
| 69 |
+
```
|
| 70 |
+
|
| 71 |
+
Notes:
|
| 72 |
+
|
| 73 |
+
- --text_file:当前轮次合成的文本集合文件
|
| 74 |
+
- --output_dir:本次生成的音频存储位置,每条音频会根据text_file中指定的文件名进行存储
|
| 75 |
+
|
| 76 |
+
## 任务二:全参数微调(Full Fine-tuning)探索
|
| 77 |
+
|
| 78 |
+
在该任务中,主要帮助同学们数据VoxCPM的全参数微调流程,我们在VoxCPM/scripts/train_voxcpm_finetune.py中提供了微调的脚本,并在VoxCPM/conf/voxcpm/voxcpm_finetune_example.yaml提供了在全参数微调时使用的配置,更多全参数微调的信息请参考文件VoxCPM/README.md
|
| 79 |
+
|
| 80 |
+
### 评估指标熟悉--测试集文本推理
|
| 81 |
+
|
| 82 |
+
该实验测试集文本已经按照多条音频推理流程中的要求整理在VoxCPM/datasets/metadatas/single_speaker_test_datas.txt中��可以自己选定目标说话人的任意一条语音,使用下面脚本进行推理
|
| 83 |
+
|
| 84 |
+
```
|
| 85 |
+
python3 inference.py --model_path ckpts --text_file datasets/metadatas/single_speaker_test_datas.txt --prompt_wav_path 自由选择音频路径 --prompt_text 音频文本
|
| 86 |
+
```
|
| 87 |
+
|
| 88 |
+
### 评估指标熟悉--自动评估工具
|
| 89 |
+
|
| 90 |
+
关于可懂度和音色相似度的评估,我们已经整理好了评估工具给大家,该脚本已经和测试集文本推理流程进行了适配。
|
| 91 |
+
|
| 92 |
+
首先需要进行环境配置,该脚本需要的环境在eval/requirements.txt中,要安装所有依赖项,请运行
|
| 93 |
+
|
| 94 |
+
```
|
| 95 |
+
pip3 install -r requirements.txt
|
| 96 |
+
```
|
| 97 |
+
|
| 98 |
+
如果服务器无法链接hugging face请自行下载https://huggingface.co/s3prl/converted_ckpts/resolve/main/wavlm_large.pt
|
| 99 |
+
|
| 100 |
+
#### WER计算
|
| 101 |
+
|
| 102 |
+
在eval文件中运行下面脚本以完成WER的计算
|
| 103 |
+
|
| 104 |
+
```
|
| 105 |
+
bash cal_wer.sh base_path/VoxCPM/datasets/metadatas/single_speaker_test_datas.txt base_path/VoxCPM/outputs base_path/VoxCPM/datasets/metadatas/single_speaker_test_datas.jsonl
|
| 106 |
+
```
|
| 107 |
+
|
| 108 |
+
该脚本一共需要输入三个路径
|
| 109 |
+
|
| 110 |
+
- 第一个路径是多条音频推理时,输入模型的text_file文件,该文件以||为分隔符包含了文件名和文本内容
|
| 111 |
+
- 第二个路径是存储音频的文件夹路径
|
| 112 |
+
- 第三个路径是测试集的jsonl文件,且该文件每一行的内容与第一个路径的文件每一行是对应的,用于提供GT的音频信息。
|
| 113 |
+
|
| 114 |
+
#### SIM计算
|
| 115 |
+
|
| 116 |
+
在eval文件中运行下面脚本以完成WER的计算
|
| 117 |
+
|
| 118 |
+
```
|
| 119 |
+
bash cal_sim.sh base_path/VoxCPM/datasets/metadatas/single_speaker_test_datas.txt base_path/VoxCPM/outputs base_path/VoxCPM/datasets/metadatas/single_speaker_test_datas.jsonl
|
| 120 |
+
```
|
| 121 |
+
|
| 122 |
+
该脚本与WER计算输入时需要的文件相同
|
| 123 |
+
|
| 124 |
+
为了方便计算WER和SIM,推荐大家使用VoxCPM/inference.py进行推理。当使用其他方式进行推理时,需要按照对应的测试集jsonl文件中的音频顺序创建一个包含text_file(以||为分隔符包含了文件名和文本内容)。
|
| 125 |
+
|
| 126 |
+
### 全参数微调
|
| 127 |
+
|
| 128 |
+
进行全参数微调需要参考下面的教程
|
| 129 |
+
|
| 130 |
+
#### 1.准备manifest (JSONL)
|
| 131 |
+
|
| 132 |
+
```
|
| 133 |
+
{"audio": "/path/to/audio_0001.wav", "text": "你好,世界。", "dataset_id": 0}
|
| 134 |
+
{"audio": "/path/to/audio_0002.wav", "text": "第二条语音", "dataset_id": 0}
|
| 135 |
+
```
|
| 136 |
+
|
| 137 |
+
- `audio`: waveform file path (WAV/FLAC/MP3 supported)
|
| 138 |
+
- `text`: transcription
|
| 139 |
+
- `dataset_id` *(optional)*: integer identifier for multi-dataset sampling statistics
|
| 140 |
+
|
| 141 |
+
这一步我们已经帮大家完成了,准备好的文件放在VoxCPM/datasets/metadatas/single_speaker_train_datas.jsonl下
|
| 142 |
+
|
| 143 |
+
#### 2.**Copy & edit the example config**
|
| 144 |
+
|
| 145 |
+
在VoxCPM/conf/voxcpm/voxcpm_finetune_example.yaml中,我们提供了一个进行全参数微调的配置文件示例,包含全参数微调用到的超参数。大家可以对其中的训练配置进行修改,以实现自己的训练方案。
|
| 146 |
+
|
| 147 |
+
#### 3.启动训练
|
| 148 |
+
|
| 149 |
+
如果你有多张卡,可以使用进行多卡训练,示例如下
|
| 150 |
+
|
| 151 |
+
```bash
|
| 152 |
+
CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node 2 \
|
| 153 |
+
scripts/train_voxcpm_finetune.py \
|
| 154 |
+
--config_path conf/voxcpm/voxcpm_finetune_example.yaml
|
| 155 |
+
```
|
| 156 |
+
|
| 157 |
+
Features:
|
| 158 |
+
|
| 159 |
+
- Distributed + AMP training (`torchrun`).
|
| 160 |
+
- TensorBoard logging (`tensorboard --logdir logs/voxcpm_finetune`).
|
| 161 |
+
- Periodic validation & checkpointing under `checkpoints/`.
|
| 162 |
+
|
| 163 |
+
如果你只有一张卡,可以进行单卡训练,示例如下
|
| 164 |
+
|
| 165 |
+
```bash
|
| 166 |
+
torchrun --nproc_per_node 1 \
|
| 167 |
+
scripts/train_voxcpm_finetune.py \
|
| 168 |
+
--config_path conf/voxcpm/voxcpm_finetune_example.yaml
|
| 169 |
+
```
|
| 170 |
+
|
| 171 |
+
#### 4.**Key modules**
|
| 172 |
+
|
| 173 |
+
- `VoxCPM/src/voxcpm/model/voxcpm.py`: unified model providing both inference and training forward。
|
| 174 |
+
- `VoxCPM/src/voxcpm/training/`: accelerator, tracker, dataset loader & batch packer utilities。
|
| 175 |
+
- `VoxCPM/scripts/train_voxcpm_finetune.py`: end-to-end fine-tune loop。
|
| 176 |
+
|
| 177 |
+
#### 5.效果测试
|
| 178 |
+
|
| 179 |
+
训练完成后可自行选择合适的step的generator.pth文件代替VoxCPM/ckpts/pytorch_model.bin文件进行效果测试(建议复制一个新文件夹进行测试,VoxCPM/ckpts文件还需要用于后续实验的训练初始化),一个简单的操作指引如下
|
| 180 |
+
|
| 181 |
+
```bash
|
| 182 |
+
cp -r ckpts new_ckpts
|
| 183 |
+
cp checkpoints/voxcpm_finetune/step_0001000/generator.pth new_ckpts/pytorch_model.bin
|
| 184 |
+
python3 inference.py --model_path new_ckpts --text_file datasets/metadatas/single_speaker_test_datas.txt
|
| 185 |
+
```
|
| 186 |
+
|
| 187 |
+
## 任务三:基于 LoRA 的高效微调
|
| 188 |
+
|
| 189 |
+
在该任务中,主要帮助同学们数据VoxCPM的LoRA微调流程,微调的脚本和全参数微调一致,都在VoxCPM/scripts/train_voxcpm_finetune.py中,并在VoxCPM/conf/voxcpm/voxcpm_finetune_lora.yaml中提供了专门用于LoRA微调的配置文件
|
| 190 |
+
|
| 191 |
+
### LoRA微调
|
| 192 |
+
|
| 193 |
+
LoRA微调的过程和全参数微调基本一致,唯一的区别就是将配置文件从VoxCPM/conf/voxcpm/voxcpm_finetune_example.yaml换成VoxCPM/conf/voxcpm/voxcpm_finetune_lora.yaml,修改配置文件中的超参数之后我们就可以用下面的脚本开始LoRA微调
|
| 194 |
+
|
| 195 |
+
如果你有多张卡,可以使用进行多卡训练,示例如下
|
| 196 |
+
|
| 197 |
+
```bash
|
| 198 |
+
CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node 2 \
|
| 199 |
+
scripts/train_voxcpm_finetune.py \
|
| 200 |
+
--config_path conf/voxcpm/voxcpm_finetune_lora.yaml
|
| 201 |
+
```
|
| 202 |
+
|
| 203 |
+
如果你只有一张卡,可以进行单卡训练,示例如下
|
| 204 |
+
|
| 205 |
+
```bash
|
| 206 |
+
torchrun --nproc_per_node 1 \
|
| 207 |
+
scripts/train_voxcpm_finetune.py \
|
| 208 |
+
--config_path conf/voxcpm/voxcpm_finetune_lora.yaml
|
| 209 |
+
```
|
| 210 |
+
|
| 211 |
+
### LoRA推理
|
| 212 |
+
|
| 213 |
+
LoRA推理得到的checkpoint需要使用全新的推理脚本进行推理,脚本保存在VoxCPM/inference_lora.py中
|
| 214 |
+
|
| 215 |
+
单条音频推理只需使用下面的命令,这里我们以文本“恭喜你们通过了第三轮试胆大会,小家伙们。”和参考音频“./prompt_sample.wav”为例
|
| 216 |
+
|
| 217 |
+
```
|
| 218 |
+
python3 inference_lora.py --lora_ckpt checkpoints/voxcpm_finetune/step_0001000 --lora_config_path conf/voxcpm/voxcpm_finetune_lora.yaml --text 恭喜你们通过了第三轮试胆大会,小家伙们。 --output_dir outputs --cfg_value 2 --inference_timesteps 10
|
| 219 |
+
```
|
| 220 |
+
|
| 221 |
+
Notes:
|
| 222 |
+
|
| 223 |
+
- --lora_ckpt:当前推理使用微调模型训练的checkpoint存储路径,默认在文件夹checkpoints/voxcpm_finetune中
|
| 224 |
+
- --lora_config_path:当前checkpoint进行LoRA微调所用到的训练配置文件
|
| 225 |
+
- --text:当前轮次合成的语音文本
|
| 226 |
+
- --output_dir:本次生成的音频存储位置,单条推理时默认存储音频名字为"output_lora.wav"
|
| 227 |
+
- --cfg_value & --inference_timesteps:可调节的推理参数
|
| 228 |
+
|
| 229 |
+
### 多条音频推理
|
| 230 |
+
|
| 231 |
+
```
|
| 232 |
+
python3 inference_lora.py --lora_ckpt checkpoints/voxcpm_finetune/step_0001000 --lora_config_path conf/voxcpm/voxcpm_finetune_lora.yaml --text_file datasets/metadatas/single_speaker_test_datas.txt --output_dir outputs --cfg_value 2 --inference_timesteps 10
|
| 233 |
+
```
|
| 234 |
+
|
| 235 |
+
Notes:
|
| 236 |
+
|
| 237 |
+
- --text_file:当前轮次合成的文本集合文件
|
| 238 |
+
- --output_dir:本次生成的音频存储位置,每条音频会根据text_file中指定的文件名进行存储
|
| 239 |
+
|
| 240 |
+
## 任务四:多说话人语音合成模型(原神角色实战)
|
| 241 |
+
|
| 242 |
+
在该任务中,我们需要大家尝试自行将说话人信息注入模型中,构建一个多说话人(Multi-Speaker)语音合成模型,即输入为“任意文本 + 目标角色 ID”,输出为该角色的语音。大家可以查询相关资料,自行实现这一功能,并使用之前任务中积累的训练经验进行训练。
|
实验三:基于VoxCPM的音色克隆(实验指导).pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:6dd00df6cd0b147f64b66a027691a9e8e01dd01a4e0b388130e04a23dd489b0b
|
| 3 |
+
size 152442
|