File size: 11,164 Bytes
ed1cdd1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# Diff-SVC(train/inference by yourself)
## 0.环境配置
>注意:requirements文件已更新,目前分为3个版本,可自行选择使用。\
1. requirements.txt 是此仓库测试的原始完整环境,Torch1.12.1+cu113,可选择直接pip 或删除其中与pytorch有关的项目(torch/torchvision)后再pip,并使用自己的torch环境
```
pip install -r requirements.txt
```
>2. (推荐)requirements_short.txt 是上述环境的手动整理版,不含torch本体,也可以直接
```
pip install -r requirements_short.txt
```
>3. 根目录下有一份@三千整理的依赖列表requirements.png,是在某品牌云服务器上跑通的,不过此torch版本已不兼容目前版本代码,但是其他部分版本可以参考,十分感谢

## 1.推理
>使用根目录下的inference.ipynb进行推理或使用经过作者适配的@小狼的infer.py\
在第一个block中修改如下参数:
```
config_path='checkpoints压缩包中config.yaml的位置'
如'./checkpoints/nyaru/config.yaml'
config和checkpoints是一一对应的,请不要使用其他config

project_name='这个项目的名称'
如'nyaru'

model_path='ckpt文件的全路径'
如'./checkpoints/nyaru/model_ckpt_steps_112000.ckpt'

hubert_gpu=True
推理时是否使用gpu推理hubert(模型中的一个模块),不影响模型的其他部分
目前版本已大幅减小hubert的gpu占用,在1060 6G显存下可完整推理,不需要关闭了。
另外现已支持长音频自动切片功能(ipynb和infer.py均可),超过30s的音频将自动在静音处切片处理,感谢@小狼的代码

```
### 可调节参数:
```
wav_fn='xxx.wav'#传入音频的路径,默认在项目根目录中

use_crepe=True 
#crepe是一个F0算法,效果好但速度慢,改成False会使用效果稍逊于crepe但较快的parselmouth算法

thre=0.05
#crepe的噪声过滤阈值,源音频干净可适当调大,噪音多就保持这个数值或者调小,前面改成False后这个参数不起作用

pndm_speedup=20
#推理加速算法倍数,默认是1000步,这里填成10就是只使用100步合成,是一个中规中矩的数值,这个数值可以高到50倍(20步合成)没有明显质量损失,再大可能会有可观的质量损失,注意如果下方开启了use_gt_mel, 应保证这个数值小于add_noise_step,并尽量让其能够整除

key=0
#变调参数,默认为0(不是1!!),将源音频的音高升高key个半音后合成,如男声转女生,可填入8或者12等(12就是升高一整个8度)

use_pe=True
#梅尔谱合成音频时使用的F0提取算法,如果改成False将使用源音频的F0\
这里填True和False合成会略有差异,通常是True会好些,但也不尽然,对合成速度几乎无影响\
(无论key填什么 这里都是可以自由选择的,不影响)\
44.1kHz下不支持此功能,会自动关闭,开着也不报错就是了

use_gt_mel=False
#这个选项类似于AI画图的图生图功能,如果打开,产生的音频将是输入声音与目标说话人声音的混合,混合比例由下一个参数确定
注意!!!:这个参数如果改成True,请确保key填成0,不支持变调

add_noise_step=500
#与上个参数有关,控制两种声音的比例,填入1是完全的源声线,填入1000是完全的目标声线,能听出来是两者均等混合的数值大约在300附近(并不是线性的,另外这个参数如果调的很小,可以把pndm加速倍率调低,增加合成质量)

wav_gen='yyy.wav'#输出音频的路径,默认在项目根目录中,可通过改变扩展名更改保存文件类型
```
如果使用infer.py,修改方式类似,需要修改__name__=='__main__'中的部分,然后在根目录中执行\
python infer.py\
这种方式需要将原音频放入raw中并在results中查找结果
## 2.数据预处理与训练
### 2.1 准备数据
>目前支持wav格式和ogg格式的音频数据,采样率最好高于24kHz,程序会自动处理采样率和声道问题。采样率不可低于16kHz(一般不会的)\
音频需要切片为5-15s为宜的短音频,长度没有具体要求,但不宜过长过短。音频需要为纯目标人干声,不可以有背景音乐和其他人声音,最好也不要有过重的混响等。若经过去伴奏等处理,请尽量保证处理后的音频质量。\
目前仅支持单人训练,总时长尽量保证在3h或以上,不需要额外任何标注,将音频文件放在下述raw_data_dir下即可,这个目录下的结构可以自由定义,程序会自主找到所需文件。

