[지능시스템 캡스톤 디자인] 감정 생성 프로젝트 일지 ③
프로젝트 개요
지능시스템 캡스톤 디자인 프로젝트에서는 RelGAN이라는 생성모델과 KoBERT라는 자연어 처리 모델, TTS 기술을 사용하여, 문장에 감정을 담아 실감나게 읽어주는 TTS 서비스를 제작하고자 진행하고 있습니다. 조금 더 자세히 설명드리자면 KoBERT 모델을 사용하여 텍스트 문장에서 감정을 추출하고, TTS를 통해 해당 텍스트를 Speech로 변환합니다. 마지막으로 변환한 Speech에 RelGAN을 사용하여 KoBERT에서 추출한 감정을 입혀 실감나는 TTS 서비스를 제작하고자 합니다. 이 중 저는 RelGAN을 통해 음성에 감정을 입히는 부분을 도맡아 하고 있습니다.
현재 위치
어제 깨달은 문제점을 해결할 시간... 이제 Mel Spectram에 대해 자세히 공부하면서 왜 numpy 데이터의 사이즈가 안맞고 그 사이즈를 어떻게 맞춰야 할 지 고민할 시간이다.
Mel spectrogram 공부하기
우선, Mel Spectrogram에 대해 자세히 알기 위해선 Mel Scale이 무엇인지를 먼저 알아야 한다.
사람의 달팽이관은 주파수가 낮은 대역에서의 주파수 변화는 잘 감지하지만 주파수가 높은 대역에서는 주파수 변화를 잘 감지하지 못한다는 특징이 있다. 이를 고려하여, 음성 데이터를 scaling할 수 있는데, 이 때 사람의 달팽이관 특성을 고려햐여 음성데이터를 scaling하는 기준이 되는 것을 mel scale이라고 한다.
Mel Spectram이란 가로축을 Time으로 두고, Mel scale을 y축으로 하는 Spectrogram이다. 즉, 내가 만든 데이터의 사ㅇ이즈가 맞지 않는 것은 내 데이터의 Time이 모두 다르기 때문이라고 볼 수 있다.
참고로 수많은 자료들을 찾아봤을 때, MCFF는 연산량이 적고 일반적인 학습 데이터에 적합하고, Mel Spectrogram은 연산량이 많지만 특정 도메인의 학습데이터에 적합하다고 한다. 우리는 CNN을 기반으로 한 GAN 모델을 학습시킬 데이터가 필요하기 때문에 특정 도메인의 학습데이터가 필요하여 MFCC가 아닌 Mel Spectrogram을 사용하여 데이터 전처리를 진행하였다.
데이터 사이즈 맞추기
우선 공부하며 내 데이터의 길이가 다 달라 사이즈가 안맞는 것이라는걸 알았다. 최대한 RelGAN과 사이즈를 맞추기 위해 (256 , 256)으로 데이터 사이즈를 맞추려 했으나, 기본 데이터가 너무 작아 (256 , 256)으로 하면 zero-padding이 너무 많을 것으로 예상되었다. 그래서 데이터를 (256 , _)으로 shape을 보고 _부분 사이즈 평균인 80으로 데이터를 맞춰, (256, 80)사이즈의 데이터를 제작하였다
데이터에 zeropadding은 다음과 같이 넣었다.
pad2d = lambda a, i: a[:, 0:i] if a.shape[1] > i
else np.hstack((a, np.zeros((a.shape[0], i-a.shape[1]))))
padding_mel = pad2d(spec,80)
정말 간단하게 그냥 80을 넘으면 자르고, 80이 안된다면 뒤에 0으로 붙여 80으로 맞춰주었다.
남은 오류는 다음 포스팅에서 해결하기로 하자!