유튜브 AI 영상 더빙, 내 목소리로 AI 음성 합성 (무료 프로그램 설치법)

유튜브 AI 영상 더빙, 내 목소리로 AI 음성 합성 (무료 프로그램 설치법)

영상 편집이나 콘텐츠 제작을 하다 보면 “내 목소리로 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를 업로드합니다.

설정(아이콘)을 눌러 아래와 같이 맞춥니다:

ai 음성 변환기
  • Audio Codec: PCM_S16LE (16-bit)
  • Audio Channels: Mono
  • Sample Rate: 32000

먼저 GPT-SoVITS v3 통합 패키지(GPT-SoVITS-v3lora-20250228.7z) 를 다운로드하세요. 이 파일은 대용량 통합 실행 파일(6.75GB)로, 공식 패키지 저장소에서 받으실 수 있습니다.

1. 공식 다운로드 링크

아래 링크를 클릭하면 즉시 다운로드가 시작되거나, 해당 파일 페이지로 이동합니다.

2. 설치 및 실행 방법

  1. 압축 해제: 다운로드한 .7z 파일의 압축을 풉니다. (가급적 경로에 한글이 없는 곳에 푸는 것이 안전합니다.)
  2. 서버 실행: 폴더 내에 있는 go-webui.bat 파일을 더블 클릭하면 브라우저에서 관리 페이지가 열립니다.
  3. 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

파이썬 기반 음성 변환 자동화 코드 분석

매번 터미널을 열어 서버를 켜고 끄는 번거로움을 줄이기 위해 제작된 자동화 스크립트입니다. 이 코드는 서버 상태 확인, 자동 실행, 음성 합성 및 재생을 한 번에 처리합니다.

주요 기능 설명

  1. 서버 상태 체크 및 자동 실행 (ensure_api_server)
    • requests.get을 통해 현재 9880 포트가 활성화되어 있는지 확인합니다.
    • 서버가 꺼져 있다면 subprocess.Popen을 사용해 창을 띄우지 않고(CREATE_NO_WINDOW) 백그라운드에서 서버를 즉시 가동합니다.
    • 서버가 완전히 부팅될 때까지 최대 30초간 대기하며 연결을 시도합니다.
  2. 고속 음성 생성 및 즉시 재생 (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_langko생성할 텍스트의 언어한국어는 ko, 영어 en, 중국어 zh
ref_audio_path(필수)참고할 3~5초 분량의 목소리 파일 경로절대 경로 사용 권장
prompt_text(선택)참고용 음성(ref_audio)에 들어있는 대사정확히 입력할수록 음질 향상
prompt_langko참고용 음성 대사의 언어목소리 파일의 언어와 일치해야 함
top_k5 ~ 15샘플링 시 후보 단어의 개수낮으면 선명하지만 단조롭고, 높으면 풍성하지만 꼬임
top_p0.7 ~ 1.0누적 확률 기반 샘플링1.0에 가까울수록 선명하고 명확한 발음
temperature0.1 ~ 1.0목소리의 창의성/변화율낮으면 차분하고 고정적, 높으면 감정이 실림
text_split_methodcut2문장을 쪼개는 방식cut2: 마침표 기준, cut5: 문맥 중심 (뉴스엔 cut2 추천)
batch_size1 ~ 10한 번에 처리하는 문장 수사양이 낮으면 1, 높으면 5 이상 (속도 관련)
speed_factor1.0말하기 속도 조절1.1 ~ 1.2는 뉴스 속도, 0.8은 느린 속도
repetition_penalty1.08 ~ 1.35동일 단어 반복 억제뚝뚝 끊기거나 무한 반복(뚜뚜둑) 현상 방지
parallel_inferTrue병렬 추론 여부True 설정 시 GPU를 풀가동해 속도 대폭 향상
split_bucketTrue메모리 최적화 여부VRAM이 부족할 때 True로 두면 튕김 방지
fragment_interval0.2 ~ 0.3잘린 문장 사이의 무음 시간값이 작을수록 문장이 쉼 없이 이어짐
streaming_modeFalse스트리밍 방식 재생 여부일반적인 파일 다운로드 방식은 False

문장 절단 방식(how_to_cut) 추천 설정

가장 추천하는 설정은 凑四句 (네 문장씩 모으기) 또는 按标点符号切 (문장 부호 기준 자르기)입니다.

설정값 (한자)의미뉴스 브리핑에 주는 효과
凑四句네 문장씩 모으기[가장 추천] 마침표 기준으로 적당히 끊어 읽어 호흡이 가장 자연스럽습니다.
按标点符号切문장 부호 기준 절단마침표, 쉼표가 나올 때마다 자릅니다. 짧게 끊어 읽는 느낌이 납니다.
切分第50字50자마다 절단현재 설정. 의미와 상관없이 글자 수로 잘라서 기계처럼 느껴집니다.
不切자르지 않음전체 문장을 한 번에 처리합니다. 문장이 너무 길면 서버가 버벅일 수 있습니다.

핵심 파라미터 (끊김 해결 방법)

  1. text_split_method (가장 중요)
    • cut1: 50자마다 무조건 자릅니다. (비추천)
    • cut2: 마침표(.), 물음표(?), 느낌표(!)가 나오면 자릅니다. 뉴스를 읽을 때 가장 끊김이 적고 자연스럽습니다.
    • cut5: 문맥을 파악해서 자릅니다. 자연스럽지만 GPU 사양이 낮으면 계산 중에 소리가 뚝 끊길 수 있습니다.
  2. repetition_penalty
    • 한국어 특성상 “입니다”, “합니다” 같은 어미가 반복될 때 모델이 헷갈려 할 수 있습니다. 이때 값을 1.1 정도로 주면 뚝뚝 끊기는 현상을 방지합니다. 너무 높으면 발음이 아예 안 나올 수 있으니 주의하세요.
  3. top_ktemperature의 조화
    • 뉴스 브리핑: top_k=5, temperature=0.7 (안정적이고 차분함)
    • 감정적인 연기: top_k=15, temperature=0.9 (억양의 변화가 큼)
  4. speed_factor
    • 단순히 재생 속도를 올리는 게 아니라, AI가 처음부터 그 속도에 맞춰 발음하게 합니다. 뉴스는 1.1에서 1.15 사이가 청취자에게 가장 신뢰감을 주는 속도입니다.

추천 최적화 코드

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 결과물을 얻을 수 있어 개발 효율이 높아집니다..

댓글 남기기