음성 합성 (TTS)

자동 음성 인식(Automatic Speech Recognition; ASR)이 음성을 텍스트로 뒤집는 작업이라면, 음성 합성(Text-to-Speech; TTS)은 텍스트를 음성으로 뒤집는 작업입니다. 2026년의 스택은 세 부분으로 이루어집니다. 텍스트를 토큰(token)으로, 토큰을 멜 스펙트로그램(mel-spectrogram)으로, 멜 스펙트로그램을 파형(waveform)으로 바꾸는 단계입니다. 각 단계에는 노트북에서도 동작하는 기본 모델이 마련되어 있습니다.

유형: Build 언어: Python 선수 강의: Phase 6 · 02 (Spectrograms & Mel), Phase 5 · 09 (Seq2Seq), Phase 7 · 05 (Full Transformer) 예상 시간: 약 75분

학습 목표

  • TTS 파이프라인(pipeline)을 텍스트 프론트엔드(text frontend), 음향 모델(acoustic model), 보코더(vocoder)로 나누어 설명합니다.
  • Tacotron 2, FastSpeech 2, VITS, F5-TTS, Kokoro의 차이를 구분합니다.
  • 평균 의견 점수(Mean Opinion Score; MOS), UTMOS, 문자 오류율(Character Error Rate; CER), 화자 임베딩 코사인 유사도(Speaker Embedding Cosine Similarity; SECS)로 TTS 품질을 평가하는 이유를 이해합니다.
  • 텍스트 정규화(text normalization)와 음소화(phonemization)가 실제 서비스에서 왜 중요한지 설명합니다.

문제

"Please remind me to water the plants at 6 pm."라는 문자열이 하나 있다고 합시다. 우리는 자연스러운 음성으로 들리고, 올바른 운율(prosody; 휴지(pause)와 강세(stress))을 갖추고, "plants"를 정확한 모음(vowel)으로 발음하며, 실시간 음성 비서(live voice assistant)에서 CPU 기준 300밀리초 안에 실행되는 3초짜리 오디오 클립(audio clip)을 만들어야 합니다. 동시에 화자(voice)를 바꿀 수 있어야 하고, 코드 스위칭 입력(code-switched input; "remind me at 6 pm, daijoubu?")을 다룰 수 있어야 하며, 사람 이름의 발음에서 망신을 당하지 않아야 합니다.

현대의 TTS 파이프라인은 다음과 같은 구조로 이루어집니다.

  1. 텍스트 프론트엔드(Text frontend). 날짜, 숫자, 이메일을 정규화(normalize)하고, 음소(phoneme) 또는 서브워드 토큰(subword token)으로 바꾸며, 운율 특성(prosody feature)을 예측합니다.
  2. 음향 모델(Acoustic model). 텍스트를 멜 스펙트로그램으로 변환합니다. 대표 예시로 Tacotron 2(2017), FastSpeech 2(2020), VITS(2021), F5-TTS(2024), Kokoro(2024)가 있습니다.
  3. 보코더(Vocoder). 멜 스펙트로그램을 파형으로 변환합니다. WaveNet(2016), WaveRNN, HiFi-GAN(2020), BigVGAN(2022), 2024년 이후의 신경 코덱 보코더(neural codec vocoder)가 여기에 속합니다.

2026년에는 종단간(end-to-end) 확산(diffusion) 모델과 흐름 일치(flow-matching) 모델이 등장하면서 음향 모델과 보코더의 경계가 흐려졌습니다. 그래도 세 부분으로 나누어 보는 사고 모형(mental model)은 디버깅(debugging)에 여전히 유효합니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.TTS 파이프라인(pipeline)은 보통 텍스트 프론트엔드(text frontend), 음향 모델(acoustic model), 보코더(vocoder) 세 단계로 나뉩니다. 음향 모델 앞에 텍스트 프론트엔드 단계가 필요한 이유는 무엇인가요?

2.TTS 파이프라인에서 보코더(vocoder)의 역할은 무엇인가요?

0/2 답변 완료

개념

