! 이번글 씹덕 주의 !

 

정말 오랜만에 글을 쓴다.

 

사실 결과물은 1~2달 전에 나왔는데 왜 이렇게 늦게 글을 쓰냐면,

내가 한국어 음성합성에서 사용한 한국어 Phonemizer를 PR 하느라 시간을 보냈고

(repo의 양식에 맞게 코드 수정 + feedback반영 등등)

음성합성의 결과물이 마음에 들지 않아 음성합성을 다시 했기 때문이다.

 

최종결과를 발표하기 전에, 중간 결과에서의 합성과 최종 결과에서의 합성의 차이에 대해서 간략하게  서술하겠다.

 

  중간 결과 최종 결과
사용한 소스 hccho2/Tacotron2-Wavenet-Korean-TTS coqui-ai/TTS
데이터셋 한국어 : KSS
+ 캐릭터 음성
한국어 : KSS
일본어 : JSSS, JSUT
+ 캐릭터 음성
training step 100K 390K
사용 모델 tacotron2 Vits
진행 환경 노트북(gtx1650 max-q) GCP vm instance(A100)
batch size 16 64
음차번역 O X
multi speaker O O
multi language X O
fine tuning X O
(250K부터 캐릭터 음성과 함께 training)
한글 사용방법 소스 내부의 korean cleaner사용
korean phonemizer제작, 사용

 

최종 결과에 대해서 말해보자!

 

음차번역

캐릭터 음성을 한국어로 음차 번역한 텍스트를 사용한다고 초기에 말했었다. 

그런데 일본어를 가장 잘 나타내는 언어는 당연히 일본어 일 것이고, vits에서는 multi language도 지원하기에 음차번역은 사용하지 않았다. 

사실 처음에는 음차번역한 텍스트들이 아까워서 음차번역 텍스트로 학습을 진행했었다. 그런데 결과물의 퀄리티가 영 좋지 않아서 음차번역 텍스트 대신 일본어 텍스트로 다시 학습을 진행했다. 위에서 '음성합성의 결과물이 마음에 들지 않아 음성합성을 다시 했기 때문이다.' 이 문장의 원인이 바로 이거다.

 

 

Tensorboard 

tensorboard의 표를 보자.

avg_loss_1을 제외한 모든 지표가 step수가 늘어날수록 줄어드는 경향을 보인다.

avg_loss_1은 검색해본 결과 training 중 나타나는 과적합을 보여주는 지표라고 보기도 한다고 한다.

그래도 300K를 지나고부터는 기울기가 많이 낮아지는 것을 볼 수 있다.

 

250K에서 지표가 급격히 변화하는 것을 볼 수 있는데, 그 이유는 fine tuning을 250K에서 시작했기 때문이다.

처음에는 급격한 변화가 보이지만, 조금 지나니 안정화되는 것을 볼 수 있다.

 

 

보시다시피 real spectrogram과 fake spectrogram이 거의 동일한 것처럼 보인다. 학습이 잘 되었다고 볼 수 있다.

 

 

음성 합성

음성 합성 결과물인 WAV 파일들을 하나씩 들어보자.

 

KSS + 한국어 

"안녕하세요. 음성합성으로 만들어진 한국어 음성입니다. "

 

매우 깔끔하게 들린다는 것을 알 수 있다. 목소리도 kss데이터 목소리와 거의 똑같다.

 

 

KSS + 한국어 (긴 문장)

옛날 옛적에 조그맣고 사랑스러운 소녀가 한 명 살았어. 어찌나 사랑스러운지 주위 사람이 모두 귀여워했어. 소녀를 특히 사랑한 사람은 할머니로, 뭐든 다 해주고 싶어서 어쩔 줄을 모를 정도였어. 한 번은 할머니가 소녀에게 빨간 벨벳으로 만든 모자를 선물했어. 소녀는 아주 좋아하며 언제나 그것만 쓰고 다녔지. 그래서 사람들은 소녀를 빨간모자라고 불렀어.

 

이렇게 긴 문장들로 합성해도 결과물이 깔끔하다.

 

 

KSS + 일본어

"音声合成で作られた日本語音声です。"  (음성합성으로 만들어진 일본어 음성입니다.)

 

