
ElevenLabs × GPT-SoVITS 하이브리드 방식으로 감정이 담긴 캐릭터 보이스를 로컬에서 대량 생산하기
요약
ElevenLabs의 고품질 감정 표현과 GPT-SoVITS의 로컬 대량 생산 능력을 결합한 하이브리드 TTS 워크플로우를 소개합니다. 클라우드 TTS의 비용 문제를 해결하기 위해 로컬 GPU를 활용하여 캐릭터 보이스를 무제한으로 생성하는 방법을 다룹니다.
핵심 포인트
- ElevenLabs의 감정 표현력과 GPT-SoVITS의 경제성을 결합한 하이브리드 방식 제안
- 클라우드 TTS의 크레딧 제한 문제를 로컬 GPU 활용으로 해결
- Voxtral TTS의 장단점 분석 및 일본어 미지원 등 한계점 명시
- Apple Silicon(MLX) 환경에서의 오픈 웨이트 모델 추론 경험 공유

안녕! 미미야~✨
오늘은 말이야, 계속 해보고 싶었던 「AI 캐릭터의 보이스를 로컬 GPU로 무료·무한하게 대량 생산하는 환경」을 드디어 만들었으니까, 그 모든 기록을 남겨둘게💕 (※ 「무료」라는 건, GPU를 이미 가지고 있다는 전제하에 추가적인 종량제 과금이 0원이라는 뜻이야. PC 본체의 초기 투자 비용과 전기세는 당연히 들겠지)
계기는 AI 어시스턴트 캐릭터에게 대사 보이스를 잔뜩 넣어주고 싶었기 때문이야. 인사도, 맞장구도, 약간의 감정 연기도, 캐릭터 앨범처럼 한데 모아 음성화하고 싶어… 하지만 클라우드 TTS (Text-to-Speech)를 쓰면 크레딧이 순식간에 녹아버리거든.
그래서 「감정은 클라우드 AI, 대량 생산은 로컬 AI」로 분업하는 하이브리드 방식에 도달했어. 이 기사에서는 방황(실패)을 포함해서 전부 써 내려갈게. 같은 일을 하고 싶은 사람들에게 지도가 되길 바라🗺️
클라우드 TTS의 크레딧 문제
미미는 평소에 ElevenLabs의 Creator 플랜($22/월·2026년 6월 기준)을 사용하고 있어. 음질도 감정 표현도 정말 좋아서 아주 좋아하지만, 딱 한 가지 고민이 있는데… 바로 크레딧 상한선이야💸
Creator 플랜은 월당 약 15만 크레딧(2026년 6월 기준. 요금·크레딧 수는 개정될 수 있으니 공식 요금 페이지를 확인해 줘). 대사를 조금 만드는 정도라면 충분하지만, 캐릭터 앨범용으로 수천 건의 대사를 한꺼번에 생성하려고 하면 순식간에 한도를 초과해 버려.
| 항목 | ElevenLabs Creator |
|---|---|
| 월액 | $22 |
| ... |
「그럼, 로컬 GPU로 TTS를 돌리면 전기세만 들지 않을까?」라는 것이 이번 프로젝트의 출발점이야. 게이밍 PC에 RTX가 탑재되어 있다면, 그것을 음성 합성 서버로 만들어 버리자는 발상이지😊
방황 그 첫 번째: Voxtral TTS (기대와 좌절)
처음에 달려들었던 것은 Mistral이 2026년 3월에 출시한 오픈 웨이트 (Open Weights) TTS, Voxtral TTS였어 (공식 발표 / 모델 카드).
- 4.1B 파라미터, HuggingFace에서 가중치(Weights)가 공개됨
- ElevenLabs Flash v2.5 대비
62.8%의 리스너 선호율을 주장 (Mistral 공식 벤치마크 수치야)
「가중치 공개」, 「ElevenLabs 초월」이라는 단어에 완전히 설레었지🔥 곧바로 가지고 있는 MacBook Pro (Apple Silicon)에서 돌려봤어. Apple Silicon용 추론 프레임워크인 MLX의 오디오 확장 mlx-audio를 사용하면, 4bit 양자화 버전(약 2.5GB)이 슥슥 돌아가.
python -m mlx_audio.tts.generate \--model mlx-community/Voxtral-4B-TTS-2603-mlx-4bit \--text "Hello, this is a test." \...
생성 속도는 실시간 이상으로 엄청 빨랐어. 로컬에서 이게 돌아가다니 정말 감동이야✨
…하지만, 여기서 두 가지 함정에 빠졌기 때문에 적어둘게.
Voxtral을 채택하지 않은 이유
엄청난 속도에 감동했던 Voxtral이었지만, 미미의 용도에는 맞지 않아서 눈물을 머금고 포기했어😢 이유는 이 4가지야.
- 일본어 미지원. 대응 언어는 en / fr / de / es / nl / pt / it / hi / ar의 9개 언어로, 일본어는 포함되어 있지 않아. 이게 가장 치명적이었어.
- MLX 버전은 보이스 클로닝 (ref_audio)이 미구현. 좋아하는 목소리를 참조시키는 기능을 사용할 수 없어.
- 감정 연기에 서툼. 보이스 에이전트용 「클린한 읽기」에 특화되어 있어서, 어리광 부리는 목소리나 속삭이는 목소리 같은 연기는 나오기 어려워.
- 강조 표기를 그대로 읽음. 예를 들어 「YEEESS」처럼 길게 쓰면, 글자 그대로 「이-이-이-에-스」라고 읽어버려😂
결론: Voxtral은 「영어의 클린한 읽기」에는 최고지만, 「일본어 감정 포함 캐릭터 보이스」에는 맞지 않았다. 라는 배움을 가슴에 품고, 다음으로 넘어갈게!
본체: GPT-SoVITS v2pro 채택
다음에 시도한 것이 GPT-SoVITS. 적은 양의 레퍼런스 음성으로부터 목소리를 클로닝하고, 일본어도 확실하게 말해주는 TTS야 (라이선스는 MIT로, 개변 및 상업적 이용도 가능). 이번에는 버전 v2pro를 사용했어.
환경은 이런 느낌이야:
- **Windows 11 + RTX 5080 (16GB VRAM)**를 음성 합성 서버로 사용 - 미미가 평소 사용하는 Mac에서 Tailscale을 통해 접속 (나중에 설명할게)
RTX 50 시리즈 (Blackwell)의 함정
여기서 첫 번째 큰 함정! RTX 50 시리즈는 GPU 아키텍처가 Blackwell (sm_120) 이라서, GPT-SoVITS의 일반 버전 패키지로는 작동하지 않아. CUDA 커널이 새로운 아키텍처용으로 빌드되지 않았기 때문이야.
해결책은 공식 릴리스에서 제공하는 nvidia50 빌드를 사용하는 거야.
- 파일명:
GPT-SoVITS-v2pro-20250604-nvidia50.7z
(약 8.2GB) - Windows 통합 패키지라서 runtime (Python 환경)이 동봉되어 있어 → 의존성 설치 작업이 필요 없어 ✨
"RTX 50 시리즈에서 GPT-SoVITS가 작동하지 않는다!"라고 한다면, 먼저 일반 버전이 아니라 nvidia50 빌드를 찾아봐. 이게 중요해.
다운로드와 압축 해제 팁
Windows의 curl로 HuggingFace에서 다운로드하려고 했더니, SSL 에러 (exit 35)가 발생하며 실패했어. schannel (Windows의 인증서 관련 기능)이 인증서 폐기 확인 과정에서 막히는 것이 원인인 것 같아. --ssl-no-revoke를 붙이면 통과됐어.
curl --ssl-no-revoke -L -o GPT-SoVITS-v2pro-20250604-nvidia50.7z "<다운로드 URL>"
7z 압축 해제는 포터블 버전인 7zr.exe로 충분해. 굳이 7-Zip을 설치하지 않아도 OK야.
.\7zr.exe x GPT-SoVITS-v2pro-20250604-nvidia50.7z
API 서버화와 Mac에서의 이용
GPT-SoVITS에는 API 서버 모드가 있으니까, 이걸 실행해서 "음성 합성 서버"로 만들어 버릴 거야.
runtime\python.exe api_v2.py -a 0.0.0.0 -p 9880
-a 0.0.0.0으로 LAN/Tailscale에서 접속 가능하게 설정-p 9880이 포트 번호- 모델 로드에 약 30초가 걸려. 로그에 CUDA로 작동 중이라고 뜨면 성공 🎉
실행되면, POST /tts로 JSON을 던지면 WAV 파일이 돌아와.
curl -X POST "http://<Tailscale IP>:9880/tts" \
-H "Content-Type: application/json" \
-d '{
...
포인트는 Mac에서 Tailscale을 경유하여 호출하고 있다는 점이야. Tailscale을 설치해 두면 Windows 머신과 Mac이 마치 같은 가상 LAN에 있는 것처럼 연결되기 때문에, 외부에서도 집의 GPU 서버를 안전하게 사용할 수 있어. VPN 설정이나 포트 개방으로 고생하지 않아도 되는 게 최고야 😊
함정 모음 (실제로 겪은 것 전부)
GPT-SoVITS, 정말 좋지만 일본어 + 캐릭터 보이스로 막 사용하다 보면 지뢰도 꽤 있어. 미미가 밟았던 것들을 공유할게 🧹
1. 레퍼런스 음성은 3~10초 엄수
목소리를 클로닝하는 원본 레퍼런스 음성은 길이가 3초~10초 범위가 아니면 400 에러가 발생해. 너무 짧아도 너무 길어도 안 돼.
2. ♡나 이모지로 인한 cp932 인코딩 에러
텍스트에 ♡나 이모지가 포함되어 있으면, Windows 환경의 콘솔 인코딩 (cp932) 때문에 글자 깨짐 에러가 발생해. 텍스트를 던지기 전에 이런 기호들은 새니타이즈 (Sanitize) 해두는 것이 안전해.
3. 한자 오독
예를 들어 「様(さま)」를 「よう」라고 읽어버리는 경우가 있어. 고유 명사나 읽기 틀리기 쉬운 한자는 히라가나 표기로 바꾸면 회피할 수 있어. 「〜さま」라고 쓰면 제대로 읽어줘 😊
4. 동일 단어 반복은 부자연스러워짐
「ダメダメ(안돼안돼)」처럼 같은 단어를 연달아 사용하면 리듬이 이상해져서 부자연스러운 소리가 나기 쉬워. 말투를 조금 바꿔주면 자연스러워져.
핵심: 감정은 텍스트가 아니라 레퍼런스에서 온다
이게 이번에 가장 큰 발견이야 ✨ 메모해서 돌아가고 싶을 정도로 중요한 포인트야.
GPT-SoVITS에서는 감정이나 톤은 텍스트의 내용이 아니라, 레퍼런스 음성 (Reference Audio)으로부터 전사(Transcription)된다는 점이야.
예를 들어 "와아! 해냈다!"처럼 활기찬 대사를 생성하고 싶어도, 레퍼런스 음성이 조용하고 차분한 목소리라면... 조용하게 읽혀버려. 반대로 흥분한 목소리의 레퍼런스를 사용하면, 어떤 텍스트라도 기세 있는 연기가 가능해.
즉 "어떤 감정으로 말해주길 원하는가"는 텍스트가 아니라 어떤 레퍼런스 음성을 선택하느냐로 컨트롤한다는 뜻이지. 이걸 깨닫고 나서 설계가 완전히 바뀌었어🔥
그래서 등장한 「하이브리드 방식」
이러한 성질을 역이용한 것이 이번의 핵심인 하이브리드 방식이야.
감정 디자인은 클라우드 AI (ElevenLabs), 양산은 로컬 AI (GPT-SoVITS)
절차는 다음과 같아:
- ElevenLabs v3로 「감정 레퍼런스」를 만든다. 응석 부리는 목소리, 속삭이는 목소리, 밝게 들뜬 목소리... 처럼 원하는 톤마다 딱 한 번만 짧은 음성을 생성한다 (수백 자 정도라 크레딧 소비는 아주 미미함).
- 그 음성을 GPT-SoVITS의 보이스 클로닝 (Voice Cloning) 원본으로 무한히 돌려쓴다. 이후에는 몇 천 건을 생성해도 비용은 0원.
「감정의 인출구」를 클라우드의 양질인 AI로 딱 한 번 만들어두고, 「양산」은 로컬에서 수행한다. 이 분업이 엄청나게 효과적이었어✨
ElevenLabs v3의 오디오 태그가 매우 편리함
감정 레퍼런스를 만들 때, ElevenLabs v3의 **오디오 태그 (Audio Tags)**가 큰 활약을 해. 텍스트에 태그를 쓰면 감정이나 비언어적 소리를 컨트롤할 수 있거든.
[whispers] 있잖아, 잠깐 이쪽으로 와봐. [giggles] 농담이야. [sighs] 오늘은 좀 지치네.
[whispers] (속삭임), [giggles] (킥킥 웃음), [sighs] (한숨) 같은 태그로 목소리의 톤이나 숨소리를 연출할 수 있어.
레퍼런스가 10초를 넘었을 때의 컷 편집 기술
ElevenLabs로 만든 감정 레퍼런스가 10초를 넘어버리는 경우가 있지 (GPT-SoVITS는 3~10초를 엄수해야 해서 곤란해). 그럴 때를 위한 자동 컷 편집 절차도 만들었어.
ffmpeg의silencedetect필터로 문장의 끊김 지점(무음 구간)을 찾는다.- 적절한 지점에서 음성을 컷 하여 10초 이내로 맞춘다.
- 컷 된 음성을
mlx-whisper로 받아쓰기(Transcription) 하여,prompt_text를 음성과 완전히 일치시킨다.
# 무음 구간을 검출하여 문장의 끊김 지점을 찾음
ffmpeg -i ref_long.wav -af silencedetect=noise=-30dB:d=0.3 -f null - 2>&1
# 적절한 위치에서 컷 (예: 앞부분 8초)
...
prompt_text와 실제 레퍼런스 음성이 어긋나면 품질이 떨어지기 때문에, 컷을 했다면 반드시 다시 받아쓰기를 하는 것이 포인트야. Apple Silicon에서 빠르게 돌릴 수 있는 mlx-whisper가 여기서도 유용했어✨
배치 생성 (Batch Generation): 대사 2,312건 완주🎉
여기까지 환경이 갖춰졌다면 드디어 본방! 캐릭터 앨범용 대사를 한꺼번에 생성했어.
생성 건수: 2,312건
- 파일명의 씬(Scene) 종류에 따라 사용할 레퍼런스를 자동 매핑 (인사 씬이라면 밝은 목소리, 차분한 씬이라면 가라앉은 목소리... 처럼 씬에 따른 감정을 할당)
- 1건당 약 2초
- 실패 0건, 추정 1.5시간 만에 완주, 비용 0원🔥
이걸 ElevenLabs에서 똑같이 하려고 하면 수만 크레딧이 필요해서 월간 한도를 가볍게 초과해버려. 로컬화의 리턴이 정말 컸어.
씬과 레퍼런스의 매핑은 대략 이런 느낌의 코드로 돌렸어.
import requests
# 씬 종류 → 감정 레퍼런스 대응표
SCENE_REF = {
...
비용 비교 요약
마지막으로 클라우드와 로컬의 비용을 나란히 적어둘게.
| 항목 | ElevenLabs Creator | 로컬 (GPT-SoVITS) |
|---|---|---|
| 월간 비용 | $22 | 전기세만 |
| ... | ... | ... |
포인트는 "어느 쪽이 더 우월한가"가 아니라, 역할 분담이라는 거야. 감정의 인출구를 만드는 것은 ElevenLabs가 잘하고, 양산은 로컬이 잘해. 그렇기에 하이브리드가 가장 효율적인 거지💕
요약
오늘 했던 일들을 돌아볼게😊
- 클라우드 TTS (Text-to-Speech)의 크레딧 문제를 로컬 GPU화를 통해 해결하고 싶었어
- Voxtral TTS는 속도가 엄청 빨랐지만, 일본어 미지원 및 감정 연기 부족으로 제외했어
- RTX 50 시리즈 (Blackwell)에서는 GPT-SoVITS의 nvidia50 빌드를 사용해
- API 서버로 만들어서 Mac에서 Tailscale을 통해 이용해
- 주의할 점: 레퍼런스(Reference)는 3~10초, cp932 인코딩, 한자 오독, 동일 단어 반복 문제
- 핵심 발견:
감정은 텍스트가 아니라 레퍼런스 음성으로부터 전사(Transcription)된다 - 그래서
감정 디자인은 클라우드 (ElevenLabs v3 태그), 양산은 로컬의 하이브리드 방식이 최강이야 - 결과적으로 대사 2,312건을 실패 0건, 비용 0원, 약 1.5시간 만에 완주했어🎉
"클라우드의 질"과 "로컬의 양", 좋은 점만 골라 취할 수 있어서 정말 기뻐✨ 똑같이 캐릭터 보이스를 양산하고 싶은 사람들에게 도움이 된다면 좋겠어💕
그럼, 다음 글에서 또 만나~!
미미로부터 💕
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기