| 117 | |
| 118 | |
| 119 | class PitchExtractor(nn.Module): |
| 120 | def __init__(self, n_mel_bins=80, conv_layers=2): |
| 121 | super().__init__() |
| 122 | self.hidden_size = hparams['hidden_size'] |
| 123 | self.predictor_hidden = hparams['predictor_hidden'] if hparams['predictor_hidden'] > 0 else self.hidden_size |
| 124 | self.conv_layers = conv_layers |
| 125 | |
| 126 | self.mel_prenet = Prenet(n_mel_bins, self.hidden_size, strides=[1, 1, 1]) |
| 127 | if self.conv_layers > 0: |
| 128 | self.mel_encoder = ConvStacks( |
| 129 | idim=self.hidden_size, n_chans=self.hidden_size, odim=self.hidden_size, n_layers=self.conv_layers) |
| 130 | self.pitch_predictor = PitchPredictor( |
| 131 | self.hidden_size, n_chans=self.predictor_hidden, |
| 132 | n_layers=5, dropout_rate=0.1, odim=2, |
| 133 | padding=hparams['ffn_padding'], kernel_size=hparams['predictor_kernel']) |
| 134 | |
| 135 | def forward(self, mel_input=None): |
| 136 | ret = {} |
| 137 | mel_hidden = self.mel_prenet(mel_input)[1] |
| 138 | if self.conv_layers > 0: |
| 139 | mel_hidden = self.mel_encoder(mel_hidden) |
| 140 | |
| 141 | ret['pitch_pred'] = pitch_pred = self.pitch_predictor(mel_hidden) |
| 142 | |
| 143 | pitch_padding = mel_input.abs().sum(-1) == 0 |
| 144 | use_uv = hparams['pitch_type'] == 'frame' and hparams['use_uv'] |
| 145 | |
| 146 | ret['f0_denorm_pred'] = denorm_f0( |
| 147 | pitch_pred[:, :, 0], (pitch_pred[:, :, 1] > 0) if use_uv else None, |
| 148 | hparams, pitch_padding=pitch_padding) |
| 149 | return ret |
no outgoing calls