앞부분은 깔끔하게 잘 들리지만, 뒤로 가면 발음이 뭉개지거나 뒷 문장을 아예 읽지 않는다. 

이유는 잘 모르겠다.

 

 

JSSS + 한국어

"일본어 데이터의 목소리이지만, 저는 지금 한국어를 하고 있습니다."

 

매우 깔끔하게 들린다. JSSS의 목소리도 잘 살아있다.

 

 

 

학습용 데이터인 KSS, JSSS, JSUT데이터들을 speaker로 합성하여 나온 결과물들은 퀄리티가 높았다.

데이터 원래 언어로 하던, 다른 언어로 하던 같은 목소리로 알아들을 수 있는 결과물이 나왔다.

 

다만 일본어의 경우, 문장의 뒤로 가면 발음이 뭉게지거나 뒷 문장을 아예 읽지 않는 것이 발견되었다. 

그리고 띄어쓰기가 없어 문장의 처음부터 끝까지 한 번에 다 읽어버리니 알아듣기가 좀 힘들었다.

 

(차선책으로 찾은 방법이 있다. 일본어 문장 끝에 。를 붙이는 대신 、、、를 붙이면 뒷 문장까지 읽는다.)

 

 

 

다음은 캐릭터 음성의 음성합성 결과물을 한번 보자.

 

캐릭터 음성 + 한국어

"포상은 열심히 한 아이에게만 주어지기 때문에 포상인 것입니다."

 

"내이름은 에밀리아. 리제로의 에밀리아입니다."

 

 

조금 어색하지만 알아 들을 정도의 음성이 나왔다.

처음 들었을 때의 느낌은 일본인이 한국어를 하는 느낌?

캐릭터의 목소리가 들리는 것 같다!

 

 

캐릭터 음성 + 일본어

"私の名前はエミリア、、、 リジェロのエミリアです、、、"

 

"ご褒美は頑張った子にだけ与えられるからご褒美なのです、、、"

 

"今日は朝早く起きなければなりません、、、"

 

목소리가 좀 더 캐릭터와 가까운 것 같은 느낌이 든다.

하지만 너무 또박또박 읽는 느낌이 난다.

 

캐릭터 음성으로 합성한 결과물들은 약간은 아쉬웠다.

하지만 캐릭터 음성 데이터가 많이 부족했던 점, 정제를 했지만 그래도 고품질의 음성은 아니었던 점

등을 감안하면 이 정도의 결과물이 나온 것은 잘 된 것이라고 생각한다.

 

 

 

 

 

후기

이렇게 해서 약 7개월간 진행한 음성합성 프로젝트가 끝이 났다.

 

이 프로젝트를 하면서 github사용법, gcp, 라이브러러 제작&배포, gui제작, 음성합성 기술들, 등등 많은 것들을 배우게 되었다.

남의 코드의 구조를 파악하고 내가 사용하려는 목적에 맞게 수정했던 경험이 큰 도움이 될 것 같다.

github에서 내가 사용하던 repo에 추가 기능을 PR을 보내고, 다른 사람들에게서 내 PR의 피드백을 받으면서 소통한 것도

좋은 경험이었다. (협업의 중요성을 알게 되었다..)

요즘 많이 사용한다는 클라우드 서비스를 직접 사용해본 것도 좋았다. 비용이 엄청난 GPU나 저장장치 등을 사지 않고 대여한다는 개념으로 돈을 내고 빌려 쓰는 방식인 클라우드 서비스는 돈이 부족한 개인이나 작은 스타트업에서 선택할 수 있는 매력적인 선택지라고 생각한다.

 

이 프로젝트가 끝났으니 막상 할게 없어졌다..

내가 또 뭘 만들고 싶은지, 뭘 구현하고 싶은지 

하고 싶고 만들고 싶은 건 많지만, 뭘 해야 할지 고민이다. (행복한 고민)

 

다음 프로젝트가 정해지면 그때 또 이렇게 글을 쓰도록 하겠다.

 

지금까지 프로젝트 "내가 좋아하는 애니캐릭터가 내 이름을 불러준다면?" 이었다. (ぱちぱちぱち~)