我正在爬行一个WAV文件文件夹,每个文件具有相同的采样率但长度不同。我正在使用Librosa加载它们,并在它们上计算一系列光谱特征。由于持续时间的不同,这导致阵列的大小不同。然后尝试连接所有这些数组失败-显然是因为它们的形状不同,例如:
shape(1,2046)
shape(1,304)
shape(1,154)
所以我要做的是在加载文件之前,我使用librosa获取每个文件的持续时间并将其打包到列表中。
class GetDurations:
def __init__(self, files, samplerate):
list = []
self.files = files
self.sampleRate = samplerate
for file in self.files:
list.append(librosa.get_duration(filename=file, sr=44100))
self.maxFileDuration = np.max(list)
然后我得到列表的最大值,以获取数组的最大可能长度,并将其转换为帧(这是Librosa的光谱提取功能所使用的)
self.maxDurationInFrames = librosa.time_to_frames(self.getDur.maxFileDuration,
sr=44100,hop_length=512) + 1
因此,现在有了一个我知道将占我输入文件最长持续时间的值。我只需要用这个长度初始化数组即可。
allSpectralCentroid = np.zeros((1, self.maxDurationInFrames))[1:]
这为我提供了一个空容器,用于存放目录中所有WAV文件的所有提取的光谱质心数据。为了向该数组添加数据,我稍后将执行以下操作:
padValue = allSpectralCentroid.shape[1] - workingSpectralCentroid.shape[1]
workingSpectralCentroid = np.pad(workingSpectralCentroid[0], ((0, padValue)), mode='constant')[np.newaxis]
allSpectralCentroid = np.append(allSpectralCentroid, workingSpectralCentroid, axis=0)
这将从“ all”数组中减去“ working”数组的长度,以获取填充值。然后用零填充工作数组,使其长度与全部数组相同。最后,它随后将两者附加在一起(将它们连接在一起),并将其分配给“ all”变量。
所以... 我的问题是-有更有效的方法吗?
奖金问题-当我100%无法知道所需的长度时该怎么办?