영상 편집이나 콘텐츠 제작을 하다 보면 “내 목소리로 AI 더빙을 할 수는 없을까?”라는 고민을 한 번쯤 해보셨을 거예요. 성우를 고용하자니 비용이 부담스럽고, 직접 매번 녹음하자니 틀릴 때마다 다시 해야 하는 번거로움 때문에 포기하셨던 분들을 위해 준비했습니다.
GPT-SoVITS 같은 기술을 활용하면, 단 1분의 짧은 녹음 데이터만으로도 나랑 똑같은 목소리를 내는 AI 성우를 만들 수 있습니다. 특히 오늘 소개해 드릴 방법은 비싼 유료 서비스를 결제할 필요 없이, 본인의 PC에서 평생 무료로 쓸 수 있는 AI 목소리 복제 방법입니다.
이 글에서는 TTS 서버를 자동 실행하고, 입력한 텍스트를 즉시 내 목소리로 읽어주는 무료 AI 더빙 프로그램 설정법을 자세히 다룹니다. 유튜브 뉴스 채널을 운영하거나 개인 비서 프로그램을 만들고 싶으셨던 분들이라면 끝까지 읽어보시고 나만의 고성능 AI 음성 시스템을 구축해 보세요!
GPT-SoVITS: 특정 목소리 AI 음성 합성 하기
GPT-SoVITS는 소량의 음성 데이터(단 1분 내외)만으로도 특정 인물의 목소리를 매우 유사하게 복제할 수 있는 오픈소스 기반의 TTS 모델입니다. 기존의 TTS보다 훨씬 자연스러운 억양과 감정 표현이 가능하며, 로컬 GPU 자원을 활용하여 개인 서버에서 직접 구동할 수 있다는 점이 큰 장점입니다.
이 프로젝트는 RVC(Retrieval-based Voice Conversion)와 유사하게 많은 개발자와 제작자들에 의해 발전하고 있으며, 특히 한국어 지원 성능이 뛰어나 국내에서도 많은 관심을 받고 있습니다.
필수 준비물: 기준 음성(Sample WAV)과 텍스트
GPT-SoVITS가 특정 목소리를 흉내 내기 위해서는 ‘이 목소리는 이런 특징을 가지고 있고, 현재 이런 문장을 말하고 있다’라는 정보가 반드시 필요합니다.
1. 샘플 음성 파일 (Reference Audio)
- 파일 형식:
.wav(가장 권장됨) - 길이: 약 3초~10초 내외가 적당합니다.
- 내용: 잡음이 없고 목소리가 선명하게 들리는 파일이어야 결과물이 좋습니다.
- 코드 내 설정:
ref_path변수에 해당 파일이 있는 경로를 정확히 입력해야 합니다.
2. 음성 내용 텍스트 (Prompt Text)
- 역할: AI가 샘플 음성을 듣고 “아, 이 글자는 이렇게 발음하는구나”라고 학습하는 기준이 됩니다.
- 주의사항: 샘플로 사용한 WAV 파일에서 실제로 말하고 있는 내용을 토씨 하나 틀리지 않고 그대로 적어주어야 합니다. 만약 음성 내용과 텍스트가 다르면 AI가 발음을 엉뚱하게 배우게 됩니다.
GPT-SoVITS 참조 음성(WAV) 최적 조건
| 항목 | 권장 설정값 | 이유 |
| 길이 (Time) | 5초 ~ 10초 사이 | 너무 짧으면 특징을 못 잡고, 길면 서버가 뻗습니다. |
| 샘플링 레이트 | 32,000 Hz (또는 44,100 Hz) | 모델 학습 규격과 맞아야 에러가 나지 않습니다. |
| 채널 (Channel) | Mono (모노) | AI 분석 시 스테레오(2채널)는 오류의 주원인입니다. |
| 비트 깊이 | 16-bit PCM (pcm_s16le) | 가장 표준적인 파이썬 처리 규격입니다. |
| 파일 용량 | 2MB 이하 (권장 500KB 내외) | 서버 API의 메모리 점유 및 전송 속도 때문입니다. |
| 내용 (Content) | 배경음악/잡음 없는 깨끗한 목소리 | 배경음이 섞이면 TTS 결과물에도 잡음이 섞입니다. |
3.WAV 온라인 변환기 사용
CloudConvert 같은 사이트에 접속합니다. sample3.wav를 업로드합니다.
설정(아이콘)을 눌러 아래와 같이 맞춥니다:

