code: def spectrogram_from_file(filename, step=10, window=20, max_freq=None,
                            eps=1e-14, overwrite=False, save_feature_as_csvfile=False):
      
  
      csvfilename = filename.replace(".wav", ".csv")
      if (os.path.isfile(csvfilename) is False) or overwrite:
          with soundfile.SoundFile(filename) as sound_file:
              audio = sound_file.read(dtype='float32')
              sample_rate = sound_file.samplerate
              if audio.ndim >= 2:
                  audio = np.mean(audio, 1)
              if max_freq is None:
                  max_freq = sample_rate / 2
              if max_freq > sample_rate / 2:
                  raise ValueError("max_freq must not be greater than half of "
                                   " sample rate")
              if step > window:
                  raise ValueError("step size must not be greater than window size")
              hop_length = int(0.001 * step * sample_rate)
              fft_length = int(0.001 * window * sample_rate)
  
              pxx, freqs = spectrogram(
                  audio, fft_length=fft_length, sample_rate=sample_rate,
                  hop_length=hop_length)
  
              ind = np.where(freqs <= max_freq)[0][-1] + 1
              res = np.transpose(np.log(pxx[:ind, :] + eps))
              if save_feature_as_csvfile:
                  np.savetxt(csvfilename, res)
              return res
      else:
          return np.loadtxt(csvfilename)
docs: Calculate the log of linear spectrogram from FFT energy
      Params:
          filename (str): Path to the audio file
          step (int): Step size in milliseconds between windows
          window (int): FFT window size in milliseconds
          max_freq (int): Only FFT bins corresponding to frequencies between
              [0, max_freq] are returned
          eps (float): Small value to ensure numerical stability (for ln(x))