음원 분리를 위한 mixture 생성 시 고려할 점
통계적 신호처리

음원 분리를 위한 mixture 생성 시 고려할 점

by handzoo 2023. 5. 20.

음원 분리를 위한 모든 source의 합 mixture을 구성할 때 단순히 summation으로 구할 수 있다면 좋겠지만 그것은 이상적인 이야기이다.. 실질적으로 어떤 처리를 해야할 지 알아보자.

1. Padding

sources로부터 잘라서 사용한다거나, 데이터셋을 각기 다른 것으로부터 불러와 mixture을 만들 때 당연하게도 각 source마다 길이를 맞춰주어야 할 것이다.

torch.nn.Functional의 F.pad를 사용하면 쉽게 가능하다.

F.pad(wav, (num_padding_left, num_padding_right))

이렇게만 알고 있어도 충분할 것이다.

 

2. Normalization (signal level 조정)

같은 녹음 환경이 아니라면, 혹은 source의 특성 상 signal level이 현저히 낮거나 혹은 현저히 높을 수 있다. 그렇게 되면 분리가 안되거나 다른 분리되어야 할 source들을 masking 해버린다. 그러니 비슷한 signal level로 맞춰줄 수 있도록 해야겠다. 아래와 같이 signal level을 조정한다.

import pyloudnorm as pyln
import random
meter = pyln.Meter(sample_rate)
loudness = meter.integrated_loudness(wav.numpy().squeeze())
loudness1 = random.uniform(-33, -25)
wav = wav * 10**((loudness1 - loudness)/20.)

 

3. Upsampling or Downsampling

각기 다른 데이터셋으로부터 source를 섞게 된다면 당연하게도 나타나는 대역이 다를 것이다. 그러므로 resampling을 통해서 모두 같은 대역 상에서 나오도록 맞춰준다. 아래의 함수에서 sr은 맞추고자 하는 target sampling rate, fs은 실제 audio의 sampling rate이다.

import torchaudio
import torchaudio.functional as AF
def load_audio(path, sr):
    x, fs = torchaudio.load(path)
    if fs != sr:
        x = AF.resample(x, fs, sr, lowpass_filter_width=64,
                        rolloff=0.9475937167399596,
                        resampling_method='kaiser_window',
                        beta=14.769656459379492)
    return x, sr

 

 

 

위 세가지는 mixture 데이터를 구성할 때 필수적으로 고려해주어야 하는 요소이기에 밥 먹듯이 사용하고 밥 먹듯이 기억하자.

 

 

 


TOP

Designed by 티스토리