Code Monkey home page Code Monkey logo

tacotron-wavenet-vocoder-korean's Introduction

Tocotron + Wavenet Vocoder + Korean TTS

Tacotron모델과 Wavenet Vocoder를 결합하여 한국어 TTS구현하는 project입니다.

Based on

Tacotron History

  • keithito가 Tocotron을 처음 구현하여 공개하였고, 이를 기반으로 한국어를 적용한 carpedm20의 구현이 있다.
  • carpedm20의 구현은 deep voice2에서 제안하고 있는 multi-speaker도 같이 구현했다.
  • Tacotron모델에서는 vocoder로 Griffin Lim 알고리즘을 사용하고 있다.

Wavenet History

  • Wavenet 구현은 ibab의 구현이 대표적이다.
  • ibab은 local condition을 구현하지 않았다. 그래서 train 후, 소리를 생성하면 알아들을 수 있는 말이 아니고, '옹알거리는 소리'만 들을 수 있다. 의미 있는 소리를 들을 수 있기 위해서는 local condition을 적용해서 구현해야 한다.
  • local condition을 구현한 wavenet-vocoder 구현은 r9y9의 구현이 대표적이다.
  • local condition으로 mel spectrogram을 넣어주는데, mel spectrogram은 raw audio 길이보다 짧아지기 때문에 upsampling 과정이 필요하다. upsampling은 conv2d_transpose를 이용한다.

Tacotron 2

  • Tacotron2에서는 모델 구조도 바뀌었고, Location Sensitive Attention, Stop Token, Vocoder로 Wavenet을 제안하고 있다.
  • Tacotron2의 구현은 Rayhane-mamah의 것이 있는데, 이 역시, keithito, r9y9의 코드를 기반으로 발전된 것이다.

This Project

  • Tacotron 모델에 Wavenet Vocoder를 적용하는 것이 1차 목표이다.
  • Tacotron과 Wavenet Vocoder를 같이 구현하기 위해서는 mel spectrogram을 만들때 부터, 두 모델 모두에 적용할 수 있도록 만들어 주어야 한다(audio의 길이가 hop_size의 배수가 될 수 있도록). 이렇게 해야, wavenet training할 때, upsampling이 원할하다.
  • Tacotron2의 stop token이나 Location Sensitive Attention을 Tacotron1에 적용하는 것이 그렇게 효과적이지 못했다(제 경험상).
  • carpedm20의 구현과 다른 점
    • Tensorflow 1.3에서만 실행되는 carpedm20의 구현을 tensorflow 1.8이상에서도 작동할 수 있게 수정. Tensorflow 버전이 업그레이드되면서, AttentionWrapperState에서 attention_state가 추가되었는데, 이 부분을 맞게 수정해 줌.
    • dropout bug 수정
    • DecoderPrenetWrapper, AttentionWrapper 순서를 바로 잡음. 이렇게 해야 keithito의 구현과 같아지고 논문에서의 취지와도 일치함. AttentionWrapper를 DecoderPrenetWrapper가 감싸야, Prenet의 결과가 AttentionWrapper의 입력으로 들어간다.
    • mel spectrogram 생성 방식을 keithito의 구현 방법으로 환원(이것도 keithito가 추후에 수정한 것임). 이렇게 mel spectrogram 생성방식을 바꾸면 train 속도가 많이 향상됨. 20k step 이상 train해야 소리가 들리기 시작했는데, 이렇게 하면 8k step부터 소리가 들린다.
    • padding이 된 곳에 Attention이 가지 않도록 보완.
    • Attention 모델 추가: LocationSensitiveAttention, GmmAttention 등
  • ibab의 wavenet 구현과 다른 점
    • fast generation을 위해서 tf.Variable을 이용해서 구현했다. 이 project에서는 Tensorflow middle level api tf.layers.conv1d를 이용하여, 코드를 이해하기 쉽게 만들었다.
  • 참고 코드 등에서의 복잡한 option을 많이 줄였습니다.

Tacotron 1에서 좋은 결과를 얻기 위해서는

  • BahdanauMonotonicAttention에 normalize=True로 적용하면 Attention이 잘 학습된다.
  • Location Sensitive Attention, GMM Attention등은 제 경험으로는 성능이 잘 나지 않음.
  • Tacotron2에서는 Locatin Sensitive Attention과 Stop Token이 결합하여 Tacotron1보다 빠른게 수렴됨.

단계별 실행

실행 순서

  • data 만들기
  • tacotron training 후, synthesize.py로 test.
  • wavenet training 후, generate.py로 test(tactron이 만들지 않은 mel spectrogram으로 test할 수도 있고, tacotron이 만든 mel spectrogram을 사용할 수도 있다.)
  • 2개 모델 모두 train 후, tacotron에서 생성한 mel spectrogram을 wavent에 local condition으로 넣어 test하면 된다.

