From 252a5e11b322a17d5170451121b3dbc746681743 Mon Sep 17 00:00:00 2001 From: Vega Date: Sat, 5 Mar 2022 00:52:36 +0800 Subject: [PATCH] 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 --- README-CN.md | 54 +++++++++++++++++++------------------- ppg2mel_train.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 27 deletions(-) create mode 100644 ppg2mel_train.py diff --git a/README-CN.md b/README-CN.md index 096ee5a..7871fd1 100644 --- a/README-CN.md +++ b/README-CN.md @@ -98,33 +98,33 @@ d48ea37adf3660e657cfb047c10edbc -## 文件结构(目标读者:开发者) -``` -├─archived_untest_files 废弃文件 -├─encoder encoder模型 -│ ├─data_objects -│ └─saved_models 预训练好的模型 -├─samples 样例语音 -├─synthesizer synthesizer模型 -│ ├─models -│ ├─saved_models 预训练好的模型 -│ └─utils 工具类库 -├─toolbox 图形化工具箱 -├─utils 工具类库 -├─vocoder vocoder模型(目前包含hifi-gan、wavrnn) -│ ├─hifigan -│ ├─saved_models 预训练好的模型 -│ └─wavernn -└─web - ├─api - │ └─Web端接口 - ├─config - │ └─ Web端配置文件 - ├─static 前端静态脚本 - │ └─js - ├─templates 前端模板 - └─__init__.py Web端入口文件 -``` +### 4. 番外:语音转换Voice Conversion(PPG based) +想像柯南拿着变声器然后发出毛利小五郎的声音吗?本项目现基于PPG-VC,引入额外两个模块(PPG extractor + PPG2Mel), 可以实现变声功能。(文档不全,尤其是训练部分,正在努力补充中) +#### 4.0 准备环境 +* 确保项目以上环境已经安装ok,运行`pip install -r requirements.txt` 来安装剩余的必要包。 +* 下载以下模型 + * 24K采样率专用的vocoder(hifigan)到 *vocoder\saved_mode\xxx* + * 预训练的ppg特征encoder(ppg_extractor)到 *ppg_extractor\saved_mode\xxx* + * 预训练的PPG2Mel到 *ppg2mel\saved_mode\xxx* + +#### 4.1 使用数据集自己训练PPG2Mel模型 (可选) + +* 下载aidatatang_200zh数据集并解压:确保您可以访问 *train* 文件夹中的所有音频文件(如.wav) +* 进行音频和梅尔频谱图预处理: +`python pre4ppg.py -d {dataset} -n {number}` +可传入参数: +* `-d {dataset}` 指定数据集,支持 aidatatang_200zh, 不传默认为aidatatang_200zh +* `-n {number}` 指定并行数,CPU 11770k在8的情况下,需要运行12到18小时!待优化 +> 假如你下载的 `aidatatang_200zh`文件放在D盘,`train`文件路径为 `D:\data\aidatatang_200zh\corpus\train` , 你的`datasets_root`就是 `D:\data\` + +* 训练合成器, 注意在上一步先下载好`ppg2mel.yaml`, 修改里面的地址指向预训练好的文件夹: +`python ppg2mel_train.py --config .\ppg2mel\saved_models\ppg2mel.yaml --oneshotvc ` +* 如果想要继续上一次的训练,可以通过`--load .\ppg2mel\saved_models\` 参数指定一个预训练模型文件。 + +#### 4.2 启动工具箱VC模式 +您可以尝试使用以下命令: +`python demo_toolbox.py vc -d ` +> 请指定一个可用的数据集文件路径,如果有支持的数据集则会自动加载供调试,也同时会作为手动录制音频的存储目录。 ## 引用及论文 > 该库一开始从仅支持英语的[Real-Time-Voice-Cloning](https://github.com/CorentinJ/Real-Time-Voice-Cloning) 分叉出来的,鸣谢作者。 diff --git a/ppg2mel_train.py b/ppg2mel_train.py new file mode 100644 index 0000000..5a6a06c --- /dev/null +++ b/ppg2mel_train.py @@ -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()