vLLM for Speech - Huggingface에서 바로 다운로드하여 추론 가능한 범용 TTS/STT 서빙 시스템
- 간단한 사용법:
vtts serve model-name한 줄로 서버 실행 - Huggingface 통합: 모델 자동 다운로드 및 캐싱
- OpenAI 호환 API: OpenAI TTS & Whisper API와 완전 호환
- TTS + STT 통합: 텍스트 음성 변환과 음성 인식 동시 지원
- 한국어 우선: 한국어 지원 모델 중심
- Docker 지원: 의존성 충돌 없이 여러 엔진 동시 실행
- CUDA 지원: GPU 가속으로 빠른 추론
| 엔진 | 생성 시간* | 품질 | 다국어 | 음성 클로닝 | 참조 오디오 |
|---|---|---|---|---|---|
| Supertonic-2 | 0.8초 | Good | 5개 언어 | No | 불필요 |
| KaniTTS 🆕 | 1.9초 | Good | 6개 언어 | No | 불필요 |
| Chatterbox 🆕 | 2초 | Very Good | 23개 언어 | Zero-shot | 선택적 |
| Qwen3-TTS | 5~7초 | Excellent | 10개 언어 | Zero-shot | 선택적 |
| GPT-SoVITS v3 | 7~8초 | Excellent | 5개 언어 | Zero-shot | 필수 |
| CosyVoice2 | 11초 | Very Good | 9개 언어 | Zero-shot | 선택적 |
*생성 시간: 동일 텍스트(~50자) 기준, GPU (RTX 4090)
| 모델 | 크기 | 언어 | 특징 |
|---|---|---|---|
ResembleAI/chatterbox |
500M | English | CFG & Exaggeration control |
ResembleAI/chatterbox-multilingual |
500M | 23개 | 다국어 (한국어 포함) |
ResembleAI/chatterbox-turbo |
350M | English | 저지연, Paralinguistic tags |
| 모델 | 크기 | 언어 | 특징 |
|---|---|---|---|
nineninesix/kani-tts-370m |
370M | 6개 | 15+ 프리셋 스피커 |
- English: david, puck, kore, andrew, jenny, simon, katie
- Korean: seulgi
- German: bert, thorsten
- Chinese: mei, ming
- Arabic: karim, nur
- Spanish: maria
⚠️ KaniTTS 주의: Python 3.11 +nemo-toolkit+torch>=2.6필요 (별도 환경 권장)
| 모델 | 크기 | 참조 오디오 | 특징 |
|---|---|---|---|
Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice |
0.6B | 불필요 | 9개 프리셋 스피커 |
Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice |
1.7B | 불필요 | 9개 프리셋 스피커 (고품질) |
Qwen/Qwen3-TTS-12Hz-0.6B-Base |
0.6B | 필요 | Voice Clone |
Qwen/Qwen3-TTS-12Hz-1.7B-Base |
1.7B | 필요 | Voice Clone (고품질) |
GPT-SoVITS: Zero-shot 음성 클로닝 모델로, 참조 오디오(3~10초) + 참조 텍스트가 필수입니다.
- Faster-Whisper - 초고속 Whisper (CTranslate2)
- Whisper.cpp, Parakeet (Coming Soon)
✅ 통합 환경 지원 (v0.1.0+)
- Python 3.11 + transformers 4.57.1 환경에서 모든 엔진 호환
- Supertonic, Qwen3-TTS, GPT-SoVITS, CosyVoice, Chatterbox가 하나의 환경에서 동작
- KaniTTS는 nemo-toolkit 대용량 의존성으로 별도 설치 권장
권장 설치 방법:
- Python 3.11 환경 생성:
conda create -n vtts python=3.11 -y- vTTS 설치:
pip install "vtts[all] @ git+https://github.com/bellkjtt/vTTS.git"
uv 사용을 강력히 권장합니다!
uv는 Rust 기반의 초고속 Python 패키지 관리자로,pip보다 10-100배 빠르고 의존성 해결이 정확합니다.
# uv 설치 (한 번만)
pip install uv
# 또는: curl -LsSf https://astral.sh/uv/install.sh | sh# GPU 자동 지원 (uv 사용!)
uv pip install "vtts[supertonic] @ git+https://github.com/bellkjtt/vTTS.git" --system
# 서버 실행
vtts serve Supertone/supertonic-2 --device cuda# 1. 통합 설치 (uv 사용!)
uv pip install "vtts[supertonic-gptsovits] @ git+https://github.com/bellkjtt/vTTS.git" --system
# 2. GPT-SoVITS 저장소 자동 클론
vtts setup --engine gptsovits
# 3. 서버 실행 (각각 다른 포트)
vtts serve Supertone/supertonic-2 --port 8001 --device cuda
vtts serve kevinwang676/GPT-SoVITS-v3 --port 8002 --device cudaSupertonic + GPT-SoVITS는 같이 설치해도 충돌하지 않습니다!
# 1. vTTS + CosyVoice 의존성 설치 (CosyVoice 코드 내장!)
pip install "vtts[cosyvoice] @ git+https://github.com/bellkjtt/vTTS.git"
# 2. 서버 실행 (모델 자동 다운로드!)
vtts serve FunAudioLLM/CosyVoice2-0.5B --device cuda --port 8001CosyVoice 코드가 vTTS에 내장되어 별도 클론이 필요 없습니다!
# 1. vTTS + Qwen3-TTS 설치
pip install "vtts[qwen3tts] @ git+https://github.com/bellkjtt/vTTS.git"
# 2. CustomVoice (프리셋 스피커, 참조 오디오 불필요)
vtts serve Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice --device cuda --port 8001
# 3. Base (Voice Clone, 참조 오디오 필요)
vtts serve Qwen/Qwen3-TTS-12Hz-0.6B-Base --device cuda --port 8001Qwen3-TTS는 10개 언어 지원, CustomVoice는 9개 프리셋 스피커 제공!
# 1. vTTS + Chatterbox 설치
pip install "vtts[chatterbox] @ git+https://github.com/bellkjtt/vTTS.git"
# 2. English
vtts serve ResembleAI/chatterbox --device cuda --port 8001
# 3. Multilingual (한국어 포함 23개 언어)
vtts serve ResembleAI/chatterbox-multilingual --device cuda --port 8001Chatterbox는 Resemble AI의 최신 TTS 모델로, 23개 언어와 감정 조절을 지원합니다!
# 별도 Python 3.11 환경 필요!
conda create -n kanitts python=3.11 -y
conda activate kanitts
# KaniTTS 설치 (nemo-toolkit 포함)
pip install kani-tts torch>=2.6.0 --index-url https://pypi.org/simple/
# vTTS 설치
pip install "vtts[kanitts] @ git+https://github.com/bellkjtt/vTTS.git"
# 서버 실행
vtts serve nineninesix/kani-tts-370m --device cuda --port 8001KaniTTS는 15+ 스피커와 6개 언어를 지원하며, 1~2초의 초고속 생성이 가능합니다!
# 모든 TTS 엔진 설치 (의존성 충돌 가능!)
pip install "vtts[all] @ git+https://github.com/bellkjtt/vTTS.git"# 개별 실행
docker-compose up -d supertonic # :8001
docker-compose up -d gptsovits # :8002 (reference_audio 폴더 필요)
docker-compose up -d cosyvoice # :8003
# 전체 + Nginx API Gateway
docker-compose --profile gateway up -d # :8000 (통합 엔드포인트)자세한 내용: Docker 가이드
# 기본 설치 (Supertonic만)
pip install "vtts[supertonic] @ git+https://github.com/bellkjtt/vTTS.git"
# CosyVoice (코드 내장!)
pip install "vtts[cosyvoice] @ git+https://github.com/bellkjtt/vTTS.git"
# GPT-SoVITS (저장소 클론 필요)
pip install "vtts[gptsovits] @ git+https://github.com/bellkjtt/vTTS.git"
vtts setup --engine gptsovits # GPT-SoVITS 저장소 자동 클론# 환경 진단
vtts doctor
# 자동 수정 (numpy, onnxruntime 호환성 문제 해결)
vtts doctor --fix
# CUDA 지원 강제 설치
vtts doctor --fix --cuda출력 예시:
vTTS Environment Diagnosis
✓ Python: 3.10.12
✓ numpy: 1.26.4
✓ onnxruntime: 1.16.0 (CUDA 지원)
Providers: CUDAExecutionProvider, CPUExecutionProvider
✓ PyTorch: 2.1.0 (CUDA 12.1)
GPU: NVIDIA GeForce RTX 4090
✓ vTTS: 설치됨
모든 환경이 정상입니다!
# Supertonic (가장 간단!)
!pip install "vtts[supertonic] @ git+https://github.com/bellkjtt/vTTS.git"
!vtts serve Supertone/supertonic-2 --device cuda &
# CosyVoice (2줄!)
!pip install "vtts[cosyvoice] @ git+https://github.com/bellkjtt/vTTS.git"
!vtts serve FunAudioLLM/Fun-CosyVoice3-0.5B-2512 --device cuda &vtts serve Supertone/supertonic-2
vtts serve Supertone/supertonic-2 --device cuda --port 8000# 1. vTTS + CosyVoice 의존성 설치 (한 줄!)
pip install "vtts[cosyvoice] @ git+https://github.com/bellkjtt/vTTS.git"
# 2. 서버 실행 (모델 자동 다운로드!)
vtts serve FunAudioLLM/Fun-CosyVoice3-0.5B-2512 --device cuda --port 8001참고:
- CosyVoice 코드가 vTTS에 내장되어 있어 별도 클론 불필요!
- 첫 실행 시 HuggingFace에서 자동으로 모델을 다운로드합니다 (~2 GB)
- 9개 언어 지원: 한국어, 영어, 중국어, 일본어, 광동어, 스페인어, 프랑스어, 독일어, 포르투갈어
- 18+ 중국어 방언 지원
# GPT-SoVITS 저장소 설치 (위의 "방법 2" 참고)
vtts setup --engine gptsovits
# 서버 실행 (pretrained 모델 자동 다운로드됨!)
vtts serve kevinwang676/GPT-SoVITS-v3 --device cuda --port 8002참고:
- 첫 실행 시 HuggingFace에서 자동으로 pretrained 모델을 다운로드합니다 (~2.9 GB)
- 모델은
~/.cache/huggingface/에 캐시되며, 이후 재사용됩니다
# CustomVoice: 프리셋 스피커 사용 (참조 오디오 불필요)
vtts serve Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice --device cuda --port 8003
# Base: Voice Clone (참조 오디오 필요)
vtts serve Qwen/Qwen3-TTS-12Hz-0.6B-Base --device cuda --port 8003
# 고품질 1.7B 모델 (더 자연스러운 음성)
vtts serve Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice --device cuda --port 8003참고:
- 10개 언어 지원: 한국어, 영어, 중국어, 일본어, 독일어, 프랑스어, 러시아어, 포르투갈어, 스페인어, 이탈리아어
- CustomVoice 스피커: Vivian, Serena, Uncle_Fu, Dylan, Eric, Ryan, Aiden, Ono_Anna, Sohee (한국어)
- 참조 오디오 캐싱: 동일 참조 오디오 재사용 시 지연 없음
vtts serve Supertone/supertonic-2 --stt-model large-v3
vtts serve Supertone/supertonic-2 --stt-model base --device cuda| 옵션 | 기본값 | 설명 |
|---|---|---|
--host |
0.0.0.0 | 서버 호스트 |
--port |
8000 | 서버 포트 |
--device |
auto | cuda, cpu, auto |
--stt-model |
None | Whisper 모델 (base, large-v3 등) |
--log-level |
INFO | DEBUG, INFO, WARNING, ERROR |
from vtts import VTTSClient
client = VTTSClient("http://localhost:8000")
# TTS
audio = client.tts(
text="안녕하세요, vTTS입니다.",
voice="F1",
language="ko",
speed=1.05
)
audio.save("output.wav")
# STT
text = client.stt("audio.wav")
print(text)audio = client.tts(
text="안녕하세요",
voice="F1", # M1-M4, F1-F4
language="ko", # en, ko, es, pt, fr
speed=1.05, # 속도 (기본: 1.05)
total_steps=5, # 품질 (1-20, 기본: 5)
silence_duration=0.3 # 청크 간 무음 (초)
)from vtts import VTTSClient
# CosyVoice 클라이언트 (9개 언어 지원!)
client = VTTSClient("http://localhost:8001")
audio = client.tts(
text="안녕하세요, CosyVoice로 생성한 음성입니다.",
model="FunAudioLLM/Fun-CosyVoice3-0.5B-2512",
voice="reference",
language="ko", # ko, en, zh, ja, yue, es, fr, de, pt
reference_audio="./samples/reference.wav", # 참조 오디오 (제로샷 클로닝)
reference_text="참조 오디오에서 말하는 내용"
)
audio.save("cosyvoice_output.wav")NOTE: CosyVoice는 9개 언어를 지원하며, 18+ 중국어 방언도 지원합니다!
from vtts import VTTSClient
# GPT-SoVITS 클라이언트 (참조 오디오 필수!)
client = VTTSClient("http://localhost:8002")
audio = client.tts(
text="안녕하세요, 음성 클로닝 테스트입니다.",
model="kevinwang676/GPT-SoVITS-v3",
voice="reference",
language="ko",
reference_audio="./samples/reference.wav", # 참조 오디오 (필수!)
reference_text="참조 오디오에서 말하는 내용", # 참조 텍스트 (필수!)
# 품질 조절 파라미터 (선택)
speed=1.0, # 속도 (0.5-2.0)
top_k=15, # Top-K 샘플링 (1-100)
top_p=1.0, # Top-P 샘플링 (0.0-1.0)
temperature=1.0, # 다양성 (0.1-2.0, 낮을수록 안정적)
sample_steps=32, # 샘플링 스텝 (1-100, 높을수록 품질↑)
seed=-1, # 시드 (-1: 랜덤, 고정값: 재현 가능)
repetition_penalty=1.35, # 반복 억제 (1.0-2.0, 높을수록 반복 감소)
text_split_method="cut5", # 텍스트 분할 (cut5, four_sentences 등)
batch_size=1, # 배치 크기 (1-10)
fragment_interval=0.3, # 문장 조각 간 간격 초 (0.0-2.0)
parallel_infer=True # 병렬 추론 활성화
)
audio.save("cloned_voice.wav")NOTE: GPT-SoVITS는
reference_audio와reference_text파라미터가 필수입니다!
from vtts import VTTSClient
# Qwen3-TTS CustomVoice 클라이언트
client = VTTSClient("http://localhost:8003")
audio = client.tts(
text="안녕하세요, Qwen3 TTS로 생성한 음성입니다.",
model="Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice",
voice="Sohee", # 한국어 스피커
language="ko"
)
audio.save("qwen3_customvoice.wav")CustomVoice 스피커 목록:
- 한국어:
Sohee - 영어:
Vivian,Serena,Dylan,Eric,Ryan,Aiden - 일본어:
Ono_Anna - 중국어:
Uncle_Fu
from vtts import VTTSClient
# Qwen3-TTS Base 클라이언트 (Voice Clone)
client = VTTSClient("http://localhost:8003")
audio = client.tts(
text="안녕하세요, Voice Clone으로 생성한 음성입니다.",
model="Qwen/Qwen3-TTS-12Hz-0.6B-Base",
voice="reference",
language="ko",
reference_audio="./samples/reference.wav", # 참조 오디오 (필수!)
reference_text="참조 오디오에서 말하는 내용" # 참조 텍스트 (필수!)
)
audio.save("qwen3_voice_clone.wav")NOTE: Qwen3-TTS Base는 동일 참조 오디오 재사용 시 voice_clone_prompt가 캐싱되어 속도가 향상됩니다!
파라미터 가이드:
| 파라미터 | 기본값 | 범위 | 설명 |
|---|---|---|---|
top_k |
15 | 1-100 | Top-K 샘플링 (낮을수록 보수적) |
top_p |
1.0 | 0.0-1.0 | Nucleus 샘플링 (낮을수록 집중적) |
temperature |
1.0 | 0.1-2.0 | 생성 다양성 (낮을수록 안정적) |
sample_steps |
32 | 1-100 | 샘플링 스텝 (높을수록 품질↑) |
seed |
-1 | -1 또는 양수 | 랜덤 시드 (-1: 랜덤) |
repetition_penalty |
1.35 | 1.0-2.0 | 반복 억제 (높을수록 반복 감소) |
text_split_method |
cut5 | - | 텍스트 분할 방식 |
batch_size |
1 | 1-10 | 배치 크기 |
fragment_interval |
0.3 | 0.0-2.0 | 문장 간 무음 (초) |
parallel_infer |
True | bool | 병렬 추론 |
시나리오별 추천:
- 고품질/안정적:
temperature=0.7, top_p=0.9, sample_steps=40, repetition_penalty=1.5 - 빠른 생성:
sample_steps=16, top_k=10, batch_size=2 - 다양한 결과:
temperature=1.2, top_k=30, repetition_penalty=1.2 - 긴 텍스트:
text_split_method="four_sentences", fragment_interval=0.5
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
response = client.audio.speech.create(
model="Supertone/supertonic-2",
voice="F1",
input="안녕하세요, 반갑습니다."
)
response.stream_to_file("output.mp3")curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"input": "Hello!", "voice": "F1", "model": "Supertone/supertonic-2", "language": "en"}' \
--output supertonic.mp3curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"input": "안녕하세요, Qwen3 TTS입니다.", "voice": "Sohee", "model": "Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice", "language": "ko"}' \
--output qwen3_customvoice.wavcurl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "안녕하세요, Voice Clone입니다.",
"voice": "reference",
"model": "Qwen/Qwen3-TTS-12Hz-0.6B-Base",
"language": "ko",
"reference_audio": "/path/to/reference.wav",
"reference_text": "참조 오디오의 텍스트"
}' \
--output qwen3_voice_clone.wavcurl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "안녕하세요, GPT-SoVITS입니다.",
"voice": "reference",
"model": "kevinwang676/GPT-SoVITS-v3",
"language": "ko",
"reference_audio": "/path/to/reference.wav",
"reference_text": "참조 오디오의 텍스트"
}' \
--output gptsovits.wavcurl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "안녕하세요, CosyVoice입니다.",
"voice": "reference",
"model": "FunAudioLLM/CosyVoice2-0.5B",
"language": "ko",
"reference_audio": "/path/to/reference.wav",
"reference_text": "참조 오디오의 텍스트"
}' \
--output cosyvoice.wav| 엔진 | 포트 | GPU 메모리 |
|---|---|---|
| Gateway (Nginx) | 8000 | - |
| Supertonic | 8001 | ~1GB |
| GPT-SoVITS | 8002 | ~4GB |
| CosyVoice | 8003 | ~3GB |
| Qwen3-TTS 0.6B | 8004 | ~2GB |
| Qwen3-TTS 1.7B | 8004 | ~4GB |
# 이미지 빌드
docker-compose build
# 실행
docker-compose up -d supertonic # Supertonic만
docker-compose up -d # 전체
# 로그
docker-compose logs -f supertonic
# 종료
docker-compose down자세한 내용: Docker 가이드
| 명령어 | 설명 |
|---|---|
vtts serve MODEL |
TTS 서버 시작 |
vtts doctor |
환경 진단 |
vtts doctor --fix |
환경 자동 수정 |
vtts setup --engine ENGINE |
엔진별 설치 |
vtts list-models |
지원 모델 목록 |
vtts info MODEL |
모델 정보 |
vTTS/
├── vtts/
│ ├── __init__.py # 환경 자동 체크
│ ├── cli.py # CLI (serve, doctor, setup)
│ ├── client.py # Python 클라이언트
│ ├── server/
│ │ ├── app.py # FastAPI 앱
│ │ ├── routes.py # TTS API 라우트
│ │ ├── stt_routes.py # STT API 라우트
│ │ └── models.py # Pydantic 모델
│ ├── engines/
│ │ ├── base.py # 베이스 엔진 인터페이스
│ │ ├── registry.py # 엔진 자동 등록
│ │ ├── supertonic.py # Supertonic 엔진
│ │ ├── gptsovits.py # GPT-SoVITS 엔진
│ │ ├── cosyvoice.py # CosyVoice 엔진
│ │ └── _supertonic/ # 내장 ONNX 모듈
│ └── utils/
│ └── audio.py # 오디오 처리
├── docker/
│ ├── Dockerfile.supertonic
│ ├── Dockerfile.gptsovits
│ ├── Dockerfile.cosyvoice
│ └── nginx.conf # API Gateway
├── docker-compose.yml
├── setup.py
└── README.md
- 프로젝트 구조 설계
- 베이스 엔진 인터페이스 구현
- Supertonic-2 엔진 구현
- CosyVoice3 엔진 구현
- GPT-SoVITS 엔진 구현
- FastAPI 서버 구현
- OpenAI 호환 API
- CLI 구현 (serve, doctor, setup)
- 모델 자동 다운로드
- CUDA 지원
- Docker 이미지
- 환경 자동 진단/수정
- 스트리밍 지원
- 배치 추론 최적화
ValueError: numpy.dtype size changed, may indicate binary incompatibility
해결: vtts doctor --fix
WARNING: CUDA requested but CUDAExecutionProvider not available
해결: vtts doctor --fix --cuda
해결: Docker 사용 권장
docker-compose up -d supertonic더 많은 문제: 문제 해결 가이드
Apache License 2.0
이 프로젝트가 도움이 되셨나요?
- vLLM - 아키텍처 영감
- Supertone
- Qwen3-TTS - Alibaba
- FunAudioLLM
- GPT-SoVITS
- Faster-Whisper