【问题标题】:How to decide the size of image for spectrogram based on audio length如何根据音频长度确定频谱图的图像大小
【发布时间】:2020-06-04 03:38:05
【问题描述】:

我正在学习使用图像的 fastai 音频分类教程1。 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')

【问题讨论】:

    标签: audio librosa fast-ai


    【解决方案1】:

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

    每个段的长度由n_fft 调用的melspectrogram 参数确定。两个后续段重叠的程度取决于hop_length 参数。默认情况下,librosa 使用n_fft=2048hop_length=512,因此后续段之间有 75% 的重叠。

    请注意,这些段通常称为

    您的问题归结为对于给定的音频长度,您获得了多少帧(图像的长度)。

    假设您有N=10s 的音频。这意味着您有N * sample_rate 样本。使用 512 的 hop_length 时,您大致得到(这也取决于填充和您的 n_fft(N * sample_rate) / hop_length 帧。

    因此,对于 10 多岁的人,您会获得大约 430 帧,因为默认情况下 librosa 使用 22050 Hz 的采样率。

    高度(即频率分辨率)仅取决于您决定使用的 mel 频段数量。您可以通过将n_mels 参数传递给melspectrogram 函数来操作它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      相关资源
      最近更新 更多