얼굴 없는 유튜브 쇼츠를 자동 생성하는 무료 자체 호스팅 파이프라인 구축 방법

발행: (2026년 5월 23일 PM 10:35 GMT+9)
5 분 소요
원문: Dev.to

Source: Dev.to

모든 “AI 유튜브” 튜토리얼은 똑같은 방식으로 끝납니다: ChatGPT Plus에 가입하고, ElevenLabs, Pictory, n8n Cloud 순서대로 가입한다. 이 모든 비용을 합치면 영상 하나도 만들기 전에 월 $75–100을 내고 있는 셈이죠—수익을 한 푼도 벌기 전에 말입니다.
저는 구독형 스택을 원하지 않았습니다. 내 컴퓨터에서 실행되고, 무료 티어와 로컬 모델을 사용하며, 내가 직접 소유할 수 있는 무언가가 필요했죠. 그래서 직접 만들었고, MIT 라이선스로 오픈소스화했습니다.
이 프로젝트의 이름은 FreeFaceless이며, 한 번의 명령으로 아무것도 없는 상태에서 유튜브 Shorts 업로드까지 진행됩니다:
스크립트 → 보이스오버 → 캡션 → B‑롤 → 조합된 영상 → 유튜브 업로드

레포지토리: https://github.com/nils44344/FreeFaceless

각 단계가 어떻게 동작하는지와, 저에게 저녁을 한참 빼앗아 간 버그 하나를 소개합니다.
전체 파이프라인은 선형 구조이며, 핵심 부분은 다음과 같습니다(생략됨):

def run_once(publish_at=None, upload_to_youtube=True):
    data = script.generate()                          # 1. Groq가 스크립트를 작성
    voice_mp3 = voice.synth(data["full_text"], ...)   # 2. edge-tts 보이스오버
    words = captions.transcribe_words(voice_mp3)      # 3. 로컬 Whisper 타이밍
    scenes = visuals.fetch_for_scenes(data["scenes"]) # 4. Pexels B‑롤
    ass = captions.write_ass(words, ...)               # 5. 캡션 파일
    final = assemble.build(scenes, voice_mp3, ass, …) # 6. ffmpeg
    if upload_to_youtube:
        upload.upload_video(final, data["title"], …)  # 7. YouTube Data API

각 단계는 독립 모듈이며, 모든 설정은 하나의 config.yaml 파일로 제어됩니다—즉, 니치, 목소리, 캡션 스타일을 바꾸는 것은 코드 수정이 아니라 설정 파일 편집만 하면 됩니다.

Groq의 무료 티어는 Llama 3.3 70B 모델을 빠르게 제공하고 OpenAI와 호환되므로, 공식 openai SDK를 베이스 URL만 Groq로 지정하면 바로 사용할 수 있습니다:

from openai import OpenAI
client = OpenAI(api_key=GROQ_API_KEY, base_url="https://api.groq.com/openai/v1")

resp = client.chat.completions.create(
    model="llama-3.3-70b-versatile",
    response_format={"type": "json_object"},  # 깔끔한 JSON 강제
    messages=[{"role": "system", "content": SYSTEM_PROMPT}, ...],
)

프롬프트는 훅 + 4–6개의 사실 + CTA를 요구하고, 각 씬별 visual_query 문자열을 포함한 JSON을 반환합니다. 이 문자열을 바로 스톡 영상 검색에 사용할 수 있죠. JSON 모드 덕분에 깨지기 쉬운 정규식 파싱이 필요 없습니다.

edge-tts는 마이크로소프트의 뉴럴 보이스를 무료로 제공하며, API 키가 필요 없습니다:

import edge_tts
communicate = edge_tts.Communicate(text, "en-US-ChristopherNeural", rate="-12%")
await communicate.save("voice.mp3")

품질이 충분히 좋기 때문에 얼굴이 나오지 않는 콘텐츠에도 안성맞춤이며, 니치에 맞는 수십 가지 목소리와 억양을 선택할 수 있습니다.

대부분의 유료 툴이 분당 요금을 부과하는 부분이 바로 여기입니다. faster-whisper는 CPU에서 로컬로 실행되며 단어 수준 타임스탬프를 제공하고, 이를 카라오케 스타일 캡션으로 변환합니다:

from faster_whisper import WhisperModel
model = WhisperModel("base", device="cpu", compute_type="int8")
segments, _ = model.transcribe("voice.mp3", word_timestamps=True)

그 다음 3단어씩 묶어 큰 볼드 스타일의 ASS 자막 파일을 작성합니다—이는 모든 Shorts 채널이 쓰는 디자인이죠. (FreeFaceless는 오픈 라이선스인 Anton 폰트를 기본으로 포함해 바로 사용할 수 있습니다.)

각 씬의 visual_query는 Pexels Videos 검색으로 연결돼 세로형 클립을 가져옵니다. 무료 API이며 제한도 관대합니다.

ffmpeg는 모든 클립을 1080×1920으로 크롭하고, 보이스오버 길이에 맞게 연결한 뒤 오디오를 오

0 조회
Back to Blog

관련 글

더 보기 »

내 스킬

프로젝트를 위한 AI 지시문을 만들고, 설치하고, 관리하세요 — 코딩이 필요 없습니다. CREATE 이름을 정하고, 카테고리를 선택하고, 원하는 것을 설명하세요 — 마법사가 자동으로 구성합니다.