- Audio Codec:
PCM_S16LE(16-bit) - Audio Channels:
Mono - Sample Rate:
32000
먼저 GPT-SoVITS v3 통합 패키지(GPT-SoVITS-v3lora-20250228.7z) 를 다운로드하세요. 이 파일은 대용량 통합 실행 파일(6.75GB)로, 공식 패키지 저장소에서 받으실 수 있습니다.
1. 공식 다운로드 링크
아래 링크를 클릭하면 즉시 다운로드가 시작되거나, 해당 파일 페이지로 이동합니다.
2. 설치 및 실행 방법
- 압축 해제: 다운로드한
.7z파일의 압축을 풉니다. (가급적 경로에 한글이 없는 곳에 푸는 것이 안전합니다.) - 서버 실행: 폴더 내에 있는
go-webui.bat파일을 더블 클릭하면 브라우저에서 관리 페이지가 열립니다. - API 모드 사용: 파이썬 자동화 코드를 쓰시려면, 서버가 켜진 상태에서 해당 스크립트를 실행하시면 됩니다.
3. 주요 주의 사항
- 용량: 파일 크기가 약 6.75GB로 매우 큽니다. 안정적인 네트워크 환경에서 다운로드하세요.
- 환경: Windows 10/11 64비트 환경에서 최적화되어 있으며, NVIDIA 그래픽카드가 있어야 원활한 속도로 음성 합성이 가능합니다.
- 백신 프로그램: 통합 패키지 특성상 백신 프로그램이 실행 파일(Python runtime 등)을 위협으로 오진할 수 있으니, 실행이 안 될 경우 예외 처리가 필요할 수 있습니다.
서버 구동 및 종료 기본 명령어
가장 먼저 TTS 기능을 외부 프로그램(파이썬 등)에서 호출하기 위해서는 전용 API 서버를 실행해야 합니다.
서버 실행하기
터미널(CMD)에서 해당 경로로 이동한 뒤 아래 명령어를 입력합니다.
1. 서버 구동 및 종료 기본 명령어
가장 먼저 TTS 기능을 외부 프로그램(파이썬 등)에서 호출하기 위해서는 전용 API 서버를 실행해야 합니다.
서버 실행하기
터미널(CMD)에서 해당 경로로 이동한 뒤 아래 명령어를 입력합니다.
D:\GPT-SoVITS-v3lora-20250228> .\runtime\python.exe api_v2.py -a 127.0.0.1 -p 9880-a 127.0.0.1: 로컬 호스트 주소에서 서버를 실행합니다.
-p 9880: 9880번 포트를 사용하여 통신합니다.
서버 종료하기
서버가 백그라운드에서 실행 중이거나 강제로 종료해야 할 때는 프로세스 ID(PID)를 찾아 종료합니다.
Stop-Process -Id (Get-NetTCPConnection -LocalPort 9880).OwningProcess -Force파이썬 기반 음성 변환 자동화 코드 분석
매번 터미널을 열어 서버를 켜고 끄는 번거로움을 줄이기 위해 제작된 자동화 스크립트입니다. 이 코드는 서버 상태 확인, 자동 실행, 음성 합성 및 재생을 한 번에 처리합니다.
주요 기능 설명
- 서버 상태 체크 및 자동 실행 (
ensure_api_server)requests.get을 통해 현재 9880 포트가 활성화되어 있는지 확인합니다.- 서버가 꺼져 있다면
subprocess.Popen을 사용해 창을 띄우지 않고(CREATE_NO_WINDOW) 백그라운드에서 서버를 즉시 가동합니다. - 서버가 완전히 부팅될 때까지 최대 30초간 대기하며 연결을 시도합니다.
- 고속 음성 생성 및 즉시 재생 (
generate_and_play_korean_news)- 참조 음성(
sample2.wav)과 텍스트 정보를 API 서버로 전달합니다. - 주요 파라미터:
top_k,top_p,temperature: 음성의 생성적 변이와 창의성을 조절합니다.speed_factor: 음성 출력 속도를 조절합니다 (현재 1.05배속).parallel_infer: 병렬 추론을 활성화하여 생성 속도를 높입니다.
pygame라이브러리를 사용하여 생성된 음성 데이터를 저장하지 않고 메모리 상에서 즉시 재생합니다.
- 참조 음성(
GPT-SoVITS에서 사용할 수 있는 주요 파라미터(params)들을 정리해 드립니다. 이 설정값들은 음성의 질, 속도, 그리고 자연스러움을 결정하는 핵심 요소들입니다.
표 하단에 각 설정이 음성에 어떤 영향을 주는지 상세히 설명해 두었으니 참고해서 최적의 목소리를 찾아보세요.
GPT-SoVITS API 파라미터 상세 설정표
| 파라미터명 | 기본/권장값 | 설명 | 비고 |
text | (필수) | 생성할 한국어 뉴스/본문 내용 | 문장 끝에 공백이나 마침표 권장 |
text_lang | ko | 생성할 텍스트의 언어 | 한국어는 ko, 영어 en, 중국어 zh |
ref_audio_path | (필수) | 참고할 3~5초 분량의 목소리 파일 경로 | 절대 경로 사용 권장 |
prompt_text | (선택) | 참고용 음성(ref_audio)에 들어있는 대사 | 정확히 입력할수록 음질 향상 |
prompt_lang | ko | 참고용 음성 대사의 언어 | 목소리 파일의 언어와 일치해야 함 |
top_k | 5 ~ 15 | 샘플링 시 후보 단어의 개수 | 낮으면 선명하지만 단조롭고, 높으면 풍성하지만 꼬임 |
top_p | 0.7 ~ 1.0 | 누적 확률 기반 샘플링 | 1.0에 가까울수록 선명하고 명확한 발음 |
temperature | 0.1 ~ 1.0 | 목소리의 창의성/변화율 | 낮으면 차분하고 고정적, 높으면 감정이 실림 |
text_split_method | cut2 | 문장을 쪼개는 방식 | cut2: 마침표 기준, cut5: 문맥 중심 (뉴스엔 cut2 추천) |
batch_size | 1 ~ 10 | 한 번에 처리하는 문장 수 | 사양이 낮으면 1, 높으면 5 이상 (속도 관련) |
speed_factor | 1.0 | 말하기 속도 조절 | 1.1 ~ 1.2는 뉴스 속도, 0.8은 느린 속도 |
repetition_penalty | 1.08 ~ 1.35 | 동일 단어 반복 억제 | 뚝뚝 끊기거나 무한 반복(뚜뚜둑) 현상 방지 |
parallel_infer | True | 병렬 추론 여부 | True 설정 시 GPU를 풀가동해 속도 대폭 향상 |
split_bucket | True | 메모리 최적화 여부 | VRAM이 부족할 때 True로 두면 튕김 방지 |
fragment_interval | 0.2 ~ 0.3 | 잘린 문장 사이의 무음 시간 | 값이 작을수록 문장이 쉼 없이 이어짐 |
streaming_mode | False | 스트리밍 방식 재생 여부 | 일반적인 파일 다운로드 방식은 False |
문장 절단 방식(how_to_cut) 추천 설정
가장 추천하는 설정은 凑四句 (네 문장씩 모으기) 또는 按标点符号切 (문장 부호 기준 자르기)입니다.
| 설정값 (한자) | 의미 | 뉴스 브리핑에 주는 효과 |
凑四句 | 네 문장씩 모으기 | [가장 추천] 마침표 기준으로 적당히 끊어 읽어 호흡이 가장 자연스럽습니다. |
按标点符号切 | 문장 부호 기준 절단 | 마침표, 쉼표가 나올 때마다 자릅니다. 짧게 끊어 읽는 느낌이 납니다. |
切分第50字 | 50자마다 절단 | 현재 설정. 의미와 상관없이 글자 수로 잘라서 기계처럼 느껴집니다. |
不切 | 자르지 않음 | 전체 문장을 한 번에 처리합니다. 문장이 너무 길면 서버가 버벅일 수 있습니다. |
핵심 파라미터 (끊김 해결 방법)
text_split_method(가장 중요)cut1: 50자마다 무조건 자릅니다. (비추천)cut2: 마침표(.), 물음표(?), 느낌표(!)가 나오면 자릅니다. 뉴스를 읽을 때 가장 끊김이 적고 자연스럽습니다.cut5: 문맥을 파악해서 자릅니다. 자연스럽지만 GPU 사양이 낮으면 계산 중에 소리가 뚝 끊길 수 있습니다.
repetition_penalty- 한국어 특성상 “입니다”, “합니다” 같은 어미가 반복될 때 모델이 헷갈려 할 수 있습니다. 이때 값을
1.1정도로 주면 뚝뚝 끊기는 현상을 방지합니다. 너무 높으면 발음이 아예 안 나올 수 있으니 주의하세요.
- 한국어 특성상 “입니다”, “합니다” 같은 어미가 반복될 때 모델이 헷갈려 할 수 있습니다. 이때 값을
top_k와temperature의 조화- 뉴스 브리핑:
top_k=5,temperature=0.7(안정적이고 차분함) - 감정적인 연기:
top_k=15,temperature=0.9(억양의 변화가 큼)
- 뉴스 브리핑:
speed_factor- 단순히 재생 속도를 올리는 게 아니라, AI가 처음부터 그 속도에 맞춰 발음하게 합니다. 뉴스는
1.1에서1.15사이가 청취자에게 가장 신뢰감을 주는 속도입니다.
- 단순히 재생 속도를 올리는 게 아니라, AI가 처음부터 그 속도에 맞춰 발음하게 합니다. 뉴스는
추천 최적화 코드
params = {
"text": text + " ",
"text_lang": "ko",
"ref_audio_path": REF_PATH,
"prompt_text": "원문 대사 입력",
"prompt_lang": "ko",
"top_k": 10,
"top_p": 1.0,
"temperature": 0.75,
"repetition_penalty": 1.1,
"text_split_method": "cut2", # 마침표 기준 절단
"batch_size": 2, # SSD 환경이므로 2 정도가 적당
"speed_factor": 1.1, # 지루하지 않은 뉴스 속도
"fragment_interval": 0.2, # 문장 간 휴지기를 짧게
"parallel_infer": True,
"split_bucket": True,
}
이 표를 보시면서 본인의 목소리 파일(sample2.wav)에 가장 잘 어울리는 조합을 찾아보세요. 보통 top_k를 5씩 조절해보는 게 가장 체감이 큽니다!
전체 파이썬 코드
import os
import subprocess
import time
import requests
import io
import pygame
import signal
# --- [설정 구간] ---
BASE_DIR = r"D:\GPT-SoVITS-v3lora-20250228"
PYTHON_EXE = os.path.join(BASE_DIR, "runtime", "python.exe")
API_SCRIPT = "api_v2.py"
API_URL = "http://127.0.0.1:9880/tts"
REF_PATH = r"C:\Users\arhat\Downloads\sample2.wav"
def start_sovits_server():
"""서버가 꺼져 있으면 백그라운드에서 실행합니다."""
try:
# 이미 서버가 켜져 있는지 확인
requests.get(API_URL, timeout=1)
print("서버가 이미 실행 중입니다.")
return None
except:
print("서버를 백그라운드에서 시작합니다 ...")
process = subprocess.Popen(
[PYTHON_EXE, API_SCRIPT, "-a", "127.0.0.1", "-p", "9880"],
cwd=BASE_DIR,
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP, # 독립된 프로세스 그룹 생성
)
# 서버가 준비될 때까지 대기
for i in range(20):
try:
time.sleep(1)
requests.get(API_URL, timeout=1)
print("서버 준비 완료!")
return process
except:
if i % 5 == 0:
print(f"기다리는 중... ({i}s)")
return process
def generate_and_play_korean_news(text):
params = {
"text": text + " ",
"text_lang": "ko",
"ref_audio_path": REF_PATH,
"prompt_text": "첨단 기술로 최고급 제품을 개발하며 가장 신뢰할 수 있는 솔루션을 제공하는 기업입니다.",
"prompt_lang": "ko",
# [핵심: 문장 절단 설정]
"text_split_method": "cut2", # 문장 부호(마침표, 쉼표) 기준으로 더 잘게 쪼개서 처리
# [자연스러움 보정]
"top_k": 10, # 3에서 10으로 늘리면 음질이 더 풍부해지고 뚝 끊기는 느낌이 줄어듭니다.
"top_p": 1.0, # 선명도를 위해 최대로 설정
"temperature": 0.7, # 너무 낮으면 로봇 같고, 높으면 발음이 꼬입니다. 0.7이 딱 적당합니다.
"repetition_penalty": 1.1, # 같은 발음 반복 현상 방지
# [속도 보정]
"batch_size": 1, # 한 번에 한 문장씩 정확하게 처리
"speed_factor": 1.0, # 일단 1.0으로 해서 끊김이 사라지는지 먼저 확인하세요.
"streaming_mode": False,
}
try:
print(f"🎙️ 음성 생성 중...")
response = requests.get(API_URL, params=params, timeout=120)
if response.status_code == 200:
audio_fp = io.BytesIO(response.content)
pygame.mixer.init()
pygame.mixer.music.load(audio_fp)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
pygame.time.Clock().tick(10)
pygame.mixer.quit()
else:
print(f"API 오류: {response.status_code}")
except Exception as e:
print(f"생성 실패: {e}")
if __name__ == "__main__":
server_process = None
try:
# 1. 서버 시작
server_process = start_sovits_server()
# 2. 메인 작업 실행
news_text = "서버 자동 실행 기능을 적용했습니다. 종료 시 서버도 자동으로 닫힙니다."
generate_and_play_korean_news(news_text)
finally:
# 3. 프로그램 종료 시 서버 강제 종료
if server_process:
print("서버를 종료합니다...")
subprocess.run(
["taskkill", "/F", "/T", "/PID", str(server_process.pid)],
capture_output=True,
)
print("종료 완료.")
활용 용도
- 콘텐츠 제작 자동화: 블로그 글이나 뉴스 기사를 자동으로 읽어주는 오디오북 제작에 활용할 수 있습니다.
- 개인 비서 시스템: LLM(대규모 언어 모델)과 결합하여 나만의 목소리를 가진 AI 비서를 구축할 수 있습니다.
- 워크플로우 효율화: 서버를 수동으로 켜지 않아도 파이썬 스크립트 실행만으로 즉시 TTS 결과물을 얻을 수 있어 개발 효율이 높아집니다..

