如何恢复训练好的Tacotron2模型并解决调用infer方法报错问题
错误原因
你调用的是NeMo框架封装的Tacotron2Model类,该类没有infer方法,你参考的PyTorch Hub原生NVIDIA Tacotron2接口和NeMo封装后的接口不通用,这是报错的核心原因。
修正后的可运行代码
from nemo.collections.tts.models import Tacotron2Model import torch # 加载你训练好的NeMo格式Tacotron2模型 check_point_path = '/content/drive/My Drive/***/checkpoints/' tacotron2 = Tacotron2Model.restore_from(check_point_path + 'Tacotron2.nemo') tacotron2 = tacotron2.to('cuda') tacotron2.eval() # 加载WaveGlow声码器 waveglow = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_waveglow', model_math='fp16') waveglow = waveglow.remove_weightnorm(waveglow) waveglow = waveglow.to('cuda') waveglow.eval() text = "你需要生成的文本内容" with torch.no_grad(): # 先用Tacotron2自带的parse方法处理文本,得到编码后的序列 parsed_text = tacotron2.parse(text) # 调用generate方法生成mel谱,这是NeMo封装的正确接口 mel_spec, _, _ = tacotron2.generate(**parsed_text) # 声码器生成音频 audio = waveglow.infer(mel_spec) audio_numpy = audio[0].data.cpu().numpy() rate = 22050 from IPython.display import Audio Audio(audio_numpy, rate=rate)
单独提取Mel谱的方法
如果你不需要生成音频,只需要输出mel谱,直接取generate方法的第一个返回值即可,得到的是张量格式的mel谱,shape为[batch_size, mel_bins, time_steps],可以按需转成numpy格式保存。
注意事项
- 如果你训练Tacotron2时用的文本标注规则(比如音素/字符编码、特殊符号定义)和默认配置不同,要确保输入文本和训练时的预处理规则一致,避免生成效果异常
- 如果WaveGlow推理时出现维度不匹配报错,可以检查mel谱的维度,部分版本的NeMo输出的mel谱可能需要调整维度顺序适配WaveGlow,只需调用
mel_spec = mel_spec.transpose(1,2)调整即可
内容的提问来源于stack exchange,提问作者Majid Adibian
相关产品推荐
相关产品推荐

