Korean Tacotron Text-to-Speech (TTS) Model
๋ชจ๋ธ ์ด๋ฆ: Full-Tuned Tacotron MinSeok Hugging Face: https://huggingface.co/skytinstone/full-tuned-tacotron-minseok ์ธ์ด: ํ๊ตญ์ด ์์ : ์์ฑ ํฉ์ฑ (Text-to-Speech) ๋ผ์ด์ ์ค: MIT
๐ ๋ชฉ์ฐจ
- ๋ชจ๋ธ ๊ฐ์
- ์ฃผ์ ํน์ง
- ์ฑ๋ฅ ์งํ
- ๊ธฐ์ ์คํ
- ์ํคํ ์ฒ
- ํ์ต ๊ณผ์
- ์ค์น ๋ฐ ์ฌ์ฉ
- ์ถ๋ก ์์
- ์ ํ์ฌํญ
- ํฅํ ๊ณํ
- ์ธ์ฉ
- ๋ผ์ด์ ์ค
๋ชจ๋ธ ๊ฐ์
์ด ํ๋ก์ ํธ๋ ํ๊ตญ์ด ์์ฑ ํฉ์ฑ์ ์ํ Tacotron ๊ธฐ๋ฐ TTS ๋ชจ๋ธ์ ๋๋ค.
ํ ์คํธ๋ฅผ ์ ๋ ฅํ๋ฉด ์์ฐ์ค๋ฌ์ด ํ๊ตญ์ด ์์ฑ (๋ฉ ์คํํธ๋ก๊ทธ๋จ)์ ์์ฑํฉ๋๋ค.
ํน์ง
- โ ํ๊ตญ์ด ์ต์ ํ: 1,772๊ฐ ํ๊ตญ์ด ์์ฑ ๋ฐ์ดํฐ์ ์ผ๋ก ํ์ต
- โ 3๋จ๊ณ ํ์ต ํ์ดํ๋ผ์ธ: PreTraining โ FineTuning โ Reinforcement Learning
- โ ๋์ ํ์ง: Mel Loss 0.1845 (์์ฉ ๋ชจ๋ธ ์์ค)
- โ ์์ฐ์ค๋ฌ์: ๋ณด์ ๊ธฐ๋ฐ RL ํ์ต์ผ๋ก ์ต์ ํ๋ ์์ฑ
- โ ๋น ๋ฅธ ์ถ๋ก : GTX 1080 Ti์์ ์ค์๊ฐ ์ถ๋ก ๊ฐ๋ฅ (5๋ฐฐ ๋น ๋ฆ)
- โ ์คํ์์ค: ์์ ๊ณต๊ฐ (MIT ๋ผ์ด์ ์ค)
์ฃผ์ ํน์ง
๐ฏ ๋ชจ๋ธ ์ฑ๋ฅ
| ๋จ๊ณ | Mel Loss | Stop Loss | ๋ณด์ | ์ํฌํฌ |
|---|---|---|---|---|
| PreTraining | 0.4196 | 0.0008 | - | 50 |
| FineTuning | 0.2854 | 0.0007 | - | 30 |
| RL (์ต์ข ) | 0.1845 | 0.0006 | 0.85+ | 20 |
์ด ๊ฐ์ ์จ: 97% ์์ค ๊ฐ์
๐ ํ์ต ๊ณก์
PreTraining: 3.196 โ 0.4196 (87% ๊ฐ์ )
โ
FineTuning: 0.4196 โ 0.2854 (32% ๊ฐ์ )
โ
RL: 0.2854 โ 0.1845 (35% ๊ฐ์ )
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
์ดํฉ: 97% ๊ฐ์ !
โก ์ถ๋ก ์๋
- ์์ฑ ์๊ฐ: ~200ms per second of speech
- ์ค์๊ฐ ๋ฐฐ์: 5๋ฐฐ (๋ฆฌ์ผํ์ ์ถ๋ก ๊ฐ๋ฅ)
- GPU: NVIDIA GTX 1080 Ti (11.8GB VRAM)
- CPU: ~10์ด/์ด ์์ฑ (์ถ์ฒํ์ง ์์)
๊ธฐ์ ์คํ
ํ๋ ์์ํฌ & ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Python 3.8+
โโโ PyTorch 2.7.1 (cu118)
โโโ numpy 1.24.3
โโโ scipy 1.11.1
โโโ librosa 0.10.0
โโโ soundfile 0.12.1
โโโ tqdm 4.66.1
โโโ huggingface-hub 1.0.0
ํ๋์จ์ด (ํ์ต ํ๊ฒฝ)
- GPU: NVIDIA GeForce GTX 1080 Ti (11.8GB VRAM)
- CUDA: 11.8
- ๋ฉ๋ชจ๋ฆฌ: 32GB RAM
- ์ ์ฅ์: SSD 500GB (์ถฉ๋ถํจ)
์ํคํ ์ฒ
์ ์ฒด ๊ตฌ์กฐ
์
๋ ฅ: ํ๊ธ ํ
์คํธ(์: "์๋
ํ์ธ์")
โ
[ํ ํฐํ] (Syllable Encoding)
- ํ๊ธ ์์ ๋ฒ์: 0xAC00 ~ 0xD7A3
- ์ดํ ํฌ๊ธฐ: 2,000
โ
[Embedding Layer] (256์ฐจ์)
โ
[Encoder] (BiLSTM + Conv1D)
- Conv1D: 256 ์ฑ๋, 3๊ฐ ๋ ์ด์ด
- BiLSTM: 256 ์จ๊ฒจ์ง ์ ๋, 1 ๋ ์ด์ด
- ์๋ฐฉํฅ ์ฒ๋ฆฌ (์ ์ฒด ๋ฌธ๋งฅ ์ธ์)
โ
[Attention Mechanism] (Additive Attention)
- Query: Decoder ์ํ
- Key/Value: Encoder ์ถ๋ ฅ
- ์์ฑ-ํ
์คํธ ์ ๋ ฌ ํ์ต
โ
[Decoder] (Autoregressive LSTM)
- LSTM: 256 ์จ๊ฒจ์ง ์ ๋, 2 ๋ ์ด์ด
- Pre-net: Linear(256) โ Linear(256)
- ์๋ํ๊ท ์์ฑ (ํ ํ๋ ์์ฉ)
โ
[Output Layer]
โโโ Mel-spectrogram (80 ์ฑ๋)
โโโ Stop Token (์ด์ง ๋ถ๋ฅ)
โ
์ถ๋ ฅ: ๋ฉ ์คํํธ๋ก๊ทธ๋จ (batch, time, 80)
โ
[Vocoder] (๋ณ๋, Griffin-Lim ๋๋ Neural Vocoder)
โ
์ต์ข
: ์์ฑ ํ์ผ (WAV)
์์ธ ๊ตฌ์ฑ์์
1๏ธโฃ Encoder (์์ฑ ์ดํด)
# Conv1D Encoder
Conv1D(1, 256, kernel=5) โ ReLU โ Dropout(0.2)
Conv1D(256, 256, kernel=5) โ ReLU โ Dropout(0.2)
Conv1D(256, 256, kernel=5) โ ReLU โ Dropout(0.2)
# BiLSTM
BiLSTM(256, 256, 1, bidirectional=True)
์ญํ : ์ ๋ ฅ ํ ์คํธ์ ์๋ฏธ์ ํน์ง์ ์ถ์ถํ๊ณ ๋ชจ๋ ๋ฌธ๋งฅ ์ ๋ณด๋ฅผ ์์ง
2๏ธโฃ Attention (์ ๋ ฌ)
# Additive Attention (Bahdanau Attention)
score = tanh(W_q * query + W_k * key + b)
attention_weights = softmax(v^T * score)
context = sum(attention_weights * value)
์ญํ : ๋์ฝ๋๊ฐ ๊ฐ ์์ฑ ํ๋ ์์ ์์ฑํ ๋ ์ด๋ ํ ์คํธ ๋ถ๋ถ์ ๋ด์ผ ํ ์ง ๊ฒฐ์
3๏ธโฃ Decoder (์์ฑ ์์ฑ)
# Pre-net (์์ฑ-ํ
์คํธ ๋ถ๋ฆฌ)
Linear(80, 256) โ ReLU โ Dropout
Linear(256, 256) โ ReLU โ Dropout
# LSTM Cell (์๋ํ๊ท)
LSTMCell(256 + 256, 256) # Input + Context
# Output Projection
Linear(256, 80) โ Mel-spectrogram
Linear(256, 1) โ Stop Token
์ญํ : ์ด์ ์์ฑ ํ๋ ์๊ณผ ๋ฌธ๋งฅ์ ์ฌ์ฉํด์ ๋ค์ ์์ฑ ํ๋ ์ ์๋์์ฑ
ํ์ต ๊ณผ์
๐ ๋ฐ์ดํฐ์
- ํฌ๊ธฐ: 1,772๊ฐ (์์ฑ-ํ ์คํธ ์)
- ์ธ์ด: ํ๊ตญ์ด
- ํ์: (ํ ์คํธ, ์์ฑ) ์
- ์ํ๋ง ๋ ์ดํธ: 48kHz
- ๋๋ฉ์ธ: ์ผ์ ํํ
- ์ด ์์ฑ ๊ธธ์ด: ~50์๊ฐ
๐ 3๋จ๊ณ ํ์ต ์ ๋ต
Phase 1: PreTraining (๊ธฐ์ด ํ์ต)
๋ชฉํ: ๋ชจ๋ธ์ด ํ ์คํธ-์์ฑ ๋งคํ์ ๊ธฐ๋ณธ์ ํ์ต
์ค์ :
โโโ Epochs: 50
โโโ Batch Size: 32
โโโ Learning Rate: 1e-3 (Adam)
โโโ Dropout: 0.2
โโโ Teacher Forcing: 100% (ํญ์ ์ ๋ต ์ฌ์ฉ)
โโโ Data Augmentation: SpecAugment + Mixup
โโโ Time: ~2.5 hours (GTX 1080 Ti)
์์ค ๋ณํ:
Epoch 1: 3.196
Epoch 10: 1.456
Epoch 25: 0.6842
Epoch 50: 0.4196 โ
ํ์ต ๋ฐฉ์:
# Teacher Forcing: ์ ๋ต ์์ฑ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉ
mel_targets = actual_mel_spectrograms
decoder_input = mel_targets[:, :-1, :] # ์ด์ ํ๋ ์
output = model(encoder_output, decoder_input)
loss = MSE(output, mel_targets[:, 1:, :])
Data Augmentation:
- SpecAugment: ๋ฉ ์คํํธ๋ก๊ทธ๋จ์ ๋ง์คํน ์ ์ฉ
- Mixup: ๋ ์ํ์ ์ ํ ์กฐํฉ (ฮป * x1 + (1-ฮป) * x2)
ํน์ง:
- โ ๋ฐ์ดํฐ ๋ค์์ฑ ์ฆ๊ฐ
- โ ์ค๋ฒํผํ ๋ฐฉ์ง
- โ ๊ฐ๊ฑด์ฑ ํฅ์
Phase 2: FineTuning (์ธ๋ฐ ์กฐ์ )
๋ชฉํ: ๋ชจ๋ธ์ ์ ํ๋๋ฅผ ๋์ด๊ณ ์๋ํ๊ท ์์ฑ์ ์ ์
์ค์ :
โโโ Epochs: 30
โโโ Batch Size: 16
โโโ Learning Rate: 5e-4
โโโ Dropout: 0.15
โโโ Teacher Forcing: 90% โ 0% (Curriculum Learning)
โโโ Scheduled Sampling: Yes
โโโ Time: ~2 hours (GTX 1080 Ti)
์์ค ๋ณํ:
Epoch 1: 0.4196 (PreTraining์์ ๋ก๋)
Epoch 10: 0.3521
Epoch 20: 0.3012
Epoch 30: 0.2854 โ
Curriculum Learning (๋์ด๋ ์ฆ๊ฐ):
# Teacher Forcing Ratio ๊ฐ์
def get_teacher_forcing_ratio(epoch):
return max(0.0, 0.9 - 0.03 * epoch)
# Epoch 0: 90% (๋๋ถ๋ถ ์ ๋ต ์ฌ์ฉ)
# Epoch 5: 75% (์์ด์ฐ๊ธฐ ์์)
# Epoch 10: 60%
# Epoch 20: 30%
# Epoch 29: 0% (100% ์๋ํ๊ท)
Scheduled Sampling:
if random() < teacher_forcing_ratio:
# ์ ๋ต ์ฌ์ฉ (ํ์ต)
decoder_input = mel_targets[:, t-1, :]
else:
# ๋ชจ๋ธ ์ถ๋ ฅ ์ฌ์ฉ (์ถ๋ก ์๋ฎฌ๋ ์ด์
)
decoder_input = model_output[:, t-1, :]
ํน์ง:
- โ ์ ์ง์ ๋์ด๋ ์ฆ๊ฐ
- โ Exposure Bias ํด๊ฒฐ (ํ์ต-์ถ๋ก ๋ถ์ผ์น)
- โ ๋ชจ๋ธ์ด ์์ ์ ์ค์๋ก๋ถํฐ ํ์ต
Phase 3: Reinforcement Learning (๋ณด์ ๊ธฐ๋ฐ ํ์ต)
๋ชฉํ: ์์ฑ ํ์ง์ ์ต๋ํํ๋ ์ ์ฑ ํ์ต
์ค์ :
โโโ Epochs: 20
โโโ Batch Size: 8
โโโ Learning Rate: 1e-4
โโโ Teacher Forcing: 0% (100% Autoregressive)
โโโ Reward Type: MOS (Mean Opinion Score)
โโโ Entropy Weight: 0.01
โโโ Time: ~1 hour (GTX 1080 Ti)
์์ค ๋ณํ:
Epoch 1: 0.2854 (FineTuning์์ ๋ก๋)
Epoch 5: 0.2231
Epoch 10: 0.1962
Epoch 20: 0.1845 โ
๋ณด์ ๋ณํ:
Epoch 1: 0.62
Epoch 5: 0.74
Epoch 10: 0.81
Epoch 20: 0.85+ โ
์ ์ฑ ๊ธฐ์ธ๊ธฐ (Policy Gradient):
# ์ก์
: ๋ค์ ํ๋ ์ ์์ฑ
action = model.decoder(context)
# ๋ณด์: ์์ฑ๋ ์์ฑ ํ์ง
reward = calculate_reward(action)
# ์์ค: -๊ธฐ๋๊ฐ(๋ณด์) + ์ ๊ทํ
policy_loss = -log_prob * (reward - baseline)
entropy_bonus = -entropy_weight * entropy(distribution)
total_loss = policy_loss + entropy_bonus
๋ณด์ ํจ์:
def calculate_mos_like_reward(mel_output, reference_mel):
"""
MOS (Mean Opinion Score) ์ ์ฌ ๋ณด์
- ์์ฑ ํ์ง ํ๊ฐ
- ์ฐ์์ฑ ํ๊ฐ
- ๋ช
ํ์ฑ ํ๊ฐ
"""
quality_score = 1.0 - MSE(mel_output, reference_mel)
continuity_score = smoothness(mel_output)
clarity_score = energy_variance(mel_output)
return 0.5 * quality_score + 0.3 * continuity_score + 0.2 * clarity_score
์ํธ๋กํผ ์ ๊ทํ (ํ์ ๊ฒฉ๋ ค):
# ๋ชจ๋ธ์ด ๋ค์ํ ์ต์
์ ํ์ํ๋๋ก ๊ฒฉ๋ ค
entropy = -sum(prob * log(prob))
entropy_bonus = entropy_weight * entropy
total_loss = policy_loss - entropy_bonus # ๊ฐ์์ํค๋ฉด ํ์ ์ฆ๊ฐ
ํน์ง:
- โ ์ง์ ์ ์ธ ํ์ง ์ต์ ํ
- โ ์์ฑ ์์ฐ์ค๋ฌ์ ํฅ์
- โ ๋ชจ๋ธ์ ๋ค์์ฑ ์ ์ง
๐ ํ์ต ๊ณก์ ๋ถ์
์์ค ํจ์ (Mel Loss)
3.5 โ PreTraining
โ โ
3.0 โ โโ
โ โโโ
2.5 โ โโโ
โ โโ
2.0 โ โโ
โ โโโ
1.5 โ โโโ
โ โโโ
1.0 โ โโโ
โ โโ
0.5 โ โโโ FineTuning
โ โโโโโ
0.2 โ โโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โโโโ RL
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
0 10 20 30 40 50 | 60 70 80 90 |100 110 120
PreTraining Epochs | FineTuning E. | RL Epochs
ํด์:
- PreTraining: ๋น ๋ฅธ ์๋ ด (50 ์ํฌํฌ)
- FineTuning: ์์ ์ ๊ฐ์ (30 ์ํฌํฌ)
- RL: ์ธ๋ฐํ ์ต์ ํ (20 ์ํฌํฌ)
- ์ด ํ์ต ์๊ฐ: ~5.5์๊ฐ
์ค์น ๋ฐ ์ฌ์ฉ
๐ฆ ์๊ตฌ์ฌํญ
Python >= 3.8
PyTorch >= 2.7.1 (CUDA 11.8)
๐ง ์ค์น
1. Hugging Face์์ ๋ชจ๋ธ ๋ค์ด๋ก๋
# ๋ฐฉ๋ฒ 1: ์๋ ๋ค์ด๋ก๋
pip install huggingface-hub
python -c "
from huggingface_hub import hf_hub_download
# ๋ชจ๋ธ ๋ค์ด๋ก๋
model_path = hf_hub_download(
repo_id='skytinstone/full-tuned-tacotron-minseok',
filename='rl_best.pt'
)
print(f'๋ชจ๋ธ ๋ค์ด๋ก๋ ์๋ฃ: {model_path}')
"
2. ํ์ํ ํจํค์ง ์ค์น
pip install torch==2.7.1 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install numpy==1.24.3
pip install scipy==1.11.1
pip install librosa==0.10.0
pip install soundfile==0.12.1
pip install matplotlib==3.8.0
3. ์์ค ์ฝ๋ ๋ค์ด๋ก๋
# Hugging Face์์ ํ์ผ ๋ค์ด๋ก๋
git clone https://huggingface.co/skytinstone/full-tuned-tacotron-minseok
cd full-tuned-tacotron-minseok
์ถ๋ก ์์
์์ 1: ๊ธฐ๋ณธ ์ถ๋ก
import torch
from tacotron_model import Tacotron
from hparams_optimized import OptimizedHParams
# 1. ๋ชจ๋ธ ์ค๋น
device = 'cuda' if torch.cuda.is_available() else 'cpu'
hparams = OptimizedHParams(phase='rl')
model = Tacotron(hparams).to(device)
# 2. ์ฒดํฌํฌ์ธํธ ๋ก๋
checkpoint = torch.load('rl_best.pt', map_location=device)
model.load_state_dict(checkpoint['model_state_dict'])
model.eval()
# 3. ํ
์คํธ ์ธ์ฝ๋ฉ
text = "์๋
ํ์ธ์"
tokens = []
for char in text:
if 0xAC00 <= ord(char) <= 0xD7A3:
idx = ord(char) - 0xAC00
tokens.append(idx % 2000)
tokens = torch.tensor([tokens], dtype=torch.long).to(device)
text_lengths = torch.tensor([tokens.shape[1]]).to(device)
# 4. ์ถ๋ก
with torch.no_grad():
mel_outputs, stop_tokens = model(
tokens,
text_lengths,
mel_targets=None,
teacher_forcing=False
)
# 5. ๊ฒฐ๊ณผ
print(f"์
๋ ฅ: {text}")
print(f"Mel ์คํํธ๋ก๊ทธ๋จ ํฌ๊ธฐ: {mel_outputs.shape}")
print(f"์์ฑ ๊ธธ์ด: {mel_outputs.shape[1] * 0.01:.1f}์ด")
์์ 2: ๋ฐฐ์น ์ฒ๋ฆฌ
import torch
from tacotron_model import Tacotron
from hparams_optimized import OptimizedHParams
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = Tacotron(OptimizedHParams(phase='rl')).to(device)
checkpoint = torch.load('rl_best.pt', map_location=device)
model.load_state_dict(checkpoint['model_state_dict'])
model.eval()
# ์ฌ๋ฌ ๋ฌธ์ฅ ์ฒ๋ฆฌ
sentences = ["์๋
ํ์ธ์", "๋ฐ๊ฐ์ต๋๋ค", "์ข์ ์์นจ์
๋๋ค"]
for text in sentences:
tokens = []
for char in text:
if 0xAC00 <= ord(char) <= 0xD7A3:
idx = ord(char) - 0xAC00
tokens.append(idx % 2000)
tokens = torch.tensor([tokens], dtype=torch.long).to(device)
text_lengths = torch.tensor([tokens.shape[1]]).to(device)
with torch.no_grad():
mel_outputs, stop_tokens = model(
tokens,
text_lengths,
mel_targets=None,
teacher_forcing=False
)
print(f"โ
{text} โ {mel_outputs.shape[1] * 0.01:.1f}์ด")
์์ 3: Vocoder์ ํจ๊ป (์์ฑ ํ์ผ ์์ฑ)
import torch
import soundfile as sf
import numpy as np
from scipy import signal
from tacotron_model import Tacotron
from hparams_optimized import OptimizedHParams
# Tacotron ์ถ๋ก
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = Tacotron(OptimizedHParams(phase='rl')).to(device)
checkpoint = torch.load('rl_best.pt', map_location=device)
model.load_state_dict(checkpoint['model_state_dict'])
model.eval()
# ํ
์คํธ โ Mel-spectrogram
text = "์๋
ํ์ธ์"
tokens = torch.tensor([[ord(c) - 0xAC00 for c in text if 0xAC00 <= ord(c) <= 0xD7A3]],
dtype=torch.long).to(device)
text_lengths = torch.tensor([tokens.shape[1]]).to(device)
with torch.no_grad():
mel_outputs, _ = model(tokens, text_lengths, mel_targets=None, teacher_forcing=False)
mel = mel_outputs[0].cpu().numpy() # (time, 80)
# Vocoder: Griffin-Lim Algorithm (๊ฐ๋จํจ)
# ์ฐธ๊ณ : ๋ ๋์ ์์ฑ ํ์ง์ ์ํ๋ฉด WaveGlow, HiFi-GAN ๋ฑ ์ฌ์ฉ
def griffin_lim(mel_spec, n_iter=100, n_fft=2048):
"""
Mel-spectrogram โ ์์ฑ ๋ณํ
"""
# Mel โ Linear spectrogram
mel_to_linear = np.dot(mel_spec, np.linalg.pinv(librosa.filters.mel(48000, 2048)))
# Griffin-Lim
phase = np.angle(np.exp(2j * np.pi * np.random.random_sample(mel_to_linear.shape)))
for _ in range(n_iter):
spectrogram = np.abs(mel_to_linear) * np.exp(1j * phase)
waveform = librosa.istft(spectrogram)
phase = np.angle(librosa.stft(waveform))
return waveform
waveform = griffin_lim(mel)
# ํ์ผ ์ ์ฅ
sf.write('output.wav', waveform, sr=48000)
print("โ
์์ฑ ํ์ผ ์์ฑ: output.wav")
์ ํ์ฌํญ
โ ๏ธ ์ธ์ด
- ํ๊ตญ์ด๋ง ์ง์
- ์์ด, ์ค๊ตญ์ด, ์ผ๋ณธ์ด ๋ฑ ๋ค๋ฅธ ์ธ์ด๋ ๋ฏธ์ง์
โ ๏ธ ํ์
- ๋จ์ผ ํ์ (1๋ช ) ๋ชจ๋ธ
- ๋ค์ค ํ์ ์ง์ํ๋ ค๋ฉด ์ฌํ์ต ํ์
โ ๏ธ ๋๋ฉ์ธ
- ์ผ์ ํํ์ ์ต์ ํ
- ํน์ ๋๋ฉ์ธ (์๋ฃ, ๋ฒ๋ฅ ๋ฑ)์ ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ
โ ๏ธ ๊ฐ์ ํํ
- ๊ฐ์ ํํ ๋ฏธ์ง์
- ๋ชจ๋ ์ถ๋ ฅ์ด ์ค๋ฆฝ์ ํค
โ ๏ธ ์ํฅ ํจ๊ณผ
- Vocoder ํ์ (๋ณ๋)
- Mel-spectrogram๋ง ์์ฑํ๋ฏ๋ก ์์ฑ ํ์ผ๋ก ๋ณํ ํ์
- ๊ถ์ฅ: WaveGlow, HiFi-GAN, Neural Vocoder
โ ๏ธ ๊ธธ์ด ์ ํ
- ๋งค์ฐ ๊ธด ๋ฌธ์ฅ (>100์)์์ ์์ฑ ํ์ง ์ ํ
- ๊ถ์ฅ: ํ ๋ฌธ์ฅ๋น 50์ ์ดํ
โ ๏ธ ํน์ ๋ฌธ์
- ํน์๋ฌธ์ ๋ฐ ์ซ์ ๋ฐ์ ๋ฏธ์ง์
- ํ๊ธ ์์ ๋ง ์ง์
ํฅํ ๊ณํ
๐ ๋ค์ค ํ์ (Multi-speaker)
- ํ์ ID ์๋ฒ ๋ฉ ์ถ๊ฐ
- ์ฌ๋ฌ ๋ช ์ ์์ฑ ํฉ์ฑ ๊ฐ๋ฅ
๐ ๊ฐ์ ํํ (Emotion Control)
- ํ๋ณต, ์ฌํ, ๋ถ๋ ธ ๋ฑ ๊ฐ์ ์ ์ด
- ๊ฐ์ ํ ํฐ ์ถ๊ฐ
๐ ๋ค๊ตญ์ด ์ง์ (Multilingual)
- ์์ด, ์ค๊ตญ์ด, ์ผ๋ณธ์ด ๋ฑ ํ์ฅ
- ์ธ์ด ID ์๋ฒ ๋ฉ
๐ FastSpeech2 ๋ก ์ ํ
- ๋ ๋น ๋ฅธ ์ถ๋ก (Autoregressive ์ ๊ฑฐ)
- ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ
๐ Vocoder ํตํฉ
- WaveGlow, HiFi-GAN ํตํฉ
- ์๋-ํฌ-์๋ ์์ฑ ์์ฑ
์ธ์ฉ
์ด ๋ชจ๋ธ์ ์ฐ๊ตฌ๋ ํ๋ก์ ํธ์ ์ฌ์ฉํ๋ค๋ฉด:
BibTeX ํ์
@model{korean_tacotron_tts_2024,
title={Korean Tacotron Text-to-Speech with Reinforcement Learning},
author={MinSeok Shin},
year={2024},
publisher={Hugging Face Hub},
howpublished={\url{https://huggingface.co/skytinstone/full-tuned-tacotron-minseok}}
}
์ผ๋ฐ ํ์
Shin, MinSeok. (2024). Korean Tacotron Text-to-Speech with Reinforcement Learning.
Hugging Face Hub. Retrieved from https://huggingface.co/skytinstone/full-tuned-tacotron-minseok
๋ผ์ด์ ์ค
MIT License - ๋ชจ๋ ์ฉ๋๋ก ์์ ๋กญ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ (์์ ์ ์ฉ๋ ํฌํจ)
MIT License
Copyright (c) 2024 MinSeok Shin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
๊ฐ์ฌ์ ๋ง
- Tacotron ๋ ผ๋ฌธ: Yuxuan Wang et al., Google (2017)
- PyTorch: Facebook AI Research
- Hugging Face: Hugging Face Inc.
- ๋ํ๋ฏผ๊ตญ ์์ฑ ์ปค๋ฎค๋ํฐ: ๋ชจ๋ ๊ธฐ์ฌ์๋ถ๋ค
๊ด๋ จ ์๋ฃ
๋ ผ๋ฌธ
- Tacotron: Towards End-to-End Speech Synthesis
- Tacotron 2: Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions
- FastSpeech 2: Fast and High-Quality End-to-End Text to Speech
๊ด๋ จ ํ๋ก์ ํธ
Vocoder
์ฐ๋ฝ์ฒ & ํผ๋๋ฐฑ
- ๐ง Email: [email protected]
- ๐ GitHub: https://github.com/skytinstone
- ๐ค Hugging Face: https://huggingface.co/skytinstone
- ๐ฌ Discussions: https://huggingface.co/skytinstone/full-tuned-tacotron-minseok/discussions
- ๐ Issues: https://huggingface.co/skytinstone/full-tuned-tacotron-minseok/issues
๋ง์ง๋ง ์ ๋ฐ์ดํธ: 2024๋ 10์ ๋ฒ์ : 1.0.0 (RL ์๋ฃ)
๋ณ๊ฒฝ ์ด๋ ฅ
v1.0.0 (2024-10-28)
- โ RL ํ์ต ์๋ฃ
- โ Hugging Face ์ ๋ก๋
- โ ๋ฌธ์ ์์ฑ ์๋ฃ