begeekmyfriend / tacotron2

Forked from NVIDIA/tacotron2 and merged with Rayhane-mamah/Tacotron-2
BSD 3-Clause "New" or "Revised" License
81 stars 38 forks source link

请教tacotron2与melgan结合的问题 #39

Open yannier912 opened 3 years ago

yannier912 commented 3 years ago

您好!我之前用您此版taco2训练,结合wavernn效果很好。 但由于wavernn合成速度太慢,试着训练了melgan melgan用的taco2预处理生成的trainingdata,训练到400step我测了一下,用trainingdata里的mel输入melgan合成语音效果较好,但用taco2模型生成的mel输入到melgan合成完全不正常,wave 参数我基本没有改,请问您有用taco2+melgan吗,效果如何? 我把taco2和melgan配置参数贴下,麻烦您帮忙看下是哪里出了问题呢?非常感谢!!! 【taco2参数:】

#Audio
num_mels = 80, #Number of mel-spectrogram channels and local conditioning dimensionality
rescale = False, #Whether to rescale audio prior to preprocessing
rescaling_max = 0.999, #Rescaling value
trim_silence = True, #Whether to clip silence in Audio (at beginning and end of audio only, not the middle)
clip_mels_length = True, #For cases of OOM (Not really recommended, working on a workaround)
max_mel_frames = 900,  #Only relevant when clip_mels_length = True
max_text_length = 300,  #Only relevant when clip_mels_length = True
sentence_span = 20,  # Number of mel hops for each sentence interval

#Mel spectrogram
n_fft = 1024, #Extra window size is filled with 0 paddings to match this parameter
hop_size = 256, #For 22050Hz, 256 ~= 11.5 ms
win_size = 1024, #For 22050Hz, 1024 ~= 46 ms (If None, win_size = n_fft)
sample_rate = 22050, #22050 Hz (corresponding to ljspeech dataset)
frame_shift_ms = None,
preemphasis = 0.97, # preemphasis coefficient

#Multi-speaker batch_size should be integer multiplies number of speakers.
anchor_dirs = ['Biaobei', 'Aida', 'Aimei', 'Sicheng', 'Siyue'],

#M-AILABS (and other datasets) trim params
trim_fft_size = 512,
trim_hop_size = 128,
trim_top_db = 60,

#Mel and Linear spectrograms normalization/scaling and clipping
signal_normalization = True,
allow_clipping_in_normalization = True, #Only relevant if mel_normalization = True
symmetric_mels = True, #Whether to scale the data to be symmetric around 0
max_abs_value = 4., #max absolute value of data. If symmetric, data will be [-max, max] else [0, max]

#Limits
min_level_db = -100,
ref_level_db = 20,
fmin = 50, #Set this to 75 if your speaker is male! if female, 125 should help taking off noise. (To test depending on dataset)
fmax = 7600,

#Griffin Lim
power = 1.2,
griffin_lim_iters = 60,

【melgan配置:】

data: # root path of train/validation data (either relative/absoulte path is ok)
  train: '/data/tts/melgan/training_data'
  validation: '/data/tts/melgan/training_data'
---
train:
  rep_discriminator: 1
  num_workers: 8
  batch_size: 48
  optimizer: 'adam'
  epochs: 1000
  amp: true
  amp_level: 'O0'
  adam:
    init_lr: 0.0001
    final_lr: 0.00001
    beta1: 0.5
    beta2: 0.9
---
audio:
  n_bits: 9
  n_mel_channels: 80
  segment_length: 16384 # 256 * 64
  pad_short: 2000
  filter_length: 1024
  hop_length: 256 # WARNING: this can't be changed.
  win_length: 1024
  sampling_rate: 22050
  mel_fmin: 50.0
  mel_fmax: 7600.0
  mel_pad_val: -4.0
---
model:
  feat_match: 10.0
---
log:
  summary_interval: 1
  validation_interval: 5
  save_interval: 25
  chkpt_dir: 'chkpt'
  log_dir: 'logs'
yannier912 commented 3 years ago

这是melgan的loss,看着似乎也不太对的样子? image

begeekmyfriend commented 3 years ago

我已经不从事深度学习了,感觉你可以拿70K step的模型再试一试,另外,我自己的WaveRNN里面,设置了mel padding value,你可以在MelGAN里面同步设置一下

morphr5466 commented 3 years ago

可以从以下方面考虑: 1.taco2生成的mel和准备gta文件时会有差距(准备gta文件时用到了teacher force),这可能导致声码器合成结果不好,如果在训练声码器时没有采用gta,这种差距会进一步放大(说白了就是taco2合成的mel谱和你用于训练声码器的mel谱不一致) 2.看一下预处理的代码,melgan和taco2的预处理不一致的话也会有上述这个问题。 3.试试parallel wavgan

