Example (no batch dim version): 1. dur = [2,2,3] 2. token_idx = [[1],[2],[3]], dur_cumsum = [2,4,7], dur_cumsum_prev = [0,2,4] 3. token_mask = [[1,1,0,0,0,0,0], [0,0,1,1,0,0,0], [0,0,0,0,1,1,1]]
(self, dur, dur_padding=None, alpha=1.0)
| 157 | self.pad_value = pad_value |
| 158 | |
| 159 | def forward(self, dur, dur_padding=None, alpha=1.0): |
| 160 | """ |
| 161 | Example (no batch dim version): |
| 162 | 1. dur = [2,2,3] |
| 163 | 2. token_idx = [[1],[2],[3]], dur_cumsum = [2,4,7], dur_cumsum_prev = [0,2,4] |
| 164 | 3. token_mask = [[1,1,0,0,0,0,0], |
| 165 | [0,0,1,1,0,0,0], |
| 166 | [0,0,0,0,1,1,1]] |
| 167 | 4. token_idx * token_mask = [[1,1,0,0,0,0,0], |
| 168 | [0,0,2,2,0,0,0], |
| 169 | [0,0,0,0,3,3,3]] |
| 170 | 5. (token_idx * token_mask).sum(0) = [1,1,2,2,3,3,3] |
| 171 | |
| 172 | :param dur: Batch of durations of each frame (B, T_txt) |
| 173 | :param dur_padding: Batch of padding of each frame (B, T_txt) |
| 174 | :param alpha: duration rescale coefficient |
| 175 | :return: |
| 176 | mel2ph (B, T_speech) |
| 177 | """ |
| 178 | assert alpha > 0 |
| 179 | dur = torch.round(dur.float() * alpha).long() |
| 180 | if dur_padding is not None: |
| 181 | dur = dur * (1 - dur_padding.long()) |
| 182 | token_idx = torch.arange(1, dur.shape[1] + 1)[None, :, None].to(dur.device) |
| 183 | dur_cumsum = torch.cumsum(dur, 1) |
| 184 | dur_cumsum_prev = F.pad(dur_cumsum, [1, -1], mode='constant', value=0) |
| 185 | |
| 186 | pos_idx = torch.arange(dur.sum(-1).max())[None, None].to(dur.device) |
| 187 | token_mask = (pos_idx >= dur_cumsum_prev[:, :, None]) & (pos_idx < dur_cumsum[:, :, None]) |
| 188 | mel2ph = (token_idx * token_mask.long()).sum(1) |
| 189 | return mel2ph |
| 190 | |
| 191 | |
| 192 | class PitchPredictor(torch.nn.Module): |