마지막 수정
M4 Mac mini에서 Supertonic 로컬 TTS 프록시를 돌려본 기록
M4 Mac mini 16GB에서 Supertonic OpenAI 호환 TTS 프록시를 설치하고, health/models/speech 응답과 wav·mp3·opus 생성 시간을 직접 확인한 운영 기록입니다.
10초 요약
- M4 Mac mini 16GB에서 Supertonic 로컬 TTS 프록시를 올리고, OpenAI TTS처럼 호출되는지 확인했습니다.
- 모델과 Python 가상환경을 합쳐 약 551MB였습니다. 외장 SSD에 따로 보관해도 부담이 크지 않은 크기입니다.
/health,/v1/models,/v1/audio/speech응답을 확인했고,wav,mp3,opus출력까지 만들었습니다.- 짧은 한국어 문장 26자 기준으로 생성 시간은 약 1.1~2.3초 사이였습니다. 다만 이 값은 최종 벤치마크가 아니라 제 환경에서의 1차 확인값입니다.
- 라이선스, 목소리별 품질, 긴 대본 안정성은 아직 공개 운영 전에 따로 봐야 합니다.
이 글은 “Supertonic이 최고다”라는 비교 리뷰가 아닙니다. 제가 확인하고 싶었던 건 더 좁았습니다. 기존 OpenAI TTS 호출 코드를 얼마나 덜 고치고, 로컬 TTS로 바꿔 끼울 수 있는가. 그 한 가지를 M4 Mac mini에서 먼저 확인했습니다.
확인 범위
| 항목 | 이번에 확인한 값 |
|---|---|
| 측정 기준일 | 2026-05-29 |
| 최종 문장 검토 | 2026-05-31 |
| 하드웨어 | M4 Mac mini 16GB |
| 운영체제 | macOS, 세부 버전은 원본 실행 로그에 따로 남기지 못함 |
| 모델 | Supertone/supertonic-3 |
| 프록시 실행 포트 | 127.0.0.1:8789 |
| 테스트 문장 | 안녕하세요. 슈퍼토닉 로컬 TTS 테스트입니다. |
| 테스트 문장 길이 | 26자 |
| 출력 포맷 | wav, mp3, opus |
위 표에서 일부러 빈칸처럼 보이는 부분도 남겼습니다. 특히 macOS 세부 버전, 콜드 스타트와 웜 실행의 분리 측정, 목소리별 청취 평가는 이번 글에서 충분히 확인하지 못했습니다. 이런 항목을 숨기면 글은 깔끔해지지만, 나중에 제가 다시 따라 할 때 오히려 덜 믿을 수 있는 기록이 됩니다.
왜 이 실험을 했나
OpenAI TTS는 편합니다. Python SDK도 익숙하고, 기존 코드도 대부분 OpenAI API 모양에 맞춰져 있습니다. 문제는 매번 외부 호출이 필요하고, 호출량이 늘면 비용과 네트워크 의존성이 같이 따라온다는 점입니다.
그래서 처음부터 “로컬 TTS를 새로 설계하자”로 가지 않았습니다. 목표를 더 작게 잡았습니다.
OpenAI 호환 프록시를 세워서
base_url만 바꾸면, 기존 코드가 거의 그대로 움직일까?
Supertonic은 이 질문을 확인하기에 좋았습니다. 모델 용량도 크지 않았고, /v1/audio/speech 형태로 호출할 수 있어서 기존 OpenAI TTS 코드와 맞춰 보기 쉬웠습니다.
출처와 원본 메모
이 글은 2026-05-17에 정리해둔 위키 메모와 2026-05-29 재실행 로그를 바탕으로 다시 썼습니다.
- 위키 메모:
Supertonic OpenAI TTS Proxy Local Usage(hermes 카테고리) - 관련 raw 메모: 설치 스크립트, 의존성, GitHub 메타,
supertonic-3모델 소스 메모 - 최근 실행 로그:
/health,/v1/models,/v1/audio/speech3회 호출, graceful shutdown 확인
초기 메모에는 실패 포인트도 같이 남아 있었습니다. 예를 들어 테스트 코드 쪽에 v2 모델 기대값이 남아 있어서, 프록시가 정상이어도 테스트가 엇갈릴 수 있었습니다. 이런 기록이 있어서 단순히 “한 번 실행됐다”에서 멈추지 않고, 어떤 값을 다시 확인해야 하는지 정리할 수 있었습니다.
설치는 hf download 쪽이 편했다
제가 쓴 흐름은 아래처럼 단순했습니다.
# 작업 폴더로 이동
cd <workspace>/supertonic-openai-tts-proxy
# 의존성 설치
uv sync
# 모델 내려받기(macOS에서 확인한 방식)
uv run hf download Supertone/supertonic-3 \
--local-dir .models/supertonic-3 \
--exclude '.git/*'
macOS에서는 scripts/download-v3-models.sh를 그대로 실행했을 때 Linux 기준 분기가 끼어드는 느낌이 있었습니다. 그래서 이 글에서는 hf download 명령을 기준으로 적었습니다. 다시 설치할 때도 이쪽이 덜 헷갈립니다.
용량은 아래 정도였습니다.
| 항목 | 실측 크기 |
|---|---|
.models/supertonic-3 | 약 385MB |
.venv | 약 166MB |
| 합계 | 약 551MB |
제 기준에서는 이 크기가 중요했습니다. 로컬 모델을 이것저것 테스트하다 보면 외장 SSD로 빼고 싶은 순간이 오는데, 551MB면 백업과 이동이 크게 부담스럽지 않습니다.
서버 실행과 기본 응답
실행은 모델 경로와 포트만 명시했습니다.
SUPERTONIC_MODEL_DIR="$PWD/.models/supertonic-3" \
HOST=127.0.0.1 \
PORT=8789 \
bash scripts/run-dev.sh
기동 후에는 먼저 두 개만 봤습니다.
curl http://127.0.0.1:8789/health
curl http://127.0.0.1:8789/v1/models
확인한 응답은 아래 형태였습니다.
{"status":"ok"}
{"object":"list","data":[{"id":"supertonic-3","object":"model","owned_by":"local"}]}
실행 로그에서 확인한 표식은 다음과 같습니다.
Application startup complete/health200/v1/models200/v1/audio/speech200, 총 3건Shutting down이후 graceful 종료
VIRTUAL_ENV 경고는 보였지만, 요청 처리 자체는 막히지 않았습니다. 운영용으로 묶는다면 이 경고를 그냥 넘기기보다 실행 스크립트 기준으로 한 번 정리하는 편이 낫겠습니다.
음성 생성 테스트
짧은 한국어 문장 하나로 wav, mp3, opus를 각각 만들었습니다.
TIMEFORMAT='elapsed=%3R'; time curl -sS -o /tmp/supertonic-test.wav \
-X POST http://127.0.0.1:8789/v1/audio/speech \
-H 'Content-Type: application/json' \
-d '{"model":"supertonic-3","voice":"F1","input":"안녕하세요. 슈퍼토닉 로컬 TTS 테스트입니다.","response_format":"wav"}'
TIMEFORMAT='elapsed=%3R'; time curl -sS -o /tmp/supertonic-test.mp3 \
-X POST http://127.0.0.1:8789/v1/audio/speech \
-H 'Content-Type: application/json' \
-d '{"model":"supertonic-3","voice":"F1","input":"안녕하세요. 슈퍼토닉 로컬 TTS 테스트입니다.","response_format":"mp3"}'
TIMEFORMAT='elapsed=%3R'; time curl -sS -o /tmp/supertonic-test.opus \
-X POST http://127.0.0.1:8789/v1/audio/speech \
-H 'Content-Type: application/json' \
-d '{"model":"supertonic-3","voice":"F1","input":"안녕하세요. 슈퍼토닉 로컬 TTS 테스트입니다.","response_format":"opus"}'
결과는 아래와 같았습니다.
| 포맷 | 생성 시간 |
|---|---|
wav | 약 2.277초 |
mp3 | 약 1.353초 |
opus | 약 1.078초 |
이 카드는 한 문장, 한 목소리 기준 측정 흐름을 정리한 것입니다. 포맷별 품질까지 이 카드만으로 단정하지 않습니다.
다음번에 다시 잰다면 최소한 아래를 나눠서 봐야 합니다.
- 첫 호출과 두 번째 호출의 차이
- 짧은 문장, 긴 문단, 숫자와 영어가 섞인 문장
F1,F3,F5,M1,M3,M5같은 목소리별 차이total_steps3/6/10 품질 차이
호출 흐름을 그림으로 다시 봤다
이 글을 공개로 돌리기 전에, 호출 흐름을 한 장짜리 카드로 다시 정리했습니다. 실제 계정 화면이나 private 경로를 캡처하지 않고, 공개해도 되는 구성만 남겼습니다.
이 그림은 실제 비밀값이나 계정 정보를 담지 않은 공개용 다이어그램입니다. 이번 글에서 확인한 핵심은 “기존 OpenAI SDK 호출 모양을 로컬 프록시에 맞출 수 있는가”였습니다.
측정값도 따로 카드로 남겼습니다. 숫자를 더 크게 보이게 하려는 목적은 아닙니다. 나중에 같은 문장으로 다시 재면, 어느 정도 차이가 나는지 비교하기 쉽게 하려는 기록입니다.
한 문장, 한 목소리 기준입니다. 이 값만으로 포맷별 품질이나 상용 TTS 대비 우열을 말하지 않습니다.
OpenAI SDK 쪽은 거의 그대로 맞았다
기존 Python 코드와 맞춰 보는 부분은 꽤 수월했습니다.
from openai import OpenAI
from pathlib import Path
client = OpenAI(
api_key="dummy",
base_url="http://127.0.0.1:8789/v1",
)
out = Path("test.mp3")
response = client.audio.speech.create(
model="supertonic-3",
voice="F1",
input="오픈AI 파이썬 SDK 호환 테스트입니다.",
response_format="mp3",
speed=1.2,
)
response.stream_to_file(out)
api_key는 SDK 형식상 값이 필요해서 dummy를 넣었습니다. 실제 인증이 필요한 값은 아니었습니다. 이 점은 로컬 실험에서는 편하지만, 운영 설정 파일로 옮길 때는 오히려 헷갈릴 수 있습니다. 진짜 비밀키가 아닌 값이라는 표시를 분명히 해두는 편이 안전합니다.
좋았던 점과 아직 찝찝한 점
좋았던 점은 분명합니다.
- 기존 OpenAI SDK 호출 흐름을 크게 바꾸지 않아도 됩니다.
- 모델과 가상환경 크기가 작아서 로컬 보관 부담이 낮습니다.
wav,mp3,opus를 모두 만들 수 있었습니다.- 네트워크 호출 없이 음성 생성 경로를 만들 수 있습니다. 단, 모델 다운로드는 미리 끝났다는 전제입니다.
아직 찝찝한 점도 있습니다.
- 첫 실행 로딩 비용을 분리해서 재지 못했습니다.
- 목소리별 품질 차이를 충분히 듣지 않았습니다.
- 긴 대본, 숫자, 영어 혼합 문장에서 끊김이나 발음 문제가 있는지 아직 모릅니다.
- 공개 서비스나 상업 사용 전에 라이선스 조건을 따로 확인해야 합니다.
- Hermes 같은 실제 에이전트 경로에 붙이려면 토큰, 경로, 실패 시 롤백 기준을 별도로 잡아야 합니다.
제 기준의 체크리스트
다시 이 실험을 반복한다면 아래 순서로 보겠습니다.
- 레포를 받은 뒤
uv sync까지 통과하는지 확인한다. - macOS에서는
hf download로 모델을 내려받는다. SUPERTONIC_MODEL_DIR,HOST,PORT를 명시하고 서버를 띄운다./health와/v1/models가 200을 주는지 본다.wav,mp3,opus를 각각 생성한다.- 생성된 파일의 길이, 크기, 생성 시간을 같이 남긴다.
- OpenAI Python SDK에서
base_url만 바꿔 호출한다. - 긴 문장과 목소리별 테스트는 별도 표로 분리한다.
- 공개 운영 전 라이선스와 장애 처리 기준을 확인한다.
ffmpeg가 있으면 파일 길이와 코덱 정보를 같이 남기기 좋습니다. 이번 글에는 길이와 시간까지만 정리했고, 파일 크기와 샘플레이트는 다음 측정 때 보강할 항목으로 남겨둡니다.
참고한 공식 문서
이번 글에서 핵심 사실을 확인할 때는 아래 공식/1차 출처를 기준으로 봤습니다.
- Hugging Face — Supertone/supertonic-3 모델 페이지
- Hugging Face CLI download 문서
- OpenAI API reference — Audio speech
- OpenAI Python SDK
여기서 공식 출처가 해결해주는 것은 “어떤 API 모양과 모델 소스를 참고했는가”입니다. 반대로 생성 시간, macOS에서 편했던 설치 방식, VIRTUAL_ENV 경고 같은 운영 판단은 제 로컬 실행 기록입니다. 둘을 섞지 않으려고 글 안에서도 출처와 판단을 나눴습니다.
같이 보면 좋은 글
FAQ
Q. 기존 OpenAI TTS 코드를 거의 그대로 쓸 수 있나요?
A. 이번 확인 범위에서는 base_url을 로컬 주소로 바꾸고 model을 supertonic-3으로 맞추면 호출이 됐습니다. 다만 모든 OpenAI TTS 옵션이 완전히 같다고 말할 수는 없습니다. 운영에 넣기 전에는 실제로 쓰는 옵션만 다시 테스트해야 합니다.
Q. 인터넷 없이도 계속 쓸 수 있나요?
A. 모델 다운로드와 의존성 설치가 끝난 뒤에는 로컬 생성 경로를 만들 수 있습니다. 다만 처음 준비 단계에서는 모델을 받아야 하고, 운영 중에도 업데이트나 재설치를 생각하면 완전한 독립 환경이라고까지 말하긴 어렵습니다.
Q. 제일 먼저 확인할 리스크는 뭔가요?
A. 저는 세 가지를 먼저 보겠습니다. 라이선스, 긴 대본 안정성, 장애 처리입니다. 특히 공개 서비스나 상업 사용으로 넘어간다면 “돌아간다”보다 “써도 되는가”와 “실패했을 때 어떻게 멈추는가”가 더 중요합니다.
기준일: 2026-05-29 | 최종 검토: 2026-05-31 | 확인 환경: M4 Mac mini 16GB, macOS, Supertonic v3 | 출처: Supertonic 로컬 TTS 위키 실전 기록 + 재실행 로그