대본만 쓰면 강의 영상이 나온다 — 버튜버 자동 제작 파이프라인 구축기

무엇을 만들었나

블로그 1장 “AI가 화면 밖으로 나왔다 — 피지컬 AI 입문 가이드"를 10분짜리 유튜브 강의 영상으로 만들었다. 목표는 분명했다. 사람이 카메라 앞에서 연기하지도, 녹화 버튼을 누르지도 않는 것. 대본을 쓰면 AI 음성 합성 → 아바타 자동 립싱크 → 자동 녹화까지 한 번에 이어지도록 배선했고, 사용한 도구가 전부 무료라 총비용은 0원이었다.

전체 흐름은 다음과 같다.

1
2
3
4
5
블로그 글 → 구어체 대본 (Claude 작성)
  → Edge TTS로 mp3 생성 (tts.py)
  → 음성 내장 HTML 슬라이드, 타임스탬프 자동 전환 (slides.html)
  → OBS 재생 음성을 가상 오디오 케이블로 VMagicMirror에 전달 → 아바타 립싱크
  → OBS WebSocket API로 녹화 시작/종료 자동화 (record.py)

무료 도구로 짠 파이프라인

파이프라인을 구성하는 도구는 모두 무료이거나 오픈소스다.

  • VRoid Studio (Pixiv): 슬라이더 조작만으로 3D 아바타를 만들어 VRM 파일로 내보낸다. 샘플 모델로 시작해도 충분하며, 내보낼 때는 호환성이 가장 좋은 VRM 0.0 형식을 쓴다.
  • VMagicMirror (MIT 라이선스): VRM 아바타를 띄우고 마이크 입력만으로 립싱크한다. 웹캠 없이 쓰는 것을 전제로 만들어져 숨쉬기·눈 깜빡임 같은 대기 모션이 자연스럽고, 그래서 “AITuber” 용도에 잘 맞는다.
  • VB-Audio Cable (도네이션웨어): 가상 오디오 케이블. 재생 소리를 가상 마이크(CABLE Output)로 흘려보내, mp3를 마이크 입력인 것처럼 넣어 준다.
  • edge-tts (파이썬 패키지): 마이크로소프트 Edge의 한국어 TTS를 무료로 쓴다. ko-KR-SunHiNeural 음성으로, 10분 분량 대본이 몇십 초 만에 mp3가 된다.
  • OBS Studio: 배경·슬라이드·아바타를 합성하고 녹화한다. WebSocket 서버를 켜면 파이썬으로 원격 제어할 수 있다.

이 구조에서 가장 중요한 건 소리 배선이다. mp3 재생음을 아바타의 “마이크 입력"으로 착각하게 만들어야 립싱크가 걸리기 때문이다.

  1. OBS 설정 → 오디오 → 고급 → 모니터링 장치CABLE Input으로.
  2. 음성 소스(슬라이드 브라우저 소스)의 고급 오디오 속성 → 모니터링을 **“모니터링과 출력”**으로.
  3. VMagicMirror 스트리밍 탭 → 립싱크 마이크를 CABLE Output으로.

정리하면 소리는 이렇게 흐른다. OBS가 mp3를 재생 → CABLE Input → CABLE Output → VMagicMirror가 마이크 입력으로 인식 → 립싱크. 같은 소리가 녹화 트랙에도 그대로 들어간다.

슬라이드 자동 전환과 자동 녹화

슬라이드는 PPT가 아니라 HTML 한 파일로 만들었다. 1920×1080 고정, 12장짜리이고 OBS 브라우저 소스로 바로 로드한다. HTML 안에 <audio>로 강의 mp3를 내장하고, JS가 audio.currentTime을 지켜보다가 미리 계산해 둔 타임스탬프에 슬라이드를 자동으로 넘긴다. 사람이 큐시트를 보며 넘길 필요가 없다.

전환 시각은 섹션별 mp3 실측 길이에 대본 글자 수 비율을 얹어 계산했다. TTS 발화 속도가 균일해서 글자 비율만으로도 추정이 꽤 정확했다. 아바타가 우측 하단에 들어가므로 슬라이드 레이아웃에서는 그 자리를 비워 뒀다(padding-right 460px).

녹화는 record.py가 맡는다. OBS 28버전 이상은 WebSocket 서버가 내장돼 있어(도구 → WebSocket 서버 설정 → 활성화), 파이썬 obsws-python 패키지로 붙어 녹화 시작 → 브라우저 소스 새로고침(refreshnocache로 페이지를 리로드해 음성을 처음부터 재생) → 재생 길이만큼 대기 → 녹화 종료를 순서대로 실행한다. 결과적으로 명령 한 줄이면 10분 45초짜리 1080p60 영상이 나온다.

막혔던 지점들

자동화 과정에서 걸렸던 문제와 해결책을 남겨 둔다.

  • 아바타 배경이 검게 찍힘: VMagicMirror 배경 투명화를 켰을 때 OBS 게임 캡처의 “투명도 허용"을 체크하지 않으면 투명 영역이 검정으로 나온다. 게임 캡처 속성에서 체크 하나로 해결.
  • 얼굴이 잘림: VMM 카메라를 “프리 카메라 모드"로 두고 아바타 창에서 휠(줌)·휠 드래그(이동)·우클릭 드래그(회전)로 구도를 잡는다. 잡은 구도는 퀵 세이브 슬롯에 저장할 수 있다.
  • 10분 맞추기: 첫 대본이 11분 10초로 나와, 중복 문장을 덜어 10분 39초로 맞췄다. 한국어 TTS 기본 속도 기준 10분은 공백 포함 4,000자 안팎이다.
  • TTS 오독: “유니트리 G1"을 “지원"으로 읽는 식의 오독이 있어, 외래어·기호는 대본 단계에서 미리 한글로 풀어썼다(챗지피티, 러로봇, 아이작 랩 등).
  • 조작용 UI가 화면에 찍힘: 슬라이드 카운터(HUD)가 녹화에 들어가서, 자동 재생 중에는 숨기도록 고쳤다. 녹화 화면에 들어가는 소스에 “조작용 표시"가 없는지 확인할 것.
  • 창을 가려도 되나: OBS 게임 캡처는 GPU 렌더링을 직접 후킹하므로 다른 창에 가려져도 캡처된다. 다만 최소화는 금지(렌더링이 멈춘다). OBS 자체는 최소화해도 녹화가 계속된다.

한 가지 한계도 분명하다. 립싱크·표정·대기 모션까지는 자동이지만, 손짓이나 판서 같은 큰 제스처는 안 된다. 다만 강의 영상은 슬라이드 하이라이트로 대체할 수 있어 실용상 문제는 없었다. 이제 다음 장부터는 “대본 작성 → TTS → 슬라이드 생성 → 자동 녹화"가 명령 몇 번으로 끝난다. 유튜브 강의 채널을 글 쓰는 속도로 운영할 수 있는 구조가 된 셈이다.

한 줄 정리

대본만 쓰면 TTS·아바타 립싱크·슬라이드 전환·녹화까지 이어지는 무료 파이프라인을 짜서, 유튜브 강의 영상을 글 쓰는 속도로 찍어낼 수 있게 됐다.

Hugo로 만듦
JimmyStack 테마 사용 중