chldkato

Tacotron 정리 본문

딥러닝

Tacotron 정리

chldkato 2020. 4. 3. 19:58

타코트론은 딥러닝 기반 음성 합성의 대표적인 모델이다

 

타코트론을 이해하면 이후의 타코트론2, text2mel 등 seq2seq 기반의 TTS를 이해하기 쉬워진다

 

그리고 타코트론도 attention을 적용한 seq2seq를 기반으로 하기때문에 seq2seq와 attention을 먼저 알아둬야 한다

 

타코트론의 구조이다

 

처음보면 되게 복잡해보이지만 결국은 attention + seq2seq의 tts버전이라 보면된다

 

위 그림과 타코트론을 비교해보면 비슷하다는 느낌이 확 온다

 

타코트론은 4부분으로 나눌 수 있다

 

1) 인코더

2) 디코더

3) 어텐션

4) 오디오 생성 (보코더)

 

1,2,3 번은 묶어서 seq2seq attention인데 구조를 어떻게 하느냐로 볼 수 있다

 

그리고 오디오로 복원하기 위해서 그리핀-림 알고리즘을 사용한다

 

 

1. 데이터 전처리

 

텍스트 그대로 입력할 수는 없기 때문에 전처리가 필요하다

 

한글의 경우 초성, 중성, 종성으로 나눠야하기 때문에 초성 19 + 중성 21 + 종성 27개

 

그리고 공백, EOS (end of speech), 패딩 까지 해서 총 70개의 케이스가 있다

 

이를 {'ㄱ': 1, 'ㄴ': 2, ... , 'ㅎ': 67, ' ': 68, '~': 69, '_': 70} 이런식으로 dict형으로 미리 라벨링해준다

 

말 그대로 각 character에 대한 사전이라고 보면 된다

 

 

이제 입력 데이터 텍스트를 character로 나누는데 먼저 특수문자를 제거한다

 

그 다음에 jamo 라이브러리의 hangul_to_jamo를 사용하면 초성, 중성, 종성 분리가 쉽게 가능하다

 

마지막에는 EOS에 해당하는 ~를 붙여준다

 

 

이제 모든 데이터셋에 앞서 만든 사전을 적용하여 숫자열로 바꿔준다

 

그리고 encoder 맨 앞의 embedding layer를 통과하여 256개의 입력 벡터로 바꿔주면 입력할 준비가 끝난다

 

[사전 제작 -> 자음모음 분리 -> 사전에 대입 -> embedding layer 통과] 이런 순서다

 

 

그리고 loss 계산에 필요한 타겟 스펙트로그램과 멜스펙트로그램을 준비해야한다

 

타코트론의 디코더 출력은 reduction factor로 몇 개의 멜스펙트로그램 프레임을 출력할 지 조절할 수 있다

 

그래서 reduction factor의 배수에 맞게 타겟 멜스펙트로그램에 0 패딩을 해야한다

 

 

위의 과정을 전부 합쳐서 [라벨링 텍스트, 타겟 멜스펙트로그램, 타겟 스펙트로그램] 3개의 데이터를 준비해야한다

 

 

2. Encoder

 

인코더는 위의 CBHG 구조를 거쳐 character를 잘 표현할 수 있는 어떠한 특징을 출력하게 된다

 

CBHG는 위 구조를 참고하여 만들었다고 한다

 

왜 CBHG를 사용했고 안에 highway는 왜 있는지 이러한 궁금증을 풀기위해 참조 논문을 계속 따라가면

 

결국 character 단위를 표현하는데 위 구조가 효과적이었다는 것이 결론이다

 

인코더를 거치면 어떠한 벡터가 나올것이고 그게 곧 어텐션의 query에 해당한다

 

 

3. Decoder, Attention

 

디코더의 출력은 멜-스펙트로그램이다

 

reduction factor라는 변수에 따라서 몇개의 프레임을 출력할지 결정한다

 

만약에 reduction factor가 3이라면 출력은 80x3 이 된다 (80은 멜 차수)

 

출력의 마지막은 seq2seq처럼 다음 시퀀스의 입력이 된다

 

디코더의 처음 입력은 <GO>라고 되있는데 초기값 0으로 설정되있다

 

 

디코더는 keith ito의 코드의 경우 wrapper 구조로 되있는데 pre-net을 거쳐 attention의 key로 사용한다

 

이제 attention의 query, key를 구했기 때문에 score를 계산하고 다시 value를 concat한다

 

여기까지는 일반적인 attention 원리와 똑같다

 

concat한 벡터를 multi GRU에 입력하여 멜-스펙트로그램을 출력하면 끝이다

 

 

마지막에 CBHG가 하나 더 있는데 멜-스펙트로그램을 입력해서 스펙트로그램을 출력한다

 

이 스펙트로그램을 그리핀-림을 사용해서 오디오 신호로 복원한다

 

loss는 디코더 출력 멜-스펙트로그램에 대한 loss와 post CBHG의 출력 스펙트로그램에 대한 loss를 더한 것이다

 

 

4. 결과

 

타코트론 결과물을 찾다보면 타코트론으로 만든 손석희, 문재인 목소리가 있는데 실제로 해보면 잘 안된다

 

목소리 파일을 하나하나 검수해서 제대로 된 목소리만 추출하고 텍스트를 하나씩 붙여줘야 잘 된다고한다

 

kss 데이터처럼 대본을 가지고 스튜디오에서 녹음한 음성으로 하면 잘 된다

 

eval-135000-0.wav
0.16MB

 

위 파일은 135k에서의 테스트 결과이다 (물론 학습할 때는 없던 텍스트다)

 

학습이 50k step쯤 되면 loss가 어느정도 수렴한 결과를 얻을 수 있다

 

51k step에서의 어텐션 그래프인데 loss가 0.08~0.09 사이로 왔다갔다 할 때쯤부터 테스트해보면 괜찮은 결과가 나온다

 

TTS는 입력 순서대로 출력이 나오기 때문에 어텐션 그래프도 나란한 직선이 나온다

 

이를 이용해서 DCTTS에서는 guided attention loss를 적용하기도 했는데 논문만큼 효과가 있는지는 잘 모르겠다

 

타코트론 이후에는 타코트론2, multi-speaker 타코트론, DCTTS를 찾아보면 된다

'딥러닝' 카테고리의 다른 글

Tacotron2 정리  (0) 2020.05.08
윈도우에서 MelGAN 학습하기  (42) 2020.04.08
MelGAN 정리  (4) 2020.04.03
윈도우에서 Tacotron 한국어 TTS 학습하기  (98) 2020.03.25
윈도우에서 DCTTS (Deep Convolutional TTS) 학습하기  (19) 2019.10.30
Comments