pytorch 识别音轨中声音最大的部分并进行裁剪(Librosa或torchaudio)

i2loujxw  于 2023-02-22  发布在  其他
关注(0)|答案(2)|浏览(370)

我已经建立了一个U-Net模型来执行多音轨音频的混音,为此我使用了音轨的20 s剪辑(转换成声谱图)作为训练模型的输入。然而训练过程非常长,所以我认为最好从每个音轨中提取2s剪辑来训练模型。
数据按8个股骨柄组织(单个乐器音轨)作为输入,并将单个混合的茎作为目标(都有sr=44100)。我想找到混合轨迹中最有活力的2s部分,并裁剪所有轨迹(输入和混合)这一特定的2s部分。我主要使用librosa准备数据,但我我不确定使用什么函数来查找声音最大(我知道这是不明确的)的88200采样段(2s)的起始点。

9wbgstp7

9wbgstp71#

如果我能很好地理解这个问题,下面的代码可能会作为一个有用的起点,它接收一个声音文件,并使用librosa.feature.rms定位它“最响”的位置(正如您在问题中提到的,定义哪个位最响并不完全简单),然后从原始声音文件中以该点为中心剪切出一个2秒的切片:

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]
idfiyjo8

idfiyjo82#

我发现了一个很好的窍门

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]

我发现它相当快。希望它能帮助一些人!
编辑:说明
寻找具有最大RMS的长度为target_length的窗口与寻找具有最大平方和的窗口相同。如果我们计算平方和的累积值cs = np.cumsum(audio ** 2),那么cs[x + target_length] - cs[x]结果是窗口[x: x+target_length]上的平方和。数组cs[target_length:] - cs[:-target_length]正好包含x从0到len(audio) - target_length的这个结果。我们拿着argmax,瞧!

相关问题