예시
Tacotron2 및 Waveglow 모델은 torch.hub에서 가져온다. Tacotron2는 (“hello my world, i miss you”)와 같은 텍스트 입력을 주어지면 mel-spectrogram을 생성한다.
Waveglow는 mel-spectrogram을 입력으로 음성을 생성한다.
해당 정보는 audio.wav
파일로 저장된다.
Package install
1
| pip install numpy scipy librosa unidecode inflect librosa
|
1
| apt-get install -y libsndfile1
|
위 명령어를 차례대로 터미널에 입력한다.
Tacotron2 load
Tacotron2 모델을 불러오기 위해선 torch
가 필요하다.
1
2
3
4
| import torch
tacotron2 = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_tacotron2', model_math='fp16')
tacotron2 = tacotron2.to('cuda')
tacotron2.eval()
|
위 명령어를 입력하게 되면 LJ Speech dataset 에 데이터셋에서 사전 훈련된 Tacotron2를 불러올 수 있다.
WaveGlow load
1
2
3
4
| waveglow = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_waveglow', model_math='fp16')
waveglow = waveglow.remove_weightnorm(waveglow)
waveglow = waveglow.to('cuda')
waveglow.eval()
|
위 명령어도 입력하면 사전 훈련된 WaveGlow모델을 불러올 수 있다.
Utils load
1
2
| utils = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_tts_utils')
sequences, lengths = utils.prepare_input_sequence([text])
|
Input Text
1
| text = "hello my world, i miss you"
|
연결된 모델 실행
1
2
3
4
5
| with torch.no_grad():
mel_outputs_postnet, mel_lengths, alignments = tacotron2.infer(sequences, lengths)
audio = waveglow.infer(mel)
audio_numpy = audio[0].data.cpu().numpy()
rate = 22050
|
Audio 파일 저장
1
2
| from scipy.io.wavfile import write
write("audio.wav", rate, audio_numpy)
|
최종 코드
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
32
33
| import torch
from scipy.io.wavfile import write
tacotron2 = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_tacotron2', model_math='fp16')
waveglow = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_waveglow', model_math='fp16')
utils = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_tts_utils')
tacotron2 = tacotron2.to('cuda')
waveglow = waveglow.to('cuda')
waveglow = waveglow.remove_weightnorm(waveglow)
tacotron2.eval()
waveglow.eval()
text = "hello my world, i miss you"
sequences, lengths = utils.prepare_input_sequence([text])
with torch.no_grad():
mel_outputs_postnet, mel_lengths, alignments = tacotron2.infer(sequences, lengths)
audio = waveglow.infer(mel)
audio_numpy = audio[0].data.cpu().numpy()
rate = 22050
write("audio.wav", rate, audio_numpy)
|
Pytorch와Github를 참고해서 작성했다.