KittenTTS: ONNX 기반 초경량 TTS 모델 분석

서론

최근 생성형 AI의 발전과 함께 텍스트-음성 변환(TTS, Text-to-Speech) 기술은 비약적인 성장을 이루었습니다. VALL-E나 Bark와 같은 대규모 언어 모델 기반의 TTS는 인간과 구별하기 힘든 수준의 감정 표현과 운율을 생성해 내지만, 그 대가로 수 기가바이트에 달하는 거대한 모델 사이즈와 GPU 필수적인 추론 환경이라는 큰 걸림돌이 있습니다.

실제 산업 현장, 특히 엣지(Edge) 디바이스 환경에서는 이러한 거대 모델을 탑재하기가 불가능에 가깝습니다. 사용자의 스마트폰, 내비게이션, 혹은 저전력 IoT 기기에서 실시간으로 음성 피드백을 제공해야 하는 시나리오를 상상해 보십시오. 수초의 지연(latency)과 발열을 감당할 수 없는 환경에서, 우리는 ‘괜찮은’ 품질이 아니라 ‘즉각적’이면서도 ‘적절한’ 품질의 음성 합성이 필요합니다.

바로 이 지점에서 KittenTTS와 같은 초경량 모델의 중요성이 부각됩니다. 모델의 효율성과 실시간성을 극대화하여, 리소스가 제한된 환경에서도 고품질의 음성 서비스를 가능하게 하는 기술적 접근이 왜 중요한지, 그리고 ONNX 생태계가 이를 어떻게 뒷받침하는지 살펴보고자 합니다.

본론

ONNX와 경량화의 만남: KittenTTS의 기술적 배경

KittenTTS의 핵심은 모델 구조 자체의 효율성뿐만 아니라, 이를 ONNX(Open Neural Network Exchange) 런타임 최적화와 결합하여 배포의 편의성을 극대화했다는 점에 있습니다. 일반적으로 딥러닝 모델은 PyTorch나 TensorFlow와 같은 프레임워크에서 학습되지만, 실제 서빙(Serving) 단계에서는 추론 속도가 가장 중요합니다.

ONNX는 이러한 모델을 프레임워크 독립적으로 실행할 수 있게 해주는 중간 포맷입니다. KittenTTS는 학습된 가중치를 ONNX 형식으로 변환하여 제공함으로써, Python뿐만 아니라 C++, C# 등 다양한 언어 환경에서의 통합을 용이하게 만들었습니다. 특히 엣지 디바이스나 임베디드 시스템에서는 무거운 Python 런타임依赖성(dependencies)을 줄이는 것이 성능 향상의 지름길입니다.

KittenTTS는 약 15m에서 80m 파라미터 수를 가진 모델을 제공하며, 이는 용량으로 환산했을 때 25MB에서 80MB 수준에 불과합니다. 이는 일반적인 VITS 모델이나 기존의 경량 TTS 모델 대비 상당히 작은 사이즈로, 메모리가 부족한 저사양 기기에서도 모델을 RAM에 완전히 로드한 상태로 유지하며 추론을 수행할 수 있음을 의미합니다.

추론 파이프라인 구조

KittenTTS의 음성 합성 과정은 전통적인 TTS 파이프라인을 따르되, 각 단계에서의 연산량을 획기적으로 줄인 것이 특징입니다. 텍스트 입력이 들어오면 전처리 과정을 거쳐 모델이 처리하기 쉬운 포맷으로 변환되고, Acoustic Model을 통해 멜 스펙트로그램(Mel-spectrogram)이 생성됩니다. 이후 Vocoder가 이 스펙트로그램을 실제 오디오 파형으로 변환합니다.

다음은 이러한 과정을 간단화하여 도식화한 것입니다.

1
2
3
4
5
6
graph LR
    A[Input Text] --> B[Text Normalization]
    B --> C[ONNX Acoustic Model]
    C --> D[Mel Spectrogram]
    D --> E[ONNX Vocoder]
    E --> F[Output Audio Waveform]

이 파이프라인의 핵심은 Acoustic Model과 Vocoder 모두 ONNX로 최적화되어 있다는 점입니다. 특히 Vocoder는 오디오 생성 과정에서 연산 밀도가 높은 부분인데, KittenTTS는 여기서轻量化的 신경망 구조를 사용하여 CPU 단독으로도 실시간(real-time) 처리를 가능하게 합니다.

경쟁 모델 대비 성능 비교

KittenTTS가 위치하는 기술적 스펙트럼을 명확히 이해하기 위해, 일반적인 TTS 솔루션과 비교해 보는 것이 필요합니다. 아래 표는 모델 크기와 추론 환경, 그리고 전형적인 사용 사례를 나타낸 것입니다.

