numpy 如何从Librosa STFT获得相同数量的帧?

eanckbw9  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(180)

我正在尝试创建一个由从WAV文件生成的Numpy数组组成的数据集。我可以将所有单独的WAV文件放入Numpy数组中,但我不能将它们合并成一个Numpy数组,因为它们的形状都略有不同。第一个维度对所有文件都是相同的,但第二个维度(帧数)略有不同。
要将WAV转换为Numpy,我使用librosa.stft。我能想到的唯一方法是用零填充每个Numpy以匹配最大帧数。这需要我迭代每个数组(3000)和每个数组中的每一行来填充每一行。一定有更好的方法。
这是通过WAV文件迭代的代码,转换为声谱图,然后保存为Numpy数组

def process(directory):
    # Load file
    for file in os.listdir(directory):
        f = os.path.join(directory, file).replace("\\", r"/")
        x, sr = librosa.load(f, sr=22050)
        # Covert to spectrogram
        X = librosa.stft(x)
        print(X.shape)
        spectrgoram = np.abs(X)
        # Save file
        np.save(f"C:/Python/GANs/Sound_Digit_Gan/Data2/{file}",spectrgoram)
        
process(directory)

由于X的形状被打印出来,这些是值的几个示例:(1025,二十三)(1025,二十九)(1025,二十六)(1025,三十四)(1025,二十六)(1025,二十七)(1025,四十)(1025,二十二)(1025,二十五)(1025,二十四)(1025,三十五)
然后,当我尝试使用以下代码创建列车数据集时:

directory = "C:/Python/GANs/Sound_Digit_Gan/Data2/"
train = []

for f in os.listdir(directory):
  file = os.path.join(directory, f).replace("\\", r"/")
  #print(file)
  array = np.load(file)
  #print(array.shape)
  train.append(array)
  
train = np.array(train)

我得到错误:ValueError: could not broadcast input array from shape (1025,13) into shape (1025,)我相信这是因为数组的形状不完全相同。如何才能得到相同的形状,而又不丢失音频信号数据?

w46czmvw

w46czmvw1#

在音频机器学习中,将时间维度沿着的大小标准化是一个常见的预处理步骤,因此librosa库提供了一个方便的函数:librosa.util.fix_length

相关问题