티스토리 뷰
괜찮다고 생각되는 TTS 모델에 한국어는 많이 없다.
따라서 직접적으로 파인튜닝을 하는 일들이 많은 데, 이때 tts에는 음소와 음절 패딩 부분이 데이터셋에 존재하는 경우가 있다.
음소는 한국어의 자음, 모음처럼 ㄱ, ㄴ, ㄷ, ...ㅏ,ㅑ,ㅓ..등등 각각 따로따로 발음하는, 말 그대로 음의 소리를 나타내어 발음하는 것이다.
이를 영어로는 Phoneme라고 한다. 영어는 음소 언어이므로, 만약 알파벳인 apple을 바꾸면 이렇게 될 것이다.
[a,p,p,l,e]
같은 방식으로 한국어도 '사과' 라는 단어가 있다면
[ㅅ,ㅏ,ㄱ,ㅗ,ㅏ]가 된다.
그렇다면 결국 TTS 모델은 숫자를 처리해야 하는데, 음을 어떻게 처리할까?
해답은 간단하다. 바로 각 발음에 숫자를 매겨 조합하는 것이다. 모든 발음과 말은 결국 음소들의 조합이기 때문이다.
만약 apple이라면, [0,16,16,12,5] 이런식으로 숫자를 매겨 각 발음을 traning한다. 그리고 나중에는 그 발음을 조합하여 그럴듯한 음성을 합성(synthesize)하는 게 결국 TTS의 원리인 것이다.
그런데 한국어는 이러한 일반적인 패턴에서 조금 벗어나 있는 언어다.
음절 단위로 되어 있는 언어로서, 굉장히 발음 요소가 많고, 조합하기 쉽지 않다. 그래서 정말 다양한 패딩 토큰들이 중간중간에 들어가게 된다.
예를 들어, '아버지가 방에 들어가신다'는 문장을 보자.
이를 어찌되었건 일단 음절별로 나누게 되면, 이렇게 된다.
아,버,지,가,' ',방,에,' ',들,어,가,신,다.
음절별로 나누면, ' '와 같은 구분자들이 명확해진다.
그러나 만약 음소별로 나누면 어떻게 될까?
아버지와 가, 그리고 들어, 가신다. 사이에도 패딩이 있어야 하는지, 아니면 그냥 자음 모음 전부에 전부 패딩이 있어야 하는지, 아니면 그냥 음절별로 training해야 하는지 헷갈리게 된다.
어찌되었건 training을 하려면 일단 숫자로 바꿔야 하기 때문에, 일단 권장되는 건 음소별로 중간에 무음 패딩을 넣는 것이다.
[ㅇ,ㅏ,ㅂ,ㅓ,ㅈ,ㅣ,ㄱ,ㅏ...]라면, 0을 _ 패딩으로 잡고,
[1,0,2,0,3,0,4,0,5,0,6,0,7,0,8...](0초과 숫자들은 예시로 든 것이다.)
이런 식으로 음소 별 중간에 0을 조합하게 되면, 어찌되었건 띄어쓰기가 된다. 그러면 모델이 더 잘 학습할 수 있게 되는 것이다.
다만 더 디테일하게 하고 싶다면, 자음의 옆에는 묵음 패딩을 붙이고, 모음에는 사용하지 않는 방법도 고려할 수 있다.
왜냐하면 한국어에는 모음의 조합으로 생겨나는 발음도 있고, 받침 발음도 있기 때문이다.
만약 음소별 길이를 조절할 수 있는 tts라면 직접 조절해줘도 좋다. 그런 방식으로 데이터셋을 조절하여 train할 수 있다면, 정말 좋은 tts 모델링을 할 수 있을 것이다.