这是我运行的代码:

import tensorflow as tf

sess = tf.InteractiveSession()

filename = 'song.mp3' # 30 second mp3 file
SAMPLES_PER_SEC = 44100

audio_binary = tf.read_file(filename)

pcm = tf.contrib.ffmpeg.decode_audio(audio_binary, file_format='mp3', samples_per_second=SAMPLES_PER_SEC, channel_count = 1)
stft = tf.contrib.signal.stft(pcm, frame_length=1024, frame_step=512, fft_length=1024)

sess.close()

正确解码了mp3文件,因为print(pcm.eval().shape)返回:
(1323119, 1)

当我使用print(pcm.eval()[1000:1010])打印它们时,甚至还有一些实际的非零值:
[[ 0.18793298]
 [ 0.16214484]
 [ 0.16022217]
 [ 0.15918455]
 [ 0.16428113]
 [ 0.19858395]
 [ 0.22861415]
 [ 0.2347789 ]
 [ 0.22684409]
 [ 0.20728172]]

但是由于某种原因,print(stft.eval().shape)评估为:
(1323119, 0, 513) # why the zero dimension?

因此print(stft.eval())是:
[]

根据thistf.contrib.signal.stft输出的第二维等于帧数。为什么为什么没有框架?

最佳答案

看来tf.contrib.ffmpeg.decode_audio返回的形状张量(?, 1)?样本的一个信号。

但是tf.contrib.signal.stft希望将(signal_count, samples)张量作为输入,因此必须预先转置它。

像这样修改 call 就可以了:

stft = tf.contrib.signal.stft(tf.transpose(pcm), frame_length=1024, frame_step=512, fft_length=1024)

10-04 18:47