
텍스트를 음성으로 변환하는 딥러닝 TTS 시스템들(Tacotron, FastSpeech, VITS 등)은 입력 텍스트를 기계가 이해할 수 있는 기호 시퀀스로 바꾸는 전처리 과정을 거칩니다. 밤바캐스트 아파트 안내방송을 위해 적용된 TTS역시 마찬가지입니다. 이때 특히 한글과 같은 언어에서는 입력 문장을 그대로 음절 단위로 처리하기보다는 자소(자음/모음 단위)로 분해하거나, 더 나아가 음소(실제 발음 단위)로 변환하는 전략이 많이 사용됩니다. 이러한 전처리는 TTS 모델의 발음 정확도를 높이고 일반화 성능과 학습 효율을 개선하는 데 핵심적입니다. 본 보고서에서는 자소 단위와 음소 단위 입력 방식의 필요성과 이유를 살펴보고, 각각의 장단점을 비교합니다. 특히 한국어의 특수성으로 인해 왜 이런 분해가 중요한지를 설명하고, 발음 오류 감소, 모델의 일반화, 학습 효율 등에 미치는 영향을 분석합니다. 또한 한국어 TTS 개발 시 일반적으로 거치는 전처리 단계들을 순서대로 정리하고, 각 단계에서 자소/음소 분해가 어떻게 활용되는지 구체적인 예시와 함께 설명합니다. 마지막으로 자주 쓰이는 오픈소스 도구/라이브러리들을 소개하고 각 도구가 해당 과정의 어느 단계에 사용되는지 기술합니다.

자소 vs. 음소 입력 전처리 개요
현대적인 TTS 모델은 문자열 입력을 바로 음성으로 변환할 수 있을 만큼 강력하지만, 그대로 문자를 사용하면 발생할 수 있는 문제들이 있습니다. 발음 규칙이 불규칙한 언어(예: 영어)의 경우 잘못된 발음 생성 가능성이 높아지며, 규칙적인 철자법을 가진 언어(예: 한국어, 스페인어 등)의 경우에도 일부 예외나 음운 변동을 다루기 어렵습니다ko.wikipedia.org. 따라서 많은 TTS 시스템에서 텍스트-음소 변환(grapheme-to-phoneme, G2P) 과정을 통해 문자를 발음 기호열로 변환하거나, 최소한 문자를 더 작은 자소 단위로 분해하여 모델의 입력으로 사용합니다bjmc.lu.lv. 예를 들어, Tacotron이나 FastSpeech, VITS 등은 문자 시퀀스를 입력으로 받도록 설계되었지만, 실제 구현에서는 **발음 부호열(phoneme sequence)**을 사용하여 학습시키는 경우가 많습니다. 한국어의 경우 한글 음절을 그대로 쓰기보다는 자모 문자로 분해하거나, 발음 규칙을 적용한 음소열을 입력으로 사용하도록 전처리합니다.
이러한 전처리를 수행하는 이유는 다음과 같이 정리할 수 있습니다:
- 발음 오류 방지: 많은 TTS 시스템에서 음소 단위 입력이 자소(문자) 입력보다 선호됩니다. 문자 자체를 입력으로 줄 경우 모델이 복잡한 철자-발음 규칙까지 모두 학습해야 하므로, 제대로 학습되지 않으면 잘못된 발음을 생성할 위험이 있습니다. 반면 음소 입력은 이미 올바른 발음으로 변환된 정보를 주기 때문에 모델이 발음 오류를 덜 내게 됩니다researchgate.net.
- OOV 및 희귀어 대응: 한글은 조합형 문자로 이루어진 11,172개의 음절 조합이 존재하지만, 이 중 훈련 데이터에 등장하지 않은 희귀 음절이 입력되면 문제가 됩니다. 자소(자모) 단위로 분해하면 초성 19자, 중성 21자, 종성 27자의 비교적 작은 집합만 다루면 되므로, 훈련 때 보지 못한 새로운 음절 조합도 기존 자모의 조합으로 처리할 수 있습니다. 즉, 자소 단위 처리는 한국어에서 **사전에 없던 음절(OOV: Out of Vocabulary)**에 대한 대응력을 높여 모델 일반화에 기여합니다.
- 학습 효율 및 품질: 입력 문자 집합 크기가 줄어들고(예: 음절 수천 개 → 자모 60여 개 수준) 각 기호가 가지는 발음 정보 밀도가 높아지므로, 임베딩 등 모델 학습이 더 효율적입니다. 또한 자소/음소 단위로 세분화하면 **음향 모델과 입력 시퀀스의 정렬(alignment)**이 수월해져 학습 안정성이 향상될 수 있습니다. 실제 연구에서도 **한글 자모 단위 입력 모델이 음절 단위보다 더 낮은 MCD(mean cepstral distortion)**를 보여 원음에 가까운 합성 품질을 얻었다는 보고가 있습니다. 이는 자모 단위 모델이 미세한 음운 변화까지 포착하여 원음과 가장 유사한 음성을 합성했기 때문으로 분석됩니다aclanthology.org.
하지만 자소 기반과 음소 기반 전처리에는 서로 다른 장단점이 존재합니다. 아래에서는 두 접근을 비교합니다.

