1. melotts docker 세팅하기
docker network create tts-net
docker run -d --network tts-net --name melotts-server -p 8888:8080 -e DEFAULT_SPEED=1 -e DEFAULT_LANGUAGE=KR -e DEFAULT_SPEAKER_ID=KR timhagel/melotts-api-server
컨테이너 내부에 python-mecab-ko를 설치
docker exec -it melotts-server pip install --upgrade pip
docker exec -it melotts-server pip install --no-cache-dir python-mecab-ko==1.3.7 g2pkk
docker exec -it melotts-server pip install --no-cache-dir --force-reinstall python-mecab-ko==1.3.7
docker exec -it melotts-server pip install --no-cache-dir mecab-python3 unidic-lite
docker logs --follow --timestamps melotts-server
2. melotts Docker 테스트하기
time curl -sS -X POST "http://localhost:8888/convert/tts" \
-H "Content-Type: application/json" \
-d '{
"text": "안녕하세요, 멜로 티티에스 한국어 테스트입니다.",
"language": "KR",
"speaker_id": "KR",
"speed": 1.0
}' --output out.wav
3. melotts 의 openai api 용 proxy 세팅
3.1 filename :: openai_gateway.py
# app_openai_tts.py: OpenAI /v1/audio/speech -> MeloTTS /convert/tts
import os, io, requests
from fastapi import FastAPI, Header, HTTPException
from fastapi.responses import Response
MELOTTS_URL = os.getenv("MELOTTS_URL", "http://melotts-server:8080")
DEFAULT_LANG = os.getenv("DEFAULT_LANGUAGE", "KR")
DEFAULT_SPK = os.getenv("DEFAULT_SPEAKER_ID", "KR")
app = FastAPI()
@app.post("/v1/audio/speech")
def audio_speech(payload: dict, authorization: str = Header(None)):
# OpenAI-style fields
text = payload.get("input", "")
voice = payload.get("voice", "kr")
fmt = payload.get("response_format", "wav")
speed = float(payload.get("speed", 1.0))
if not text:
raise HTTPException(400, "input is required")
# Simple voice->language/speaker mapping (customize as needed)
language = DEFAULT_LANG
speaker_id = DEFAULT_SPK
if voice.lower() in ["kr","korean","ko"]:
language, speaker_id = "KR", "KR"
# add more mappings if desired
# Call MeloTTS REST API
r = requests.post(f"{MELOTTS_URL}/convert/tts", json={
"text": text,
"language": language,
"speaker_id": speaker_id,
"speed": speed
}, timeout=120)
if r.status_code != 200:
raise HTTPException(r.status_code, r.text)
# Pass-through bytes; set media type by requested format (best-effort)
media = f"audio/{'wav' if fmt=='wav' else 'mpeg'}"
return Response(content=r.content, media_type=media)
3.2 file::requirements.txt
requests
3.3 file::Dockerfile
# Dockerfile
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.11
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
# openai_gateway.py 안에는 FastAPI 인스턴스 변수명이 app 여야 합니다.
COPY ./openai_gateway.py /app/main.py
3.4 proxy 용 docker 만들기
docker build -t melotts-openai-gateway .
3.5 melotts proxy docker 시작 스크립트
docker run -d --name melotts-openai-gw --network tts-net -p 8899:80 -e MELOTTS_URL=http://melotts-server:8080 -e DEFAULT_LANGUAGE=KR -e DEFAULT_SPEAKER_ID=KR melotts-openai-gateway
4. melotts proxy docker 테스트
curl -sS -X POST "http://localhost:8899/v1/audio/speech" \
-H "Authorization: Bearer sk-local-test" \
-H "Content-Type: application/json" \
-d '{
"model": "tts-1",
"input": "안녕하세요, 오픈에이아이 호환 엔드포인트 테스트입니다.",
"voice": "kr",
"response_format": "mp3",
"speed": 1.0
}' --output out.mp3
curl -sS -X POST "http://192.168.1.234:8899/v1/audio/speech" \
-H "Authorization: Bearer sk-local-test" \
-H "Content-Type: application/json" \
-d '{
"model": "tts-1",
"input": "안녕하세요, 오픈에이아이 호환 엔드포인트 테스트입니다.",
"voice": "kr",
"response_format": "mp3",
"speed": 1.0
}' --output out.mp3
댓글 0개