Skip to content
/ vTTS Public

The simplest way to run multiple TTS models.

License

Notifications You must be signed in to change notification settings

bellkjtt/vTTS

Repository files navigation

vTTS - Universal TTS/STT Serving System

Version License Python GitHub Sponsors Status

vLLM for Speech - Huggingface에서 바로 다운로드하여 추론 가능한 범용 TTS/STT 서빙 시스템

한국어 | English | 中文 | 日本語

목표

  • 간단한 사용법: vtts serve model-name 한 줄로 서버 실행
  • Huggingface 통합: 모델 자동 다운로드 및 캐싱
  • OpenAI 호환 API: OpenAI TTS & Whisper API와 완전 호환
  • TTS + STT 통합: 텍스트 음성 변환과 음성 인식 동시 지원
  • 한국어 우선: 한국어 지원 모델 중심
  • Docker 지원: 의존성 충돌 없이 여러 엔진 동시 실행
  • CUDA 지원: GPU 가속으로 빠른 추론

지원 모델

TTS (Text-to-Speech)

엔진 생성 시간* 품질 다국어 음성 클로닝 참조 오디오
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)

Chatterbox 모델 종류 (Resemble AI)

모델 크기 언어 특징
ResembleAI/chatterbox 500M English CFG & Exaggeration control
ResembleAI/chatterbox-multilingual 500M 23개 다국어 (한국어 포함)
ResembleAI/chatterbox-turbo 350M English 저지연, Paralinguistic tags

KaniTTS 스피커 (NineNineSix)

모델 크기 언어 특징
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 필요 (별도 환경 권장)

Qwen3-TTS 모델 종류

모델 크기 참조 오디오 특징
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초) + 참조 텍스트가 필수입니다.

STT (Speech-to-Text)

  • 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 대용량 의존성으로 별도 설치 권장

권장 설치 방법:

  1. Python 3.11 환경 생성: conda create -n vtts python=3.11 -y
  2. vTTS 설치: pip install "vtts[all] @ git+https://github.com/bellkjtt/vTTS.git"

로컬 설치 (uv 권장 - 빠르고 정확함!)

uv 사용을 강력히 권장합니다!
uv는 Rust 기반의 초고속 Python 패키지 관리자로, pip보다 10-100배 빠르고 의존성 해결이 정확합니다.

# uv 설치 (한 번만)
pip install uv
# 또는: curl -LsSf https://astral.sh/uv/install.sh | sh

옵션 1: Supertonic만 (가장 가볍고 빠름)

# GPU 자동 지원 (uv 사용!)
uv pip install "vtts[supertonic] @ git+https://github.com/bellkjtt/vTTS.git" --system

# 서버 실행
vtts serve Supertone/supertonic-2 --device cuda

옵션 2: Supertonic + GPT-SoVITS (호환 보장!)

# 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 cuda

Supertonic + GPT-SoVITS는 같이 설치해도 충돌하지 않습니다!

옵션 3: CosyVoice만 (2줄!)

# 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 8001

CosyVoice 코드가 vTTS에 내장되어 별도 클론이 필요 없습니다!

옵션 4: Qwen3-TTS (고품질 TTS)

# 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 8001

Qwen3-TTS는 10개 언어 지원, CustomVoice는 9개 프리셋 스피커 제공!

옵션 5: Chatterbox (23개 언어)

# 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 8001

Chatterbox는 Resemble AI의 최신 TTS 모델로, 23개 언어와 감정 조절을 지원합니다!

옵션 6: KaniTTS (초고속, 6개 언어)

# 별도 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 8001

KaniTTS는 15+ 스피커와 6개 언어를 지원하며, 1~2초의 초고속 생성이 가능합니다!

옵션 7: 모든 엔진 한번에

# 모든 TTS 엔진 설치 (의존성 충돌 가능!)
pip install "vtts[all] @ git+https://github.com/bellkjtt/vTTS.git"

Docker (여러 엔진 동시 사용)

# 개별 실행
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 가이드

CLI 자동 설치

# 기본 설치 (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: 설치됨

모든 환경이 정상입니다!

Kaggle/Colab에서

# 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 &

서버 실행

Supertonic (빠른 TTS)

vtts serve Supertone/supertonic-2
vtts serve Supertone/supertonic-2 --device cuda --port 8000

CosyVoice (다국어 음성 클로닝)

# 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 (음성 클로닝)

# 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/ 에 캐시되며, 이후 재사용됩니다

Qwen3-TTS (고품질 다국어 TTS)

# 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 (한국어)
  • 참조 오디오 캐싱: 동일 참조 오디오 재사용 시 지연 없음

TTS + STT 동시

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

Python 사용

기본 사용법

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)

고급 옵션 (Supertonic)

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  # 청크 간 무음 (초)
)

음성 클로닝 (CosyVoice)

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+ 중국어 방언도 지원합니다!

음성 클로닝 (GPT-SoVITS)

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_audioreference_text 파라미터가 필수입니다!

Qwen3-TTS (CustomVoice - 프리셋 스피커)

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

Qwen3-TTS (Base - Voice Clone)

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

OpenAI SDK 호환

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

Supertonic (가장 빠름)

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.mp3

Qwen3-TTS CustomVoice (프리셋 스피커)

curl -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.wav

Qwen3-TTS Base (Voice Clone)

curl -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.wav

GPT-SoVITS (Voice Clone)

curl -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.wav

CosyVoice (Voice Clone)

curl -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

Docker

포트 구성

엔진 포트 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 가이드


CLI 명령어

명령어 설명
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 이미지
  • 환경 자동 진단/수정
  • 스트리밍 지원
  • 배치 추론 최적화

문서

시작하기

예제 및 테스트

개발자 문서

다국어 문서


문제 해결

numpy 호환성 에러

ValueError: numpy.dtype size changed, may indicate binary incompatibility

해결: vtts doctor --fix

CUDA를 찾을 수 없음

WARNING: CUDA requested but CUDAExecutionProvider not available

해결: vtts doctor --fix --cuda

의존성 충돌

해결: Docker 사용 권장

docker-compose up -d supertonic

더 많은 문제: 문제 해결 가이드


라이선스

Apache License 2.0

후원

이 프로젝트가 도움이 되셨나요?

Sponsor Ko-fi

감사의 말

About

The simplest way to run multiple TTS models.

Resources

License

Stars

Watchers

Forks

Sponsor this project

 

Packages

No packages published