지능시스템 졸업 프로젝트

[지능시스템 캡스톤 디자인] 음성 합성 프로젝트 일지 ⑧

부농쿼카 2023. 5. 30. 01:08
728x90

프로젝트 개요

지능시스템 캡스톤 디자인 프로젝트에서는 RelGAN이라는 생성모델과 KoBERT라는 자연어 처리 모델, TTS 기술을 사용하여, 문장에 감정을 담아 실감나게 읽어주는 TTS 서비스를 제작하고자 진행하고 있습니다. 조금 더 자세히 설명드리자면 KoBERT 모델을 사용하여 텍스트 문장에서 감정을 추출하고, TTS를 통해 해당 텍스트를 Speech로 변환합니다. 마지막으로 변환한 Speech에 RelGAN을 사용하여 KoBERT에서 추출한 감정을 입혀 실감나는 TTS 서비스를 제작하고자 합니다. 이 중 저는 RelGAN을 통해 음성에 감정을 입히는 부분을 도맡아 하고 있습니다.

 

프로젝트 이슈

어제 batch_size가 1인 데이터를 가지고 출력하는 코드를 작성했었다. 그런데 출력물이 음성이 아닌 완전 노이즈만 나왔다.. Generater가 생성한 이후, 사이즈 맞추는 부분에서 데이터 손실이 많이 이뤄졌던 것 같다. 

with torch.no_grad():
    conversion = gan.G(img, attribute).detach()
gen[-1] = torch.cat([gen[-1], conversion.unsqueeze(1).cpu()], dim=1) #generate list에 쌓기
gen = torch.cat(gen)
print("generate size: ",gen.size())

gen = gen.view(gen.size(0)*gen.size(1)*gen.size(2), gen.size(3), gen.size(4))
print("사이즈 맞춤: ",gen.size())

이렇게 Generater 부분을 마지막 출력이 [2, 256, 256]이 되도록 수정하였고 그 결과 나름 나쁘지 않은 음성데이터가 만들어졌다.

test3_0.wav
0.12MB

음성에서 뭔가 감정이 변화하였다는 느낌이 없어서 많이 아쉬운 느낌이다.. 아무래도 가지고 있는 weight가 끝까지 학습된 버전은 아니다보니 학습에 좀 부족한 것 같다..

 

우선 이 19999.weight를 통해 음성을 출력해서 세트를 가지고 있고 Colab 추가 결제 후 epoch 40,000번을 학습시켜서 끝까지 학습된 weight파일을 가지는 것을 목표로 마지막까지 달려보려고 한다.

 

numpy에서 음성으로 변환하는 코드는 다음과 같다.

def npytomp4(npy, path):
    spec = np.array(npy.squeeze(), dtype=np.float64)
    # spec = spec.type(np.float64)
    print("spec", spec.shape)
    sr = 22050
    res = librosa.feature.inverse.mel_to_audio(spec, 
                                            sr=sr, 
                                            n_fft=512, 
                                            hop_length=256,
                                            win_length=None, 
                                            window='hann', 
                                            center=True, 
                                            pad_mode='reflect', 
                                            power=2.0, n_iter=256)
    import soundfile as sf
    sf.write(path, res, sr)

 

세밀한 파라미터 값 조정을 위해 librosa.feature.inverse.mel_to_audio()함수에 대해 알아보자

spec : np.ndarray를 입력값으로 받는 부분으로, audio파일로 바꿀 melSpectrogram을 입력해주면 된다.

sr : Samplig Rate을 뜻한다. 이 값은 Mel Spectrgram화 할 때 사용했던 sr을 사용하는데, 모른다면 대부분 16000 혹은 22050 둘 중 하나일 것이다. Mel spectogram화 할 때 따로 sampling rate을 설정하지 않았으면 기본값은 22050이라는 것을 알아두자

n_fft : 한 번 FFT를 할 만 큼의 sequence 길이

hop_length : STFT의 hop 길이로, 다른 말로는 window간의 거리를 뜻한다. 

n_iter : Grittin-Lim의 반복 횟수이다. 여기서 Griffin-Lim이란, TTS에 사용되는 알고리즘으로, 스펙토그램을 오디오로 바꿔주는 후처리 알고리즘이다.

 

음성을 numpy로 변환할 때 각자 사용한 파라미터 값들이 다르기 때문에 음성이 제대로 출력되지 않을 수 있다. 그럴 경우에는 본인에게 맞는 sr, n_fft, hop_length등 파라미터 값들을 조정해가면서 음성이 출력될 수 있도록 하다보면, 깨끗한 음성을 얻을 수 있다!

728x90