음원 분리를 위한 모든 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 데이터를 구성할 때 필수적으로 고려해주어야 하는 요소이기에 밥 먹듯이 사용하고 밥 먹듯이 기억하자.
'통계적 신호처리' 카테고리의 다른 글
[데이터 전처리] 수식으로 신호 level 음량 LUFS 조절하기, 심리음향적 특성을 반영한 Loudness Units Full Scale (0) | 2024.08.30 |
---|---|
Circular convolution 계산법과 언제 linear convolution과 같아지나 살피기 (0) | 2023.05.24 |
내적, cosine similarity, projection 정사영 한번에 짚기 (1) | 2023.05.17 |
Block convolution인 Overlap add과 Overlap save (0) | 2023.04.29 |
Random process와 signal (0) | 2023.04.08 |