자소 기반 vs. 음소 기반 전처리 비교
자소 기반 전처리란 한글 음절을 초성/중성/종성의 자모 문자 단위로 분해하여 모델 입력으로 사용하는 방식입니다. 예를 들어 “한글”이라는 단어를 자소 단위로 분해하면 ㅎ, ㅏ, ㄴ, ㄱ, ㅡ, ㄹ의 여섯 글자 시퀀스로 표현합니다. 한편 음소 기반 전처리는 텍스트를 실제 발음되는 음소열로 변환하는 것을 말합니다. 여기에는 철자법상으로는 드러나지 않는 연음, 동화, 탈락 등의 음운 변동 규칙까지 적용된 발음 결과가 포함됩니다. 예를 들어 “밥 한공기”라는 문장을 음소 변환하면 “밥 한공기”→“밥 한공기” (철자상 동일) 이지만 실제 발음은 [밥 판공기]로 /밥/의 받침 ㅂ+ㅎ이 합쳐져 [ㅍ]음으로 발음됩니다. 음소 전처리는 이러한 변화를 반영하여 입력을 [바판공기]에 해당하는 음소열로 나타냅니다.
두 방식의 특징과 장단점을 비교하면 다음과 같습니다:
- 자소 기반 입력 (한글 자모 분해):
- 장점: (1) 어휘 범용성이 높습니다. 자모 조합을 통해 어떤 새로운 음절도 표현 가능하므로, 훈련 데이터에 없던 음절이라도 발음 모르는 글자가 없는 한 합성이 가능합니다. (2) 입력 심볼 개수가 적고 규칙적이라 임베딩 학습이 수월합니다. (3) 언어 지식 없이도 모델을 구축하기 쉽습니다. 별도의 발음 변환 규칙 엔진 없이 자모만 분해하면 되므로 구현이 단순합니다. 실제 Tacotron 계열 모델도 문자를 그대로 입력으로 받을 수 있어, 한글 자모만 제공하면 추가 G2P 없이도 학습이 가능했습니다openreview.net.
- 단점: (1) 음운 규칙 학습 부담이 모델에 남습니다. 자모 입력만으로는, 예컨대 받침 ‘ㄷ’이 다음 모음과 만나 /ㄴ/으로 변하거나 하는 복잡한 한국어 음운현상을 모델 스스로 학습해야 합니다. 데이터가 충분치 않거나 모델 용량이 작으면 이러한 학습이 불완전해져 발음 오류가 발생할 수 있습니다. (2) 자모 분해로 인해 시퀀스 길이가 증가합니다. 한 음절이 보통 2~3개의 자모로 분해되므로 문장이 길어져 어텐션 모델의 학습 난이도가 다소 올라갈 수 있습니다. (3) 사람의 직관적인 해석이 어려울 수 있습니다. (예를 들어, 자모열 "ㅂㅏㅍㅏㄴ..." 형태로 나열되면 해당 발음을 사람이 즉시 알아채기 어렵지만, 음소 기호 “[바판…]”이라고 쓰면 이해가 쉬움).
- 음소 기반 입력 (발음 변환):
- 장점: (1) 정확한 발음 정보를 모델에 제공합니다. 사람이 사전에 정의한 규칙이나 사전 기반 G2P로 변환하기 때문에, 모델이 잘못 추론할 가능성을 줄입니다. 예를 들어 동일한 철자 "신고"도 앞뒤 문맥에 따라 [신고](신을 신고) vs [신꼬](혼인 신고)로 발음이 달라지는데, 음소 변환을 거치면 이러한 차이가 명시적으로 입력됩니다. (2) 모델의 부담을 경감합니다. 복잡한 철자→발음 변환 규칙을 이미 처리한 상태이므로 모델은 음향 합성 자체에 집중할 수 있고, 적은 데이터로도 높은 품질을 내기 쉬워집니다. (3) 다국어나 코드믹스 처리에 유리합니다. 예컨대 한국어 문장 내 영어 단어를 발견하면 이를 한국어 발음으로 바꾸는 등 일관된 발음 체계로 입력을 통일할 수 있습니다github.com.
- 단점: (1) 전처리 복잡성이 증가합니다. 언어별 G2P 규칙 구현이나 형태소 분석 등이 필요하여 시스템이 복잡해지고 유지보수가 어려워질 수 있습니다. (2) 오류 전Propagation 문제가 있습니다. 만약 G2P 단계에서 잘못 변환하면 모델은 그 잘못된 발음을 그대로 학습합니다. (3) 희귀 어휘 확장이 어려울 수 있습니다. 사람의 사전이나 규칙에 없는 신조어, 외래어 등이 들어오면 G2P에서 처리 못 할 가능성이 있고, 추가 데이터 없이 모델이 자체 학습하기도 어렵습니다 (반면 문자 기반이면 모델이 유추할 여지가 있음).
요약하면, 자소 기반은 구현이 간단하고 범용성이 높지만 모델이 음운 규칙까지 학습해야 하고, 음소 기반은 발음 정확도를 높여주지만 그만큼 전처리 단계가 복잡합니다. 한국어 TTS에서는 두 접근을 혼합하기도 합니다. 예를 들어 기본적으로 자모로 분해하되, 문장 단위로 발음 규칙(연음, 경음화 등)을 적용하여 “발음된 자모” 시퀀스를 입력으로 사용합니다. 실제 공개된 TTS 구현들을 보면, 발음 변환 모듈을 거친 후 그 출력을 자모 단위로 분해하여 모델에 넣는 경우가 많습니다. 이렇게 하면 두 방식의 장점을 살릴 수 있습니다: 전처리로 발음 오류를 줄이면서도, 최종 입력은 한글 자모로 하여 모델 구조를 크게 변경하지 않고 학습할 수 있습니다.
한국어에서 자소/음소 분해가 중요한 이유
한글은 표음 문자이므로 겉으로는 철자와 발음이 거의 일치한다고 생각하기 쉽습니다. 실제로 영어처럼 철자규칙이 예외투성이인 언어와 달리, 한국어의 경우 한글만 제대로 읽을 줄 알면 웬만한 발음을 생성할 수 있습니다aclanthology.org. 이러한 이유로 일부 연구에서는 “한글은 발음과 철자가 거의 일치하므로 굳이 음소 변환을 하지 않고 자소/음절 입력을 사용”하기도 했습니다aclanthology.org. 그러나 실제로는 한글 표기와 발음 사이에 미묘한 차이와 규칙들이 다수 존재하여, 이를 제대로 처리하지 않으면 TTS 품질 저하나 오류로 이어집니다. 한국어에서 자소/음소 분해가 특별히 중요한 이유를 몇 가지 살펴보겠습니다:
- 음운 변동 현상의 처리: 한국어에는 받침소리 연음, 겹받침의 발음, 자음 동화, 경음화, 모음 약화 등 다양한 음운 변동이 존재합니다. 예를 들어 “맑았는데”라는 철자열은 표기상으로는 [막았는데]로 읽힐 것 같지만 실제 발음은 **[말간는데]**에 가깝습니다. 이는 ‘맑’의 받침 ‘ㄺ’ 중 ‘ㄹ’만 발음되고 이어지는 ‘았’의 ‘ㅇ’과 결합하여 ‘간’으로 소리가 나기 때문입니다. 또 다른 예로 “신고”라는 글자는 문맥에 따라 [신꼬] (혼인 신고) 또는 [싱고/신고] (신을 신고)로 달라집니다. 사람이 보면 쉽지만, 모델은 이러한 맥락 의존 발음 변화를 학습해야 합니다. 자소/음소 단위 전처리를 통하면 이러한 현상을 규칙으로 미리 반영하여 모델 입력에 넣을 수 있으므로, 모델이 잘못 학습하거나 혼동할 가능성을 크게 줄입니다. 특히 조사 “의”는 원칙적 발음은 [의]지만 구어체에서는 [에]로 많이 발음되는 등, 맥락과 문어/구어에 따른 차이가 있습니다. 이런 부분도 G2P 단계에서 규범 발음 vs 실제 발음 옵션을 줘서 선택적으로 처리할 수 있습니다github.com.
- 모호성 해소와 정확한 억양: 한국어에는 동형어(철자 동일하나 의미 다른 단어)들이 존재하며, 경우에 따라 발음이 달라지는 어휘도 있습니다. 예를 들어 “가족들”의 복수 표지 “들”과 명사 “들”(들판)은 붙여쓰면 철자가 같지만 전자는 [들]로, 후자는 [틀]로 소리 나는 식입니다. 형태소 분석과 음소 변환을 거치면 전자는 접미사로 처리되어 앞 단어에 연음 규칙이 적용되지 않지만, 후자는 고유명사로 처리되어 고유 발음이 보존되는 등 올바른 발음을 얻을 수 있습니다. 이러한 맥락 기반 발음 차이는 자소/음소 전처리가 없다면 모델이 데이터에서 통계적으로 배우게끔 기대해야 하는데, 학습 코퍼스에 드문 패턴일 경우 잘못 읽을 소지가 큽니다. 전처리를 통해 이러한 모호성을 선제적으로 해소하면 모델은 항상 명확한 발음 힌트를 받게 됩니다.
- 모델 일반화 및 억양/운율 처리: 한글은 그나마 규칙적이지만, 외래어 표기나 줄임말 등은 훈련에 없는 패턴일 수 있습니다. 예를 들어 “GDP” 같은 영문 약어가 나오면, 자소 기반 모델은 ‘G’, ‘D’, ‘P’ 각각에 대응하는 발음을 학습하지 않았다면 제대로 못 읽지만, 전처리 모듈이 이를 “지디피”로 변환하면 문제 없습니다. 숫자 “2025”를 읽을 때도 “이천이십오” vs “이공이오” 등 맥락에 맞는 읽기가 필요합니다. 실제 오픈소스 모듈에서는 영어, 한자, 숫자, 기호 등을 한국어 발음으로 변환해주는 전처리 단계가 포함되어 있습니다. 이를 통해 모델은 다양한 입력에도 대응하는 범용성을 갖추게 됩니다. 또한 음소 단위로 쪼개면 각 음소에 대한 길이 및 억양 제어가 세밀하게 가능해집니다. 예컨대 감정 TTS에서 자모 하나를 늘려 발음하면 특정 음절을 늘이거나 강조하는 효과를 낼 수 있습니다. 반면 음절 단위로 처리했다면 음절 내부에서 어떤 소리가 늘어나야 할지 제어가 어려웠을 것입니다.
정리하면, 한국어 TTS에서 자소/음소 전처리는 한글 표기의 함정들을 제거하여 항상 올바른 발음의 입력을 모델에 공급하기 위함입니다. 그 결과 잘못된 발음 생성이 줄고, 새로운 단어/문장이 들어와도 모델이 일반화하여 처리하기 쉬워집니다. 또한 음소 단위 처리는 훈련 데이터 규모가 작을 때도 모델이 빨리 수렴하고 안정적으로 alignment를 학습하도록 도와줄 수 있습니다. 다만, 전처리가 복잡해지는 만큼 이를 구현할 때 추가적인 노력과 도구가 필요합니다.

