我正在使用图像教程1跟踪fastai音频分类。 URBANSOUND数据集的图像大小为230x224,长度为4秒。我正在使用长度为10秒的DCASE音频数据集。那么,如何根据音频的长度在librosa中确定图像的大小?
以下是生成频谱图的代码。
def create_fold_spectrograms(fold):
spectrogram_path = Path('spectrogram/')
audio_path = Path('audio/')
print(f'Processing fold {fold}')
os.mkdir(spectrogram_path/fold)
for audio_file in list(Path(audio_path/f'{fold}').glob('*.wav')):
samples, sample_rate = librosa.load(audio_file)
fig = plt.figure(figsize=[0.72,0.72])
ax = fig.add_subplot(111)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.set_frame_on(False)
filename = spectrogram_path/fold/Path(audio_file).name.replace('.wav','.png')
filename = (str(filename))
S = librosa.feature.melspectrogram(y=samples, sr=sample_rate)
librosa.display.specshow(librosa.power_to_db(S, ref=np.max))
plt.savefig(filename, dpi=400, bbox_inches='tight',pad_inches=0)
plt.close('all')
答案 0 :(得分:1)
使用librosa创建频谱图时,实际上是将音频(一维数据)切成重叠的片段,并计算每个片段的频率内容。
每个段的长度由melspectrogram调用的n_fft
参数确定。随后的两个段有多少重叠取决于hop_length
参数。默认情况下,librosa使用n_fft=2048
和hop_length=512
,因此后续段之间有75%的重叠。
请注意,这些段通常称为帧。
您的问题可以归结为对于给定的音频长度,您可以获得多少帧(图像的长度)。
让我们假设您有N=10s
音频。这意味着您有N * sample_rate
个样本。 hop_length
为512,您可以大致得到(这也取决于填充和n_fft
)(N * sample_rate) / hop_length
帧。
因此,在您的10秒钟内,您将获得大约430帧,因为librosa默认使用22050 Hz的采样率。
高度(即您的频率分辨率)仅取决于您决定使用的梅尔频段的数量。您可以通过将n_mels
参数传递给melspectrogram
函数来对其进行操作。