2

我试图让 tensorflow mfcc 给我与 python lybrosa mfcc 相同的结果我试图匹配 librosa 在我的 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)

以下是结果图表: 张量流 mfcc 结果

librosa mfcc 结果

4

4 回答 4

5

我是 的作者tf.signal。很抱歉没有早点看到这篇文章,但tf.signal.stft如果你在将信号传递给tf.signal.stft. 有关更多详细信息,请参阅此 GitHub 问题

于 2019-01-27T07:30:38.910 回答
1

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

于 2020-03-11T20:27:57.460 回答
0

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

但即便如此,尝试将 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)
于 2018-07-03T12:07:42.597 回答
0

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

transwav = tf.transpose(waveform[0])

于 2017-11-03T08:11:49.763 回答