code: def test_correct_shape_compute_af_at_sample_rate(self, audio_len_sec):
      audio_sin = gen_np_sinusoid(
          self.frequency, self.amp, self.sample_rate, audio_len_sec
      )
      exp_length = self.expected_length(audio_sin)
      audio_features = ddsp_metrics.compute_audio_features(
          audio_sin, frame_rate=self.frame_rate
      )
  
      self.validate_output_shapes(
          audio_features,
          {
              "audio": audio_len_sec * self.sample_rate,
              "f0_hz": exp_length,
              "f0_confidence": exp_length,
              "loudness_db": exp_length,
          },
      )
  
imports: from unittest import mock
  from absl.testing import parameterized
  import ddsp
  from ddsp.test_util import gen_np_batched_sinusoids
  from ddsp.test_util import gen_np_sinusoid
  import ddsp.training.metrics
  import numpy
  import tensorflow.compat.v2
label_desc: Use image node_id 4 for calling the ComputeAudioFeaturesTest obj's underlying member method code with example usage: obj.test_correct_shape_compute_af_at_sample_rate(audio_len_sec) without return types