如何根据音频长度确定频谱图的图像大小

时间:2020-06-04 03:38:05

标签: audio librosa fast-ai

我正在使用图像教程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')

1 个答案:

答案 0 :(得分:1)

使用librosa创建频谱图时,实际上是将音频(一维数据)切成重叠的片段,并计算每个片段的频率内容。

每个段的长度由melspectrogram调用的n_fft参数确定。随后的两个段有多少重叠取决于hop_length参数。默认情况下,librosa使用n_fft=2048hop_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函数来对其进行操作。