我正在从音频文件中提取一些特征,并将它们保存在列表中,然后将列表保存在hdf5文件中,但这会导致错误。以前,我直接将特征保存在一个hdf5文件中,但它只是覆盖所有的值,只保存最后一个值。
ampList = []
mffcslist = []
centroidlist = []
i = 0
ampList.append(Xdb) # saving extracted feature in a list
mffcslist.append(mfccs)
centroidlist.append(spectral_centroids)
with h5py.File('C:/Users/Aweem Ashar/Desktop/feature.h5', 'a') as f:
f.close()
for i in range(len(audio_path)):
#print(ampList[i])
f.create_dataset("amplitude", data=ampList[i])
f.create_dataset("MffC", data=mffcslist[i])
f.create_dataset("spectral", data=centroidlist[i])
# plt.show() # To view Wave graph
发布于 2019-09-25 14:55:21
当我写我的评论时,我没有仔细地看你的代码。我刚刚意识到你是一次加载一个元素的列表数据。有更好/更快的方法可以用Numpy数组来实现。我不知道您使用的是哪种类型的数据,所以在ampList
中用几个浮点数创建了一个非常简单的示例。我使用np.asarray()
将列表转换为一个Numpy数组,然后一次性加载到dataset中。更简单,更紧凑。此方法(使用np.asarray()
)将适用于任何具有公共类型(全部为浮点型或全部为整型)元素的列表。
我的简单示例:
import h5py
import numpy as np
ampList = [ 20., 11., 33., 40., 100. ]
with h5py.File('SO_58092765.h5','w') as h5f:
h5f.create_dataset("amplitude", data=np.asarray(ampList) )
更好的方法:
上面的示例解决了您的基本问题(如何将列表数据复制到HDF数据集中)。但是,我认为对于您的场景,有一种更好的方法。我假设您有每个音频文件的振幅、MffC和频谱数据,并且将这些数据与音频文件名关联起来会很方便。如果是这样的话,这就是HDF5和混合格式数据类型如此强大的地方。
我创建了第二个示例(如下所示)来展示如何在单个数据集中保存混合数据。我假设了以下数据类型(为了使示例更有趣):
浮点形状音频文件名: String
此示例创建2个HDF5文件:
第二种方法使用Numpy数据类型(dtype)来定义HDF5数据集中每列数据的名称和数据类型。然后使用该数据类型创建一个空的数据集。通过引用字段名称将每个列表写入dataset。
第二个示例:
import h5py
import numpy as np
fileList = [ 'audio1.mp3', 'audio2.mp3', 'audio11.mp3', 'audio21.mp3','audio22.mp3' ]
ampList = [ 20., 11., 33., 40., 100. ]
mffcslist = [ 12, 8, 9, 14, 33 ]
centroidlist = [ (0.,0.,0.), (1.,0.,0.),
(0.,1.,0.), (0.,1.,0.),
(1.,1.,1.),]
# create SO_58092765_3ds.h5:
with h5py.File('SO_58092765_3ds.h5','w') as h5f:
h5f.create_dataset("amplitude", data=np.asarray(ampList) )
h5f.create_dataset("MffC", data=np.asarray(mffcslist) )
h5f.create_dataset("spectral", data=np.asarray(centroidlist) )
# create SO_58092765_1ds.h5 with ds_dtype:
ds_dtype = np.dtype( [("audiofile",'S20'), ("amplitude",float),
("MffC",int), ("spectral",float, (3,)) ] )
with h5py.File('SO_58092765_1ds.h5','w') as h5f:
ds = h5f.create_dataset("test_data", shape=(len(ampList),), dtype=ds_dtype )
ds['audiofile'] = np.asarray(fileList)
ds['amplitude'] = np.asarray(ampList)
ds['MffC'] = np.asarray(mffcslist)
ds['spectral'] = np.asarray(centroidlist)
发布于 2019-09-30 02:59:20
import matplotlib.pyplot as plt
from glob import glob
import librosa as lb
import sklearn
import librosa.display
import librosa
import h5py
import numpy as np
dir = 'C:\\Users\\Aweem Ashar\\Desktop\\recordingd'
audio_path = glob(dir + '/*.wav')
ampList = []
mffcslist = []
centroidlist = []
for file in range(0, len(audio_path)):
x, sr = lb.load(audio_path[file])
print(type(x), type(sr))
librosa.display.waveplot(x, sr=sr)
X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X))
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')
spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]
spectral_centroids.shape
frames = range(len(spectral_centroids))
t = librosa.frames_to_time(frames)
def normalize(x, axis=0):
return sklearn.preprocessing.minmax_scale(x, axis=axis)
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_centroids), color='r')
mfccs = librosa.feature.mfcc(x, sr=sr)
print(mfccs.shape)
librosa.display.specshow(mfccs, sr=sr, x_axis='time')
ampList.append(Xdb)
mffcslist.append(mfccs)
centroidlist.append(spectral_centroids)
with h5py.File('C:/Users/Aweem Ashar/Desktop/feature.h5', 'w') as f:
f.create_dataset("amplitude", data=np.asarray(ampList))
f.create_dataset("MFCC", data=np.asarray(mffcslist))
f.create_dataset("SpectralCentroid", data=np.asarray(centroidlist))
发布于 2019-09-30 13:55:54
Aweem,我不熟悉librosa
或sklearn
,所以不能调试你所有的代码。在处理新事物时,请使用最低限度完整的可验证示例(MCVE)来确认使用简单数据集的行为。它们更容易诊断。
为此,我在您的第二篇文章中简化了for
循环;重新组织并删除了我认为不必要的内容。而且,你也不需要遍历所有的图像。更改glob()
调用以获取1个(或几个)图像。Xdb
的形状(保存到ampList
)应该显示为什么Numpy asarray()
尝试广播该形状(以及为什么会出现错误)。如果没有,请发布输出以供审查。
最后,您应该向create_dataset("amplitude")
添加一个注释,以验证其他两个create_dataset()
调用是否正常工作。祝好运。
dir = 'C:\\Users\\Aweem Ashar\\Desktop\\recordingd'
# change this to get 1 wav file:
audio_path = glob(dir + '/*.wav')
ampList = []
mffcslist = []
centroidlist = []
for file in range(0, len(audio_path)):
x, sr = lb.load(audio_path[file])
print(x, sr)
X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X))
print (Xdb.shape)
ampList.append(Xdb)
spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]
print (spectral_centroids.shape)
centroidlist.append(spectral_centroids)
mfccs = librosa.feature.mfcc(x, sr=sr)
print (mfccs.shape)
mffcslist.append(mfccs)
with h5py.File('C:/Users/Aweem Ashar/Desktop/feature.h5', 'w') as f:
f.create_dataset("amplitude", data=np.asarray(ampList))
f.create_dataset("MFCC", data=np.asarray(mffcslist))
f.create_dataset("SpectralCentroid", data=np.asarray(centroidlist))
https://stackoverflow.com/questions/58092765
复制