이번에는 지금까지 세운 계획에 대해서 가볍게 언급하도록 하겠다.

제일 처음 글을 쓸 때, 이 프로젝트를 3단계로 구분 지었다.

 

  • 음성합성을 진행할 방법 정하기 
  • 데이터셋 만들기
  • 학습하기

 

먼저 '음성합성을 진행할 방법 정하기'에 대해서 말해보겠다.

방법으로는 딥러닝을 활용한 기술을 사용하기로 정했었다.

 

여기서 acoustic model과 vocoder model를 뭘 사용할지 정해야 한다. 물론 장단점을 다 따져가면서 정해야 하지만, acoustic model과 vocoder model의 설명, 이론과 구현한 코드를 보니 내가 구현하기에는 엄청난 시간이 소모될 것으로 보여 가능하면 구현이 이미 되어있는 모델을 선택하고 싶었다. (물론 정말 필요하면 구현을 해봐야겠지만..)

 

그래서 구현이 되어있는 코드 중 가장 쓰기 좋은 코드를 github나 다른 분들의 블로그를 뒤지면서 찾던 중, 

github에서 hccho2님의 'Tacotron2-Wavenet-Koreann-TTS'를 찾게 되었다.

 

https://github.com/hccho2/Tacotron2-Wavenet-Korean-TTS

 

GitHub - hccho2/Tacotron2-Wavenet-Korean-TTS: Korean TTS, Tacotron2, Wavenet

Korean TTS, Tacotron2, Wavenet. Contribute to hccho2/Tacotron2-Wavenet-Korean-TTS development by creating an account on GitHub.

github.com

 

acoustic model로는 이미 좋은 합성 모델로 증명이 되어있는 tacotron2가 사용되었다. (google에서 만든 model)

(참고로 model이름이 tacotron인 이유가 이거 만든 개발자 과반수가 타코를 좋아해서라는 소문이 있다. 맛있겠다)

 

 

vocoder로는 wavenet이 사용되었다. wavenet의 장단점을 요약하자면, '엄청나게 느린데 품질이 가장 좋다.'라고 할 수 있다. 지금은 소리 한번 들어보는 게 목적이기에 시간은 크게 관심대상이 아니다.(물론 나중에 느리다는 특징이 발목을 잡을 수도 있다. 하지만 나중에 가서 vocoder만 바꾸면 되기에 상관없다.)

 

한국어를 지원한다는 점, 그래도 비교적 최신 model인 tacotron2를 사용한다는 점, 설명이 친절하다는 점,그래서 이 코드를 사용하기로 결정했다. 아니 결정했었다.

 

이 코드를 자세히 보면 언어로 영어와 한국어를 지원한다는 것을 알 수 있다. 하지만.. 내 목적은 애니 캐릭터가 나를 불러주는! 그런 걸! 원한단! 말이다!!! 이게 무슨 문제냐? 캐릭터가 사용하는 언어는 일본어다! (으엌어ㅓㅋㅇ렄)

 

데이터셋을 만들 때, 음성 데이터는 일본어다. 이 음성 데이터를 text로 가장 잘 표현할 수 있는 언어는 당연히 일본어다.하지만 위의 코드에는 일본어를 지원하지 않는 것으로 보인다.그럼 여기서 선택을 해야 한다.

  1. text를 한국어나 영어로 작성한다.
  2. 일본어를 지원하는 코드를 작성하여 위의 코드에 추가한다.

 

1번 방법의 예시

음성 :わたし  --> text : 와타시 or watashi

 

1번 방법은 추가로 코드를 짤 필요가 없지만, 모든 음성 데이터들을 다 들어보고 최대한 가깝게 한글이나 영어로 작성해야 한다. 많은 시간이 들 것이고, 일본어 음성을 한글로 표현한 이 데이터셋으로 학습을 했을 때, 자연스러운 음성이 나올 것 같지가 않다고 생각한다.

