내 목소리 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-shot | Fine-tuning |
|---|---|---|
| 필요 데이터 | 3~15초 샘플 1개 | 5~10분 분량 |
| 준비 시간 | 즉시 (~1분) | 1~3시간 학습 |
| 목소리 유사도 | 70~80% | 90~95% |
| 감정 표현 | 보통 | 높음 |
| 일관성 | 생성마다 약간 다름 | 일정하게 유지 |
| 권장 도구 | F5-TTS | RVC / 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-TTS | Kokoro | Sesame CSM-1B |
|---|---|---|---|
| 파라미터 | 300M | 82M | 1B |
| Zero-shot | ✅ 3초 샘플 | ❌ 불가 | ✅ Fine-tuning 전제 |
| 음질 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 감정 표현 | 보통 | 낮음 | 매우 높음 |
| 추론 속도 | 빠름 | 매우 빠름 | 보통 |
| VRAM | 4GB+ | CPU 가능 | 8GB+ |
| 라이선스 | MIT | Apache 2.0 | Apache 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 완료
- 대본 파일 → 음성 일괄 변환 스크립트 실행 성공
- 최종 음성 품질 확인 (유사도·발음·노이즈)