내 목소리 AI 클론 만들기 — 유튜브 내레이터 자동화

F5-TTS와 RVC로 내 목소리를 학습해 텍스트만 입력하면 자동 더빙 음성 파일 출력

2026.04.13

VoiceCloneF5TTSRVCTextToSpeechFinetuning

[미검증]

📌 0. 시리즈

응용편제목난이도핵심 기술
응용 1사진 10장으로 AI 캐릭터·프로필 이미지 만들기⭐⭐⭐FLUX.1 dev · LoRA · ComfyUI
응용 2내 목소리 AI 클론 — 유튜브 내레이터 자동화⭐⭐⭐F5-TTS · Kokoro · Sesame CSM-1B
응용 3상품 이미지 1장 → 15초 광고 영상 자동 생성⭐⭐⭐⭐Wan2.2 · HunyuanVideo 1.5 · LTX-2
응용 4공장 불량 자동 검사 — NG/OK 탐지 + 로봇 좌표 추출⭐⭐~⭐⭐⭐⭐⭐YOLOv12 · OpenCV · RealSense
응용 5영상 분위기 분석 → BGM 자동 생성 & 싱크⭐⭐⭐MusicGen · AudioCraft · Stable Audio Open
응용 6주제 한 줄 입력으로 유튜브 영상 완성 — AI 콘텐츠 자동화 파이프라인⭐⭐⭐⭐LangGraph · CrewAI · AutoGen 0.4
응용 7사진 보고 글 쓰는 AI — Vision LLM 상세페이지 자동 작성⭐⭐⭐⭐Qwen2.5-VL · InternVL3 · LLaVA-Next
응용 8내 PDF 문서를 AI가 읽는다 — 사내 지식 RAG 챗봇 구축⭐⭐⭐LlamaIndex · ChromaDB · Qdrant

📌 1. 들어가며

이 포스트에서 만들 것

이 포스트를 끝까지 따라하면 내 목소리 샘플 만으로 아래 결과물을 만들 수 있습니다.

입력: 내 목소리 녹음 파일
   ↓
Zero-shot (3초) 또는 Fine-tuning (10분)
   ↓
출력:
  ├─ 텍스트 입력 → 내 목소리로 읽는 음성 파일
  ├─ 대본 전체 자동 더빙
  ├─ 감정·속도 조절된 내레이션
  └─ AI 노래 커버 (RVC 활용 시)

Zero-shot vs Fine-tuning — 언제 어떤 방식을 쓸까

구분Zero-shotFine-tuning
필요 데이터3~15초 샘플 1개5~10분 분량
준비 시간즉시 (~1분)1~3시간 학습
목소리 유사도70~80%90~95%
감정 표현보통높음
일관성생성마다 약간 다름일정하게 유지
권장 도구F5-TTSRVC / Applio
추천 상황빠른 테스트, 1회성 더빙유튜브 채널, 반복 사용

💡 결론: 유튜브 채널을 운영하거나 지속적으로 쓸 계획이라면 Fine-tuning, 단발성으로 빠르게 쓰고 싶다면 Zero-shot을 선택하세요.


📌 2. 환경 준비

2-1. 하드웨어 & 마이크 권장 사양

GPU (권장):
  Zero-shot (F5-TTS): VRAM 4GB+ (RTX 3060 이상)
  Fine-tuning (RVC):  VRAM 6GB+ (RTX 3060 Ti 이상)
  CPU만으로도 동작 가능 (단, 추론 속도 느림)

RAM: 16GB 이상

마이크 권장 사양:
  입문: 다이나믹 마이크 (오디오테크니카 AT2020 등)
  권장: 콘덴서 마이크 + 오디오 인터페이스
  최소: 스마트폰 이어폰 마이크도 가능 (노이즈 제거 필수)

녹음 포맷:
  샘플레이트: 44100Hz 또는 48000Hz
  비트뎁스: 24bit
  파일 형식: WAV (MP3 지양)

2-2. 소프트웨어 설치