yannier912 commented 3 years ago

我已经不从事深度学习了,感觉你可以拿70K step的模型再试一试,另外,我自己的WaveRNN里面,设置了mel padding value,你可以在MelGAN里面同步设置一下

感谢回复,我在melgan配置文件里加了mel_pad_val: -4.0的

yannier912 commented 3 years ago

可以从以下方面考虑: 1.taco2生成的mel和准备gta文件时会有差距(准备gta文件时用到了teacher force),这可能导致声码器合成结果不好,如果在训练声码器时没有采用gta,这种差距会进一步放大(说白了就是taco2合成的mel谱和你用于训练声码器的mel谱不一致) 2.看一下预处理的代码,melgan和taco2的预处理不一致的话也会有上述这个问题。 3.试试parallel wavgan

@morphr5466 您好,感谢提供思路~

  1. 我训练melgan是非gta,直接将taco2预处理的mel训练的melgan。之前训练wavernn也是非gta效果还不错。接下来我尝试一下gta训练melgan,但之前没用过gta不太懂teacher force是什么
  2. 预处理参数比如fft size、hot size、mel min max等我都调整一致了,但两者处理过程不是完全一致的。这里有个疑问,taco2和melgan都是用的taco2预处理的wav和mel训练,所以melgan的预处理是没有用到的是吧?那预处理不一致还会影响结果吗?
  3. parallel wavegan了解过,还没尝试,因为也涉及到和taco2结合的问题,我担心melgan调不好,wavegan也调不好,最后两边都没成。。。。请问您有taco2和melgan或parallel wavegan结合的资料或git代码吗,谢谢~~
begeekmyfriend commented 3 years ago

Teacher force的意思是,在生成下一帧时,上一帧用的时ground truth,还是上一次循环生成的帧,前者就是teacher force,用[0, 1]概率过渡就是soft teacher force。 taco2的预处理我是照搬Rayhane-mamah/Tacotron-2的,个人觉得纯粹DSP要比原版那个CNN处理效果好,没有音质上的loss(无非就是量化时候轻微损失)。MelGAN训练可以直接用GTA mel

begeekmyfriend commented 3 years ago

Teacher force的意思是,在生成下一帧时,上一帧用的时ground truth,还是上一次循环生成的帧,前者就是teacher force,用[0, 1]概率过渡就是soft teacher force。 taco2的预处理我是照搬Rayhane-mamah/Tacotron-2的,个人觉得纯粹DSP要比原版那个CNN处理效果好,没有音质上的loss(无非就是量化时候轻微损失)。MelGAN训练可以直接用GTA mel

yannier912 commented 3 years ago

@begeekmyfriend 收到,我用gta mel训练一下melgan。但我还有两个疑问

  1. 我用非gta模式,也就是直接将taco2预处理生成的mel训练melgan,那melgan的预处理代码相当于没有用了是吗?训练阶段和合成阶段都没有用到,所以是否也不存在把taco2和melgan预处理保持一致的问题了?
  2. 我看您melgan的配置文件设置了mel_pad_val: -4.0,是为了和taco2对齐吧,但这个是在哪里用到的呢? 疑问比较多,谢谢耐心指导!~~
begeekmyfriend commented 3 years ago

预处理只要在Tacotron那边做就好,vocoder只要mel + wav,而且两者长度一致(比如一帧对应256个samples) mel_pad_val表示mel最低值,相当于静音,比它还小就会截断

begeekmyfriend commented 3 years ago

预处理只要在Tacotron那边做就好,vocoder只要mel + wav,而且两者长度一致(比如一帧对应256个samples) mel_pad_val表示mel最低值,相当于静音,比它还小就会截断

morphr5466 commented 3 years ago

1.我也建议您用GTA训练。 2.如果预处理的代码都是用taco2的就不存在这个问题了,我在使用parallel wavegan时也是将它的预处理改写成与taco一致。 3.https://github.com/kan-bayashi/ParallelWaveGAN 预处理的代码见 parallel/wavegan/bin/preprocess.py logmelfilterbank

yannier912 commented 3 years ago

@morphr5466 关于您说的第二点“预处理的代码都是用taco2”,我现在是这样处理的:并没有把melgan的process用taco2的process替换,而是用taco2的process生成了wav和mel,作为taco2和melgan的训练数据。这算是保持一致吗?因为我理解后面训练、训练结束后加载模型合成语音 都没有再用到process代码了,我理解的对吗

begeekmyfriend commented 3 years ago

只要生成mel谱,后面跟预处理无关了

yannier912 commented 3 years ago

只要生成mel谱,后面跟预处理无关了

