赞
踩
包括下载代码、下载模型等等步骤
%cd /content/drive/MyDrive
# 这里是下载原仓库代码
#!git clone https://github.com/fishaudio/Bert-VITS2.git
# 这是下载码云调整后的代码
!git clone https://gitee.com/ajianoscgit/bert-vits2.git
这里只下载了中文语音的模型,在https://huggingface.co/hfl/chinese-roberta-wwm-ext-large/tree/main 下载即可,根据/content/drive/MyDrive/Bert-VITS2/bert/chinese-roberta-wwm-ext-large目录缺失的文件下载补全。
%cd /content/drive/MyDrive/Bert-VITS2/bert/chinese-roberta-wwm-ext-large
!wget https://huggingface.co/hfl/chinese-roberta-wwm-ext-large/resolve/main/flax_model.msgpack
!wget https://huggingface.co/hfl/chinese-roberta-wwm-ext-large/resolve/main/pytorch_model.bin
!wget https://huggingface.co/hfl/chinese-roberta-wwm-ext-large/resolve/main/tf_model.h5
下载底模文件:
底模文件使用b站大佬裁切好的底模,效果更好,https://www.bilibili.com/video/BV1hp4y1K78E
由于cloab无法直接下载到模型文件,只好先在站点下载完成之后再上传到谷歌云盘中,放在logs/base/目录下。
# 这是原版底模,使用1.1版b站大佬的底模替代!
%cd /content/drive/MyDrive/Bert-VITS2
#!wget -P logs/base/ https://huggingface.co/Erythrocyte/bert-vits2_base_model/resolve/main/DUR_0.pth
#!wget -P logs/base/ https://huggingface.co/Erythrocyte/bert-vits2_base_model/resolve/main/D_0.pth
#!wget -P logs/base/ https://huggingface.co/Erythrocyte/bert-vits2_base_model/resolve/main/G_0.pth
训练特定音色的模型时,需要首先将准备好的音频干声文件进行分割,将分割后的文件文本提取出来备用。
可以本地将这些文件先准备好,也可以服务器上制作,服务器上制作就用以下脚本实现。
以下脚本为实现此功能的相关脚本(该脚本根据csdn大佬的代码进行了调整,实现读取运行时参数和音频转写文本时汉字繁体转简体):
import os from pathlib import Path import librosa from scipy.io import wavfile import numpy as np import whisper import argparse from langconv import * def split_long_audio(model, filepath, save_dir="short_dir", out_sr=44100)->str: '''将长音源wav文件分割为短音源文件,返回短音源文件存储路径path''' # 短音频文件存储路径 save_dir=os.path.join(os.path.dirname(filepath),save_dir) if not os.path.exists(save_dir): os.makedirs(save_dir) #分割文件 print(f'分割文件{filepath}...') result = model.transcribe(filepath, word_timestamps=True, task="transcribe", beam_size=5, best_of=5) segments = result['segments'] wav, sr = librosa.load(filepath, sr=None, offset=0, duration=None, mono=True) wav, _ = librosa.effects.trim(wav, top_db=20) peak = np.abs(wav).max() if peak > 1.0: wav = 0.98 * wav / peak wav2 = librosa.resample(wav, orig_sr=sr, target_sr=out_sr) wav2 /= max(wav2.max(), -wav2.min()) for i, seg in enumerate(segments): start_time = seg['start'] end_time = seg['end'] wav_seg = wav2[int(start_time * out_sr):int(end_time * out_sr)] wav_seg_name = f"{i}.wav" # 修改名字 i+=1 out_fpath = os.path.join(save_dir,wav_seg_name) wavfile.write(out_fpath, rate=out_sr, data=(wav_seg * np.iinfo(np.int16).max).astype(np.int16)) return save_dir def transcribe_one(audio_path): # 使用whisper语音识别 # load audio and pad/trim it to fit 30 seconds audio = whisper.load_audio(audio_path) audio = whisper.pad_or_trim(audio) # make log-Mel spectrogram and move to the same device as the model mel = whisper.log_mel_spectrogram(audio).to(model.device) # detect the spoken language _, probs = model.detect_language(mel) lang = max(probs, key=probs.get) # decode the audio options = whisper.DecodingOptions(beam_size=5) result = whisper.decode(model, mel, options) #繁体转简体 txt = result.text txt = Converter('zh-hans').convert(txt) fileName = os.path.basename(audio_path) print(f'{fileName}:{lang}——>{txt}') return txt if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('inputFilePath', type=str,help="干声源音频wav文件的全路径") parser.add_argument('listFileSavePath', type=str,help=".list文件存储全路径") parser.add_argument('--shortFilesPath', type=str, help="已经分割好了的短音频的存储目录全路径,用于当分割好之后再次运行时配置") opt = parser.parse_args() print(f'参数:{opt}') model = whisper.load_model("medium") #将长音源分割成短音源文件 if not opt.shortFilesPath: save_dir = split_long_audio(model, opt.inputFilePath) else: save_dir = opt.shortFilesPath #为每个短音频文件提取文字内容,生成.lab文件和filelists目录下的.list文件 if not os.path.exists(opt.listFileSavePath): file = open(opt.listFileSavePath, "w") file.close() print('提取文字内容...') files=os.listdir(save_dir) spk = os.path.basename(os.path.dirname(opt.inputFilePath)) for file in files: if not file.endswith('.wav'): continue text = transcribe_one(os.path.join(save_dir,file)) with open(os.path.join(save_dir,f"{file}.lab"),'w') as f: f.write(text) with open(opt.listFileSavePath,'a', encoding="utf-8") as wf: wf.write(f"{os.path.join(save_dir,file)}|{spk}|ZH|{text}\n") print('音频预处理完成!')
#检查CUDA版本
import torch
print(torch.version.cuda)
print(torch.cuda.is_available())
#安装依赖
%cd /content/drive/MyDrive/Bert-VITS2
!pip install wavfile
!pip install git+https://github.com/openai/whisper.git
!pip install -r requirements.txt
!pip install zhconv==1.4.3
!pip install zhtools==0.3.1
%cd /content/drive/MyDrive/Bert-VITS2
!python 音频预处理脚本.py /content/drive/MyDrive/Bert-VITS2/data/zhangsan/ganshen.wav /content/drive/MyDrive/Bert-VITS2/filelists/zhangsan.list --shortFilesPath '/content/drive/MyDrive/Bert-VITS2/data/zhangsan/short_dir'
注意:音频预处理完成之后,要打开datalists目录下对应的list文件看看处理结果,把过分离奇的、错误明显的行直接删掉!
会在dataset下生成重采样后的音频,如果修改了源音频要进行二次训练,需要将原dataset下的文件删除。
%cd /content/drive/MyDrive/Bert-VITS2
!python resample.py --in_dir /content/drive/MyDrive/Bert-VITS2/data/zhangsan/short_dir
预处理完成会在filelists下生成.cleaned、train.list、val.list文件!
%cd /content/drive/MyDrive/Bert-VITS2
!python preprocess_text.py --transcription-path /content/drive/MyDrive/Bert-VITS2/filelists/zhangsan.list
会在data/用户名/short_dir目录下生成对应视频文件的.bert.pt文件
%cd /content/drive/MyDrive/Bert-VITS2
!python bert_gen.py --num_processes 4
注意1:开始训练前必须要先把data目录下本次训练的文件夹名字加到configs/config.json文件的spk2id下,并加一个id!!!这个案例中就是把“zhangsan”加到"标贝": 247,后面!
注意2:train_ms.py和data_utils.py有大量修改,支持多线程并行训练。但是T4服务器只有12G内存会爆仓,所以没有多线程的效果。
%cd /content/drive/MyDrive/Bert-VITS2
# -m:base,表示的logs/base/底模文件目录的base
!python train_ms.py -m base -c configs/config.json --cont
%cd /content/drive/MyDrive/Bert-VITS2
# -m:就是推理之后的模型路径
!python 命令行推理.py -m ./logs/base/G_8000.pth --text='你好啊你是谁呀' --speaker='zhangsan'
生成的音频文件自行下载下来即可播放。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。