这是我运行的一段代码:
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())
是:[]
根据this
tf.contrib.signal.stft
的第二个维度输出等于帧数。为什么没有框架呢?
最佳答案
看来tf.contrib.ffmpeg.decode_audio
返回一个形状为 (?, 1)
的张量这是 ?
的一个信号 sample 。
然而tf.contrib.signal.stft
预计 (signal_count, samples)
张量作为输入,因此必须事先对其进行转置。
像这样修改调用可以解决问题:
stft = tf.contrib.signal.stft(tf.transpose(pcm), frame_length=1024, frame_step=512, fft_length=1024)
关于python - tf.contrib.signal.stft 返回一个空矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47729101/