한국어 TTS 전처리 단계별 과정
이제 한국어 TTS 시스템 개발 시 일반적으로 수행되는 텍스트 전처리 과정을 단계별로 살펴보겠습니다. 아래에는 각 단계를 순서대로 설명하고, 실제 예시 문장을 통해 단계별 변화와 사용 도구를 소개합니다.
예시 문장: 어제는 날씨가 맑았는데, 오늘은 흐리다.
(이 문장은 날짜나 숫자가 없어 비교적 간단하지만, 받침 ‘맑았-’ 부분에 발음 변화가 있습니다.)
- 텍스트 정규화 (전처리 1단계) – 숫자, 기호, 외래어 등을 표준적인 한글 표기로 변환합니다. 문장에서 불필요한 기호 제거, 약어/줄임말 풀기, 대문자→소문자(영어의 경우) 등의 작업도 이 단계에서 이뤄집니다. 한국어의 경우 숫자를 한글로 읽는 규칙이 비교적 명확하므로 규칙 기반으로 "3"→"삼" 등 변환하며, 연도/시간/단위 등은 사전에 정의된 패턴에 따라 변환합니다. 외국어(영문자, 한자 등)는 사용자의 선택에 따라 발음 그대로 한글 음사하거나 (예: "ABC" -> "에이비씨"), 원어 발음을 따로 처리하기도 합니다. 오픈소스로는 예를 들어 SMART-G2P 모듈의 sentranslit이 이런 작업을 수행합니다. 이 모듈은 문장 내의 영어, 한자, 숫자를 한국어 발음으로 변환하며, 사용자가 원하면 특정 요소(숫자, 기호 등)는 변환하지 않고 남겨둘 수도 있습니다github.com.
예시 적용: 우리 문장은 이미 한글로만 되어 있어 이 단계에서 큰 변화는 없습니다. (만약 "2025년 7월 22일" 같은 입력이었다면 "이천이십오년 칠월 이십이일"로 변환됩니다.) - 형태소 분석 및 발음 변환 (전처리 2단계) – 한글 문장에 대한 형태소 분석을 수행하여 품사와 단어 경계를 파악하고, 이를 기반으로 철자→음소 규칙을 적용합니다. 한국어는 교착어이므로 띄어쓰기 단위로 처리하면 안 되고, 내부 형태소 경계를 알아야 정확한 발음 변환이 가능한 경우가 많습니다. 이를 위해 Mecab-ko와 같은 형태소 분석기가 활용됩니다. 형태 분석 결과를 토대로, 각 음절에 음운 변동 규칙을 적용하여 실제 발음되는 형태로 텍스트를 변환합니다. 한국어 발음 변환 규칙에는 대표적으로 연음(받침+모음 연결), 끝소리 규칙(모든 받침은 ㄱㄴㄷㄹㅁㅂㅇ 7종으로), 자음 동화(앞뒤 자음의 영향으로 ㅋ→ㄱ, ㄶ→ㄴ 등), 경음화(된소리화) 등이 있습니다. 이러한 규칙을 체계적으로 적용하면 입력 문장의 음소열(발음 기호열)을 얻을 수 있습니다. 예를 들어 앞서 언급한 “맑았는데”는 형태소 기준으로 “맑았/는데”로 나뉘고, ‘맑았’에서 받침 ㄺ+ㄴ(는데)이 결합되어 [ㄹ+ㄴ] → [ㄹㄴ] 동화, 그리고 앞의 ㅏ 모음 이후의 ㅆ이 ㄴ 앞에서 [ㄴ]으로 바뀌는 등의 처리가 이루어져 **“말간는데”**로 변환됩니다.
한국어 G2P를 도와주는 오픈소스 라이브러리로 g2pK와 KoG2P가 널리 쓰입니다. g2pK(Kyubyong 제공)는 파이썬으로 구현된 규칙 기반 모듈로, jamo 라이브러리를 통해 한글 자모 분해를 하고, Mecab-ko 형태소 분석 결과를 이용해 문맥에 맞는 발음을 생성합니다github.comgithub.com. 예를 들어 g2pK를 사용하면 아래와 같이 출력됩니다:위 결과에서 볼 수 있듯이, 철자 "맑았는데, 오늘은"이 발음 "말간는데, 오느른"으로 변환되었습니다. 첫 단어 “맑았는데”의 맑이 [말ㄱ]이 아닌 [말ㄴ]으로 변하고 았의 받침 ㅆ도 ㄴ으로 바뀌어 “말간는데”로 처리되었습니다. 또한 “오늘은”에서 ‘은’이 받침 ㄴ 뒤에 이어지며 [는] 소리가 덧나는 듯한 “오느른” 형태로 출력된 것을 볼 수 있습니다. 이처럼 g2pK는 문맥을 고려한 한국어 발음열을 산출합니다. 참고로 g2pK는 표준 발음을 기본으로 하지만, descriptive=True 옵션을 주면 실제 구어에서 흔한 발음 (예: 조사 "의"→[에], "계산"의 "계"→[게] 등)을 반영하기도 합니다. 반면 KoG2P는 정원익 등이 공개한 G2P로, scarletcho의 구현은 규칙 파일(rulebook.txt)을 기반으로 한 완전한 규칙 기반 변환기입니다. KoG2P는 결과를 로마자 발음 기호로도 출력할 수 있는데 (예: output type 'eng'), 이는 음소를 영문자로 표기한 것으로 TTS 모델 입력으로 쓰기보다는 디버깅이나 다른 용도에 가깝습니다. 실제 TTS에서는 g2pK처럼 한글 발음 문자열을 뽑아서 쓰거나, KoG2P라 하더라도 변환 결과를 다시 한글로 mapping하여 사용합니다.어제는 날씨가 말간는데, 오느른 흐리다. - 예시 적용: 우리 문장 "어제는 날씨가 맑았는데, 오늘은 흐리다."는 g2pK 적용 결과 **"어제는 날씨가 말간는데, 오느른 흐리다."**로 변환되었습니다github.com. (형태소 분석상 맑았/는데, 오늘/은으로 나눠지고 규칙 적용된 결과입니다.)
-
# pythonfrom g2pk import G2p g2p = G2p() print(g2p("어제는 날씨가 맑았는데, 오늘은 흐리다."))
- 자소 단위 분해 및 토큰화 (전처리 3단계) – G2P를 통해 얻은 한글 발음 문자열을 구성하는 각 음절을 자모 문자로 분해하고, 이를 최종 토큰 시퀀스로 만듭니다. 예를 들어 발음 변환 결과 "말간는데, 오느른 흐리다."에서 한 음절 "말"은 ㅁ, ㅏ, ㄹ 세 글자로 분해됩니다. 이 과정을 파이썬에서는 unicodedata.normalize('NFD', text) 등을 통해 수행하거나, hgtk(한글 도깨비) 라이브러리, Python jamo 등을 사용해 구현합니다. 앞서 g2pK 예시의 코드에서도 to_syl=False 옵션을 주면 결과를 자모 분해된 문자열로 얻을 수 있습니다. 다만 자모가 분해된 문자열은 눈으로 보기엔 원문과 동일해 보일 수 있습니다 (예: "말간는데"가 폰트에 따라 "말간는데"와 구분 안 감)github.com. 따라서 디버깅 시에는 각 자모 사이에 공백을 넣거나 코드포인트를 출력하면 확인할 수 있습니다. 최종적으로 모델에 투입되는 토큰 시퀀스는 이러한 자모들의 나열입니다. 이때 일반적으로 문장 경계 토큰이나 구두점 토큰도 추가할 수 있습니다. 예를 들어 ','나 '.' 같은 문장부호를 일정 기호로 치환해 포함하기도 합니다. 우리 예시에서는 쉼표와 마침표가 있으므로 쉼표를 <comma> 등으로, 마침표를 <eos> 등으로 토큰화할 수 있습니다.
이 시퀀스가 곧 Tacotron/FastSpeech 등의 텍스트 인코더에 들어가는 입력 IDs로 변환됩니다. 한편, 만약 음소 변환을 생략했다면 입력은 원문 "어제는 날씨가 맑았는데, 오늘은 흐리다."를 자모화한 [ᄋ, ᅥ, ᄌ, ᅦ, ... ᄆ, ᅡ, ᆰ, ...] 등의 시퀀스가 되었을 것입니다. 두 경우의 차이는 “맑았” 부분에서 음소 변환을 거쳤다면 [ᄆ,ᅡ,ᆯ,ᄀ...] 대신 [ᄆ,ᅡ,ᆯ,ᄀ->ᄂ...]로 다른 자모 시퀀스가 입력된다는 점입니다. 전자는 모델이 나중에 [ᄀ→ᄂ] 변환을 학습해야 하고, 후자는 이미 변환된 [ᄂ]이 들어가 있는 셈입니다.[ᄆ, ᅡ, ᆯ, ᄀ, ᅡ, ᆫ, ᄂ, ᅳ, ᆫ, ᄃ, ᅦ, <comma>, ᄋ, ᅩ, ᄂ, ᅳ, ᄅ, ᅳ, ᆫ, ᄒ, ᅳ, ᄅ, ᅵ, ᄃ, ᅡ, <eos>]
- 예시 적용: "말간는데, 오느른 흐리다."를 자모 분해하면 다음과 같은 시퀀스가 됩니다 (쉼표/마침표는 특별 토큰으로 처리):
- 모델 입력 및 후처리: 이렇게 얻어진 자모 시퀀스를 숫자 ID로 변환하여 TTS 모델의 입력으로 넣으면, 이후에는 어쿠스틱 모델(Tacotron 계열의 멜 스펙트로그램 예측기 등)과 보코더를 거쳐 음성이 합성됩니다. 모델 출력인 멜 spectrogram→파형 변환 등은 본 보고서 범위를 벗어나므로 생략하지만, 최종적으로 합성 음성이 나오면 필요에 따라 후처리(디엔딩 노이즈 제거 등)를 할 수 있습니다. 일반적으로 전처리 단계에서 자소/음소 변환이 잘 되어 있으면 후단 출력의 발음 오류를 수정하는 후처리는 거의 필요 없습니다.
요약하면, 한국어 TTS 전처리는 (텍스트 정규화) → (형태소 분석 기반 G2P) → **(자모 단위 토큰화)**의 단계를 거치며, 각 단계마다 특화된 도구들이 활용됩니다. 이러한 철저한 전처리를 통해 Tacotron, FastSpeech, VITS 같은 최신 모델들도 한국어 문장을 정확하고 자연스러운 음성으로 합성할 수 있게 됩니다.

