本地训练,立等可取,30秒音频素材复刻霉霉讲中文音色基于Bert-VITS2V2.0.2

在这里插入图片描述

之前我们使用Bert-VITS2V2.0.2版本对现有的原神数据集进行了本地训练,但如果克隆对象脱离了原神角色,我们就需要自己构建数据集了,事实上,深度学习模型的性能和泛化能力都依托于所使用的数据集的质量和多样性,本次我们在本地利用Bert-VITS2V2.0.2对霉霉讲中文的音色进行克隆实践。

霉霉讲中文的原始音视频地址:

https://www.bilibili.com/video/BV1bB4y1R7Nu/

这一段是基于HeyGen项目的AI音色克隆以及唇形合成技术,全片1分钟左右,中文和英文各30秒,因为我们只克隆中文音色部分,那么将英文部分截去,留下30秒的中文音频素材。

Bert-VITS2V2.0.2构建数据集

拿到视频后,首先需要做音画分离的操作,即将视频和音频拆开,因为数据集并不需要视频,运行命令安装相关库:

pip3 install moviepy

moviepy可以帮我们把音频部分提取出来,编写代码:

from moviepy.editor import AudioFileClip  
my_audio_clip = AudioFileClip("e:/meimei.mp4")  
my_audio_clip.write_audiofile("e:/meimei.wav")

音频就被提取了出来。

随后针对原始音频素材进行分析:

import librosa  
import numpy as np  
audio, freq = librosa.load("e:\meimei.wav")  
time = np.arange(0, len(audio)) / freq  
print(len(audio), type(audio), freq, sep="\t")

程序返回:

python3 -u "test.py"  
848384  <class 'numpy.ndarray'> 22050

可以看到读取到了采样频率和每个采样点的信号强度,采样点共 848384,频率为 22050,音频长度约38秒。

至此,我们就完成了原始数据集文件的准备。

Bert-VITS2V2.0.2数据集切分

深度学习训练过程中,计算机会把训练数据读入显卡的缓存中,但如果训练集数据过大,会导致内存溢出问题,也就是常说的“爆显存”现象。

将数据集分成多个部分,每次只载入一个部分的数据进行训练。这种方法可以减少内存使用,同时也可以实现并行处理,提高训练效率。

虽然38秒的原始数据并不大,我们依然需要对其切分,这里首先克隆Bert-VITS2V2.0.2本地训练项目:

https://github.com/v3ucn/Bert-VITS2_V202_Train.git

安装依赖:

pip install -r requirements.txt

随后运行项目内的切分脚本:

python3 audio_slicer.py

该脚本原理就是利用slicer2库将大文件切分为小份:

import librosa  # Optional. Use any library you like to read audio files.  
import soundfile  # Optional. Use any library you like to write audio files.  
  
import shutil  
import gradio as gr  
import os  
import webbrowser  
import subprocess  
import datetime  
import json  
import requests  
import soundfile as sf  
import numpy as np  
import yaml  
from config import config  
import os  
  
with open('config.yml', mode="r", encoding="utf-8") as f:  
    configyml=yaml.load(f,Loader=yaml.FullLoader)  
  
model_name = configyml["dataset_path"].replace("Data\\","")  
  
from slicer2 import Slicer  
  
audio, sr = librosa.load(f'./Data/{model_name}/raw/{model_name}/{model_name}.wav', sr=None, mono=False)  # Load an audio file with librosa.  
slicer = Slicer(  
    sr=sr,  
    threshold=-40,  
    min_length=2000,  
    min_interval=300,  
    hop_size=10,  
    max_sil_kept=500  
)  
chunks = slicer.slice(audio)  
for i, chunk in enumerate(chunks):  
    if len(chunk.shape) > 1:  
        chunk = chunk.T  # Swap axes if the audio is stereo.  
    soundfile.write(f'./Data/{model_name}/raw/{model_name}/{model_name}_{i}.wav', chunk, sr)  # Save sliced audio files with soundfile.  
  