text → phonemes → mel → waveform text frontend normalize + G2P "6 pm" → "six p m" acoustic model phones → mel [T, 80] FastSpeech / VITS / F5 vocoder mel → wav [T·256] HiFi-GAN, BigVGAN waveform 24 kHz float32 in [-1, 1] speaker.wav open-source TTS timeline Tacotron 2 2017 · AR seq2seq FastSpeech 2 2020 · non-AR VITS 2021 · end-to-end flow XTTS v2 2024 · voice cloning F5-TTS 2024 · flow matching Kokoro 2024 · 82M CPU 2026 open-source leaderboard (LibriTTS test-clean) model UTMOS CER via Whisper params ground truth 4.08 1.2% F5-TTS 3.95 2.1% 335M Kokoro v0.19 3.87 1.8% 82M XTTS v2 3.81 3.5% 470M

Tacotron 2(2017). 시퀀스 투 시퀀스(seq2seq) 구조입니다. 문자 임베딩(character embedding) → 양방향 LSTM 인코더(BiLSTM encoder) → 위치 민감 어텐션(location-sensitive attention) → 자기회귀(autoregressive; AR) LSTM 디코더 흐름으로 멜 프레임(mel frame)을 만들어 냅니다. 자기회귀 방식이라 느리고, 긴 텍스트에서는 정렬(alignment)이 흔들리기 쉽습니다. 그래도 여전히 베이스라인(baseline)으로 자주 인용됩니다.

FastSpeech 2(2020). 비자기회귀(non-autoregressive) 구조입니다. 지속 시간 예측기(duration predictor)가 각 음소가 몇 개의 멜 프레임을 차지할지 출력합니다. 단일 패스(1-pass)로 동작하며 Tacotron보다 약 10배 빠릅니다. 단조 정렬(monotonic alignment) 때문에 자연스러움을 일부 잃을 수 있지만, 실서비스 환경 어디에나 폭넓게 배포되어 있습니다.

VITS(2021). 인코더, 흐름 기반 지속 시간 예측기(flow-based duration), HiFi-GAN 보코더를 변분 추론(variational inference)으로 한 번에 학습시키는 종단간 모델입니다. 품질이 높고 단일 모델 구성이 가능합니다. 2022년부터 2024년까지 오픈소스 TTS의 대표 모델로 자리 잡았습니다. 변형으로 다중 화자 제로샷 모델인 YourTTS, 그리고 Coqui의 XTTS v2(2024)가 있습니다.

F5-TTS(2024). 흐름 일치 위에 얹은 확산 트랜스포머(diffusion transformer)입니다. 자연스러운 운율을 만들어 내고, 5초짜리 참조 음성(reference audio)만으로 제로샷 음성 복제(zero-shot voice cloning)에 강합니다. 2026년 오픈소스 TTS 리더보드 상위권에 있으며, 파라미터 수는 약 335M입니다.

Kokoro(2024). 82M 파라미터로 작고, CPU에서 실행 가능하며, 실시간 영어 TTS 용도로는 최고 수준입니다. 닫힌 어휘(closed-vocabulary) 기반 영어 전용 모델이며, 라이선스는 Apache 2.0입니다.

OpenAI TTS-1-HD, ElevenLabs v2.5, Google Chirp-3. 상업용 최첨단(state of the art) 모델입니다. 그중 ElevenLabs v2.5는 "[whispered]", "[laughing]" 같은 감정 태그(emotion tag)와 캐릭터 음성(character voice)을 무기로 2026년 오디오북 제작 시장을 사실상 장악하고 있습니다.

보코더(Vocoder)의 발전 흐름

시기보코더지연(Latency)품질(Quality)
2016WaveNet오프라인 전용발표 당시 최첨단(SOTA)
2018WaveRNN실시간 수준양호
2020HiFi-GAN실시간 대비 100배사람과 거의 구분 불가
2022BigVGAN실시간 대비 50배화자와 언어에 걸쳐 잘 일반화
2024SNAC, DAC(신경 코덱)자기회귀 모델과 통합이산 토큰(discrete token) 기반, 비트 효율적

2026년에는 대부분의 "TTS" 모델이 텍스트에서 파형까지 종단간으로 동작합니다. 멜 스펙트로그램은 내부 표현(internal representation)으로만 남는 추세입니다.

