code: def get_mfcc_features(
      audio: torch.Tensor,
      sampling_rate: float,
      num_mfccs: int,
      num_frames: int,
      window_length: float = 0.023,
  ) -> torch.Tensor:
      """Get MFCC features for a batch of audio data.
  
      Args:
          audio: the audio signal, in [batch_size, temporal_size, num_channels]
              order.
          sampling_rate: the sampling rate of the audio signal.
          num_mfccs: the number of coefficients to use.
          window_length: the window length used for computing the spectrogram. By
              default, we choose 23ms, which is a good value for human speech.
          num_frames: each MFCC spectrogram gets dividied into @num_frames frames
              (sub-time-slice temporal components) of length ceil(spectrogram_length/num_frames).
      Returns:
          MFCCs in [N, C, num_mfccs, num_frames, ceil(spectrogram_length/num_frames)] order.
      """
      if audio.dim() != 3:
          raise ValueError(f"Invalid audio.dim()={audio.dim()}")
      if audio.shape[2] != 2:
          raise ValueError(
              f"Invalid number of channels {audio.shape[2]}"
          )
      audio = audio.permute([0, 2, 1])
  
      features = calculate_mfccs(
          audio,
          sampling_rate,
          num_mfccs,
          window_length=window_length,
      )  # Size: [N, C, num_mfccs, T].
  
      return get_padded_features(
          features=features,
          num_frames=num_frames,
      )
  
imports: import math
  import torch
  from utils import logger
label_desc: Use image node_id 3 for calling a global function with example usage: get_mfcc_features(audio, sampling_rate, num_mfccs, num_frames, window_length) and returns: get_padded_features