code: def log_mel_spectrogram(data,
                          audio_sample_rate=8000,
                          log_offset=0.0,
                          window_length_secs=0.025,
                          hop_length_secs=0.010,
                          **kwargs):
    
    window_length_samples = int(round(audio_sample_rate * window_length_secs))
    hop_length_samples = int(round(audio_sample_rate * hop_length_secs))
    fft_length = 2 ** int(np.ceil(np.log(window_length_samples) / np.log(2.0)))
    spectrogram = stft_magnitude(
        data,
        fft_length=fft_length,
        hop_length=hop_length_samples,
        window_length=window_length_samples)
    mel_spectrogram = np.dot(spectrogram, spectrogram_to_mel_matrix(
        num_spectrogram_bins=spectrogram.shape[1],
        audio_sample_rate=audio_sample_rate, **kwargs))
    return np.log(mel_spectrogram + log_offset)
docs: Convert waveform to a log magnitude mel-frequency spectrogram.
  
    Args:
      data: 1D np.array of waveform data.
      audio_sample_rate: The sampling rate of data.
      log_offset: Add this to values when taking log to avoid -Infs.
      window_length_secs: Duration of each window to analyze.
      hop_length_secs: Advance between successive analysis windows.
      **kwargs: Additional arguments to pass to spectrogram_to_mel_matrix.
  
    Returns:
      2D np.array of (num_frames, num_mel_bins) consisting of log mel filterbank
      magnitudes for successive frames.