PaddlePaddle / Parakeet

PAddle PARAllel text-to-speech toolKIT (supporting Tacotron2, Transformer TTS, FastSpeech2/FastPitch, SpeedySpeech, WaveFlow and Parallel WaveGAN)
Other
599 stars 83 forks source link

fastspeech2 save to static bug ? #183

Closed outman2008 closed 3 years ago

outman2008 commented 3 years ago

import sys import numpy as np import paddle from matplotlib import pyplot as plt from IPython import display as ipd import soundfile as sf import librosa.display import yaml from yacs.config import CfgNode from paddle.static import InputSpec from paddle.jit import TracedLayer from parakeet.models.fastspeech2 import FastSpeech2, FastSpeech2Inference from parakeet.modules.normalizer import ZScore

fastspeech2_config = {} with open("fastspeech2_nosil_baker_ckpt_0.4/default.yaml") as f: fastspeech2_config = CfgNode(yaml.safe_load(f)) odim = fastspeech2_config.n_mels model = FastSpeech2(idim=10,odim=odim,**fastspeech2_config["model"]) state_dict = paddle.load("fastspeech2_nosil_baker_ckpt_0.4/snapshot_iter_76000.pdz")["main_params"] model.set_state_dict(state_dict) model.eval()

stat = np.load("fastspeech2_nosil_baker_ckpt_0.4/speech_stats.npy") mu, std = stat mu = paddle.to_tensor(mu) std = paddle.to_tensor(std) fastspeech2_normalizer = ZScore(mu, std) fastspeech2_inference = FastSpeech2Inference(fastspeech2_normalizer, model) fastspeech2_inference.eval() input_var = paddle.to_tensor([0]) fastspeech2_model = paddle.jit.to_static(fastspeech2_inference,input_spec=[input_var]) paddle.jit.save(fastspeech2_model,"fastspeech2.pdmodel")

error: File "/usr/local/lib/python3.7/dist-packages/paddle/fluid/dygraph/dygraph_to_static/convert_operators.py", line 235, in _run_py_ifelse return true_fn(true_args) if pred else false_fn(false_args) File "/content/Parakeet/parakeet/modules/nets_utils.py", line 81, in make_pad_mask ( user code ) lengths = lengths.tolist() AttributeError: 'Variable' object has no attribute 'tolist'

我跟了下代码,发现是在里面的 parakeet/models/fastspeech2.py 513 行 x = paddle.cast(text, 'int64') 这个方法执行失败了导致 x=null 进一步发现 paddle.cast paddle.to_tensor 这些方法都会出问题, 单独执行就没问题,不知道是不是to_static的bug还是什么其他原因?

yt605155624 commented 3 years ago

您好,由于 fastspeech2 实现上的一些问题(例如某些算子paddle不支持,自己用了 numpy 实现,transformer结构等),目前 fastspeech2 动转静确实有问题,目前 parakeet 支持动转静的只有 speedyspeech 和 pwgan,抱歉

yt605155624 commented 3 years ago

同时您进行动转静的时候需要用最新的 develop paddle,该版本将会在十月正式上线

outman2008 commented 3 years ago

同时您进行动转静的时候需要用最新的 develop paddle,该版本将会在十月正式上线

感谢你这么快就回复了,我现在就想把这个模型转静态后用到手机上 ,用paddle lite运行 等不了那么久了,有什么办法么?自己写代码很复杂吗?

yt605155624 commented 3 years ago

用 develop paddle 是一方面(官网有安装方式),最主要的问题是 fastspeech2 用了 mask 操作(paddle 不支持,自己实现的),而且涉及到语音变长的问题等,具体的动转静的坑我没有踩过,没办法说自己写代码是否复杂,而且 fastspeech2 模型实在是太大了,放到 lite 里面不太现实,https://paddlespeech.bj.bcebos.com/Parakeet/speedyspeech_pwg_inference_0.4.zip 提供了动转静后的 speedyspeech 和 pwgan 的模型,您可以先试试

outman2008 commented 3 years ago

TensorflowTTS 的 fastspeech2 模型我转过,只不过原模型才30多M,转后才15M 使用发现效果不是很理想,遇到特别长的句子后面读音就乱了。看了下代码,他的fastspeech2.v2.yaml配置做了裁剪,比原始的少了很多层,不知道是不是为了减少模型大小牺牲了质量。 Parakeet 的 fastspeech2 应该是参考的 pytorch 的fastspeech2 模型。 两者的效果都比较好,就是没法转手机上,pytorch 的我也没转成功

yt605155624 commented 3 years ago

动转静这件事儿我确实没有尝试过,但是 "遇到特别长的句子后面读音就乱了" 这件事儿我猜测和和剪裁没有太大关系,这是 fastspeech 系列模型固有的问题, 因为 fastspeech 不是自回归模型,虽然用了 position encoding 但是对特别长的句子表现也不好,如果 pytorch 和 paddle 的动转静都没办法成功,我建议您对 tensorflow 的模型的输入文本做一下简单的预处理(比如按照标点符号切分,按照句子送入模型),可以参考我们的文本前端实现。https://github.com/PaddlePaddle/Parakeet/blob/develop/parakeet/frontend/cn_normalization/text_normlization.py

outman2008 commented 3 years ago

谢谢了,文本预处理我也做了一些,而且还处理了英文字母发音。只是没有想到断句。 文本太长读音会乱,只是一方面,TensorflowTTS fastspeech 读音偏快,听着感觉很慌,不自然,这个也是我不想用的原因 我试试 speedyspeech 吧,再次感谢

yt605155624 commented 3 years ago

读音偏快可能是和训练预料有关,不同说话人的 duration 性质是不一样的,同时 fastspeech 是可以自己输入duration的,比如您对原生的 duration 乘个系数,但是这就要求过两遍模型了,预测速度可能会慢。加油

outman2008 commented 3 years ago

speedyspeech 也有句子太长,读音会乱的问题,将merge_sentences=False改了,将句子断开就好了

yt605155624 commented 3 years ago

是的呢, speedyspeech 是基于 fastspeech 改的,都是非自回归模型

yt605155624 commented 3 years ago

上述报错是因为 input_spec 输入不对,可以按照如下输入 fastspeech2_inference = jit.to_static( fastspeech2_inference, input_spec=[ InputSpec([-1], dtype=paddle.int64) ]) (但是还会有别的问题)

yt605155624 commented 3 years ago

fastspeech2 可以动转静了 https://github.com/PaddlePaddle/DeepSpeech/pull/948/files