mirror of
https://github.com/babysor/MockingBird.git
synced 2024-03-22 13:11:31 +08:00
Ppg vc init (#421)
* Init ppg extractor and ppg2mel * add preprocess and training * FIx known issues * Update __init__.py Allow to gen audio * Fix length issue * Fix bug of preparing fid * Fix sample issues * Add UI usage of PPG-vc * Add readme
This commit is contained in:
parent
b617a87ee4
commit
252a5e11b3
54
README-CN.md
54
README-CN.md
|
@ -98,33 +98,33 @@
|
||||||
|
|
||||||
<img width="1042" alt="d48ea37adf3660e657cfb047c10edbc" src="https://user-images.githubusercontent.com/7423248/134275227-c1ddf154-f118-4b77-8949-8c4c7daf25f0.png">
|
<img width="1042" alt="d48ea37adf3660e657cfb047c10edbc" src="https://user-images.githubusercontent.com/7423248/134275227-c1ddf154-f118-4b77-8949-8c4c7daf25f0.png">
|
||||||
|
|
||||||
## 文件结构(目标读者:开发者)
|
### 4. 番外:语音转换Voice Conversion(PPG based)
|
||||||
```
|
想像柯南拿着变声器然后发出毛利小五郎的声音吗?本项目现基于PPG-VC,引入额外两个模块(PPG extractor + PPG2Mel), 可以实现变声功能。(文档不全,尤其是训练部分,正在努力补充中)
|
||||||
├─archived_untest_files 废弃文件
|
#### 4.0 准备环境
|
||||||
├─encoder encoder模型
|
* 确保项目以上环境已经安装ok,运行`pip install -r requirements.txt` 来安装剩余的必要包。
|
||||||
│ ├─data_objects
|
* 下载以下模型
|
||||||
│ └─saved_models 预训练好的模型
|
* 24K采样率专用的vocoder(hifigan)到 *vocoder\saved_mode\xxx*
|
||||||
├─samples 样例语音
|
* 预训练的ppg特征encoder(ppg_extractor)到 *ppg_extractor\saved_mode\xxx*
|
||||||
├─synthesizer synthesizer模型
|
* 预训练的PPG2Mel到 *ppg2mel\saved_mode\xxx*
|
||||||
│ ├─models
|
|
||||||
│ ├─saved_models 预训练好的模型
|
#### 4.1 使用数据集自己训练PPG2Mel模型 (可选)
|
||||||
│ └─utils 工具类库
|
|
||||||
├─toolbox 图形化工具箱
|
* 下载aidatatang_200zh数据集并解压:确保您可以访问 *train* 文件夹中的所有音频文件(如.wav)
|
||||||
├─utils 工具类库
|
* 进行音频和梅尔频谱图预处理:
|
||||||
├─vocoder vocoder模型(目前包含hifi-gan、wavrnn)
|
`python pre4ppg.py <datasets_root> -d {dataset} -n {number}`
|
||||||
│ ├─hifigan
|
可传入参数:
|
||||||
│ ├─saved_models 预训练好的模型
|
* `-d {dataset}` 指定数据集,支持 aidatatang_200zh, 不传默认为aidatatang_200zh
|
||||||
│ └─wavernn
|
* `-n {number}` 指定并行数,CPU 11770k在8的情况下,需要运行12到18小时!待优化
|
||||||
└─web
|
> 假如你下载的 `aidatatang_200zh`文件放在D盘,`train`文件路径为 `D:\data\aidatatang_200zh\corpus\train` , 你的`datasets_root`就是 `D:\data\`
|
||||||
├─api
|
|
||||||
│ └─Web端接口
|
* 训练合成器, 注意在上一步先下载好`ppg2mel.yaml`, 修改里面的地址指向预训练好的文件夹:
|
||||||
├─config
|
`python ppg2mel_train.py --config .\ppg2mel\saved_models\ppg2mel.yaml --oneshotvc `
|
||||||
│ └─ Web端配置文件
|
* 如果想要继续上一次的训练,可以通过`--load .\ppg2mel\saved_models\<old_pt_file>` 参数指定一个预训练模型文件。
|
||||||
├─static 前端静态脚本
|
|
||||||
│ └─js
|
#### 4.2 启动工具箱VC模式
|
||||||
├─templates 前端模板
|
您可以尝试使用以下命令:
|
||||||
└─__init__.py Web端入口文件
|
`python demo_toolbox.py vc -d <datasets_root>`
|
||||||
```
|
> 请指定一个可用的数据集文件路径,如果有支持的数据集则会自动加载供调试,也同时会作为手动录制音频的存储目录。
|
||||||
|
|
||||||
## 引用及论文
|
## 引用及论文
|
||||||
> 该库一开始从仅支持英语的[Real-Time-Voice-Cloning](https://github.com/CorentinJ/Real-Time-Voice-Cloning) 分叉出来的,鸣谢作者。
|
> 该库一开始从仅支持英语的[Real-Time-Voice-Cloning](https://github.com/CorentinJ/Real-Time-Voice-Cloning) 分叉出来的,鸣谢作者。
|
||||||
|
|
67
ppg2mel_train.py
Normal file
67
ppg2mel_train.py
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
import sys
|
||||||
|
import torch
|
||||||
|
import argparse
|
||||||
|
import numpy as np
|
||||||
|
from utils.load_yaml import HpsYaml
|
||||||
|
from ppg2mel.train.train_linglf02mel_seq2seq_oneshotvc import Solver
|
||||||
|
|
||||||
|
# For reproducibility, comment these may speed up training
|
||||||
|
torch.backends.cudnn.deterministic = True
|
||||||
|
torch.backends.cudnn.benchmark = False
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Arguments
|
||||||
|
parser = argparse.ArgumentParser(description=
|
||||||
|
'Training PPG2Mel VC model.')
|
||||||
|
parser.add_argument('--config', type=str,
|
||||||
|
help='Path to experiment config, e.g., config/vc.yaml')
|
||||||
|
parser.add_argument('--name', default=None, type=str, help='Name for logging.')
|
||||||
|
parser.add_argument('--logdir', default='log/', type=str,
|
||||||
|
help='Logging path.', required=False)
|
||||||
|
parser.add_argument('--ckpdir', default='ppg2mel/saved_models/', type=str,
|
||||||
|
help='Checkpoint path.', required=False)
|
||||||
|
parser.add_argument('--outdir', default='result/', type=str,
|
||||||
|
help='Decode output path.', required=False)
|
||||||
|
parser.add_argument('--load', default=None, type=str,
|
||||||
|
help='Load pre-trained model (for training only)', required=False)
|
||||||
|
parser.add_argument('--warm_start', action='store_true',
|
||||||
|
help='Load model weights only, ignore specified layers.')
|
||||||
|
parser.add_argument('--seed', default=0, type=int,
|
||||||
|
help='Random seed for reproducable results.', required=False)
|
||||||
|
parser.add_argument('--njobs', default=8, type=int,
|
||||||
|
help='Number of threads for dataloader/decoding.', required=False)
|
||||||
|
parser.add_argument('--cpu', action='store_true', help='Disable GPU training.')
|
||||||
|
parser.add_argument('--no-pin', action='store_true',
|
||||||
|
help='Disable pin-memory for dataloader')
|
||||||
|
parser.add_argument('--test', action='store_true', help='Test the model.')
|
||||||
|
parser.add_argument('--no-msg', action='store_true', help='Hide all messages.')
|
||||||
|
parser.add_argument('--finetune', action='store_true', help='Finetune model')
|
||||||
|
parser.add_argument('--oneshotvc', action='store_true', help='Oneshot VC model')
|
||||||
|
parser.add_argument('--bilstm', action='store_true', help='BiLSTM VC model')
|
||||||
|
parser.add_argument('--lsa', action='store_true', help='Use location-sensitive attention (LSA)')
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
paras = parser.parse_args()
|
||||||
|
setattr(paras, 'gpu', not paras.cpu)
|
||||||
|
setattr(paras, 'pin_memory', not paras.no_pin)
|
||||||
|
setattr(paras, 'verbose', not paras.no_msg)
|
||||||
|
# Make the config dict dot visitable
|
||||||
|
config = HpsYaml(paras.config)
|
||||||
|
|
||||||
|
np.random.seed(paras.seed)
|
||||||
|
torch.manual_seed(paras.seed)
|
||||||
|
if torch.cuda.is_available():
|
||||||
|
torch.cuda.manual_seed_all(paras.seed)
|
||||||
|
|
||||||
|
print(">>> OneShot VC training ...")
|
||||||
|
mode = "train"
|
||||||
|
solver = Solver(config, paras, mode)
|
||||||
|
solver.load_data()
|
||||||
|
solver.set_model()
|
||||||
|
solver.exec()
|
||||||
|
print(">>> Oneshot VC train finished!")
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in New Issue
Block a user