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

说明

  • 本次训练服务器使用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 / peakwav2 = 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+=1out_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_dirdef transcribe_one(audio_path): # 使用whisper语音识别# load audio and pad/trim it to fit 30 secondsaudio = whisper.load_audio(audio_path)audio = whisper.pad_or_trim(audio)# make log-Mel spectrogram and move to the same device as the modelmel = 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 audiooptions = whisper.DecodingOptions(beam_size=5)result = whisper.decode(model, mel, options)#繁体转简体txt = result.texttxt = Converter('zh-hans').convert(txt)fileName = os.path.basename(audio_path)print(f'{fileName}:{lang}——>{txt}')return txtif __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'):continuetext = 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内存会爆仓,所以没有多线程的效果。

  • 这里训练的总步数由config.json里面的epochs控制,一般设置为500左右就差不多了
  • 训练生成的模型在logs目录下,其中DUR_x、D_x、G_x后面的数字都是一一对应的,程序断掉之后下次训练会继续在之前的步数上接着进行
%cd /content/drive/MyDrive/Bert-VITS2# -m:base,表示的logs/base/底模文件目录的base
!python train_ms.py -m base -c configs/config.json --cont

推理

  • 有浏览器环境的,直接运行webui.py就可以开启界面操作推理
  • 没有可视界面环境的,使用以下脚本进行命令行推理:
%cd /content/drive/MyDrive/Bert-VITS2
# -m:就是推理之后的模型路径
!python 命令行推理.py -m ./logs/base/G_8000.pth --text='你好啊你是谁呀' --speaker='zhangsan'

生成的音频文件自行下载下来即可播放。

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

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

相关文章

低代码:避免重复造轮子的高效工具

一、前言 在软件开发和其他工程领域,“重复造轮子”被广泛认为是一种低效的做法,因为它浪费了大量的时间和资源去重新创作已经存在的东西,而不是利用现有的技术和经验去解决问题。 因此,为了避免“重复造轮子”,开发人…

chatGPT 帮我优化mysql查询语句 优化一下查询速度

最终效果 备份一下数据库,加上索引就行。25ms查询完成。 对比 加上索引之前及之后的 EXPLAIN SELECT d.sn, d.imei1, d.imei2, d.remark FROM device_info_new d INNER JOIN production_log p ON d.state ‘0’ AND p.sn d.sn AND p.imei1 d.imei1 AND p.imei2 …

Realm violation Datapatch 禁用DBV database vault

Datapatch failed with the error ORA-47410: Realm violation for CREATE ROLE (Doc ID 2306010.1)​编辑To Bottom APPLIES TO: Oracle Database - Enterprise Edition - Version 12.1.0.2 and later Oracle Database Cloud Schema Service - Version N/A and later Oracle…

专业韩语论文翻译,论文中译韩哪里比较专业?

据了解,论文翻译是翻译工作中较常见的一种翻译题材,论文翻译的主要目的是在国外期刊上发表,加强国际学术交流。那么,如何做好论文翻译,论文中译韩哪里比较专业? 业内人士指出,翻译韩语论文&…

OLED透明拼接屏:福州鼓山风景区:徜徉于城市壮丽之

福州是中国福建省的省会城市,历史悠久,文化底蕴深厚。 该城市曾是唐宋时期的重要港口城市,也是丝绸之路海上丝绸之路的起点之一。 福州以其独特的地理位置和丰富的历史遗产而闻名于世。 福州拥有众多的历史景点,其中最著名的是…

nginx绑定tomcat与tomcat联合使用的配置(nginx反向代理tomcat的配置说明)

nginx反向代理tomcat通信配置 (内容来自网上,注解部分才是原创) 切记: url的意思就是 unifed resource location 统一资源定位 其中location就是定位的意思 所以上文中的location就有 对应匹配的 url 标识的资源的相关配置之…

java Maven入门笔记

后端Web开发技术的学习,我们要先学习Java项目的构建工具:Maven 目录 Maven概述Maven介绍及其作用Maven模型介绍Maven仓库Maven安装 IDEA集成Maven配置Maven环境当前工程设置全局设置 Maven项目创建Maven项目POM配置详解Maven坐标详解 导入Maven项目 依赖…

【TensorFlow2 之013】TensorFlow-Lite

