我正在使用图像教程 1 遵循 fastai 音频分类。对于长度为 4 秒的 URBANSOUND 数据集,图像大小为 230x224。我正在使用长度为 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')
使用 librosa 创建频谱图时,您基本上将音频(1d 数据(切成重叠的段,并计算每个段的频率内容。
每个段的长度由频谱图调用的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 的采样率。
高度,即您的频率分辨率,仅取决于您决定使用的 mel 频段的数量。可以通过将n_mels
参数传递给melspectrogram
函数来操作它。