평가

  • 평균 의견 점수(Mean Opinion Score; MOS). 1~5점 척도로 크라우드소싱(crowd-sourcing) 평가를 받는 방식입니다. 여전히 정석으로 통하지만 매우 느립니다.
  • 비교형 평균 의견 점수(Comparative MOS; CMOS). A 대 B로 두는 선호도(preference) 평가입니다. 한 번 평가할 때마다 얻는 신뢰 구간(confidence interval)이 더 좁습니다.
  • UTMOS, DNSMOS. 참조 음성이 필요 없는(reference-free) 신경망 기반 MOS 예측기입니다. 리더보드 산정에 자주 쓰입니다.
  • ASR 기반 문자 오류율(Character Error Rate; CER). TTS 출력을 Whisper에 통과시킨 뒤 원래 입력 텍스트와 비교해 CER을 계산합니다. 명료도(intelligibility)의 대리 지표(proxy)로 사용합니다.
  • 화자 임베딩 코사인 유사도(Speaker Embedding Cosine Similarity; SECS). 음성 복제 품질을 측정합니다.

LibriTTS의 test-clean 셋 기준 2026년 수치는 다음과 같습니다.

모델UTMOSCER(Whisper 기준)모델 크기
정답 음성(Ground truth)4.081.2%
F5-TTS3.952.1%335M
XTTS v23.813.5%470M
VITS3.623.1%25M
Kokoro v0.193.871.8%82M
Parler-TTS Large3.762.8%2.3B

직접 만들기

Step 1: 입력 텍스트를 음소로 바꾸기

from phonemizer import phonemize
ph = phonemize("Hello world", language="en-us", backend="espeak")
# 'həloʊ wɜːld'

음소는 여러 언어와 모델을 잇는 보편적인 다리 역할을 합니다. VITS 수준 미만의 모델에는 가공되지 않은 텍스트를 그대로 넣지 않는 편이 안전합니다.

Step 2: Kokoro 실행하기(2026년 CPU 기본 선택지)

from kokoro import KPipeline
tts = KPipeline(lang_code="a")  # "a" = American English
audio, sr = tts("Please remind me to water the plants at 6 pm.", voice="af_bella")
# audio: float32 tensor, sr=24000

오프라인으로 동작하고, 단일 파일 구성이며, 파라미터 수는 약 82M입니다.

Step 3: F5-TTS로 음성 복제하기

from f5_tts.api import F5TTS
tts = F5TTS()
wav = tts.infer(
    ref_file="my_voice_5s.wav",
    ref_text="The quick brown fox jumps over the lazy dog.",
    gen_text="Please remind me to water the plants.",
)

5초짜리 참조 음성 클립과 그 전사(transcript)를 함께 넘깁니다. F5는 화자의 운율과 음색(timbre)을 모두 복제합니다.

Step 4: HiFi-GAN 보코더를 처음부터 만들어 보기

전체 구현을 튜토리얼 한 편에 담기에는 분량이 너무 크지만, 골격은 다음과 같습니다.

class HiFiGAN(nn.Module):
    def __init__(self, mel_channels=80, upsample_rates=[8, 8, 2, 2]):
        super().__init__()
        # 4 upsample blocks, total 256x to go from mel-rate to audio-rate
        ...
    def forward(self, mel):
        return self.blocks(mel)  # -> waveform

학습은 적대적(adversarial) 방식으로 이루어집니다. 짧은 구간을 보는 판별기(discriminator), 멜 스펙트로그램 재구성 손실(mel-spectrogram reconstruction loss), 특성 일치 손실(feature-matching loss)을 함께 사용합니다. 이미 표준화되어 보편화된 영역이므로 hifi-gan 저장소나 NVIDIA NeMo의 사전 학습된 체크포인트(checkpoint)를 가져와 사용합니다.

Step 5: 전체 파이프라인(의사 코드)

text = "Please remind me at 6 pm."
phones = phonemize(text)
mel = acoustic_model(phones, speaker=alice)      # [T, 80]
wav = vocoder(mel)                                # [T * 256]
soundfile.write("out.wav", wav, 24000)

사용하기

2026년 기준 스택은 다음과 같이 고릅니다.

상황선택
실시간 영어 음성 비서Kokoro(CPU) 또는 XTTS v2(GPU)
5초 참조 음성 기반 음성 복제F5-TTS
상업용 캐릭터 음성ElevenLabs v2.5
오디오북 내레이션ElevenLabs v2.5 또는 XTTS v2 + 파인튜닝(fine-tune)
저자원(low-resource) 언어대상 언어 데이터 5~20시간으로 VITS 학습
표현력/감정 태그ElevenLabs v2.5 또는 StyleTTS 2 파인튜닝

