Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
yannier912 opened this issue Jul 11, 2021 · 28 comments
Open

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

yannier912 opened this issue Jul 11, 2021 · 28 comments
Labels
question Further information is requested

Comments

@yannier912
Copy link

您好!我之前用您此版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
Copy link
Author

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

@begeekmyfriend
Copy link
Owner

begeekmyfriend commented Jul 13, 2021

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

@morphr5466
Copy link

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

@yannier912
Copy link
Author

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

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

@yannier912
Copy link
Author

可以从以下方面考虑:
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
Copy link
Owner

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

1 similar comment
@begeekmyfriend
Copy link
Owner

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

@yannier912
Copy link
Author

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

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

@begeekmyfriend
Copy link
Owner

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

1 similar comment
@begeekmyfriend
Copy link
Owner

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

@morphr5466
Copy link

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

@yannier912
Copy link
Author

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

@begeekmyfriend
Copy link
Owner

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

@yannier912
Copy link
Author

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

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

@begeekmyfriend
Copy link
Owner

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

@yannier912
Copy link
Author

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

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

@morphr5466
Copy link

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

@yannier912
Copy link
Author

从您的描述来看,应该没有问题,也许可以检查一下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
Copy link

我参考了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
Copy link
Author

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

@begeekmyfriend begeekmyfriend added the question Further information is requested label Jul 13, 2021
@yannier912
Copy link
Author

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

@morphr5466
Copy link

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

@yannier912
Copy link
Author

@morphr5466

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

@yannier912
Copy link
Author

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

@morphr5466
Copy link

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

@yannier912
Copy link
Author

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

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

@morphr5466
Copy link

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

@yannier912
Copy link
Author

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

3 participants