aMuseMe: 소형 모델들이 시각적 교향곡을 작곡할 때
요약
aMuseMe는 오디오 파일을 입력하면 자동으로 스타일리시한 키네틱 타이포그래피 가사 비디오를 생성하는 시스템입니다. 35억 개의 파라미터를 가진 소형 모델들을 활용하여 로컬 환경에서 단어 단위 타임스탬프 추출부터 배경 묘사, 애니메이션 렌더링까지의 파이프라인을 구현했습니다.
핵심 포인트
- 3.5B 파라미터 규모의 소형 모델들로 구성된 로컬 실행 파이프라인
- Whisper large-v3를 활용한 정밀한 단어 단위 타임스탬프 추출
- 오디오 분석, 가사 분할, 배경 묘사, 렌더링의 4단계 자동화 과정
- 클라우드 API 없이 로컬 환경에서 동작하는 효율적인 아키텍처
"Thousand Token Wood에서의 모험" 현장 노트 — Build Small Hackathon 2026"
뮤직비디오는 매우 개인적인 유물입니다. 뮤직비디오는 노래를 단순히 듣는 것에서 넘어, 눈으로 보고 마음으로 느끼는 무언가로 변화시킵니다. 하지만 음악에 맞춰 단어가 나타나는 단순한 가사 비디오(lyric video)를 만드는 것조차 지루하고 수동적인 과정입니다. 비디오 에디터에서 단어 타이밍을 키프레임(keyframing)으로 잡고, 귀로 박자에 맞춰 텍스트를 정렬하며, "분위기에 맞는" 스톡 푸티지(stock footage)를 찾아 헤매야 합니다. 3분짜리 노래 한 곡을 위해 몇 시간의 작업이 필요합니다.
우리는 다른 질문을 던지기 위해 aMuseMe를 구축했습니다: 오디오 파일만 넣으면 스타일이 입혀진 완전한 가사 비디오를 돌려받을 수 있다면 어떨까? 가사가 필요 없습니다. 타임라인 편집도 필요 없습니다. 스톡 푸티지를 찾아 헤맬 필요도 없습니다. 그저 음악을 넣으면, 비디오가 나옵니다.
그리고 우리는 이를 **총 35억 개(3.5 billion)의 파라미터(parameters)**로 해냈습니다.
아이디어: 키네틱 타이포그래피(Kinetic Typography)와 소형 AI의 만남
키네틱 타이포그래피(Kinetic typography) — 음성 오디오에 맞춰 움직이고, 크기가 변하며, 애니메이션화되는 단어들 — 는 화면에 텍스트를 제시하는 가장 몰입감 있는 방법 중 하나입니다. 음악 가사 비디오는 이에 완벽하게 적용됩니다. 모든 단어에는 정확한 타임스탬프(timestamp)가 있고, 모든 문장에는 그 _외형_을 결정할 수 있는 감정적 분위기가 있기 때문입니다.
우리는 다음과 같은 파이프라인(pipeline)을 구상했습니다:
- AI가 노래를 듣고(listens) 모든 단어의 타임스탬프를 찍습니다.
- AI가 가사를 읽고(reads) 이를 어떻게 표시할 줄로 나눌지 결정합니다.
- AI가 각 섹션을 어울리는 배경 그림으로 **묘사(illustrates)**합니다.
- 렌더러(renderer)가 이 모든 것을 부드러운 30fps HD 비디오로 **애니메이션화(animates)**합니다.
문제는 이 네 단계가 모두 해커톤의 32B 파라미터 예산 안에 들어와야 한다는 것이었습니다. 클라우드 API는 사용하지 않습니다. 모든 것은 로컬(local)에서 이루어집니다.
아키텍처: 네 개의 소형 모델, 하나의 파이프라인
1단계: 리스너(The Listener) — Whisper large-v3 (~1.55B)
우리는 faster-whisper(CTranslate2로 최적화된 포트)를 사용하여 원본 오디오에서 **단어 단위 타임스탬프(word-level timestamps)**를 추출합니다. 문장 단위가 아니라 _단어 단위_입니다. 가수가 정확히 4.72초에 "heart"라고 말하면, 우리는 그것이 4.72초에 시작하여 5.01초에 끝난다는 것을 알 수 있습니다.
이러한 정밀함이 최종 비디오를 생동감 있게 만듭니다. 단어들은 단순히 한 줄씩 나타나는 것이 아니라, 각 단어가 노래되는 정확한 밀리초(millisecond) 단위로 불이 들어옵니다.
튜닝의 늪 (The tuning rabbit hole): (깨끗한 음성이 아닌) 노래에서 정확한 단어 타임스탬프 (word timestamps)를 얻어내는 과정에는 광범위한 실험이 필요했습니다.
condition_on_previous_text=True설정은 정확도를 극적으로 향상시킵니다. Whisper는 자신의 이전 출력을 컨텍스트 (context)로 사용하므로, 노래의 어휘를 "기억"합니다. 하지만 이는 연주 구간(instrumental breaks) 동안 **무한 환각 루프 (infinite hallucination loops)**를 유발합니다 (Whisper가 침묵을 반복되는 유령 가사로 채워버립니다).- **VAD (Voice Activity Detection, 음성 활동 감지)**가 이 환각 문제를 해결합니다. 우리는
min_silence_duration_ms=2000,speech_pad_ms=2000,min_speech_duration_ms=50과 같은 공격적인 임계값 (thresholds)을 사용하여, Whisper가 실제로 누군가가 노래하고 있는 오디오 세그먼트 (audio segments)만 인식하도록 합니다. - 속도를 위해
whisper-base(74M 파라미터)로 시작했지만, 빠른 보컬의 경우 단어 경계 (word boundary) 정확도가 떨어졌습니다.large-v3가 최적의 지점(sweet spot)이었습니다. 노래에 충분히 정확하면서도, 32B 예산 범위 내에 충분히 들어왔기 때문입니다.
2단계: 디렉터 (The Director) — MiniCPM5-1B + Outlines
이 단계는 파이프라인의 창의적인 두뇌입니다. Whisper의 가공되지 않은 출력은 타임스탬프가 찍힌 단어들의 평면적인 리스트일 뿐이지만, 가사 비디오에는 _줄 (lines)_이 필요합니다. "Every heartbeat echoes feel like grooving my veins"는 다음과 같이 변해야 합니다:
Every heartbeat echoes ← 1행
feel like grooving my veins ← 2행
규칙 기반 (rule-based) 접근 방식 (침묵 간격에서 분할, 최대 7단어로 제한)도 작동하지만, 이는 기계적이고 부자연스러운 끊김을 만들어냅니다. LLM은 구문 구조 (phrase structure)를 이해합니다. 예를 들어 "breaking all of these chains"가 함께 유지되어야 한다는 것을 알고 있습니다.
우리는 MiniCPM5-1B (OpenBMB 제작, 이번 해커톤의 주요 스폰서 중 하나)를 사용합니다. 이는 단일 GPU에서 Whisper 및 SD-Turbo와 함께 실행될 수 있을 만큼 작은 1B 파라미터 언어 모델입니다. 약 10단어 단위의 각 청크 (chunk)에 대해, 모델은 다음과 같은 작업을 수행합니다:
- 단어를 표시 줄로 분할 (Splits words into display lines) — 각 줄에 몇 개의 단어가 포함될지 결정합니다.
- 프레임 애니메이션 선택 (Picks a frame animation) — 강조를 위한
zoom_in, 극적인 타격감을 위한flash, 조용한 엔딩을 위한fade_to_black, 부드러운 움직임을 위한pan_left/pan_right를 선택합니다.
구조화된 생성의 돌파구 (The structured generation breakthrough): 소형 LLM (Large Language Model)의 가장 큰 과제는 출력의 신뢰성입니다. 1B 모델은 종종 형식이 잘못된 JSON을 생성하거나, 필드가 누락되거나, 환각 (hallucination)된 키를 만들어내곤 합니다. 우리는 Outlines를 통해 이 문제를 완전히 해결했습니다. Outlines는 디코딩 (decode) 시점에 LLM의 토큰 생성을 Pydantic 스키마 (schema)에 맞도록 제한하는 라이브러리입니다. 모델은 말 그대로 유효하지 않은 JSON을 생성할 수 없습니다. 재시도(retry)도, 정규 표현식 (regex) 추출도, 파싱 (parsing) 실패도 필요하지 않습니다.
from outlines import from_transformers, Generator
class Frame(BaseModel):
...
Stage 3: 일러스트레이터 (The Illustrator) — SD-Turbo (~865M)
각 가사 줄 쌍에 대해, 우리는 SD-Turbo (Stability AI의 증류된 (distilled) Stable Diffusion 모델)를 사용하여 영화 같은 배경 이미지를 생성합니다. SD-Turbo의 마법은 guidance_scale=0.0 설정으로 단 한 번의 추론 단계 (single inference step) 만에 고품질 이미지를 생성한다는 점입니다.
우리는 가사 텍스트를 사용자의 스타일 프롬프트 (style prompt)와 결합합니다:
"neon-lit futuristic city at night, vibrant glowing colors,
cyberpunk aesthetic, breaking all of these chains"
약 15개의 스토리보드 이미지가 포함된 3분 길이의 노래의 경우, 전체 배경 생성 단계는 GPU에서 약 2초가 소요됩니다. 그 후 배경을 어둡게 처리(55% 오버레이)하여, 생성된 어떤 이미지 위에서도 흰색/네온 색상의 가사 텍스트를 읽을 수 있도록 합니다.
Stage 4: 렌더러 (The Renderer) — Pillow + FFmpeg
마지막 단계는 Pillow로 구축된 커스텀 프레임 단위 렌더러 (frame-by-frame renderer)입니다:
- 단어 수준 강조 (Word-level highlighting): 현재 줄의 단어들은 테마의 활성 색상으로 표시되며, 아직 발음되지 않은 단어들은 흐릿하게 처리됩니다. 각 단어의 타임스탬프(timestamp)가 도달하면 해당 단어가 밝게 빛납니다.
- 프레임 수준 애니메이션 (Frame-level animations): LLM이 선택한 애니메이션(확대, 팬, 플래시, 페이드)이 전체 텍스트 블록에 적용되어 영화 같은 움직임을 만들어냅니다.
- 스마트 텍스트 줄 바꿈 (Smart text wrapping): 긴 줄은 읽기 힘든 크기로 축소되는 대신 자동으로 여러 행으로 나뉩니다.
- 크로스 페이드 전환 (Cross-fade transitions): 배경 이미지는 1초의 알파(alpha) 전환을 통해 부드럽게 혼합됩니다.
프레임은 디스크에 임시 파일을 쓰지 않고, stdin 파이프를 통해 FFmpeg 서브프로세스로 raw RGB 바이트 형태로 직접 스트리밍됩니다. 이는 클라우드 러너(cloud runners)를 괴롭히는 I/O 병목 현상을 방지하고 조립 단계를 거의 즉각적으로 유지해 줍니다.
무엇이 이것을 "Thousand Token Wood"로 만드는가?
Track 2는 AI 없이는 존재할 수 없는 즐거운 것을 요구합니다. aMuseMe는 AI 챗봇이나 생산성 도구가 아니라, 창의적인 악기입니다. 노래를 입력하면 네 개의 소형 AI 모델이 협업하여 인간 편집자가 몇 시간 동안 작업해야 할 결과물을 만들어냅니다:
- 친구에게 보여주고 싶은가? 물론입니다. "가장 좋아하는 노래를 넣고 90초 만에 가사 비디오를 만드세요"라는 문구는 즉각적인 데모가 됩니다.
- AI가 핵심적인 역할을 하는가 (AI load-bearing)? 네 가지 모델 중 하나라도 제거하면 경험이 무너집니다. Whisper가 없으면 단어 동기화가 불가능합니다. MiniCPM5-1B가 없으면 보기 싫은 줄 바꿈이 발생하고 애니메이션 방향을 잡을 수 없습니다. SD-Turbo가 없으면 시각적 분위기가 형성되지 않습니다.
- 독창적인가? 음성-텍스트 변환(speech-to-text) → 구조화된 LLM 지시(structured LLM direction) → 텍스트-이미지 변환(text-to-image) → 키네틱 타이포그래피 렌더링(kinetic typography rendering)을 단일 파이프라인으로 연결한 다른 프로젝트는 본 적이 없습니다. LLM이 단순히 텍스트를 형식화하는 것을 넘어 애니메이션에 대한 창의적인 결정을 내리는 "비디오 감독으로서의 AI" 개념은 저희가 알기로는 매우 참신합니다.
- 완성도가 높은가? 세 가지 시각적 테마, 네 가지 폰트 패밀리, 사이버펑크 스타일의 다크 UI, 즉시 테스트 가능한 샘플 곡, 그리고 원클릭 생성 버튼을 갖추고 있습니다.
Off the Grid: 클라우드 API 미사용
전체 파이프라인(pipeline)은 온디바이스(on-device)로 실행됩니다. Whisper, MiniCPM5-1B, SD-Turbo, 그리고 Demucs는 모두 GPU 메모리에 로드되는 로컬 모델들입니다. OpenAI API, Stability API, 혹은 클라우드 의존성(cloud dependencies)이 전혀 없습니다. HF Spaces에서는 효율적인 공유 GPU 할당을 위해 ZeroGPU (@spaces.GPU)를 사용하지만, 연산은 여전히 외부 서비스를 호출하는 것이 아니라 HF 자체 하드웨어에서 수행됩니다.
우리가 배운 점
-
구조화된 생성(Structured generation)은 소형 모델의 모든 것을 바꿉니다. Outlines를 통해 항상 유효한 JSON을 출력하는 1B 모델은, 형식이 올바르게 맞춰지기를 기대해야 하는 70B 모델보다 더 신뢰할 수 있습니다. 제약 사항은 한계가 아니라 초능력입니다.
-
단어 단위 동기화(Word-level sync)가 "와우(wow)" 요인입니다. 줄 단위 가사는 2005년의 노래방처럼 느껴집니다. 밀리초(millisecond) 단위의 정밀도를 가진 단어별 하이라이팅은 _마법_처럼 느껴집니다. 시청자 참여도(viewer engagement) 측면에서 그 차이는 엄청납니다.
-
음악을 위해서는 Whisper에 세심한 관리(babysitting)가 필요합니다. VAD, 이전 텍스트 기반 조건화(condition-on-previous-text), 압축률 임계값(compression ratio thresholds), 온도 스케줄링(temperature scheduling) 등 — 우리는 렌더러(renderer)를 작성하는 것보다 Whisper 파라미터를 튜닝하는 데 더 많은 시간을 보냈습니다. 노래는 근본적으로 음성보다 어렵습니다.
-
디스크보다는 파이프(Pipes)입니다. stdin을 통해 FFmpeg로 원시 바이트(raw bytes)를 스트리밍하는 것은 임시 프레임을 디스크에 쓰는 것보다 10배의 성능 이점을 가져다주었습니다. I/O가 느린 클라우드 러너(cloud runners) 환경에서 이는 파이프라인 실행 시간을 10초와 100초로 가르는 차이입니다.
-
원스텝 확산(One-step diffusion)은 파이프라인의 게임 체인저입니다. SD-Turbo가 2초 만에 15장의 이미지를 생성한다는 것은 배경 생성이 더 이상 병목 현상(bottleneck)이 아님을 의미합니다. 이는 단순한 기능(feature)을 넘어 유틸리티(utility)로 쓰이기에 충분할 만큼 빠릅니다.
직접 체험해 보세요 — 노래를 넣고 마법이 일어나는 것을 지켜보세요:
👉 aMuseMe on Hugging Face Spaces
OUTPUT song VIDEO;
APP DEMO VIDEO:
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기