class_docstr: Randomly permute and selects a subset of channels.
  
  Args:
      permute_channels (bool): Apply a random permutation of channels.
      num_channels_min (int): Minimum number of channels to select.
      num_channels_max (int): Max number of channels to select.
      rng: Optional, random generator.
      seed: Optional, seed for the generator.
code: def forward(self, input: torch.Tensor) -> torch.Tensor:
      # Expecting (B, C, T)
      assert input.ndim == 3, f"Expecting input with shape (B, C, T)"
      num_channels_in = input.size(1)
  
      if num_channels_in < self.num_channels_min:
          raise RuntimeError(
              f"Number of input channels ({num_channels_in}) is smaller than the min number of output channels ({self.num_channels_min})"
          )
  
      num_channels_max = (
          num_channels_in
          if self.num_channels_max is None
          else self.num_channels_max
      )
      num_channels_out = self._rng.randint(
          self.num_channels_min, num_channels_max
      )
  
      channels = list(range(num_channels_in))
  
      if self.permute_channels:
          self._rng.shuffle(channels)
  
      channels = channels[:num_channels_out]
  
      return input[:, channels, :]
  
imports: import random
  from typing import Callable, Optional
  import torch
  from nemo.collections.asr.parts.submodules.multi_head_attention import MultiHeadAttention
  from nemo.core.classes import NeuralModule, typecheck
  from nemo.core.neural_types import AudioSignal, FloatType, NeuralType, SpectrogramType
  from nemo.utils import logging
label_desc: Use image node_id 4 for calling the ChannelAugment obj's underlying member method code with example usage: obj.forward(input) and returns: input