Data 만들기

  • audio data(e.g. wave 파일)을 다운받고, 1~3초(최대 12초)길이로 잘라주는 작업을 해야 한다. 그리고 잘라진 audio와 text(script)의 sync를 맞추는 것은 고단한 작업이다. Google Speech API를 이용하는 것도 하나의 방법이 될 수 있다.
  • Google Speech API로 생성한 text의 Quality가 좋지 못하기 때문에, 수작업으로 (아주) 많이 보정해 주어야 한다.
  • 특별히 data를 확보할 방법이 없으면, carpedm20에서 설명하고 있는대로 하면 된다. 여기서는 data를 다운받은 후, 침묵(silence)구간을 기준으로 자른 후, Google Speech API를 이용하여 text와 sync를 맞추고 있다.
  • 한글 data는 KSS Dataset가 있고, 영어 data는 LJ Speech Dataset, VCTK corpus 등이 있다.
  • KSS Dataset이나 LJ Speech Dataset는 이미 적당한 길이로 나누어져 있기 때문에, data의 Quality는 우수하다.
  • 각 speaker별로 wav 파일을 특정 directory에 모은 후, text와 wav파일의 관계를 설정하는 파일을 만든 후, preprocess.py를 실행하면 된다. 다음의 예는 son.py에서 확인 할 수 있듯이 'son-recognition-All.json'에 필요한 정보를 모아 놓았다.
  • 각자의 상황에 맞게 preprocessing하는 코드를 작성해야 한다. 이 project에서는 son, moon 2개의 example이 포함되어 있다.

python preprocess.py --num_workers 8 --name son --in_dir .\datasets\son --out_dir .\data\son

  • 위의 과정을 거치든 또는 다른 방법을 사용하든 speaker별 data 디렉토리에 npz파일이 생성되면 train할수 있는 준비가 끝난다. npz파일에는 dict형의 data가 들어가게 되는데, key는 ['audio', 'mel', 'linear', 'time_steps', 'mel_frames', 'text', 'tokens', 'loss_coeff']로 되어 있다. 중요한 것은 audio의 길이가 mel, linear의 hop_size 배로 되어야 된다는 것이다.

Tacotron Training

  • train_tacotron.py 내에서 '--data_paths'를 지정한 후, train할 수 있다.
parser.add_argument('--data_paths', default='.\\data\\moon,.\\data\\son')
  • train을 이어서 계속하는 경우에는 '--load_path'를 지정해 주면 된다.
parser.add_argument('--load_path', default='logdir-tacotron/moon+son_2018-12-25_19-03-21')
  • speaker가 1명 일 때는, hparams의 model_type = 'single'로 하고 train_tacotron.py 내에서 '--data_paths'를 1개만 넣어주면 된다.
parser.add_argument('--data_paths', default='D:\\Tacotron-Wavenet-Vocoder\\data\\moon')
  • 하이퍼파라메터를 hparmas.py에서 argument를 train_tacotron.py에서 다 설정했기 때문에, train 실행은 다음과 같이 단순합니다.

python train_tacotron.py

  • train 후, 음성을 생성하려면 다음과 같이 하면 된다. '--num_speaker', '--speaker_id'는 잘 지정되어야 한다.

python synthesizer.py --load_path logdir-tacotron/moon+son_2018-12-25_19-03-21 --num_speakers 2 --speaker_id 0 --text "오스트랄로피테쿠스 아파렌시스는 멸종된 사람족 종으로, 현재에는 뼈 화석이 발견되어 있다."

Wavenet Vocoder Training

  • train_vocoder.py 내에서 '--data_dir'를 지정한 후, train할 수 있다.
  • memory 부족으로 training 되지 않거나 너무 느리면, hyper paramerter 중 sample_size를 줄이면 된다. 그러나 receptive field보다 적게 하면 안된다. 물론 batch_size를 줄일 수도 있다.
DATA_DIRECTORY =  'D:\\Tacotron-Wavenet-Vocoder\\data\\moon,D:\\Tacotron-Wavenet-Vocoder\\data\\son'
parser.add_argument('--data_dir', type=str, default=DATA_DIRECTORY, help='The directory containing the VCTK corpus.')
  • train을 이어서 계속하는 경우에는 '--logdir'를 지정해 주면 된다.
LOGDIR = './/logdir-wavenet//train//2018-12-21T22-58-10'
parser.add_argument('--logdir', type=str, default=LOGDIR)
  • wavenet train 후, tacotron이 생성한 mel spectrogram(npy파일)을 local condition으로 넣어서 STT의 최종 결과를 얻을 수 있다.