if os.path.exists(f'./Data/{model_name}/raw/{model_name}/{model_name}.wav'):  # 如果文件存在  
    os.remove(f'./Data/{model_name}/raw/{model_name}/{model_name}.wav')

需要注意的是min_length参数非常重要,分片文件时长绝对不能低于2秒,这里单位是毫秒,所以数值为2000,因为梅尔频谱本身需要有一个加窗的过程,音频文件必须要至少达到1帧长+窗口时长才能有结果,否则就会返回空。所以在数据切分时不能有超过2秒的音频,同时本来短时样本的质量就普遍偏低。

切分后效果:

E:\work\Bert-VITS2-v202_demo\Data\meimei\raw\meimei>tree /f  
Folder PATH listing for volume myssd  
Volume serial number is 7CE3-15AE  
E:.  
    meimei_0.wav  
    meimei_1.wav  
    meimei_2.wav  
    meimei_3.wav  
    meimei_4.wav  
    meimei_5.wav  
    meimei_6.wav  
    meimei_7.wav  
    meimei_8.wav

可以看到38秒音频被切成了九份。

Bert-VITS2V2.0.2数据集重采样和标注

切分好数据集后,需要对音频进行重新采样并生成标注文件,较高的采样率会导致更大的数据量和更高的计算成本。

运行脚本:

python3 short_audio_transcribe.py --languages "CJE" --whisper_size medium

这里语言使用medium模型进行推理,解决方案采用whisper,关于whisper,请移步:持续进化,快速转录,Faster-Whisper对视频进行双语字幕转录实践(Python3.10),这里不再赘述。

程序返回:

E:\work\Bert-VITS2-v202_demo\venv\lib\site-packages\whisper\timing.py:58: NumbaDeprecationWarning: The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.  
  def backtrace(trace: np.ndarray):  
Data\meimei\raw  
Detected language: zh  
但这些歌曲没进入专辑因为想留着他们下一张专辑用  
Processed: 1/31  
Detected language: zh  
然後下一張專輯完全不同所以他們被拋在了後面  
Processed: 2/31  
Detected language: zh  
你總是會想起這些歌曲你會想  
Processed: 3/31  
Detected language: zh  
会发生什么因为我希望人们能听到这个但它属于那个时刻  
Processed: 4/31  
Detected language: zh  
所以现在我可以回去重新审视我的旧作品  
Processed: 5/31  
Detected language: zh  
我從他們所在的地方挖掘出那些歌曲  
Processed: 6/31  
Detected language: zh  
並聯繫了我喜歡的藝術家  
Processed: 7/31  
Detected language: zh  
問他們是否願意和我一起演唱這首歌  
Processed: 8/31  
Detected language: zh  
你知道Phoebe Bridgers是我最喜欢的艺术家之一  
Processed: 9/31

可以看到文本已经被whisper转录了出来。

随后对文本进行预处理以及生成bert模型可读文件:

python3 preprocess_text.py  
  
python3 bert_gen.py

执行后会产生训练集和验证集文件:

E:\work\Bert-VITS2-v202\Data\meimei\filelists>tree /f  
Folder PATH listing for volume myssd  
Volume serial number is 7CE3-15AE  
E:.  
    cleaned.list  
    short_character_anno.list  
    train.list  
    val.list

检查无误后,数据预处理就完成了。

Bert-VITS2 V2.0.2开始训练

打开Data/meimei/config.json训练配置文件:

{  
  "train": {  
    "log_interval": 50,  
    "eval_interval": 50,  
    "seed": 42,  
    "epochs": 200,  
    "learning_rate": 0.0001,  
    "betas": [  
      0.8,  
      0.99  
    ],  
    "eps": 1e-09,  
    "batch_size": 8,  
    "fp16_run": false,  
    "lr_decay": 0.99995,  
    "segment_size": 16384,  
    "init_lr_ratio": 1,  
    "warmup_epochs": 0,  
    "c_mel": 45,  
    "c_kl": 1.0,  
    "skip_optimizer": false  
  },  
  "data": {  
    "training_files": "Data/meimei/filelists/train.list",  
    "validation_files": "Data/meimei/filelists/val.list",  
    "max_wav_value": 32768.0,  
    "sampling_rate": 44100,  
    "filter_length": 2048,  
    "hop_length": 512,  
    "win_length": 2048,  
    "n_mel_channels": 128,  
    "mel_fmin": 0.0,  
    "mel_fmax": null,  
    "add_blank": true,  
    "n_speakers": 1,  
    "cleaned_text": true,  
    "spk2id": {  
      "keqing": 0  
    }  
  },  
  "model": {  
    "use_spk_conditioned_encoder": true,  
    "use_noise_scaled_mas": true,  
    "use_mel_posterior_encoder": false,  
    "use_duration_discriminator": true,  
    "inter_channels": 192,  
    "hidden_channels": 192,  
    "filter_channels": 768,  
    "n_heads": 2,  
    "n_layers": 6,  
    "kernel_size": 3,  
    "p_dropout": 0.1,  
    "resblock": "1",  
    "resblock_kernel_sizes": [  
      3,  
      7,  
      11  
    ],  
    "resblock_dilation_sizes": [  
      [  
        1,  
        3,  
        5  
      ],  
      [  
        1,  
        3,  
        5  
      ],  
      [  
        1,  
        3,  
        5  
      ]  
    ],  
    "upsample_rates": [  
      8,  
      8,  
      2,  
      2,  
      2  
    ],  
    "upsample_initial_channel": 512,  
    "upsample_kernel_sizes": [  
      16,  
      16,  
      8,  
      2,  
      2  
    ],  
    "n_layers_q": 3,  
    "use_spectral_norm": false,  
    "gin_channels": 256  
  },  
  "version": "2.0"  
}

训练的保存间隔调小一点,方便训练过程中随时进行推理验证。

随后输入命令,开始训练:

python3 train_ms.py

至此,训练环节和之前的基于已有数据集的本地训练流程已经一致,更多训练步骤请移步:本地训练,开箱可用,Bert-VITS2 V2.0.2版本本地基于现有数据集训练(原神刻晴),囿于篇幅,这里不再赘述。

Bert-VITS2 V2.0.2过拟合问题

按照刻板印象,训练步数应该越多越好,但其实不然,训练步数(或称为迭代次数)并不是越多越好,而是需要在一定范围内找到一个合适的平衡点,如果模型的训练步数过多,模型可能会过度拟合训练数据,导致在新数据上的泛化能力下降。过拟合指的是模型过度记忆了训练数据中的细节和噪声,而无法很好地适应新的、未见过的数据。

类比的话,有些类似生活中的语义饱和现象,又称字形饱和、完形崩坏,是一种心理学现象,指的是人在重复盯着一个字或者一个单词长时间后,会发生突然不认识该字或者单词的情况。此过程仅为暂时,心理学上认为其原因是人的大脑神经如果短时间内接收到太多重复的刺激,就会引起神经活动的抑制,造成对常用字突然不认识的现象。

一般情况下,较大的数据集通常可以提供更多的样本和更丰富的数据分布,有助于模型学习更准确和泛化能力更好的特征。大数据集可以降低过拟合的风险,使模型更能够捕捉数据中的普遍模式而不是噪声。因此,如果数据集足够大,模型可能需要更多的训练步数才能充分利用数据集的信息。

但我们的数据集只有30秒,所以并不需要迭代过多次数,50步足矣。

最后,运行命令对刚训练的模型进行推理即可:

python3 server_fastapi.py

结语

需要注意的是,本次30秒小数据集训练很容易导致过拟合,因为模型可能会过度记忆数据中的细节和噪声。过多的训练次数可能会加剧过拟合问题。另一方面,如果训练次数太少,模型可能无法充分学习数据中的模式和特征,导致欠拟合。因此,需要在过拟合和欠拟合之间找到一个平衡点。