| 비교 항목 | KittenTTS (ONNX) | Standard VITS (PyTorch) | Large LLM TTS (e.g., VALL-E) | | :— | :— | :— | :— | | 모델 파라미터 | 15M ~ 80M | 40M ~ 110M | 1B+ (수십억) | | 모델 용량 | 25MB ~ 80MB | 150MB ~ 400MB | 3GB ~ 10GB+ | | 추론 하드웨어 | CPU (Edge 가능) | GPU 권장 | 멀티 GPU (H100/A100) | | 지연 시간(Latency) | 매우 낮음 (< 100ms) | 중간 | 높음 (초 단위) | | 음성 품질 | 양호 (Daily 용도) | 매우 우수 | 인간 수준 (Prosody) | | 주요 용도 | 내비게이션, IoT, 앱 | 게임, 애니메이션 더빙 | 고급 AI 어시스턴트 |

위 표에서 볼 수 있듯, KittenTTS는 음성의 자연스러움을 다소 희생하더라도 배포 용이성과 속도를 극대화하는 방향으로 설계되었습니다. 이는 “완벽한 인간의 목소리"보다는 “빠르고 명확한 정보 전달"이 중요한 도메인에서 매우 강력한竞争优势(경쟁 우위)을 가집니다.

실무 적용 가이드: KittenTTS 구현하기

KittenTTS를 실제 프로젝트에 적용하는 과정은 매우 간단합니다. Python 환경에서 라이브러리를 설치하고, 내장된 8가지 음성 중 하나를 선택해 텍스트를 전달하면 됩니다.

먼저 라이브러리를 설치합니다.

1
pip install kittentts

다음은 간단한 Python 스크립트를 통해 CPU 환경에서 텍스트를 음성으로 변환하는 예제 코드입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import torch
from kittentts import KittenTTS

# 모델 초기화 (기본적으로 CPU에서 실행됨)
# 'cpu' 명시적으로 지정하여 GPU 메모리 사용 방지
tts = KittenTTS(device='cpu')

# 사용 가능한 음성 목록 확인 (예: 'korean_amy', 'korean_joe' 등 지원 여부 확인)
# print(tts.voices) 

text_input = "안녕하세요, 이것은 KittenTTS의 테스트 음성입니다. 경량화에 성공했습니다."

# 텍스트를 오디오 데이터(WAV)로 변환
# speed 조절을 통해 재생 속도 제어 가능
audio_data = tts.tts(text_input, voice='korean_female_01', speed=1.0)

# 결과 파일 저장
with open("output_test.wav", "wb") as f:
    f.write(audio_data)

print("오디오 파일이 저장되었습니다.")

이 코드는 GPU가 없는 일반 개발용 노트북이나 서버에서도 즉시 실행 가능합니다. tts.tts() 함수 내부적으로 ONNX Runtime이 호출되어 최적화된 연산이 수행됩니다.

MLOps 관점에서의 고찰 및 최적화 팁

MLOps 엔지니어의 관점에서 KittenTTS는 모델 서빙(Serving) 최적화의 교과서 같은 사례입니다. 다만, 엣지 디바이스 성능에 따라 추가적인 최적화가 필요할 수 있습니다.

  1. Quantization (양자화): ONNX Runtime은 8-bit 정수 양자화(Quantization)를 지원합니다. 32-bit 부동소수점(FP32)으로 학습된 모델을 INT8로 변환하면 모델 크기를 4배 줄이면서도 추론 속도를 2~3배까지 높일 수 있습니다. KittenTTS 모델 자체가 이미 작지만, 저전력 MCU(Microcontroller) 등에 탑재한다면 이 과정이 필수적입니다. 2. Static Caching: 입력 텍스트의 길이가 일정한 경우(예: “앞으로 우회전 하시겠습니까?” 같은 고정된 안내 멘트), ONNX Runtime의 Shape inference를 통해 메모리 할당 시간을 더 줄일 수 있습니다. 3. Streaming 추론: 긴 텍스트를 처리할 때 전체 텍스트를 처리한 후 한 번에 오디오를 생성하는 방식(Batch processing) 대신, 청크(Chunk) 단위로 생성하여 실시간으로 스트리밍하는 방식을 구현하면 사용자 경험(UX)이 크게 향상됩니다.

결론

KittenTTS는 “클수록 좋다(Bigger is Better)“는 딥러닝의 통념을 깨고, “환경에 맞는 모델이 최고다"는 실용적인 접근 방식을 보여줍니다. 25MB라는 작은 용량과 8가지 내장 음성, 그리고 GPU 의존성을 제거한 ONNX 기반 아키텍처는 리소스가 제한적인 엣지 AI 환경에 최적화된 솔루션입니다.

AI 연구자 및 엔지니어에게 중요한 시사점은, 모든 문제를 거대 파라미터 모델로 해결하려 하기보다는, 적절한 모델 경량화 기술과 추론 최적화 프레임워크(ONNX)를 결합하여 실제 서비스의 제약 조건을 해결하는 것이 중요하다는 것입니다. KittenTTS는 특히 내비게이션, 도서관 가이드, 장애인 보조 기기 등 즉각적인 음성 피드백이 필요한 다양한 산업 분야에서 즉시 도입해 볼 수 있는 훌륭한 오픈소스 자산입니다.

참고자료


출처: https://news.hada.io/topic?id=27680

Hugo로 만듦
JimmyStack 테마 사용 중