자주 사용되는 오픈소스 도구 및 라이브러리
마지막으로, 앞서 언급한 과정별로 실무에서 자주 활용되는 오픈소스 도구들을 정리합니다. 밤바캐스트 아파트 안내방송을 위해 적용된 TTS역시 직 간접적인 영향을 받은 도구들입니다. 한국어 TTS 연구 커뮤니티에는 운이 좋게도 다양한 전처리 도구들이 공개되어 있어, 이를 조합하면 손쉽게 고품질 TTS 전처리 파이프라인을 구축할 수 있습니다:
- KoNLPy 및 Mecab-ko – 파이썬에서 이용 가능한 한국어 형태소 분석기 도구입니다. Mecab-ko는 가볍고 빠른 분석기로, g2pK 등에서 형태 분석용으로 사용됩니다github.com. 형태소 분석을 통해 단어 경계, 품사, 활용형 등을 파악하여 G2P의 정확도를 높입니다.
- g2pK (github: Kyubyong/g2pK) – 한국어 grapheme-to-phoneme 변환을 위한 파이썬 모듈입니다. 한글의 복잡한 발음 규칙을 비교적 완벽히 구현하고 있으며, Mecab-ko를 이용한 문맥 판별로 정확도를 높입니다. 출력은 기본 한글 완성형으로 나오며, 옵션으로 자모 분해 출력도 지원합니다. TTS 용도로 많이 활용되며, 라이센스도 Apache 2.0으로 자유롭게 쓸 수 있습니다.
- KoG2P (github: scarletcho/KoG2P) – 서울대 연구진이 공개한 또 다른 한국어 G2P입니다. 규칙기반이며, 영어/한자를 포함한 문자열도 처리 가능하도록 설계되었습니다github.com. KoG2P는 변환 결과를 영문자 표기(예: “천”→"ch\u2019\u014fn")로도 내보낼 수 있는 특징이 있는데, SMART-TTS 프레임워크 등에서 이를 활용해보기도 했습니다. 다만 최종 TTS 입력으로는 g2pK와 마찬가지로 한글 자모나 완성형이 사용됩니다. KoG2P는 MIT 라이선스로 공개되어 있습니다.
- SMART-G2P (github: SMART-TTS/SMART-G2P) – 2021년 IITP 지원으로 개발된 한국어 TTS 전처리 모듈입니다. 문장 내 영어, 한자, 숫자 등을 한국어 발음으로 바꿔주는 전처리 파이프라인을 포함하며, 내부적으로 g2pK나 KoG2P를 연동해 최종 발음열을 얻습니다. 사용자가 옵션으로 “영어는 그대로 둘지, 숫자는 그대로 둘지” 등을 조절할 수 있어 실용성이 높습니다. 예컨대 "3-147" 같은 문자열을 그대로 둘지 "삼다시일사칠"로 변환할지 선택 가능합니다. SMART-G2P는 종단형 한국어 TTS 개발을 위해 공개된 툴킷의 일부로, 숫자→한글 변환 등 세부 규칙까지 잘 다듬어져 있어 현업에서도 활용 가치가 높습니다github.comgithub.com.
- TensorFlowTTS / Coqui TTS 등 – 인기 있는 오픈소스 TTS 구현체들도 한국어 처리를 지원합니다. 예를 들어 TensorFlowTTS는 한국어 KSS 데이터셋 예제로 자모 단위 Tacotron2 모델을 제공하며, Coqui TTS에도 한국어 Phonemizer가 포함되어 있어 (내부적으로 g2pK와 유사한 원리로) 텍스트를 자모/음소 시퀀스로 변환해줍니다hiplab.mc.vanderbilt.edu. 이러한 프레임워크를 사용할 경우 사용자 입장에서는 전처리 세부를 직접 코딩하지 않아도, 설정만으로 자소/음소 전처리가 적용된 모델을 훈련시킬 수 있습니다.
- 기타 유용한 라이브러리:
- python-jamo – 한글 음절을 자모 단위로 분해하거나 조립해주는 파이썬 라이브러리입니다. 자소 단위 TTS 구현 시 유용합니다.
- hgtk – 한글 Python 처리 라이브러리로, 자모 분해(hgtk.letter.decompose)와 조합, 초/중/종성 체크 등의 기능을 제공합니다.
- OpenKoreanText (오픈한글) – 카카오에서 공개한 한국어 텍스트 정규화 및 토크나이즈 라이브러리입니다. TTS보다는 SNS 텍스트 분석용이지만, 한글 영어 혼용된 문장의 한국어화 등에 활용할 수 있습니다.
- Num2words(ko) – 숫자를 한국어로 읽는 기능에 특화된 파이썬 패키지로, 날짜나 통화 단위 읽기 등의 커스터마이즈가 가능하여 TTS 정규화 단계에 응용할 수 있습니다.