最后奉上本地整合包,与君共觞:

https://pan.baidu.com/s/1KtNb4wb4UbsHrwVKyTlT0g?pwd=v3uc

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国产Ai大模型和chtgpt3.5的比较

下面是针对国产大模型&#xff0c;腾讯混元&#xff0c;百度文心一言&#xff0c;阿里通义千问和chatgpt的比较&#xff0c;最基础的对一篇文章的单词书进行统计&#xff0c;只有文心一言和chatgpt回答差不多&#xff0c;阿里和腾讯差太多了

Luminar Neo1.16.0(ai智能图像处理)

Luminar Neo是一款ai智能图像编辑软件&#xff0c;它专注于使用人工智能技术来实现对照片的快速、高效和创造性的编辑。 具体来说&#xff0c;Luminar Neo可以自动移除景观或旅行照片中令人分心的元素&#xff0c;例如电话线、电线杆等&#xff0c;从而增强照片的整体质量。同…

OpenCvSharp从入门到实践-(03)像素

目录 像素 1、确定像素位置 2、获取像素的BGR值 3、修改像素的BGR值 像素 图像数字化是指用数字表示图像&#xff0c;每一幅数字图像都是有M行N列的像素组成的&#xff0c;其中每一个像素都存储一个像素值。计算机通常会把像素值处理为256个灰度级别&#xff0c;这256个灰…

数据库应用:MongoDB 数据备份与恢复

目录 一、实验 1.MongoDB 数据库备份与恢复 2.MongoDB 数据表备份与恢复 二、问题 1.MongoDB有哪些命令行工具实现数据备份与恢复 一、实验 1.MongoDB 数据库备份与恢复 &#xff08;1&#xff09;查看版本 rootnode1:~# mongo --version&#xff08;2&#xff09;准备…

ESXi 6.7 升级 7.0

方式一&#xff1a;esxcli方式 1.登陆exsi web界面。 启用控制台shell 2.存储-datastore-数据存储浏览器&#xff0c;上载 ESXI-7.0.0-depot.zip升级文件。记住此datastore的位置 ssh连接ESXI主机 vmware -vl 查看当前版本 查看升级包中对应的版本信息&#xff1a; es…

YOLOv5独家原创改进: AKConv(可改变核卷积),即插即用的卷积,效果秒杀DSConv | 2023年11月最新发表

💡💡💡本文全网首发独家改进:可改变核卷积(AKConv),赋予卷积核任意数量的参数和任意采样形状,为网络开销和性能之间的权衡提供更丰富的选择,解决具有固定样本形状和正方形的卷积核不能很好地适应不断变化的目标的问题点,效果秒殺DSConv 1)AKConv替代标准卷积进行…

Redis入门保姆级教程

1. Redis入门 1.1 Redis简介 Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 官网:https://redis.io 中文网:https://www.redis.net.cn/ key-value结构存储&#xff1a; 主要特点&#xff1a; 基于内存存储&#xff0c;读写…

03_歌词滚动效果

03_歌词滚动效果 文章目录 03_歌词滚动效果效果一、数据准备①&#xff1a;歌词②&#xff1a;音频等 二、代码实现①&#xff1a;首页②&#xff1a;样式③&#xff1a;js逻辑④&#xff1a;测试 效果 一、数据准备 ①&#xff1a;歌词 var lrc [00:00.95]夜微凉 - 徐珊 [0…

全志R128按键控制蜂鸣器GPIO配置详解

按键控制蜂鸣器 首先我们搭建电路&#xff0c;如下&#xff1a; 引脚按键PA25按键1脚GND按键3脚PA29蜂鸣器触发脚 载入方案 我们使用的开发板是 R128-Devkit&#xff0c;需要开发 C906 核心的应用程序&#xff0c;所以载入方案选择r128s2_module_c906 $ source envsetup.sh…

ChatGPT初体验:注册、API Key获取与ChatAPI调用详解