Python 환경 세팅:

bashpython -m venv venv
source venv/bin/activate       # Linux/Mac
venv\Scripts\activate          # Windows PowerShell

# PyTorch 설치 (CUDA 12.1 기준)
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu121

F5-TTS 설치:

bashpip install git+https://github.com/SWivid/F5-TTS.git

Applio (RVC GUI) 설치:

bashgit clone https://github.com/IAHispano/Applio
cd Applio
pip install -r requirements.txt
python app.py    # 브라우저에서 GUI 실행

UVR5 설치 (노이즈 제거):

bash# 방법 1: GUI 버전 (권장)
# https://github.com/Anjok07/ultimatevocalremovergui
# Releases 탭에서 설치파일 다운로드

# 방법 2: Python 패키지
pip install audio-separator

📌 3. 목소리 녹음 & 전처리

3-1. 녹음 환경 세팅

잔향(Reverb) 최소화 방법:

공간 선택:
  ✅ 좋음: 옷장 안, 이불 덮고 녹음, 흡음재가 있는 방
  ✅ 좋음: 카펫·소파·커튼이 많은 방
  ❌ 나쁨: 빈 방, 화장실, 딱딱한 벽면이 많은 공간
  ❌ 나쁨: 환풍기·에어컨 가동 중인 환경

마이크 세팅:
  - 마이크와 입 거리: 10~15cm
  - 팝 필터 사용 (p, b 발음 폭음 방지)
  - 마이크를 입 정면보다 약간 위쪽에 배치
  - 녹음 전 3초 침묵 → 노이즈 프로파일 확보용

Audacity로 기본 노이즈 제거:

1. Audacity 실행 → 녹음 파일 불러오기
2. 처음 3초 침묵 구간 선택
3. 효과 → 노이즈 감소 → 노이즈 프로파일 가져오기
4. 전체 선택(Ctrl+A) → 노이즈 감소 적용
5. WAV로 내보내기

3-2. 분량 기준

Zero-shot용 (F5-TTS):

필요 분량: 3~15초
권장 내용: 자연스럽고 또렷하게 읽은 문장 1~2개
예시 스크립트:
  "안녕하세요, 저는 AI 기술을 소개하는 채널을 운영하고 있습니다.
   오늘도 좋은 정보로 찾아오겠습니다."

주의: F5-TTS는 15초 초과 분량은 자동으로 무시합니다.

Fine-tuning용 (RVC / Applio):

최소: 5분  → 기본 학습 가능
권장: 10분 → 품질과 효율의 균형
우수: 30분 → 고품질, 다양한 톤 커버 가능

녹음 내용 구성 (10분 기준):
  - 일반 대화체 문장: 3분
  - 뉴스 낭독체 문장: 3분
  - 감정 포함 문장 (기쁨, 진지함): 2분
  - 숫자·영어 포함 문장: 2분

녹음 분량 자동 계산:

pythonimport wave

