utils.py 888 B

1234567891011121314151617181920212223242526272829
  1. import torch
  2. def squeeze(x, x_mask=None, n_sqz=2):
  3. b, c, t = x.size()
  4. t = (t // n_sqz) * n_sqz
  5. x = x[:, :, :t]
  6. x_sqz = x.view(b, c, t // n_sqz, n_sqz)
  7. x_sqz = x_sqz.permute(0, 3, 1, 2).contiguous().view(b, c * n_sqz, t // n_sqz)
  8. if x_mask is not None:
  9. x_mask = x_mask[:, :, n_sqz - 1::n_sqz]
  10. else:
  11. x_mask = torch.ones(b, 1, t // n_sqz).to(device=x.device, dtype=x.dtype)
  12. return x_sqz * x_mask, x_mask
  13. def unsqueeze(x, x_mask=None, n_sqz=2):
  14. b, c, t = x.size()
  15. x_unsqz = x.view(b, n_sqz, c // n_sqz, t)
  16. x_unsqz = x_unsqz.permute(0, 2, 3, 1).contiguous().view(b, c // n_sqz, t * n_sqz)
  17. if x_mask is not None:
  18. x_mask = x_mask.unsqueeze(-1).repeat(1, 1, 1, n_sqz).view(b, 1, t * n_sqz)
  19. else:
  20. x_mask = torch.ones(b, 1, t * n_sqz).to(device=x.device, dtype=x.dtype)
  21. return x_unsqz * x_mask, x_mask