python generate.py --mel ./logdir-wavenet/mel-moon.npy --gc_cardinality 2 --gc_id 0 ./logdir-wavenet/train/2018-12-21T22-58-10

Result

  • tacotron모델에서는 griffin lim vocoder를 통해서 audio sample을 만들어 내는데, 음질이 나쁘지 않다.
  • wavenet vocoder는 train step이 부족할 때는 좋은 결과를 얻기 어렵다. 다음 issue들에서도 그런 사실을 확인할 수 있다.
  • 이 project에서 얻은 결과: wavenet vocoder로 부터 얻은 결과는 train step 부족으로 결과가 좋지는 못하다. 성능이 좋은 GPU로 train하면 더 좋은 결과가 있을 것으로 기대합니다.

음성을 처음 공부하는 분들께

  • Tensorflow의 Simple Audio Recognition은 음성관련 공부를 처음 시작하는 사람들에게 좋은 시작점이 될 수 있다.
  • 이를 통해, wav로 된 음성을 stft으로 변환하고 다시 mel spectrogram으로 변환하는 과정을 공부할 수 있다.
  • Simple Audio Recognition을 공부한 후에는 Tacotron을 공부할 수 있수도 있지만, 딥러닝에서의 기본인 RNN, Attention에 관한 공부를 미리해 두며 더욱 좋다.
  • 자료는 음성인식 기초, Tacotron, Wavenet 등에 관한 내용을 제가 정리한 것입니다(page 133).
  • 또한 Tensorflow에서 Attention Mechanism이 어떻게 작동되는지에 관한 자료도 정리되어 있습니다(page 69).
  • Facebook TFKR에 제가 작성한 도 참고하세요.

tacotron-wavenet-vocoder-korean's People

Contributors

hccho2 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tacotron-wavenet-vocoder-korean's Issues

vocoder training 질문드립니다.

안녕하세요 좋은 코드를 바탕으로 열심히 공부중인 학생입니다..!!

2019-10-04 13:38:15.119765: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1435] Adding visible gpu devices: 0
2019-10-04 13:38:15.457661: I tensorflow/core/common_runtime/gpu/gpu_device.cc:923] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-10-04 13:38:15.457699: I tensorflow/core/common_runtime/gpu/gpu_device.cc:929] 0
2019-10-04 13:38:15.457711: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 0: N
2019-10-04 13:38:15.457799: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 10426 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:06:00.0, compute capability: 6.1)
Trying to restore saved checkpoints from ./logdir-wavenet/train/2019-10-04T13-37-34 ... No checkpoint found.
finally
Done

vocoder train시에
이런식으로 Done 이후에 계속 멈춰있는데 뭐가 문제일까요..?

Wavenet-Vocoder 훈련 속도 문제 문의 드립니다.

안녕하세요? Tacotron2-Wavenet-Vocoder 좋은 코드 만들어 올려 주셔서 잘 사용하고 있습니다.

감사드립니다.

Wavenet-Vocoder 훈련 속도 관련하여 문의 드립니다.

제 PC에 달린 GPU는 desktop RTX 2080 Ti 입니다. Tacotron2는 문제 없이 훈련이 잘 되었는데 Wavenet Vocoder는 훈련이 너무 느립니다.

지난 7월 30일에 훈련을 시작했는데 현재까지 38,700회 정도 훈련 진행되었습니다.

샘플로 올리신 Wavenet-Vocoder 음성 훈련하셨을 때 걸리신 시간이 어떻게 되시나요?

뭐가 문제인지 모르겠습니다.

제 글 확인하시면 꼭 답변 부탁 드리겠습니다.

감사합니다.

우은주 드림

taco 성공 후 wavenet 실패

안녕하세요
소스 잘 사용하고 있습니다. tacotron2 (한개 보이스 학습하여) 는 잘 동작합니다. 합성도 어느정도 되는 것 같구요
그런데 wavenet 학습 진행을 못하겠는데요
약간 설명 드리자면

./data/gosData 폴더에 npz 이 들어있습니다

한 개의 보이스만 훈련하기 위해서
train_vocoder.py 에
DATA_DIRECTORY = '.\data\gosData'
hparams.py
model_type = 'single',

으로 변경 후 수행 했습니다만
train_vocoder.py 내에서
audio_batch, lc_batch = reader.inputs_wav, self.local_condition
self.local_condition을 찾을 수 없다고 출력되고 종료 됩니다.
train_vocoder.py 안에 변수로 선언돼 있지 않아서 어떤 값으로 대제 해야할지 모르겠습니다.

만일 이게 복잡하다면, 제 데이터인 gosData 에 moon 데이터를 같이 학습한 것을 single tacotron 학습한 mel 로 사용해도 잘 동작 할까요?

