CoolFace
Apppublic

Julius8888/XiJingPing_voice_cloning

sourceHugging Faceupdated 3y agoView on Hugging Face
1likes
webui_preprocess.py167 linesDownload Raw Back to root
1import gradio as gr2import webbrowser3import os4import json5import subprocess6import shutil7 8 9def get_path(data_dir):10    start_path = os.path.join("./data", data_dir)11    lbl_path = os.path.join(start_path, "esd.list")12    train_path = os.path.join(start_path, "train.list")13    val_path = os.path.join(start_path, "val.list")14    config_path = os.path.join(start_path, "configs", "config.json")15    return start_path, lbl_path, train_path, val_path, config_path16 17 18def generate_config(data_dir, batch_size):19    assert data_dir != "", "数据集名称不能为空"20    start_path, _, train_path, val_path, config_path = get_path(data_dir)21    if os.path.isfile(config_path):22        config = json.load(open(config_path, "r", encoding="utf-8"))23    else:24        config = json.load(open("configs/config.json", "r", encoding="utf-8"))25    config["data"]["training_files"] = train_path26    config["data"]["validation_files"] = val_path27    config["train"]["batch_size"] = batch_size28    out_path = os.path.join(start_path, "configs")29    if not os.path.isdir(out_path):30        os.mkdir(out_path)31    model_path = os.path.join(start_path, "models")32    if not os.path.isdir(model_path):33        os.mkdir(model_path)34    with open(config_path, "w", encoding="utf-8") as f:35        json.dump(config, f, indent=4)36    if not os.path.exists("config.yml"):37        shutil.copy(src="default_config.yml", dst="config.yml")38    return "配置文件生成完成"39 40 41def resample(data_dir):42    assert data_dir != "", "数据集名称不能为空"43    start_path, _, _, _, config_path = get_path(data_dir)44    in_dir = os.path.join(start_path, "raw")45    out_dir = os.path.join(start_path, "wavs")46    subprocess.run(47        f"python resample_legacy.py "48        f"--sr 44100 "49        f"--in_dir {in_dir} "50        f"--out_dir {out_dir} ",51        shell=True,52    )53    return "音频文件预处理完成"54 55 56def preprocess_text(data_dir):57    assert data_dir != "", "数据集名称不能为空"58    start_path, lbl_path, train_path, val_path, config_path = get_path(data_dir)59    lines = open(lbl_path, "r", encoding="utf-8").readlines()60    with open(lbl_path, "w", encoding="utf-8") as f:61        for line in lines:62            path, spk, language, text = line.strip().split("|")63            path = os.path.join(start_path, "wavs", os.path.basename(path)).replace(64                "\\", "/"65            )66            f.writelines(f"{path}|{spk}|{language}|{text}\n")67    subprocess.run(68        f"python preprocess_text.py "69        f"--transcription-path {lbl_path} "70        f"--train-path {train_path} "71        f"--val-path {val_path} "72        f"--config-path {config_path}",73        shell=True,74    )75    return "标签文件预处理完成"76 77 78def bert_gen(data_dir):79    assert data_dir != "", "数据集名称不能为空"80    _, _, _, _, config_path = get_path(data_dir)81    subprocess.run(82        f"python bert_gen.py " f"--config {config_path}",83        shell=True,84    )85    return "BERT 特征文件生成完成"86 87 88if __name__ == "__main__":89    with gr.Blocks() as app:90        with gr.Row():91            with gr.Column():92                _ = gr.Markdown(93                    value="# Bert-VITS2 数据预处理\n"94                    "## 预先准备:\n"95                    "下载 BERT 和 WavLM 模型:\n"96                    "- [中文 RoBERTa](https://huggingface.co/hfl/chinese-roberta-wwm-ext-large)\n"97                    "- [日文 DeBERTa](https://huggingface.co/ku-nlp/deberta-v2-large-japanese-char-wwm)\n"98                    "- [英文 DeBERTa](https://huggingface.co/microsoft/deberta-v3-large)\n"99                    "- [WavLM](https://huggingface.co/microsoft/wavlm-base-plus)\n"100                    "\n"101                    "将 BERT 模型放置到 `bert` 文件夹下,WavLM 模型放置到 `slm` 文件夹下,覆盖同名文件夹。\n"102                    "\n"103                    "数据准备:\n"104                    "将数据放置在 data 文件夹下,按照如下结构组织:\n"105                    "\n"106                    "```\n"107                    "├── data\n"108                    "│   ├── {你的数据集名称}\n"109                    "│   │   ├── esd.list\n"110                    "│   │   ├── raw\n"111                    "│   │   │   ├── ****.wav\n"112                    "│   │   │   ├── ****.wav\n"113                    "│   │   │   ├── ...\n"114                    "```\n"115                    "\n"116                    "其中,`raw` 文件夹下保存所有的音频文件,`esd.list` 文件为标签文本,格式为\n"117                    "\n"118                    "```\n"119                    "****.wav|{说话人名}|{语言 ID}|{标签文本}\n"120                    "```\n"121                    "\n"122                    "例如:\n"123                    "```\n"124                    "vo_ABDLQ001_1_paimon_02.wav|派蒙|ZH|没什么没什么,只是平时他总是站在这里,有点奇怪而已。\n"125                    "noa_501_0001.wav|NOA|JP|そうだね、油断しないのはとても大事なことだと思う\n"126                    "Albedo_vo_ABDLQ002_4_albedo_01.wav|Albedo|EN|Who are you? Why did you alarm them?\n"127                    "...\n"128                    "```\n"129                )130                data_dir = gr.Textbox(131                    label="数据集名称",132                    placeholder="你放置在 data 文件夹下的数据集所在文件夹的名称,如 data/genshin 则填 genshin",133                )134                info = gr.Textbox(label="状态信息")135                _ = gr.Markdown(value="## 第一步:生成配置文件")136                with gr.Row():137                    batch_size = gr.Slider(138                        label="批大小(Batch size):24 GB 显存可用 12",139                        value=8,140                        minimum=1,141                        maximum=64,142                        step=1,143                    )144                    generate_config_btn = gr.Button(value="执行", variant="primary")145                _ = gr.Markdown(value="## 第二步:预处理音频文件")146                resample_btn = gr.Button(value="执行", variant="primary")147                _ = gr.Markdown(value="## 第三步:预处理标签文件")148                preprocess_text_btn = gr.Button(value="执行", variant="primary")149                _ = gr.Markdown(value="## 第四步:生成 BERT 特征文件")150                bert_gen_btn = gr.Button(value="执行", variant="primary")151                _ = gr.Markdown(152                    value="## 训练模型及部署:\n"153                    "修改根目录下的 `config.yml` 中 `dataset_path` 一项为 `data/{你的数据集名称}`\n"154                    "- 训练:将[预训练模型文件](https://openi.pcl.ac.cn/Stardust_minus/Bert-VITS2/modelmanage/show_model)(`D_0.pth`、`DUR_0.pth`、`WD_0.pth` 和 `G_0.pth`)放到 `data/{你的数据集名称}/models` 文件夹下,执行 `torchrun --nproc_per_node=1 train_ms.py` 命令(多卡运行可参考 `run_MnodesAndMgpus.sh` 中的命令。\n"155                    "- 部署:修改根目录下的 `config.yml` 中 `webui` 下 `model` 一项为 `models/{权重文件名}.pth` (如 G_10000.pth),然后执行 `python webui.py`"156                )157 158        generate_config_btn.click(159            generate_config, inputs=[data_dir, batch_size], outputs=[info]160        )161        resample_btn.click(resample, inputs=[data_dir], outputs=[info])162        preprocess_text_btn.click(preprocess_text, inputs=[data_dir], outputs=[info])163        bert_gen_btn.click(bert_gen, inputs=[data_dir], outputs=[info])164 165    webbrowser.open("http://127.0.0.1:7860")166    app.launch(share=False, server_port=7860)167