padding.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. import numpy as np
  2. import torch
  3. from torch.nn.utils.rnn import pad_sequence
  4. def padding(data, float_pad_value=0.0, int_pad_value=-1):
  5. assert isinstance(data, list)
  6. assert "key" in data[0]
  7. assert "speech" in data[0] or "text" in data[0]
  8. keys = [x["key"] for x in data]
  9. batch = {}
  10. data_names = data[0].keys()
  11. for data_name in data_names:
  12. if data_name == "key" or data_name =="sampling_rate":
  13. continue
  14. else:
  15. if data[0][data_name].dtype.kind == "i":
  16. pad_value = int_pad_value
  17. tensor_type = torch.int64
  18. else:
  19. pad_value = float_pad_value
  20. tensor_type = torch.float32
  21. tensor_list = [torch.tensor(np.copy(d[data_name]), dtype=tensor_type) for d in data]
  22. tensor_lengths = torch.tensor([len(d[data_name]) for d in data], dtype=torch.int32)
  23. tensor_pad = pad_sequence(tensor_list,
  24. batch_first=True,
  25. padding_value=pad_value)
  26. batch[data_name] = tensor_pad
  27. batch[data_name + "_lengths"] = tensor_lengths
  28. return keys, batch