在Tacotron训练Notebook中遇TypeError错误,求解决方案
问题解决:Tacotron训练中
TypeError: mel() takes 0 positional arguments but 5 were given 错误分析
报错核心是mel()函数被传入5个参数,但该函数定义未接收任何参数。结合你提供的create_mels()代码,问题出在TacotronSTFT类内部的mel函数实现,而非create_mels()本身——给create_mels()加self完全无效,因为它不是类方法。
修复步骤
修正语法错误
你的save_mel函数最后一行末尾有多余的点,先删除:np.save(filename.replace('.wav', ''), melspec) # 去掉末尾的.检查并修正
TacotronSTFT类的mel函数
找到layers模块中的TacotronSTFT类,确保其中的mel方法(或调用的外部mel函数)定义正确:- 如果
mel是类成员方法,必须包含self参数,示例实现:class TacotronSTFT(nn.Module): def __init__(self, filter_length, hop_length, win_length, n_mel_channels, sampling_rate, mel_fmin, mel_fmax): super(TacotronSTFT, self).__init__() self.filter_length = filter_length self.mel_basis = librosa.filters.mel( sr=sampling_rate, n_fft=filter_length, n_mels=n_mel_channels, fmin=mel_fmin, fmax=mel_fmax ) # 其他初始化代码 def mel(self, specgram): # 正确接收self和输入频谱参数 return torch.matmul(specgram, torch.from_numpy(self.mel_basis).float().to(specgram.device)) def mel_spectrogram(self, audio): # 先计算线性频谱(需确保stft方法已正确实现) linear_spec = self.stft(audio) # 调用mel方法转换为梅尔频谱 return self.mel(linear_spec) - 如果
mel是独立函数,确保它接收所需的5个参数,示例:def mel(specgram, sampling_rate, n_mel_channels, mel_fmin, mel_fmax): mel_basis = librosa.filters.mel( sr=sampling_rate, n_fft=specgram.size(1), n_mels=n_mel_channels, fmin=mel_fmin, fmax=mel_fmax ) return torch.matmul(specgram, torch.from_numpy(mel_basis).float().to(specgram.device))
- 如果
验证参数传递匹配
确保你实例化TacotronSTFT时传入的hparams.filter_length等参数都已正确定义,且mel_spectrogram方法内部调用mel时的参数数量与mel函数定义完全匹配。
内容的提问来源于stack exchange,提问作者Tristan Killett
相关产品推荐
相关产品推荐