2026년 오픈소스 진영의 선두는 품질은 F5-TTS, 효율은 Kokoro입니다. 역사 자료를 다루는 경우가 아니라면 Tacotron부터 손에 잡을 필요는 없습니다.

흔한 함정

  • 텍스트 정규화기(text normalizer)가 없는 경우. "Dr. Smith"를 "Doctor"로 읽어야 할까요, "Drive"로 읽어야 할까요? "2026"을 "twenty twenty six"으로 읽어야 할까요, "two zero two six"으로 읽어야 할까요? 음소화 이전 단계에서 반드시 정규화합니다.
  • 어휘 사전에 없는 고유명사(out-of-vocabulary; OOV proper nouns). "Ghumare" 같은 이름은 "ghyu-mair"처럼 이상하게 읽힐 수 있습니다. 알 수 없는 토큰에는 글자 대 음소 변환(grapheme-to-phoneme) 모델 같은 대안(fallback)을 준비해 둡니다.
  • 클리핑(clipping). 보코더 출력이 클리핑되는 경우는 드물지만, 추론(inference) 단계의 멜 스케일링 불일치(mel scaling mismatch) 때문에 ±1.0을 넘기는 일이 생길 수 있습니다. 항상 np.clip(wav, -1, 1)을 적용합니다.
  • 샘플레이트 불일치(sample-rate mismatch). Kokoro는 24 kHz로 출력합니다. 후속 파이프라인이 16 kHz를 기대한다면 리샘플링(resampling)을 해주어야 하며, 그렇지 않으면 에일리어싱(aliasing)이 발생합니다.

산출물 만들기

outputs/skill-tts-designer.md로 저장합니다. 화자, 지연 예산, 대상 언어에 맞는 TTS 파이프라인을 설계하는 스킬입니다.

연습문제

  1. 쉬움. code/main.py를 실행합니다. 장난감 어휘(toy vocab)에서 음소 사전을 만들고, 음소별 지속 시간을 추정하며, 가짜 "mel" 스케줄을 출력합니다.
  2. 중간. Kokoro를 설치하고, 같은 문장을 af_bella 화자와 am_adam 화자로 각각 합성합니다. 오디오 길이와 주관적 품질을 비교합니다.
  3. 어려움. 자기 목소리로 5초 분량의 참조 클립을 녹음합니다. F5-TTS로 이를 복제합니다. 참조 음성과 복제된 출력 사이의 SECS 값을 측정해 보고합니다.

핵심 용어

용어흔한 설명실제 의미
음소(Phoneme)소리 단위추상적인 소리 부류이며, 영어 ARPABet 기준 약 39개가 쓰인다.
지속 시간 예측기(Duration predictor)각 음소가 얼마나 지속되는가비자기회귀 모델의 출력으로, 음소당 정수형 프레임 수를 낸다.
보코더(Vocoder)멜에서 파형으로 변환멜 스펙트로그램을 원시 오디오 샘플로 바꾸는 신경망이다.
HiFi-GAN표준 보코더GAN 기반으로 2020~2024년에 가장 널리 쓰인 보코더다.
MOS주관적 품질사람 평가자가 매기는 1~5점 평균 의견 점수다.
SECS음성 복제 지표목표 화자와 출력 화자의 임베딩(embedding) 사이 코사인 유사도다.
F5-TTS2024년 오픈소스 최첨단흐름 일치 확산 기반의 제로샷 음성 복제 모델이다.
KokoroCPU 영어 TTS의 선두82M 파라미터 모델이며 Apache 2.0 라이선스다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

tts-designer

Pick TTS model, voice, text-normalization scope, and evaluation plan for a given language, style, and latency target.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.FastSpeech 2는 Tacotron 2보다 약 10배 빠른 합성 속도를 달성합니다. 이 속도 향상을 가능하게 하는 주된 아키텍처 차이는 무엇인가요?

2.TTS로 합성한 음성을 Whisper에 통과시켜 원래 입력 텍스트와 비교하여 CER을 계산합니다. 이 파이프라인은 TTS 품질의 어떤 측면을 측정하나요?

3.TTS 시스템이 'Dr. Smith lives on Elm Dr.'에서 두 'Dr.' 토큰을 동일하게 발음합니다. 어떤 파이프라인 단계에 문제가 있을 가능성이 가장 높고, 그 이유는 무엇인가요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다