声音克隆,定制自己的声音,使用最新版Bert-VITS2的云端训练+推理记录

news2025/2/27 2:38:50

说明

  • 本次训练服务器使用Google Colab T4 GPU
  • Bert-VITS2库为:https://github.com/fishaudio/Bert-VITS2,其更新较为频繁,使用其2023.10.12的commit版本:在这里插入图片描述
  • 主要参考:B站诸多大佬视频,CSDN:https://blog.csdn.net/qq_51506262/article/details/133359555,
    码云:https://gitee.com/Sake809/Bert-VITS2-Integration-package
  • 部署过程中出现诸多问题,对原版Bert-VITS2个别代码也有调整,调整后的代码已放码云:https://gitee.com/ajianoscgit/bert-vits2.git
  • 本项目是确定可运行的,后续随着Bert-VITS2的持续更新,当前能稳定运行的代码后续可能会出问题。

环境准备

包括下载代码、下载模型等等步骤

下载项目

%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

训练

音频预处理

  • 音频需要自己录一段声音,1分钟以上,10分钟以内即可
  • 音频使用Ultimate Vocal Remover工具去掉背景杂音,使其为一段纯音频的干声。Ultimate Vocal Remover工具使用见:https://github.com/Anjok07/ultimatevocalremovergui,作者封装了GUI,下载安装即可
  • 提取好了的干声自行上传到项目的data目录下,data下需要新建一个名称目录,如zhangsan,文件结构如下:
    Bert-VITS2
    ————data
    ——————zhangsan
    ————————ganshen.wav
  • 执行以下脚本,对音频预处理
%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

预处理.list文件

预处理完成会在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

生成pt文件

会在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1087499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Visual Studio主题颜色及字体

一、打开VS上方的工具 二、选择“选项” 三、在“常规”中选择“颜色主题” 一共四个颜色供大家参考: ①深色 ②浅色 ③蓝色 ④蓝(额外对比度) 四、字体设置 左边环境中下划

【实训项目】“优品果园”-线上水果商城小程序

1.项目背景 随着现代人对消费水平的追求以及对食物安全的需要,无污染、产地直销的有机水果受到越来越多市民的喜欢。交易过程的简洁化是现代消费者的追求,产地直销也是近期流行的一种新型的交易模式。产地直销的交易模式使得交易过程更加简便快捷&#…

产业集群的转型升级需要各个方面的协同转型——以河北吉力宝为例

随着全球经济的不断演进,产业集群的转型升级已经成为确保企业持续竞争力的必经之路。产业集群是一种由相关产业企业在相对密集的地理区域内紧密互联的经济组织形式,它们通常共享类似的供应链、市场和技术基础。其中,河北吉力宝是中国鞋业产业…

【教学类-32-04】20231013十二生肖4.0(标记+1位数字+排序+左右分类)(大班:《我是中国人》偏科学-数)

作品展示 一位数字、汉字对齐排列 背景需求: 1、优化教案,参与比赛 10月份有一个幼儿园原创教案比赛,我把这个活动《十二生肖排排队》上报了。 2、把两位数序号改成一位数。 “老师,我觉得猴子最大,他是90”。 因…

关于Vue+webpack使用unocss编写CSS,打包后CSS没加前缀

关于Vuewebpack使用unocss编写CSS,打包后CSS没加前缀,封装了一个插件去解决了这个问题 unocss-postcss-webpack-plugin unocss在vite中使用配置,关于unocss在vite中使用,自行查阅官网 https://unocss.dev/integrations/vite ,vi…

Jetson ORIN NX安装Ubuntu20.04,配置CUDA,cuDNN 等注意事项

大体准备工作与流程与博客英伟达官方源Jetson Xavier NX安装Ubuntu20.04,配置CUDA,cuDNN,Pytorch等环境教程(基于NVIDIA官方教程,理论适用其它Jetson设备)一致,主要在步骤二、三处有一些区别&am…

专利分为哪些?如何查询一个公司的专利信息?

今天来分享专利的相关知识。 专利从字面上是指专有的权利和利益。“专利”一词来源于拉丁语Litterae patentes,意为公开的信件或公共文献,是中世纪的君主用来颁布某种特权的证明,后来指英国国王亲自签署的独占权利证书。专利在现代一般是由政…

湖南省政协副主席赖明勇一行莅临麒麟信安调研

10月11日下午,湖南省政协副主席、民建湖南省委会主委赖明勇,省政协提案委主任袁海平,民建省委会专职副主委、一级巡视员段安娜等长沙先进计算及信息安全产业调研组领导莅临麒麟信安调研国产操作系统企业发展情况。长沙市政府副市长彭涛&#…

Java 拷贝

