일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Vocoder
- 딥러닝 보코더
- text-to-speech
- korean tts
- 딥러닝
- 한국어 음성 합성
- TTS
- waveglow
- 보코더
- 학습
- 한국어 tts
- DCTTS
- YOLO
- 윈도우
- melgan
- deep voice
- tacotron
- 음성 합성
- 트레이닝
- singing voice synthesis
- you only look once
- 딥러닝 음성 합성
- 타코트론
- 노래합성
- Today
- Total
chldkato
Tacotron 정리 본문
타코트론은 딥러닝 기반 음성 합성의 대표적인 모델이다
타코트론을 이해하면 이후의 타코트론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 데이터처럼 대본을 가지고 스튜디오에서 녹음한 음성으로 하면 잘 된다
위 파일은 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 |