why use rescaling?

preprocess과정에서 왜
wav = wav / np.abs(wav).max() * hparams.rescaling_max
과정을 거치는지 궁금합니다.

tacotron 학습 데이터 문의 드립니다.

안녕하세요.

음성 합성과 관련된 내용을 공부하고 있는 학생입니다.

좋은 자료 올려주신 덕분에 아주 많은 도움이 되었습니다.

다름이 아니라, datasets에 있는 moon 데이터와 son 데이터는 각각 대략 100개 정도 있는 것 같은데요

이 데이터 만으로는 학습했을 때, 결과가 좋지 않은건 당연한거 겠지요 ~?

혹시 알고 계시다면 대략 평균 3초정도의 음성이 몇개정도 있을 때 유의미한 결과를 볼 수 있을까요 ?

다시한번, 좋은 자료 올려주셔서 정말 감사드립니다

synthesizer.py 관련 질문이 있습니다

안녕하세요
우선 훌륭한 코드를 작성해주셔서 감사합니다.

다름이 아니라 train_tacotron2.py 으로 트레이닝 후
synthesizer.py 로 음성파일을 만들어서 테스트를 하는데,

문장끝이 잘리는 문제가 있는데 이것은 어떤 옵션을 만져야 해결되는지 알 수 있을까요,,?
예를들어, "문 대표는 이날 국회에서 연 회견 뒤 이어진 취재진과의 질의응답에서 이렇게 말했다" 라는 문장이 있으면
"문 대표는 이날 국회에서 연 회견 뒤 이어"
까지만 음성이 생성되는 문제가 있습니다

데이터셋

혹시 이거 train 시킬 때 기본으로 제공되는 손석희 앵커와 문재인 대통령의 데이터셋으로 하셨나요? train시키려고 보니까 너무 데이터양이 적어서 학습이 잘 될까 궁금해서요.

Wavenet-Vocoder 학습 관련 문의드립니다

안녕하세요, 구현해주신 코드 잘 사용하고 있습니다. 감사합니다.

Tacotron으로는 꽤 쓸만하게 성능이 나와서 잘 활용하고 있습니다.
보다 음질을 높이기 위해 Wavenet Vocoder도 테스트해보고 있는데
600k까지 학습해보니, 거의 잡음만 출력되다가 일부 부분에서만 음성이 출력됩니다.
Loss는 5 이상에서 더이상 수렴을 하지 않는 거 같습니다.

245k까지 Wavenet Vocoder를 학습하신 결과를 보니, 음질은 안 좋지만 결과는 어느 정도 나오는데
그때의 loss가 어느 정도였는지 기억하시나요?

또, Wavenet Vocoder로 학습하는 과정이 제가 이해한 게 맞는지 확인해주실 수 있으신가요?

  1. 원하는 데이터셋으로 Wavenet Vocoder를 학습함(train_wavenet.py)
  2. 기존에 학습한 Tacotron 모델로 원하는 text를 음성으로 합성함(synthesizer.py)
  3. 2과정에서 생긴 npy 파일을 기반으로 Wavenet 모델로 음성을 생성함(generate.py)
    (1과 2의 Wavenet과 Tacotron 모델은 동일한 데이터셋으로 학습했습니다.)

감사합니다.

train_tacotron.py 실행시 오류가 나요.

Traceback (most recent call last):
  File "train_tacotron.py", line 308, in <module>
    main()
  File "train_tacotron.py", line 305, in main
    train(config.model_dir, config)
  File "train_tacotron.py", line 146, in train
    train_feeder.loss_coeff,is_randomly_initialized=is_randomly_initialized)
  File "/data/Tacotron-Wavenet-Vocoder/tacotron/tacotron.py", line 185, in initialize
    for idx, cell in enumerate(decoder_rnn_init_states):
TypeError: 'NoneType' object is not iterable

이런오류가 나면서 실행이 안되는데 어떻게 해야될까요?

tacotron 학습 step 문의 드립니다

tacotron 을 single 로 학습 중인데요, 20만 스텝을 넘어가고 있네요
tacotron의 학습 종료는 언제쯤일까요?
그리고 학습데이터는 (구글 음성인식으로 ) 10시간이 좀 안되구요
그런데 loss 가 아래와 같은데, 혹시 경험치랑 비슷한지 문의 드립니다.

Step 204027 [0.981 sec/step, loss=0.68417, avg_loss=0.66632]
Step 204028 [0.973 sec/step, loss=0.68508, avg_loss=0.66625]
Step 204029 [0.971 sec/step, loss=0.67858, avg_loss=0.66610]
Step 204030 [0.972 sec/step, loss=0.67207, avg_loss=0.66616]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.