(일본어 음성+한국어 text로 학습을 한다고 생각해보자. 일본어 음성+한국어 text로 학습을 하면, 출력을 위해 한국어 text를 넣었을 때 나오는 음성이 일본어의 특성을 크게 가질 것이라고 예상한다. 예를 들면 '물'이라는 text를 입력한다면 '무르'라는 음성이 나올 것이라고 예상한다. 이렇게 되어버리면 자연스러운 한국어를 듣기 어려울 것으로 예상한다.)

 

 

2번 방법은 일본어에 대한 이해가 있어야 만들 수 있기에 조금 힘들 것 같다. 그리고 입력 text를 일본어로 해야 하기에 사용하기에 어려움이 있을 것이다.

 

둘 다 맘에 들지 않는다.. 그렇게 어떤 방법이 더 있을까 생각을 하다가 1주일 넘게 날렸는데.. 우연히 어떤 홈페이지에 들어가게 되었는데 multilingual speech synthesis(다중언어 음성합성)에 관한 논문과 오디오 샘플이 있는 홈페이지를 발견했다!

 

https://google.github.io/tacotron

 

Audio samples related to Tacotron, an end-to-end speech synthesis system by Google.

 

google.github.io

 

후에 이 홈페이지가 tacotron을 개발한 구글에서 tacotron의 논문과 오디오 샘플 등을 공개하는 github page라는 것을 알게 되었다..

 

multilingual speech synthesis에 대해서 간단히 설명하면, 말 그대로 다중 언어로 음성 합성을 하는 것이다. 

예를 들면, 영어 dataset(A), 일본어 dataset(B), 한국어 dataset(C)가 있다고 하자. A, B, C로 학습을 진행한 후 speaker를 C로 설정하고 text로 영어를 넣는다면 영어로 음성을 출력한다. 당연히 목소리는 원래 C의 목소리다.

 

이게 내가 원하던 거다! 

이러한 기술이 있다는 것에 놀랐고, 오디오 샘플을 듣고 또 놀랐다...
홈페이지에서는 영어, 스페인어, 북경어 dataset으로 학습을 진행한 후, 한 speaker의 영어, 스페인어, 북경어로 음성을 출력하는 결과물을 제공한다. 

 

https://google.github.io/tacotron/publications/multilingual/index.html

 

Audio samples from "Learning to speak fluently in a foreign language: Multilingual speech synthesis and cross-language voice clo

Audio samples from "Learning to speak fluently in a foreign language: Multilingual speech synthesis and cross-language voice cloning" Paper: arXiv Authors: Yu Zhang, Ron J. Weiss, Heiga Zen, Yonghui Wu, Zhifeng Chen, RJ Skerry-Ryan, Ye Jia, Andrew Rosenber

google.github.io

 

들어보면 알겠지만 원어민이 발음한다고 느낄 정도로 발음이 정확하고 뭉개지지 않는다. 그리고 사람이 말하는 것이라고 착각할 정도로 사람의 말과 비슷하다.

(물론 dataset이 정말 많다.. 홈페이지에서 말하는 바로는 영어 385시간, 스페인어 97시간, 북경어 68시간 정도이다.)

 

그래서 계획을 약간 수정해서, multilingual이 지원되는 코드를 이용하여 프로젝트를 진행하기로 결정했다.

data는 일본어 dataset과 한국어 dataset 그리고 캐릭터 음성 dataset으로 합성을 진행할 예정이다. 

 

이제 당장 해결해야 할 문제는 2가지 정도이다.

  1. 일본어, 한국어, 캐릭터 음성 dataset 최대한 많이 끌어모으기.
  2. multilingual이 지원되는 코드 구하거나 만들기.

캐릭터 음성 dataset은 시간 날 때마다 틈틈이 만들고는 있는데... 이거 양이 정말 얼마 안 된다.. 시간도 엄청 걸리고..

하지만 절대 포기 안 하지

애니보면서 데이터 뽑는 본인 모습

 

 

일본어, 한국어 dataset은 speaker가 달라도 문제없으니 최대한 끌어모으는 게 어렵지는 않을 것이다. 공개되어있는 dataset도 많고.

 

계획 정리는 이렇게 끝이다.

 

(다음 글은 데이터 제작 방법을 설명하거나, 사용할 코드를 살펴볼 예정이긴 한데.. 확정은 아니다.)