[MIKANTONE] 결과물의 선명도와 부드러움 개선하기
어디까지나 가설에 불과하며, 검증과정을 거칠 예정은 없습니다.
수식
저의 모델에선 로그함수를 이용해서 이미지 데이터를 노멀라이징 했기 때문에,
모델이 생성해 준 이미지를 stft 이미지로 변경하는 데에는 다음과 같은 지수함수를 이용해야 합니다.
$$ y = ae^{bx} $$
그리고 이 지수함수는 원칙 상 처음 stft 이미지를 노멀라이징 한 함수의 역함수를 사용하면 됩니다.
그러나 실제로 완성된 모델에 역함수를 바로 적용하면 당황스러운 상황을 마주하게 될 것입니다.
대략 두 경우 중 하나이며, 때로는 둘 다 해당될 수도 있습니다.
- 소리에 갈라짐이 있는 경우.
- 소리가 먹먹한 경우.
갈라짐이 있는 경우는 가장 판단하기 쉬우며 자주 발생합니다.
먹먹한 경우는 변환된 소리만 단독으로 들었을 때는 판단하기 어렵습니다만,
레퍼런스가 될 만한 원본 목소리를 같이 틀어보면 먹먹하다는 것을 바로 알 수 있습니다.
완성된 모델의 문제점 중 이 두 경우는 의외로 모델을 직접 건드리지 않고도 고칠 수 있는 경우에 해당합니다.
다만 모델에 따라 무려 보컬 에디터에서 수식을 직접 계산해 보며 조정해야 하는 점이 문제라면 문제여서,
이 점은 모델을 만들 때 수식을 계산해서 적용할 수 있도록 보완해 볼 계획입니다.
자, 그러면 두 경우가 어째서 발생하고, 어째서 제가 고칠 수 있다 고 하는지 한번 알아봅시다.
갈라짐이 심한 경우
사실 딥러닝을 통해 파동이 아닌 주파수의 이미지를 생성했기 때문에 발생하는 문제이지, 자연적인 소리라면 존재해서는 안 되는 경우랍니다.
소리가 갈라지는 이유는 여러 종류의 서로 다른 소리가 중첩되어 들리는 것으로 볼 수 있습니다.
제 모델의 경우 소리는 대체로 두 개로 분리되어 들리게 되는데, 그것은 stft 이미지의 맨 아래 첫째줄과 둘째줄에서 나오는 소리입니다.
아래의 첫째줄과 둘째줄까지 밝기가 강렬해 보이죠?
이 두 소리가 거의 경쟁적인데도 완벽한 배음을 이루지 못하게 되면서 불협에 가까운 소리가 나는 것으로 파악됩니다.
이 문제를 해결하기 위해서
먹먹한 경우
먹먹한 소리가 나는 이유는 고음역대 신호가 약해서 입니다. 이 경우 단순히 저음역 대비 고음역대 신호를 올려 주기 위해 기울기를 감소시키면 되는데,
먹먹한 경우
다음 4가지 식을 만족하는 함수
$$ g(x) = a'e^{b'x}+c' $$
가 필요합니다.
- \(f(-1) = g(-1)\) : 이것을 만족하지 않으면 전체 구간에 잡음이 낍니다.
- \(f'(1) = g'(1)\): 이것을 만족하지 않으면 소리가 선명해짐과 동시에 갈라지거나, 오히려 더 먹먹해집니다.
- \(f'(0) < g'(0)\) 이며 \(f''(0) > g''(0)\) : 이것을 만족하지 않으면 먹먹함이 해결되지 않습니다.
으로부터 다음과 같은 식이 얻어집니다.
$$ ae^{-b} = a'e^{-b'} + c' $$ $$ abe^{b} = a'b'e^{b'} $$ $$ b > b', a < a' $$
이 식을 풀면, 다음과 같은 방법으로 \(a', b', c'\) 을 구할 수 있습니다.
- \( b' < b \) 를 만족하는 임의의 \( b'\) ( \( b'\) 값 결정)
- \( a' = \frac{abe^{b}}{b'e^{b'}} \) 을 만족하는 하나의 \( a'\)
- \( c' = ae^{-b} – a'e^{-b'} \) 을 만족하는 하나의 \( c'\)
예를 들어, 지금 먹먹한 현상을 보이는 변환식이
$$ 0.0837e^{7x} $$
인 경우 \( a = 0.0837 \) , \( b = 7 \) 이 되겠습니다.
우선 \( b' \) 의 경우 7보다 작은 임의의 숫자인 6으로 잡겠습니다.
그리고 두번째 식으로부터,
$$ a'= \frac{0.0837\times{7}e^{7}}{6e^{6}} = 0.265 $$
로 결정합니다.
마지막으로,
$$ c' = 0.0837e^{-7} – 0.265e^{-6.5} = – 0.000322 $$
을 구합니다.
이 세 값을 앞의 수식에 대입해서 변환식을
$$ 0.265e^{6x} – 0.000322 $$
로 최종 수정합니다.