jc.jang

책 읽어주는 딥러닝 본문

카테고리 없음

책 읽어주는 딥러닝

jangstory 2018. 7. 19. 17:49

다음 링크의 자료를 참고했고 발표해주신 김태훈님께 감사를 표합니다.
김태훈님 발표 영상 https://bit.ly/2uRklOo
김태훈님 발표 슬라이드 https://bit.ly/2mJ6rsZ


네이버 nvoice

배우 유인나해리포터를 읽어준다면?
유인나가 해리포터를 읽어주는 소프트웨어를 만들어보자
로 시작함.

API 사용해보자. (TTS 서비스) NAVER, KAKAO, GOOGLE

목소리 퀄리티가 아쉽다. 

그래서 TENSORFLOW를 이용해 만들었다.


오늘의 발표는 크게 3파트로 나뉜다.
  1. 데이터
  2. 모델
  3. 결과

텍스트 <-> 음성 pair로 있어야한다.
한국어 음성 합성 데이터는 공개 된게 없다. 직접 만들어야한다.

  • 데이터 프로세싱
  1. 음성추출
  2. 문장 별 자르기
  3. 텍스트 <-> 음성 맞추기

노가다 x -> Google Speech API, Text similarity 이용

뉴스 + 유튜브 + 오디오 북 데이터를 이용해서  50+ 시간 데이터를 모음

손석희 15+시간 13,000 문장
박근혜 5+ 시간 6,000 문장
문재인 2+ 시간 2000 문장

  • 모델
딥러닝
  1. 타코트론
  2. 딥 보이스2
타코트론의 핵심
과거의 전통적인 음성 합성 기술
텍스트 -> [토큰화 -> 운율 분석 -> 모델을 만들거나 or 잘게나눠진 음성들을 검색하고 합성 ]-> 음성 

여러 개의 파이프라인을 없애고 모델 하나로 가능하게 했다.
텍스트 -> 모델-> 음성
                    이 모델이 타코트론이다.

모델은 크게 4가지로 구성되어있다.
  1. 인코더 Encoder
  2. 디코더 Decoder
  3. 어텐션 Attention
  4. 보코더 Vocoder

하나씩 소개해본다.

 1. 인코더부터 설명

인코더의 역할?

텍스트 -> Encoder -> 텍스트 정보를 잘 나타내는 숫자

캐릭터 임베딩?
글자를숫자로 변환하는 것
딥러닝 모델이 글자를 계산 할 수 없으므로 숫자로 바꿔주는 것
0.7
0.3
0.1
0.9
0.5
0.0
0.0
0.5
0.9
0.7
0.3
0.1
1.0
0.5
0.2
0.2
...
...
...
...
학습을 하면서 행렬도 바뀜


띵작








명작                                                                                    띵동
















장점 : 띵작을 말하고 싶을 때
학습 데이터에 띵작이라는 단어가 없어도
명작, 띵동 이라는 단어를 캐릭터 임베딩으로 잘 배웠다면
명작을 잘 표현하는 캐릭터 임베딩을 만들 수 있다.

ㄱㄲㄴㄷㄸㄹㅁ ... ㅊㅋㅌㅍㅎ

ㅏㅐㅑㅐㅓㅔ ㅕ ... ㅠ ㅡ ㅢ ㅣ

! ' () , - . : ; ? _ ~

자음, 모음, 특수 문자 총 80개의 임베딩


ex) ㅋㅏㄹㅡㅍㅔ -> pre-net (FC -ReLU-Dropout을 2번 거친다.) -> CBHG -> 텍스트 임베딩 (텍스트를 잘 나타내는 숫자)

카르페라는 문장을 말한다고 했을 때 가장 먼저 pre-net 모듈을 거친다. pre-net은 FC-ReLU-Dropout을 2번 거친 것이다.

그다음 CBHG라는 모듈을 거친다.


CBHG = 1-D Convolution Bank + Highway network + Bidirectional GRU 




요약: 인코더가 하는 일은 다음과 같은데, 텍스트가 Pre-net과 CBHG를 거치면 텍스트 임베딩을 만들어 낸다.



2. Decoder

크게 보면 그냥 RNN


디코더가 하는 역할은?


이전에 만든 스팩트로그램을 입력으로 받고 -> Decoder -> 다음 스팩트로그램 생성한다.


스팩트로그램: 음성을 숫자로 표현하는 여러가지 방법 중 하나이다. 스팩트로그램으로 음성을 만들 수 있다.

디코더는 처음에 입력으로 <GO> frame을 받는데 이것은 학습되는 것이고 어떤 숫자들이다. 


어텐션은 나중에 설명


이후에는 RNN을 한다.

왜 1/N로 줄이냐면 만약 '가'라는 음성이 있으면 파형으로 생각하면 잘게잘게 나눠보면 '가', '가', '가', '가', '가', '가', '가', '가', '가', 이게 반복 될 것이다.

'가ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ' 이런식...?

그래서 굳이 똑같은게 여러갠데 많이 예측할 필요없고 n개의 스팩트로그램만 예측한다.






디코더의 결과로 n개의 스팩트로그램의 리스트를 얻게 된다. 스팩트로그램은 음성이 되기 직전의 숫자들이다.



어텐션을 설명하기전에 제일 마지막 모듈인 보코더 부터 설명합니다.

보코더의 역할은 스팩트로그램을 입력으로 받아서 음성을 만들어주는 것이다.




여기서 또 CBHG를 거친다. 


스팩트로그램을 음성으로 만들어주는 방법이 여러가지 있는데 그 중 하나인 그리핀-림(Griffin-Lim)알고리즘을 이용해서 음성으로 만들었다.


그리고 마지막으로 가장 중요한 어텐셜 Attention

왼쪽 초록색 배열은 인코더의 출력으로, 텍스트 임베딩한 결과물이다. 텍스트 임베딩과 디코더를 잘 합쳐주는 모델이 어텐셜이다.


Attention -> 어디에 집중할 것인가?


어디에 집중할 건지는 학습을 통해 알아서 계산한다.


어떻게 만들어지는지 예제를 봅시다




어텐션이 중요한 이유가 뭘까?

일반화 때문이다.

학습하지 않은 것을 얼마나 잘 말 할 수 있는가?


Comments