【问题标题】:is it possible to get exactly the same results from tensorflow mfcc and librosa mfcc?是否有可能从 tensorflow mfcc 和 librosa mfcc 获得完全相同的结果?
【发布时间】:2018-04-13 20:43:31
【问题描述】:

我正在尝试让 tensorflow mfcc 给我与 python lybrosa mfcc 相同的结果 我试图匹配 librosa 使用的所有默认参数 在我的 tensorflow 代码中得到了不同的结果

这是我使用的 tensorflow 代码:

waveform = contrib_audio.decode_wav(
 audio_binary,
 desired_channels=1,
 desired_samples=sample_rate,
 name='decoded_sample_data')


sample_rate = 16000

transwav = tf.transpose(waveform[0])

stfts = tf.contrib.signal.stft(transwav,
  frame_length=2048,
  frame_step=512,
  fft_length=2048,
  window_fn=functools.partial(tf.contrib.signal.hann_window, 
  periodic=False), 
  pad_end=True)

spectrograms = tf.abs(stfts)
num_spectrogram_bins = stfts.shape[-1].value
lower_edge_hertz, upper_edge_hertz, num_mel_bins = 0.0,8000.0, 128
linear_to_mel_weight_matrix = 
tf.contrib.signal.linear_to_mel_weight_matrix(
num_mel_bins, num_spectrogram_bins, sample_rate, lower_edge_hertz,
   upper_edge_hertz)
mel_spectrograms = tf.tensordot(
 spectrograms, 
 linear_to_mel_weight_matrix, 1)
mel_spectrograms.set_shape(spectrograms.shape[:-1].concatenate(
linear_to_mel_weight_matrix.shape[-1:]))
log_mel_spectrograms = tf.log(mel_spectrograms + 1e-6)
mfccs = tf.contrib.signal.mfccs_from_log_mel_spectrograms(
    log_mel_spectrograms)[..., :20]

librosa 中的等价物: libr_mfcc = librosa.feature.mfcc(wav, 16000)

以下是结果图表:

【问题讨论】:

    标签: audio tensorflow mfcc librosa


    【解决方案1】:

    我是tf.signal 的作者。很抱歉没有早点看到这篇文章,但是如果您在将信号传递给tf.signal.stft 之前将信号居中填充,则可以让 librosa 和tf.signal.stft 匹配。详情请见this GitHub issue

    【讨论】:

      【解决方案2】:

      我花了整整 1 天的时间试图让它们匹配。甚至 rryan 的解决方案对我也不起作用(在 librosa 中 center=False),但我终于发现,TF 和 librosa STFT 仅适用于 librosa 中的 win_length==n_fft 和 TF 中的 frame_length==fft_length 的情况。这就是 rryan 的 colab example 起作用的原因,但是您可以尝试如果设置 frame_length!=fft_length,幅度会非常不同(尽管在视觉上,绘制后的模式看起来很相似)。典型示例 - 如果您选择了一些 win_length/frame_length,然后您想将 n_fft/fft_length 设置为大于 win_length/frame_length 的 2 的最小幂,那么结果会有所不同。所以你需要坚持你的窗口大小给出的低效FFT......我不知道为什么会这样,但就是这样,希望它对某人有所帮助。

      【讨论】:

        【解决方案3】:

        contrib_audio.decode_wav 的输出应该是DecodeWav with { audio, sample_rate } 和audio shape 是 (sample_rate, 1),那么获取第一项波形并进行转置的目的是什么?

        transwav = tf.transpose(waveform[0])

        【讨论】:

        • 如果没有转置,它就无法工作,我得到了错误的形状错误。
        【解决方案4】:

        没有直接的方法,因为 librosa stft 使用 center=True 不符合 tf stft。 如果它是 center=False,stft tf/librosa 会给出足够接近的结果。见colab sniff

        但即便如此,尝试将 librosa 代码导入 tf 也是一件令人头疼的事情。这是我开始和放弃的。近但不够近。

        def pow2db_tf(X):
            amin=1e-10
            top_db=80.0
            ref_value = 1.0
            log10 = 2.302585092994046
            log_spec = (10.0/log10) * tf.log(tf.maximum(amin, X))
            log_spec -= (10.0/log10) * tf.log(tf.maximum(amin, ref_value))
            pow2db = tf.maximum(log_spec, tf.reduce_max(log_spec) - top_db)
            return pow2db
        
        
        def librosa_feature_like_tf(x, sr=16000, n_fft=2048, n_mfcc=20):
            mel_basis = librosa.filters.mel(sr, n_fft).astype(np.float32)
            mel_basis = mel_basis.reshape(1, int(n_fft/2+1), -1)
            tf_stft = tf.contrib.signal.stft(x, frame_length=n_fft, frame_step=hop_length, fft_length=n_fft)
            print ("tf_stft", tf_stft.shape)
            tf_S = tf.matmul(tf.abs(tf_stft), mel_basis);
            print ("tf_S", tf_S.shape)
            tfdct = tf.spectral.dct(pow2db_tf(tf_S), norm='ortho'); print ("tfdct", tfdct.shape)
            print ("tfdct before cut", tfdct.shape)
            tfdct = tfdct[:,:,:n_mfcc];
            print ("tfdct afer cut", tfdct.shape)
            #tfdct = tf.transpose(tfdct,[0,2,1]);print ("tfdct afer traspose", tfdct.shape)
            return tfdct
        
        
        x = tf.placeholder(tf.float32, shape=[None, 16000], name ='x')
        tf_feature = librosa_feature_like_tf(x)
        print("tf_feature", tf_feature.shape)
        mfcc_rosa = librosa.feature.mfcc(wav, sr).T
        print("mfcc_rosa", mfcc_rosa.shape)
        

        【讨论】:

          猜你喜欢
          • 2020-06-14
          • 2020-06-08
          • 1970-01-01
          • 2021-09-13
          • 2020-09-21
          • 2019-11-16
          • 1970-01-01
          • 2019-04-07
          相关资源
          最近更新 更多