Files
tts_site/vendor/melo/main.py
claude f197177ae1 한국어 우선 MeloTTS 웹 서비스 추가 (GPU, 속도/피치, 로그인 없음)
- FastAPI 백엔드: /api/voices, /api/tts, /api/health
- 한국어 메인 + 영어(5종 악센트), 중국어/일본어 UI 제거
- 언어별 목소리 모델 선택, 속도(0.5~2.0x)/피치(±12반음) 조절
- 로그인/사용제한/과금 유도 없음 (무제한 테스트)
- NVIDIA GPU 자동 사용 (torch cu128, Blackwell sm_120)
- 유저 친화 한국어 UI (frontend)
- Docker/compose (GPU 예약), 8788 포트
- MeloTTS(순수 파이썬) 벤더링 + 검증된 버전 고정(constraints)
2026-08-23 21:57:48 +09:00

37 lines
1.8 KiB
Python

import click
import warnings
import os
@click.command
@click.argument('text')
@click.argument('output_path')
@click.option("--file", '-f', is_flag=True, show_default=True, default=False, help="Text is a file")
@click.option('--language', '-l', default='EN', help='Language, defaults to English', type=click.Choice(['EN', 'ES', 'FR', 'ZH', 'JP', 'KR'], case_sensitive=False))
@click.option('--speaker', '-spk', default='EN-Default', help='Speaker ID, only for English, leave empty for default, ignored if not English. If English, defaults to "EN-Default"', type=click.Choice(['EN-Default', 'EN-US', 'EN-BR', 'EN_INDIA', 'EN-AU']))
@click.option('--speed', '-s', default=1.0, help='Speed, defaults to 1.0', type=float)
@click.option('--device', '-d', default='auto', help='Device, defaults to auto')
def main(text, file, output_path, language, speaker, speed, device):
if file:
if not os.path.exists(text):
raise FileNotFoundError(f'Trying to load text from file due to --file/-f flag, but file not found. Remove the --file/-f flag to pass a string.')
else:
with open(text) as f:
text = f.read().strip()
if text == '':
raise ValueError('You entered empty text or the file you passed was empty.')
language = language.upper()
if language == '': language = 'EN'
if speaker == '': speaker = None
if (not language == 'EN') and speaker:
warnings.warn('You specified a speaker but the language is English.')
from melo.api import TTS
model = TTS(language=language, device=device)
speaker_ids = model.hps.data.spk2id
if language == 'EN':
if not speaker: speaker = 'EN-Default'
spkr = speaker_ids[speaker]
else:
spkr = speaker_ids[list(speaker_ids.keys())[0]]
model.tts_to_file(text, spkr, output_path, speed=speed)