自从2022年10月&#xff0c;ChatGPT诞生以后&#xff0c;实际上已经改变了很多&#xff01;其火爆程度简直超乎想象&#xff0c;一周的时间用户过百万&#xff0c;两个月的时间用户过亿。 目前ChatGPT4已经把2023年4月以前的人类的知识都学习到了&#xff0c;在软件工程里面&am…

echarts 通用线性图

echarts 通用线性图 getLineData() {const myChart echarts.init(this.$refs.chartDom);const option {tooltip: {trigger: axis,},legend: {show: false,textStyle: {fontSize: 14, //字体大小color: #ffffff, //字体颜色},data: [AAA, BBB],},grid: {show: true,left: 10%,…

Linux进程状态(僵尸进程,孤儿进程)+进程优先级+进程调度与切换

Linux进程状态[僵尸进程,孤儿进程]进程优先级 一.进程状态1.进程排队2.教材上对于进程状态的描述:1.阻塞挂起 3.Linux下具体的进程状态:1.Linux下的进程状态数组2.R3.S:可终止睡眠---浅度睡眠1.补充:前台进程和后台进程2.一种"奇怪"的现象 4.D:不可终止睡眠---深度睡…

如何避免光模块接口受到污染?

光模块作为光通信领域一个重要的配件&#xff0c;实现光电和电光的转换&#xff0c;和光纤连接&#xff0c;承载了数据流量的快速转换与传输。因而在整个网络体系中&#xff0c;起着至关重要的作用。虽然光模块在使用过程中&#xff0c;不像交换机和服务器等网络设备一样需要经…

echarts 自定义提示样式

在setOption中添加自定义样式 tooltip: {trigger: axis,formatter: (params)> {// console.log(params);var result if(params[0] && params[1]){result 发电量对比<div style"background:#F4F7FC;padding:5px;margin:5px 0px;border-radius:6px"&…

简易版王者荣耀

所有包和类 GameFrame类 package newKingOfHonor;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList;im…

前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案一:编译项目时动态生成一个记录版本号的文件

前言 当我们重新部署前端项目的时候&#xff0c;如果用户一直停留在页面上并未刷新使用&#xff0c;会存在功能使用差异性的问题&#xff0c;因此&#xff0c;当前端部署项目后&#xff0c;需要提醒用户有去重新加载页面。 技术框架 vue、js、webpack 解决方案 编译项目时动…

MacOS14 Sonoma 安装 Flutter 开发环境

本文针对 小白用户也包括自己&#xff0c;以前都是将这些写入我的有道云笔记。为了让给多人看见或者说自己更好的浏览&#xff0c;先将其记录如下。 朋友介绍一个项目说要开发一款App&#xff0c;最近也是闲着就答应下来。主要功能是通过蓝牙BLE控制设备的一个 Iot边缘设备&…

2020年06月 Scratch(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共15题,每题2分,共30分) 第1题 执行下图程序后,“花名”列表的第3项是? A:莲花 B:丁香 C:合欢 D:月季 答案:C 列表基本知识,选C。 第2题 执行如下图所示程序后,其结果为? A: B:

P2704 [NOI2001] 炮兵阵地 题解

P2704 题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示 解题思路分析Code更多方法 题目 原题链接 题目描述 司令部的将军们打算在 N M N\times M NM 的网格地图上部署他们的炮兵部队。 一个 N M N\times M NM 的地图由 N N N 行 M M M 列组成&#x…

解决视口动画插件jquery.aniview.js使用animate.css时无效的问题(最新版本网页视口动画插件的使用及没作用、没反应)

当网站页面元素进入视口时自动应用过渡效果。CSS过渡效果可以为网页添加动画效果&#xff0c;并提供了一种平滑的转换方式&#xff0c;使元素的变化更加流畅和生动。而通过jQuery插件来获取页面滚动位置决定合适调用动画效果。 一、官网 animate.css官网 一款强大的预设css3动…