Java 中的拷贝分为两种,浅拷贝和深拷贝,关于为什么要有两种拷贝方式而不是一种,就要涉及到 Java 的两种类型数据了。Java 的深浅拷贝都是针对于引用类型而言的,基本类型是没有深浅拷贝之分的,类似于 C 语言&#xff0c…

C# AnimeGAN 漫画风格迁移 动漫风格迁移 图像卡通化 图像动漫化

效果 项目 模型 animeganv3_H40_model.onnx animeganv3_H50_model.onnx animeganv3_H64_model.onnx AnimeGANv3_JP_face_v1.0.onnx AnimeGANv3_PortraitSketch_25.onnx Hayao-60.onnx Hayao_64.onnx Paprika_54.onnx Shinkai_53.onnx 下载 可执行文件exe下载 源码下载

element el-table树形表格结构,勾选联动 父级勾选,子级全部选中,勾选子级,父级显示勾选状态

需求实现如下 重点使用到 select 以及 select-all 两个方法 返回数据格式 代码实现 <el-table ref"tableRef" :cell-style"{ color: #FFF, background: #333 }":header-cell-style"{ color: #FFF, background: #333 }" row-key"id"…

操作系统 面试题(二)

PART1 1.乐观锁和悲观锁的区别是什么&#xff1f; 2.乐观锁和悲观锁的实现方式分别有哪些&#xff1f; 3.平均周转时间如何计算&#xff1f; 4.银行家算法是什么&#xff1f; 5.IO多路复用是什么&#xff1f; 6.HTTP的头部包含哪些内容&#xff1f; 7.TCP如何保持连接&a…

HTTP 原理与CND原理

1 HTTP 原理 HTTP是一个无状态的协议。无状态是指客户机&#xff08;Web浏览器&#xff09;和服务器之间不需要建立持久的连接&#xff0c;这意味着当一个客户端向服务器端发出请求&#xff0c;然后服务器返回响应(response)&#xff0c;连接就被关闭了&#xff0c;在服务器端…

NSA 和 CISA 揭示十大网络安全错误配置

美国国家安全局 (NSA) 和网络安全与基础设施安全局 (CISA) 在5日公布了其红蓝团队在大型组织网络中发现的十大最常见的网络安全错误配置。 通报还详细介绍了威胁行为者使用哪些策略、技术和程序 (TTP) 来成功利用这些错误配置来实现各种目标&#xff0c;包括获取访问权限、横向…

内存空间扩充之进程覆盖技术,交换技术

1.覆盖技术 人们引入了覆盖技术&#xff0c;用来解决“程序大小超过物理内存总和”的问题。 一个固定区&#xff1a; 存放最活跃的程序段固定区中的程序段在运行过程中不会调入调出 若干覆盖区&#xff1a; 不可能同时被访问程序段可共享一个覆盖区覆盖区中的程序段在运行…

MySQL慢查询的原因与解决方案

一、前言 在数据库系统中&#xff0c;慢查询是一个常见的问题。特别是在MySQL中&#xff0c;由于其复杂的查询结构和大量的数据&#xff0c;慢查询可能会导致系统性能下降&#xff0c;甚至影响整个应用的运行。本文将详细介绍MySQL慢查询的原因&#xff0c;并提供一些有效的解…

基于springboot实现火车订票管理系统项目【项目源码+论文说明】计算机毕业设计

摘要 本论文主要论述了如何使用JAVA语言开发一个火车订票管理系统 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述火车订票管理系统的当前背景以及系统开发的…

免备案域名 DNS解析

1、注册购买域名地址&#xff08;免备案&#xff09; Name.com | Domain Names, Registration, Websites & Hosting 注意国家选中国区才可以使用支付宝&#xff0c;信息填写完之后创建账号&#xff0c;邮箱填写自己的邮箱 2、注册完登录账号进去找到Domain Name 搜索自动…

SOLIDWORKS® 2024 新功能 - 3D CAD

1、 先前版本的兼容性 • 利用您订阅的 SOLIDWORKS&#xff0c;可将您的 SOLIDWORKS 设计作品保存为旧版本&#xff0c;与使用旧版本 SOLIDWORKS 的供应商无缝协作。 • 可将零件、装配体和工程图保存为新版本前两年之内的SOLIDWORKS 版本。 优点&#xff1a; 即使其他用户正…

信息系统项目管理师第四版学习笔记——高级项目管理

项目集管理 项目集管理角色和职责 在项目集管理中涉及的相关角色主要包括&#xff1a;项目集发起人、项目集指导委员会、项目集经理、其他影响项目集的干系人。 项目集发起人和收益人是负责承诺将组织的资源应用于项目集&#xff0c;并致力于使项目集取得成功的人。 项目集…