【问题标题】:Identifying the loudest part of an audio track and cropping (Librosa or torchaudio)识别音轨中最响亮的部分并裁剪(Librosa 或 torchaudio)
【发布时间】:2023-02-22 07:18:50
【问题描述】:

我已经构建了一个 U-Net 模型来执行多轨音频的音频混合,为此我使用了 20 秒的音轨剪辑(转换为频谱图)作为训练模型的输入。然而训练过程非常长,所以我认为最好从每条轨道上取 2s 片段来训练模型。

数据被组织为 8 个词干(单独的乐器轨道)作为输入,词干的单一混合作为目标(都有 sr=44100)。我想找到混合轨道中最有活力的 2s 部分,并裁剪所有轨道(输入和混合)这个特定的 2s 部分。我主要在我的数据准备中使用 librosa,但我不确定使用什么函数来找到最响亮的(我知道这是模棱两可的)88200 样本段 (2s) 的起点。

【问题讨论】:

    标签: python audio pytorch librosa torchaudio


    【解决方案1】:

    如果我足够好地关注这个问题,下面的代码可能会作为起点有用。它接收一个声音文件并使用 librosa.feature.rms 找到它“最响亮”的位置(正如您在问题中提到的,定义最响亮的位并不完全直接),然后从原始文件中剪下两秒的片段以该点为中心的声音文件:

    import librosa
    
    FILENAME = 'soundfile.wav'  # change to path of your sound file
    FRAME_LENGTH = 2048
    HOP_LENGTH = 512
    NUM_SECONDS_OF_SLICE = 2
    
    sound, sr = librosa.load(FILENAME, sr=None)
    
    clip_rms = librosa.feature.rms(y=sound,
                                   frame_length=FRAME_LENGTH,
                                   hop_length=HOP_LENGTH)
    
    clip_rms = clip_rms.squeeze()
    peak_rms_index = clip_rms.argmax()
    peak_index = peak_rms_index * HOP_LENGTH + int(FRAME_LENGTH/2)
    
    half_slice_width = int(NUM_SECONDS_OF_SLICE * sr / 2)
    left_index = max(0, peak_index - half_slice_width)
    right_index = peak_index + half_slice_width
    sound_slice = sound[left_index:right_index]
    

    【讨论】:

    • 感谢这完美地工作,我现在只需要实现它来循环遍历数据集。只是一个简单的问题:我的一些数据以立体声加载(即 (2, no. of samples) 的形状,你知道我如何在保留维度的同时分割声音吗?目前我有 sound_slice = sound[1][left_index:right_index],它返回一个形状数组 @987654325 @ 而不是 (2, 88200)
    • 对不起,忽略这个,我的大脑今天不太好用-显然只是sound_slice = sound[:,left_index:right_index]
    【解决方案2】:

    我找到了一个很好的技巧来做到这一点

    import numpy as np
    def crop_loudest(audio, target_length):
        cs = np.cumsum(audio ** 2)
        start = (cs[target_length:] - cs[:-target_length]).argmax()
        return audio[start:start+target_length]
    

    我发现它相当快。 希望它能帮助别人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-13
      • 2021-01-11
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 2018-11-04
      相关资源
      最近更新 更多