이상과 같은 도구들을 적절히 조합하면, 한국어 텍스트→발음→자모 시퀀스로 변환하는 완전한 전처리 파이프라인을 구축할 수 있습니다. 이러한 전처리를 통해 Tacotron, FastSpeech, VITS 등 최신 TTS 모델들은 입력 문장의 의미를 정확한 소리로 전달하는 데 필요한 발음 정보를 충분히 얻을 수 있으며, 결과적으로 더 자연스럽고 오류 없는 음성 합성이 가능해집니다. 밤바캐스트 아파트 안내방송을 가능하게한 기술들입니다.
참고문헌 및 소스: 본 보고서에서는 한국어 TTS 전처리의 중요성에 대해 다룬 다양한 자료를 인용하였습니다. Perquin 등(2020)의 연구는 음소 입력이 발음 오류를 줄이는 경향을 보여주었으며bjmc.lu.lv, Jeon 등(2020)의 Jejueo TTS 연구에서는 한글 자모 입력의 효과를 실험으로 입증하였습니다aclanthology.orgaclanthology.org. Kyubyong의 g2pK README와 SMART-G2P 자료에서 발췌한 예시는 실제 한국어 발음 변환의 사례를 잘 보여줍니다github.comgithub.com. 자세한 내용은 각 주석의 출처를 통해 확인할 수 있습니다.