def get_audio_duration(wav_path):
    with wave.open(wav_path, 'r') as f:
        frames     = f.getnframes()
        rate       = f.getframerate()
        duration   = frames / float(rate)
        minutes    = int(duration // 60)
        seconds    = int(duration % 60)
    print(f"총 녹음 시간: {minutes}{seconds}초")
    return duration

get_audio_duration("./my_voice.wav")

3-3. UVR5로 노이즈 제거

MDX-Net 모델 선택 기준:

모델명용도권장 상황
MDX23C-INSTVOC HQ보컬/반주 분리노래에서 목소리만 추출
MDX-Net Voc FT정밀 보컬 분리 2차 처리1차 분리 후 추가 정제
Reverb HQ잔향(리버브) 제거녹음실 없이 녹음한 경우
UVR-DeNoise배경 노이즈 제거환경음·잡음 제거

권장 처리 순서:

[원본 녹음 파일]
      ↓
1단계: MDX23C-INSTVOC HQ → 보컬 분리 (노래 포함 시)
      ↓
2단계: Reverb HQ → 잔향 제거
      ↓
3단계: UVR-DeNoise → 배경 노이즈 제거
      ↓
[깨끗한 음성 파일 완성]

Python으로 자동화:

bash# audio-separator 패키지 사용
audio-separator my_voice.wav --model_name="Reverb_HQ_By_FoxJoy"
audio-separator my_voice_no_reverb.wav --model_name="UVR-DeNoise"

📌 4. Zero-shot 방식 — F5-TTS

4-1. F5-TTS 설치 & 실행

bash# 설치
pip install git+https://github.com/SWivid/F5-TTS.git

# Gradio 웹 UI 실행 (초보자 권장)
f5-tts_infer-gradio

# 또는 CLI 실행
f5-tts_infer-cli \
  --model F5TTS_v1_Base \
  --ref_audio "./my_voice_sample.wav" \
  --ref_text "안녕하세요, 저는 AI 기술을 소개합니다." \
  --gen_text "오늘 포스트에서는 LoRA 파인튜닝을 다룹니다." \
  --output_dir "./output"

4-2. 참조 음성 샘플 입력

pythonfrom f5_tts.api import F5TTS

tts = F5TTS()

# 참조 음성 로드
ref_audio  = "./my_voice_sample.wav"   # 3~15초 분량
ref_text   = "안녕하세요, 저는 AI 기술을 소개하는 채널을 운영하고 있습니다."
# ※ ref_text는 ref_audio 파일에서 실제로 말한 내용과 정확히 일치해야 합니다

# 생성할 텍스트
gen_text = "오늘은 FLUX.1 dev를 이용한 이미지 생성 방법을 알아보겠습니다."

wav, sr, _ = tts.infer(
    ref_file  = ref_audio,
    ref_text  = ref_text,
    gen_text  = gen_text,
    speed     = 1.0,    # 말하기 속도 (0.7~1.3)
)

4-3. 텍스트 입력 → 즉시 음성 출력

pythonimport soundfile as sf
import numpy as np

# 음성 저장
sf.write("./output/result.wav", wav, sr)
print("음성 생성 완료: ./output/result.wav")

# 긴 텍스트 자동 분할 처리 (문단 단위)
def generate_long_audio(tts, ref_audio, ref_text, long_text, output_path):
    # 문장 단위 분할
    sentences  = long_text.split('. ')
    audio_list = []

    for i, sentence in enumerate(sentences):
        if not sentence.strip():
            continue
        wav, sr, _ = tts.infer(
            ref_file = ref_audio,
            ref_text = ref_text,
            gen_text = sentence + '.',
        )
        audio_list.append(wav)
        print(f"[{i+1}/{len(sentences)}] 생성 완료")

    # 전체 합치기
    full_audio = np.concatenate(audio_list)
    sf.write(output_path, full_audio, sr)
    print(f"최종 저장: {output_path}")

generate_long_audio(
    tts, ref_audio, ref_text,
    long_text   = open("./script.txt").read(),
    output_path = "./output/full_narration.wav"
)

📌 5. Fine-tuning 방식 — RVC / Applio

5-1. Applio GUI 사용법

bash# Applio 실행
cd Applio
python app.py
# → http://localhost:7897 브라우저에서 열림

Applio 메뉴 구조:
  ├─ Train     ← 모델 학습
  ├─ Inference ← 음성 변환 (추론)
  ├─ TTS       ← 텍스트 → 내 목소리
  └─ Settings  ← 설정

학습 탭 주요 설정:

Model Name: my_voice_v1        ← 저장할 모델 이름
Dataset Path: ./dataset/audio  ← 녹음 파일 폴더
Sample Rate: 40000             ← 권장값

5-2. 학습 설정

에포크(Epoch) 수 기준:

데이터 5분 기준:
  100 Epoch  → 학습 부족, 목소리 특징 희미
  300 Epoch  → 기본 품질 확보
  500 Epoch  → 권장, 유사도 80~90%
 1000 Epoch  → 고품질, 학습 시간 2~3시간
 2000 Epoch  → 최고품질, 과적합 주의

※ 데이터가 많을수록 더 높은 Epoch 필요
   10분 데이터 → 500~800 Epoch 권장
   30분 데이터 → 300~500 Epoch으로도 충분

Pitch 설정 (남성/여성 구분):

python# 추론 시 피치 조정값
pitch_settings = {
    "남성 → 남성":  0,    # 변환 없음
    "여성 → 여성":  0,    # 변환 없음
    "남성 → 여성": 12,    # 1옥타브 올림
    "여성 → 남성": -12,   # 1옥타브 내림
}

# Applio GUI에서 Transpose 항목에 위 값 입력
# 또는 미세 조정: +6 / -6 (반옥타브)

전체 학습 설정 (Applio GUI 기준):

Total Epoch:         500
Batch Size:          8      (VRAM 8GB 기준)
Save Every Epoch:    50     (체크포인트 저장 주기)
Pretrain G:          f0G40k.pth   ← 사전학습 모델
Pretrain D:          f0D40k.pth
GPU Index:           0
Pitch Guidance:      활성화 (음정 보존)

5-3. 학습 완료 후 모델 추론

python# Applio Python API로 추론
import subprocess

# Applio CLI 추론
subprocess.run([
    "python", "core.py",
    "run-infer-script",
    "--pitch",        "0",
    "--filter_radius","3",
    "--index_rate",   "0.75",        # 목소리 유사도 (0~1)
    "--volume_envelope", "1",
    "--protect",      "0.5",
    "--hop_length",   "128",
    "--f0method",     "rmvpe",       # 피치 추출 알고리즘
    "--input_path",   "./tts_output.wav",   # F5-TTS로 생성한 파일
    "--output_path",  "./final_my_voice.wav",
    "--pth_path",     "./logs/my_voice_v1/my_voice_v1.pth",
    "--index_path",   "./logs/my_voice_v1/added_IVF256_Flat_nprobe_1.index",
], check=True)

F5-TTS + RVC 파이프라인 통합:

텍스트 입력
   ↓
F5-TTS (기본 목소리로 TTS 생성)
   ↓
RVC / Applio (내 목소리 스타일로 변환)
   ↓
내 목소리로 읽힌 최종 음성 파일

📌 6. 모델 비교

F5-TTS vs Kokoro vs Sesame CSM-1B

항목F5-TTSKokoroSesame CSM-1B
파라미터300M82M1B
Zero-shot✅ 3초 샘플❌ 불가✅ Fine-tuning 전제
음질⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
감정 표현보통낮음매우 높음
추론 속도빠름매우 빠름보통
VRAM4GB+CPU 가능8GB+
라이선스MITApache 2.0Apache 2.0
한국어 지원Fine-tuning 필요Fine-tuning 필요Fine-tuning 필요

용도별 추천

빠른 음성 클론 (바로 사용):
  → F5-TTS (3초 샘플로 즉시 클론)

엣지 배포 / 저사양 환경:
  → Kokoro (CPU만으로도 실시간 동작)

감정 표현이 중요한 콘텐츠:
  → Sesame CSM-1B (대화형 AI 에이전트, 감성 더빙)

유튜브 채널 장기 운영:
  → F5-TTS (Zero-shot) + RVC (Fine-tuning) 조합

📌 7. 텍스트 → 음성 자동화 스크립트

대본 파일 → 음성 파일 일괄 변환 코드

대본 파일 형식 (script.txt):

[scene_01]
안녕하세요, 오늘은 AI 이미지 생성에 대해 알아보겠습니다.

[scene_02]
먼저 FLUX.1 dev 모델을 설치하는 방법부터 시작합니다.

[scene_03]
설치가 완료되면 ComfyUI를 실행해 주세요.

자동 변환 스크립트:

pythonimport re, os
import soundfile as sf
import numpy as np
from f5_tts.api import F5TTS

def batch_tts_from_script(
    script_path,
    ref_audio,
    ref_text,
    output_dir   = "./output/scenes",
    speed        = 1.0,
    silence_sec  = 0.5,    # 씬 사이 묵음 길이
):
    os.makedirs(output_dir, exist_ok=True)
    tts = F5TTS()

    # 대본 파싱
    with open(script_path, 'r', encoding='utf-8') as f:
        content = f.read()

    scenes = re.findall(r'\[(\w+)\]\n(.+?)(?=\n\[|\Z)', content, re.DOTALL)

    all_audio   = []
    sample_rate = None

    for scene_name, text in scenes:
        text = text.strip()
        print(f"생성 중: [{scene_name}] {text[:30]}...")

        wav, sr, _ = tts.infer(
            ref_file = ref_audio,
            ref_text = ref_text,
            gen_text = text,
            speed    = speed,
        )
        sample_rate = sr

        # 씬별 저장
        scene_path = os.path.join(output_dir, f"{scene_name}.wav")
        sf.write(scene_path, wav, sr)

        # 전체 합치기용 누적
        silence = np.zeros(int(sr * silence_sec))
        all_audio.extend([wav, silence])

    # 전체 합본 저장
    full_audio    = np.concatenate(all_audio)
    full_path     = os.path.join(output_dir, "full_narration.wav")
    sf.write(full_path, full_audio, sample_rate)

    print(f"\n✅ 완료! 총 {len(scenes)}개 씬 생성")
    print(f"   합본 저장: {full_path}")

# 실행
batch_tts_from_script(
    script_path = "./script.txt",
    ref_audio   = "./my_voice_sample.wav",
    ref_text    = "안녕하세요, 저는 AI 기술을 소개하는 채널을 운영하고 있습니다.",
    output_dir  = "./output/scenes",
    speed       = 1.05,    # 살짝 빠르게 (유튜브 권장)
)

📌 8. 결과 확인 & 트러블슈팅

발음이 뭉개질 때

원인 1: ref_text가 ref_audio와 정확히 일치하지 않음
  → ref_audio 파일을 직접 듣고 말한 내용 그대로 텍스트 작성

원인 2: 텍스트가 너무 길 경우
  → 한 번에 50자 이내로 분할 처리
  → 위 batch_tts_from_script() 활용

원인 3: 한국어 발음 부정확
  → F5-TTS 한국어 파인튜닝 모델 사용
     (HuggingFace에서 "F5-TTS Korean" 검색)

음정이 이상할 때

원인 1: RVC Transpose(피치) 설정 오류
  → 남성 목소리면 Transpose = 0 확인
  → 여성 목소리면 Transpose = 0 or +12 조정

원인 2: f0method (피치 추출) 설정 문제
  → rmvpe 알고리즘 사용 권장 (가장 안정적)
  → harvest → rmvpe 로 변경

원인 3: 원본 녹음의 피치 불안정
  → Audacity에서 피치 시각화 후 이상 구간 재녹음

잡음이 섞일 때

원인 1: 노이즈 제거 미흡
  → UVR5 처리를 다시 수행
  → MDX23C-INSTVOC HQ → Reverb HQ → DeNoise 순서 확인

원인 2: RVC index_rate가 너무 높음
  → index_rate 0.75 → 0.5 로 낮추기
  → index 파일이 없거나 손상된 경우 재학습

원인 3: 출력 파일 샘플레이트 불일치
  → 모든 파일을 44100Hz 또는 48000Hz로 통일
  import librosa, soundfile as sf
  y, sr = librosa.load("./output.wav", sr=44100)
  sf.write("./output_resampled.wav", y, 44100)

완성 체크리스트

  • 목소리 녹음 완료 (최소 5분 이상)
  • UVR5로 노이즈·잔향 제거 완료
  • F5-TTS Zero-shot 테스트 성공
  • Applio RVC Fine-tuning 500 Epoch 완료
  • 대본 파일 → 음성 일괄 변환 스크립트 실행 성공
  • 최종 음성 품질 확인 (유사도·발음·노이즈)