### 2.2 修改超参数配置
>首先请备份一份config.yaml(此文件对应24kHz声码器, 44.1kHz声码器请使用config_nsf.yaml),然后修改它\
可能会用到的参数如下(以工程名为nyaru为例):
```
K_step: 1000
#diffusion过程总的step,建议不要修改

binary_data_dir: data/binary/nyaru
预处理后数据的存放地址:需要将后缀改成工程名字

config_path: training/config.yaml
你要使用的这份yaml自身的地址,由于预处理过程中会写入数据,所以这个地址务必修改成将要存放这份yaml文件的完整路径

choose_test_manually: false
手动选择测试集,默认关闭,自动随机抽取5条音频作为测试集。
如果改为ture,请在test_prefixes:中填入测试数据的文件名前缀,程序会将以对应前缀开头的文件作为测试集
这是个列表,可以填多个前缀,如:
test_prefixes:
- test
- aaaa
- 5012
- speaker1024
重要:测试集*不可以*为空,为了不产生意外影响,建议尽量不要手动选择测试集

endless_ds:False
如果你的数据集过小,每个epoch时间很短,请将此项打开,将把正常的1000epoch作为一个epoch计算

hubert_path: checkpoints/hubert/hubert.pt
hubert模型的存放地址,确保这个路径是对的,一般解压checkpoints包之后就是这个路径不需要改,现已使用torch版本推理
hubert_gpu:True
是否在预处理时使用gpu运行hubert(模型的一个模块),关闭后使用cpu,但耗时会显著增加。另外模型训练完推理时hubert是否用gpu是在inference中单独控制的,不受此处影响。目前hubert改为torch版后已经可以做到在1060 6G显存gpu上进行预处理,与直接推理1分钟内的音频不超出显存限制,一般不需要关了。

lr: 0.0008
#初始的学习率:这个数字对应于88的batchsize,如果batchsize更小,可以调低这个数值一些

decay_steps: 20000
每20000步学习率衰减为原来的一半,如果batchsize比较小,请调大这个数值

#对于30-40左右的batchsize,推荐lr=0.0004,decay_steps=40000

max_frames: 42000
max_input_tokens: 6000
max_sentences: 88
max_tokens: 128000
#batchsize是由这几个参数动态算出来的,如果不太清楚具体含义,可以只改动max_sentences这个参数,填入batchsize的最大限制值,以免炸显存

pe_ckpt: checkpoints/0102_xiaoma_pe/model_ckpt_steps_60000.ckpt
#pe模型路径,确保这个文件存在,具体作用参考inference部分

raw_data_dir: data/raw/nyaru
#存放预处理前原始数据的位置,请将原始wav数据放在这个目录下,内部文件结构无所谓,会自动解构

residual_channels: 384
residual_layers: 20
#控制核心网络规模的一组参数,越大参数越多炼的越慢,但效果不一定会变好,大一点的数据集可以把第一个改成512。这个可以自行实验效果,不过不了解的话尽量不动。

speaker_id: nyaru
#训练的说话人名字,目前只支持单说话人,请在这里填写(只是观赏作用,没有实际意义的参数)

use_crepe: true
#在数据预处理中使用crepe提取F0,追求效果请打开,追求速度可以关闭

val_check_interval: 2000
#每2000steps推理测试集并保存ckpt

vocoder_ckpt:checkpoints/0109_hifigan_bigpopcs_hop128
#24kHz下为对应声码器的目录, 44.1kHz下为对应声码器的文件名, 注意不要填错

work_dir: checkpoints/nyaru
#修改后缀为工程名(也可以删掉或完全留空自动生成,但别乱填)
no_fs2: true
#对网络encoder的精简,能缩减模型体积,加快训练,且并未发现有对网络表现损害的直接证据。默认打开

```
>其他的参数如果你不知道它是做什么的,请不要修改,即使你看着名称可能以为你知道它是做什么的。

### 2.3 数据预处理
在diff-svc的目录下执行以下命令:\
#windows
```
set PYTHONPATH=.
set CUDA_VISIBLE_DEVICES=0 
python preprocessing/binarize.py --config training/config.yaml
```
#linux
```
export PYTHONPATH=.
CUDA_VISIBLE_DEVICES=0 python preprocessing/binarize.py --config training/config.yaml
```
对于预处理,@小狼准备了一份可以分段处理hubert和其他特征的代码,如果正常处理显存不足,可以先python ./network/hubert/hubert_model.py
然后再运行正常的指令,能够识别提前处理好的hubert特征
### 2.4 训练
#windows
```
set CUDA_VISIBLE_DEVICES=0 
python run.py --config training/config.yaml --exp_name nyaru --reset  
```
#linux
```
CUDA_VISIBLE_DEVICES=0 python run.py --config training/config.yaml --exp_name nyaru --reset 
```
>需要将exp_name改为你的工程名,并修改config路径,请确保和预处理使用的是同一个config文件\
*重要* :训练完成后,若之前不是在本地数据预处理,除了需要下载对应的ckpt文件,也需要将config文件下载下来,作为推理时使用的config,不可以使用本地之前上传上去那份。因为预处理时会向config文件中写入内容。推理时要保持使用的config和预处理使用的config是同一份。


### 2.5 可能出现的问题:
>2.5.1 'Upsample' object has no attribute 'recompute_scale_factor'\
此问题发现于cuda11.3对应的torch中,若出现此问题,请通过合适的方法(如ide自动跳转等)找到你的python依赖包中的torch.nn.modules.upsampling.py文件(如conda环境中为conda目录\envs\环境目录\Lib\site-packages\torch\nn\modules\upsampling.py),修改其153-154行
```
return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners,recompute_scale_factor=self.recompute_scale_factor)
```
>改为
```
return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners)
# recompute_scale_factor=self.recompute_scale_factor)
```
>2.5.2 no module named 'utils'\
请在你的运行环境(如colab笔记本)中以如下方式设置:
```
import os
os.environ['PYTHONPATH']='.'
!CUDA_VISIBLE_DEVICES=0 python preprocessing/binarize.py --config training/config.yaml
```
注意一定要在项目文件夹的根目录中执行
>2.5.3 cannot load library 'libsndfile.so'\
可能会在linux环境中遇到的错误,请执行以下指令
```
apt-get install libsndfile1 -y
```
>2.5.4 cannot load import 'consume_prefix_in_state_dict_if_present'\
torch版本过低,请更换高版本torch

>2.5.5 预处理数据过慢\
检查是否在配置中开启了use_crepe,将其关闭可显著提升速度。\
检查配置中hubert_gpu是否开启。

如有其他问题,请加入QQ频道或discord频道询问。