一、说明 在这篇文章中,我们将展示如何构建计算机视觉模型并准备将其部署在移动和嵌入式设备上。有了这些知识,您就可以真正将脚本部署到日常使用或移动应用程序中。 教程概述: 介绍在 TensorFlow 中构建模型将模型转换为 TensorFlow Lite训练…

Jenkins 结合 ANT 发送测试报告

目录 全局变量配置 新建任务 插件安装 HTML 报告配置 邮件配置 全局变量配置 点击 ManageJenkins进入Jenkins 管理 点击 Global Tool Configuration 进入全局变量配置 配置 Ant ,Name 自己定义一个比较好理解的名称。 去掉 Install automatically 勾选&#x…

华为OD机考算法题:找终点

目录 题目部分 解读与分析 代码实现 题目部分 题目找终点难度易题目说明给定一个正整数数组,设为nums,最大为100个成员,求从第一个成员开始,正好走到数组最后一个成员,所使用的最少步骤数。 要求: 1.第…

skywalking动态配置[集成nacos/apollo/consul]

说明:以下配置仅关于的阈值规则的动态配置,其他参数也可以进行配置。 1,skywalking动态配置集成nacos 编辑application.yml nacos配置参数如下: nacos:# Nacos Server HostserverAddr: 10.10.5.145# Nacos Server Portport: 8848# Nacos Configuration Groupgroup: skywal…

2.1、如何在FlinkSQL中读取写出到Kafka

目录 1、环境设置 方式1:在Maven工程中添加pom依赖 方式2:在 sql-client.sh 中添加 jar包依赖 2、读取Kafka 2.1 创建 kafka表 2.2 读取 kafka消息体(Value) 使用 format json 解析json格式的消息 使用 format csv 解析…

快速学习微服务保护框架--Sentinel

学习一个框架最好的方式就是查看官方地址,sentinel是国内阿里巴巴公司的,官网更方便官网 官网 微服务保护框架 Sentinel 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微…

全力以赴,火山引擎边缘云代表团出战亚运会

END 未来,火山引擎边缘云赛事阵容将继续全力以赴,通过领先、可信赖的云和智能技术,助力游戏行业呈现更加精彩的竞技赛事。

光耦合器继电器与传统继电器:哪种最适合您的项目?

在电子和电气工程领域,继电器的选择可以显着影响项目的性能和安全性。两种常见类型的继电器是光耦合器继电器和传统机电继电器。每个都有其优点和缺点,因此选择过程对于项目的成功结果至关重要。 光耦合器继电器:基础知识 光耦合器继电器&…

linux环境下使用lighthouse与selenium

一、安装谷歌浏览器、谷歌浏览器驱动、lighthouse shell脚本 apt update && apt -y upgrade apt install -y curl curl -fsSL https://deb.nodesource.com/setup_18.x | bash apt install -y nodejs apt install -y npm npm install -g lighthouse apt-get install -y …

AutoRunner自动化测试工具

AutoRunner自动化测试工具(简称AR)是泽众软件自主研发的自动化测试工具,也是一个自动测试框架,加载不同的测试组件,能够实现面向不同应用的测试。通过录制和编写测试脚本,实现功能测试、回归测试的自动化,自…

记录一个@Transaction注解引发的bug

记录一个Transactional(readOnly true)注解引发的bug 一、问题代码和报错 1-1 问题代码模拟 引发这个问题的三大要素分别是: 事务注解任意数据库操作数据库操作后执行耗时业务(耗时超过数据库配置的超时时间) //1.这里是问题的核心之一…

“过度炒作”的大模型巨亏,Copilot每月收10刀,倒赔20刀

大模型无论是训练还是使用,都比较“烧钱”,只是其背后的成本究竟高到何处?已经推出大模型商用产品的公司到底有没有赚到钱?事实上,即使微软、亚马逊、Adobe 这些大厂,距离盈利之路还有很远!同时…

微信自动批量添加好友的方法

在现在的营销中微信已成为一种重要的沟通方式。微信目前是没有自动批量添加好友的功能,需要运营者一个一个手动去添加,这样太过于浪费时间,并且加频繁了还容易被封号,今天给大家介绍几种手动批量加好友的方式以及怎么借助第三方软…