Tocotron + Wavenet Vocoder + Korean TTS
Tacotron๋ชจ๋ธ๊ณผ Wavenet Vocoder๋ฅผ ๊ฒฐํฉํ์ฌ ํ๊ตญ์ด TTS๊ตฌํํ๋ project์ ๋๋ค.
Based on
- https://github.com/keithito/tacotron
- https://github.com/carpedm20/multi-speaker-tacotron-tensorflow
- https://github.com/ibab/tensorflow-wavenet
- https://github.com/r9y9/wavenet_vocoder
- https://github.com/Rayhane-mamah/Tacotron-2
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๋ค์์๋ ๊ทธ๋ฐ ์ฌ์ค์ ํ์ธํ ์ ์๋ค.
- r9y9/wavenet_vocoder#110 : 1000K ์ด์ trainํด์ผ noise ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๊ณ ๋งํ๊ณ ์๋ค.
- keithito/tacotron#64 : train ์๋๊ฐ ๋๋ฆฌ๊ณ , ์ข์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ง ๋ชปํ๋ค๊ณ ๋งํ๊ณ ์๋ค.
- r9y9/wavenet_vocoder#1 : step 80K, 90K ๊ฒฐ๊ณผ๊ฐ ์ฒจ๋ถ๋์ด ์๋๋ฐ, ๊ฒฐ๊ณผ๊ฐ ์ข์ง๋ ๋ชปํ๋ค.
- https://r9y9.github.io/wavenet_vocoder/ : ๊ทธ๋ผ์๋ ์ข ๋ ๋ง์ train step์ ์ํํ๋ฉด ์ข์ ๊ฒฐ๊ณผ๊ฐ ์ป์ด์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ์ด project์์ ์ป์ ๊ฒฐ๊ณผ: wavenet vocoder๋ก ๋ถํฐ ์ป์ ๊ฒฐ๊ณผ๋ train step ๋ถ์กฑ์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ์ข์ง๋ ๋ชปํ๋ค. ์ฑ๋ฅ์ด ์ข์ GPU๋ก trainํ๋ฉด ๋ ์ข์ ๊ฒฐ๊ณผ๊ฐ ์์ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
- sample-son: tacotron(griffin-lim, step 106K)
- sample-moon: tacotron(griffin-lim, step 106K)
- sample-son: tacotron + wavenet vocoder(step 245K)
- sample-moon: tacotron + wavenet vocoder(step 245K)
์์ฑ์ ์ฒ์ ๊ณต๋ถํ๋ ๋ถ๋ค๊ป
- 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์ ์ ๊ฐ ์์ฑํ ๊ธ๋ ์ฐธ๊ณ ํ์ธ์.