[3]Encoder-Decoder TTS Models2
[DeepVoice1]
1)text가 들어오면, grapheme 이라고 볼 수 있는데 이걸 phoneme으로 바꾼다. 이 과정에는 phoneme dictionary라는 것이 필요하다.
2)Phoneme의 sequence로 부터, 각 phoneme의 길이가 얼마나 되어야 하는가 그 부분을 수정한다.
3)또 한가지는 그 phoneme을 발음 하기 위한 F0(pitch)를 설정한다.
4)이렇게 세가지를 받아서, 이제 오디오를 합성한다.
학습은 과정:
1)text가 우선 들어온다. text는 phoneme으로 바꾸고 이 과정은 neural net을 사용하지 않고, phoneme dictionary를 이용해서 진행이 된다.
2)오디오와 phoneme간에 mapping 관계를 학습을 해야한다.
이것을 위해서는 먼저 오디오를 segmentation을 해야한다. 말을 하고 있으면, 어디서 부터 어디까지 phoneme인지 잘라야 한다. 그럼 이렇게 segmentation 된 정보로 부터 duration alignment정보를 알 수 있다. 그럼 이 정보와, phoneme정보를 이용해서 duration predictor를 학습한다. 학습한 결과가 음성에서 추출한 duration과 같아지게 학습하는 것이다.
3)f0학습 과정:
오디오로 부터 f0를 추출한다. (신호처리 분석으로 가능)
F0값을 phoneme과 매칭을 시켜서 학습을 시킨다.
4)마지막으로 f0와 duration, phoneme을 이용해서 음성을 합성한다.
DeepVoice1의 구조:
1)G2Pmodel(enc-dec model)
인코더 디코더를 학습시킬때, phoneme dictionary가 사용되었다.
2)Segmentation model(CTC-Connectionist Temporal Classification)
원래 C2C는 음성인식을 위해서 만들어짐.
매타임 웨이브 form 정보를 받아서, RNN에 집어 넣으면, RNN이 각 캐릭터일 확률을 내줌.
시간 resolution이 음성의 시간 resolution이다.
각 phoneme이 어디서 부터 어디까지인지, 잘라야 text resolution의 결과를 받을 수 있다. frame 단위의 결과를 받아서, 적절히 같은 phoneme에 대해서 연결을 해주면, waveform 전체를 segmentation을 할 수 있다.
3)Phoneme duration model(FC + GRU)
각 phoneme의 지속시간을 예측하는 역할을 한다.
4)Fundamental frequency model(FC + GRU)
F0성분을 확보하는 역할을 한다.
5)Audio Synthesis model(WaveNet과 비슷한 구조)-음성합성
[End-to-End TTS Models]
sequence to sequence transfer을 이용해서 text에서 스팩토 그램까지나 text에서 오디오까지 가는걸 의미한다.
보통 스팩트럼 제너레이터는 Seq2seq transform이고 autoregressive 나 non-autoregressive models가 있따.
Vocoder를 이용해서 speech waveform
과
spectrogram을 inverse 풀리에 트랜스폼 —> speech waveform이 나온다.
문제는 이 과정에서 real-component와 imaginary 두가지가 있어서 정보의 양이 두배가 된다. 보통 magnitude만 사용하고 phase정보는 버리는 경우가 많다.
spectrogram generator도, 실수와 허수를 다 가지고 있는게 아니라, magnitude만 있는 spectrogram을 가지고 있는다.
그럼, vocoder의 중요한 역할은 phase를 복원하는 역할을 한다.
ex)griffin-lim, wavenet, parallel wavenet, parallel wavegan, melgan, vocgan
[Tacotron]
mel spectrogram을 만들었다. linear spectrogram을 이용하면 정보의 양이 너무 많아진다.
Vocoder로는 griffin-lim reconstruction을 이용한다.
Neural net에 의해서 mel-spectrogram을 만들어 낸다.
실제 신경망의 구조는 Encoder-attention-decoder의 구조를 가지고 있다.
Attention의 정보를 잘 활용해서 spectrogram을 만들어 내는 decoder가 있다.
Decoder—>
Attention에 의해서 context vector가 들어온다. context vector를 이용해서 spectrogram을 만들어 낸다. 그 결과가 다음 타임에 입력으로 들어간다. 그걸 이용해서 다음껄 만들어 내고 이러한 과정을 거치게 된다.
[타코트론 동작 원리]
encoder나 decoder는 입력을 받을때, character embedding을 입력을 받는다. prenet을 이용해서 특징 추출을 한번 한다. CBHG라는 것을 통과한다.
RNN을 이용해서 학습된다. RNN이 출력해주면, 매 타임미다 output이 하나씩 나온다. memory의 컨텐트가 attention에 들어간다.
Decoder도 마찬가지로 prenet을 거쳐서 들어간다. attention에 들어가는 embedding을 넣어 주는 것과 decoder에서 실제로 만들어낸 RNN이 서로 분리가 되어 있다.
Tacotron에는 리덕션 factor라는 트릭이 있다.
이와 같은 사이클이 되게 많이 동작 해야한다.
RNN의 동작은 동작하는 시간이 길어질수록 학습도 어렵고, 불안정성이 계속 될 수 있다.
타코트론에서 이것을 해결하기 위한 트릭은, 한번에 여러개의 spectrum을 생성해서 시간을 줄인다. 실제 논문에서는 2를 이용한다.
이렇게 해서는 mel-spectrum이 나오고, 이걸 linear-scale spectrogram을 만든다. 이걸 이용해서 griffin-lim을 이용해서 음성으로 추출한다.
[Encoder의 구조]
1)character embedding이 입력으로 들어간다.
2)1차원 멕스 풀링: 시간축에 따라서
사용된 이유—>position 변이가 어느정도 흡수되는 효과를 위해서
(with=2, stride=1) 타임 스텝1정도 오차는 허용, stride=1로 resolution은 유지
3)prenet
4)GBHG
좁은 context와 넓은걸 둘다 보겠다.
high-way network도 들어감.
아래서 위로 올라갈때 일종의 gate 개념을 이용해서, depth가 깊은 네트워크도 잘 학습되게 만들었다.
GRU가 맨위에 들어감(bi-directional)
5)Residual connection
[Attention 구조] [Decoder 구조]
1)Prenet을 통과 한다. 앞에서 들어온 정보가 좀더 처리가 되서 들어간다.
2)GRU와 FC가 들어간다.
각 타임에 fc를 통해서 아웃풋을 낸다.
80 band mel0spctrogram을 만들어 내기 위해서.
Reduction factor=2이다.
[Postprocessing net 구조]Mel-spectrogram을 linear spectrogram으로 만들어 준다.
구조는 CBHG를 사용한다.
[Tacotron 결과]
엄청 뛰어나지는 않지만, 딥러닝기반에 최초로 음성합성 성공
[Tacotron2]
보코더 부분이 가장 크게 변한 부분이다. griffin-lim에서 WaveNet Vocoder로 바꾸었다. mel spectrogram에서 waveform으로 만들어 준다.
바꾼 이후에는 음질이 상당히 좋아졌다.
네트워크 구조를 훨씬 더 단순화 했다.
[Encoder 구조]
512 dimension의 chracter embedding을 input으로 사용하고,
512디멘젼 5 by 1 fiter 컨볼루션 3개를 사용했다.
Bi-direction LSTM으로 교체 했다. 이전에는 GRU를 사용했다.
[Decoder 구조]
Pre-net(2FC)
2 LSTM (1024 dim)
Post-net(5 conv.)
512 5*1 fiters
[Attention 구조] [전체 Tacotron2 모델 구조] [결과]
음성의 품질이 상당히 좋아졌다. ground-truth와 비슷한 퍼포먼스에 도달했다.
[WaveNet]
Autoregressive neural vocoder
과거의 시그널을 받아서 다음 시그널을 만드는 역할을 한다.
Dilated causal convolution + gated activation이라는 방법을 사용한다.
두칸씩 입력으로 받아서,
두번째 layer부터는 차원을 줄이기 위해서 3개를 다보는게 아니라, 중간씩 건너뛰면서 본다.
장점은 넓은 컨텍스트를 볼 수 있다. full-convolution을 쓰기에는 음성 신호는 resolution이 높아서 쉽지 않다.
causal convolution은 과거의 정보는 쓸수 있지만, 미래는 아직 안만들어서 못쓴다. 즉 왼쪽은 보지만, 뒤에는 보지 않는다.
16비트짜리 high-fidelity sound가 만들어 질 수 있다.
이 generation하는 과정은 매우 느리다.
하지만, 음질은 매우 좋다.
[속도를 개선한 보코더 모델들]
[DCTTS]
convolution 기반의 TTS
타코드론보다 좋은점: RNN기반보다 훨씬더 학습이 빠르다.
[DC TTS 전체 구조]
장점1)인코더가 병렬처리가 가능하다. / 인코더가 convolution을 사용함
장점2)디코더는 컨볼루션을 써도 시퀀셜하게 움직인다. 그래도 훨씬 빠름
구성은 Text2Mel이라는 서브 네트워크와 SSRN(mel to linear spectrogram)으로 이루어 진다.
Highway Network이다. LSTM에서 영감을 받았다.
[Text2Mel의 구조]
Text Encoder는 L이라는 text으 sequence를 방아서 key와 value의 sequence를 만들어 준다.
Audio Decoder는 이전타임의 정보와 컨텍스트 정보다 입력으로 들어간다. 스팩토 그램을 임베딩 백터로 만들어 주는 역할을 한다. 이것은 쿼리의 역할을 한다.
Reduced Mel-spectrogram을 해야 네트워크에 부담이 적다.
SSRN이 mel을 linear spectogram으로 만들어 준다.
줄였던 차원을 다시 늘려준다.
[SSRN의 구조]
Mel - spectrogram —> full size linear spectrogram
upsampling을 한다.
frequency direction으로 upsampling을 하고, 동시에
temporal direction으로 4배정도 upsampling을 한다.
그렇기 때문에 2 transposed conv.를 이용한다.
타코트론은 12일 걸린다.
DCTTS는 2시간에서 15시간이면 가능하다.
'딥러닝 논문정리' 카테고리의 다른 글
FastSpeech1, 2 (0) | 2021.07.08 |
---|---|
Transformer TTS (0) | 2021.07.08 |
[2]Encoder-Decoder TTS_1 (0) | 2021.07.08 |
[1]Introduction to Speech Preprocessing (0) | 2021.07.08 |
ResNet 논문정리 (0) | 2021.05.11 |