嗯嗯,那我的训练没有问题,不知道为什么合成出来全是噪音。只能试一下gta了

begeekmyfriend commented 3 years ago

全是噪声的话,恐怕哪里出错了,你试着用Ground Truth同样的语句合成一下?

yannier912 commented 3 years ago

全是噪声的话,恐怕哪里出错了,你试着用Ground Truth同样的语句合成一下?

Ground Truth就是taco2预处理生成的mel吧?这个合成效果是好的

morphr5466 commented 3 years ago

从您的描述来看,应该没有问题,也许可以检查一下taco2生成的mel 是不是[-4, 4],如果是的话把它+4 / 8再送给melgan

yannier912 commented 3 years ago

从您的描述来看,应该没有问题,也许可以检查一下taco2生成的mel 是不是[-4, 4],如果是的话把它+4 / 8再送给melgan

@morphr5466 我把taco2预处理的mel通过np.load导入,最小值-4最大2.15,同样方法taco2模型生成的mel最大值-0.23最小-12.25,说明就是频谱范围不一致了是吧?我把mel/np.max(np.abs(mel))*4这样处理后,给到melgan合成语音还是不对,和之前差异不大,您听一下 原wav 修改mel范围后

morphr5466 commented 3 years ago

我参考了begeekmyfriend和fatchord的代码,在我自己的预处理中,mel谱经过归一化之后变成[0, 1] 而训练时做了Y = (Y * 8.) - 4,使mel谱范围变成了[-4, 4],这使得taco模型生成的mel谱范围也是[-4, 4],这算是一种训练技巧吧。而声码器如果使用预处理的mel谱训练,其范围是[0,1],所以需要把taco生成的mel谱缩回到[0,1],Y = (Y + 4) / 8。 至于您的代码中是否有这样的操作,这个需要您查看一下了。另外生成GTA时我都是把mel谱限制在[0, 1]范围内的。

yannier912 commented 3 years ago

@morphr5466 我明白您说的意思了,我去看一下我的代码!非常感谢!!!!

yannier912 commented 3 years ago

@morphr5466 我仔细看了作者begeekmyfriend的taco2,预处理生成了audio和mel,但是在训练时候读取的是audio,然后由audio重新计算mel。我改成了训练时候直接读取mel,这样taco2和melgan训练都用的预处理生成的mel。 现在melgan训练到175epoch,合成不再是杂音了,但效果还是很差。而且用训练的mel合成也是一样效果:您听一下 是训练时长不够吗?感觉还是哪里有问题。。。 当前melgan的loss image

morphr5466 commented 3 years ago

1.可以用griffinlim生成音频检测taco2的模型是否训练正常,会有杂音,但是能听清讲话的内容。 2.我没有尝试过melgan,我建议您参考一下其他人训练melgan的平均时长,按我的经验声码器一般要训练3~5天。 3.这个loss看起来是非常大的,而且generator的loss一致在上升,确实有些奇怪。

yannier912 commented 3 years ago

@morphr5466

  1. griffinlim生成音频是正常的
  2. 当前训练数据12000条,单人音色,总时长约20小时。那我再等等看看。
  3. 正常dloss和gloss都应该下降是吗?我不太懂这块,因为看作者贴出的图gloss也是上升的。 感谢您的耐心回复!!!太谢谢了~~
yannier912 commented 3 years ago

@morphr5466 您好!之前果然是训练时间太短了,我接着训练下去,现在到3700epoch了,效果提升了很多。 不过比wavernn还是差很多,语调怪怪的在飘一样,也有回音的感觉。您空了听下: melgan wavernn 请问您训练的parallel wavegan效果好吗?跟wavernn差得远吗?melgan的速度倒真是快太多了!

morphr5466 commented 3 years ago

parallel_wavegan.zip 这是以parallel_wavegan的结果,感觉还是比较接近wavernn的,推论速度比wavernn快很多。

yannier912 commented 3 years ago

parallel_wavegan.zip 这是以parallel_wavegan的结果,感觉还是比较接近wavernn的,推论速度比wavernn快很多。

请问是多大数据集,训练了几天的效果呢?听着效果很好呢,我有时间也试一下parallel_wavegan

morphr5466 commented 3 years ago

标贝数据集:https://weixinxcxdb.oss-cn-beijing.aliyuncs.com/gwYinPinKu/BZNSYP.rar non-attentive-tacotorn和parallel_wavegan各自训练两天多。

yannier912 commented 3 years ago

标贝数据集:https://weixinxcxdb.oss-cn-beijing.aliyuncs.com/gwYinPinKu/BZNSYP.rar non-attentive-tacotorn和parallel_wavegan各自训练两天多。

感谢!我之前也一直用标贝数据集,回头训练有效果了给您同步。太感谢啦!!