tf.contrib.signal.stft返回一个空matrix
这是我运行的代码片段:
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()
由于print(pcm.eval().shape)
返回,所以mp3文件被正确解码:
(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())
是:
[]
据此, tf.contrib.signal.stft
输出的第二个维度等于帧数。 为什么没有框架呢?
看来, tf.contrib.ffmpeg.decode_audio
返回一个形状(?, 1)
的张量,这是一个信号?
样本。
然而tf.contrib.signal.stft
需要一个(signal_count, samples)
张量作为input,因此必须预先转置它。
像这样修改调用的窍门是:
stft = tf.contrib.signal.stft(tf.transpose(pcm), frame_length=1024, frame_step=512, fft_length=1024)