Communitygithub.com

Emoji Party (비트 동기화 이모지 월드 가사 뮤직 비디오, Blender Grease Pencil)

모든 장르의 노래로 비트에 맞춰 움직이는 이모지 캐릭터, 씬별 세계관과 색상 팔레트, 애니메이션 가사, 풀 렌더링을 포함한 Blender Grease Pencil 기반의 뮤직 비디오를 제작합니다.

Emoji Party (비트 동기화 이모지 월드 가사 뮤직 비디오, Blender Grease Pencil)란 무엇인가요?

Emoji Party는 사용자가 제공한 오디오 파일과 가사를 바탕으로, Blender Grease Pencil을 사용하여 완전한 1080p 뮤직 비디오를 자동 생성하는 AI 에이전트 스킬입니다. 각 섹션마다 독특한 이모지 얼굴이 등장하며, 각각 고유한 세계관과 색상 구성표를 가지고 비트에 맞춰 춤추고, 베이스와 함께 진동하는 가사가 화면에 나타납니다. 이 스킬은 Claude Code, Cursor, Codex 등의 AI 코딩 에이전트와 함께 사용하도록 설계되었으며, Blender 5.x의 Grease Pencil 기능을 최대한 활용합니다. 이 스킬은 주어진 음악의 장르와 분위기를 자동으로 분석하여 적절한 비트 감지(템포, 박자, 장르별 움직임 스타일), 씬 분할, 팔레트 선택, 캐릭터 디자인(항상 액세서리를 착용한 이모지), 가사 애니메이션 등을 결정합니다. 특히, 템포가 흔들리는 라이브 녹음이나 특수 박자(3/4, 6/8 등)에도 대응할 수 있으며, 트랩, 힙합, 드럼 앤 베이스, 왈츠 등 다양한 장르의 음악적 특징을 이해하고 시각화합니다. 주요 기능은 다음과 같습니다: librosa를 사용한 정확한 BPM 및 비트 감지, Descript API를 통한 가사 타임스탬프 추출, 장르 및 가사 분위기에 기반한 씬별 팔레트 및 캐릭터 디자인, 수학적 표현식을 이용한 비트 동기화 애니메이션(점프, 흔들림, 스케일 변화 등), Blender의 Grease Pencil을 활용한 2D 그래픽 렌더링, 병렬 렌더링을 통한 고속 처리(씬당 약 1.3초/프레임), 최종 비디오 조립 및 품질 검증입니다. 각 씬은 미리보기 이미지로 확인 후 제작하며, 최종 결과물은 MP4와 Blender 파일로 제공됩니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/MayorDapper/Partymoji/tree/HEAD/emoji-party

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Emoji Party (비트 동기화 이모지 월드 가사 비디오, Blender Grease Pencil)

사용자가 모든 장르의 노래(오디오 파일)와 가사를 제공하거나, 가사 없는 연주곡을 제공하면, 전체 길이의 1080p 비디오를 생성합니다: 각 섹션마다 인식 가능한 이모지 얼굴이 하나씩 등장하며, 각 얼굴은 고유한 세계관과 색상 구성표를 가지고, 비트에 맞춰 춤추며, 베이스와 함께 진동하는 가사가 화면에 나타납니다. "Mr Me"(150 BPM, 4:12, 15개 씬, 약 840개 오브젝트, 약 10분 렌더링)에서 검증되었습니다.

0. 창작 규칙 (사용자로부터 학습)

  • 리드는 감정을 전달하는 이모지 얼굴이며, 씬마다 다른 감정(불안, 싱글벙글, 붕대, 헐떡임, 울다가 웃음, 쉿, 충격, 너드, 화남, 뜨거움, 별눈, 지퍼 입, 돈 눈, 후광, 파티)을 가집니다. 사물(양초, 나침반, 다이아몬드)은 소품일 뿐이며, 리드가 될 수 없습니다.
  • 모든 리드는 무언가를 착용합니다: 랩의 경우 체인과 펜던트, 그릴, 얼굴 문신, 귀걸이, 모자(캡, 두건, 버킷햇, 비니, 왕관); 다른 장르의 경우 섹션 0b 참조.
  • 씬별 공감 가는 행동: 운전, 자전거 타기, 시험 보기, 폰으로 촬영하기, 낚시, 디제잉, 역도, 셀카, 돈 던지기.
  • 씬당 하나의 팔레트를 가사 분위기에서 선택합니다. 가사 스타일은 모든 씬에서 일관되게 유지되어 비디오가 하나의 작품으로 읽힙니다.
  • 하나의 반복 리드(선글라스 이모지)가 후렴을 담당하고, 마지막 후렴에서 전체 캐스트와 함께 돌아옵니다.
  • 독창적인 이모지 스타일 캐릭터를 그립니다. 특정 업체의 이모지 세트를 복사하지 마십시오.
  • 먼저 단일 테스트 씬(또는 3가지 팔레트 옵션)을 보여주고 확인을 받은 후 전체를 제작합니다. SendUserFile을 사용하여 미리보기 스틸을 보냅니다.

0b. 음악에 적응 (모든 장르)

무엇이든 선택하기 전에 트랙을 읽으십시오. 장르는 입력값이지 가정이 아닙니다.

  • 템포 검색: 60-180 BPM 범위를 검색한 후, 스네어 또는 박수가 떨어지는 위치(비트 2와 4)를 기준으로 반박자/배속을 결정합니다. 트랩과 힙합은 종종 140-150으로 읽히지만 반박자 느낌입니다; 드럼 앤 베이스는 170+로 읽히지만 절반 속도로 애니메이션될 수 있습니다. FPB(느껴지는 비트)와 그리드 비트를 모두 저장합니다.
  • 박자: 기본값은 마디당 4비트; 마디당 비트 수를 파라미터(왈츠는 3, 6/8은 6)로 만들고 FR(bar) 및 마디 길이 표현식에서 사용합니다.
  • 템포 드리프트(라이브 밴드, 오래된 녹음): 콤 점수가 약하거나 드리프트하는 경우, 추적된 비트 목록을 사용하고 고정 주기 표현식 대신 비트당 beat_phase 속성을 키로 사용합니다.
  • 프레임 속도: 느껴지는 비트당 정수 프레임을 제공하는 fps를 선택합니다. 그렇지 않으면 25fps를 사용하고 분수 비트를 허용합니다.
  • 느낌별 움직임:
    • Four-on-the-floor (하우스, 테크노, 디스코, 아마피아노): 모든 비트에서 균일한 바운스, 꾸준한 흔들림.
    • 반박자 (트랩, 힙합, 드릴, 덥스텝): 비트 1에서 큰 히트, 비트 3에서 뒤로 젖히기, 작은 하이햇 속도 디테일.
    • 오프비트 (레게, 댄스홀, 아프로비트, 스카): 오프비트에서 바운스, 엉덩이는 2비트 주기로 흔들림.
    • 빠름 (드럼 앤 베이스, 펑크, 하드코어): 절반 속도 바디, 전체 속도 손과 소품.
    • 느림 (발라드, R&B, 소울, 로파이): 흔들림만, 긴 주기, 작은 스쿼시, 팝 대신 느린 가사 페이드.
    • 스윙/셋잇단음표 (재즈, 블루스, 셔플): 오프비트를 비트의 2/3로 지연.
  • 에너지에 따른 컷 속도: 차분할 때 씬당 8-16마디, 후렴에서는 4마디, 드롭과 피크에서는 1-2마디.
  • 장르와 가사에서 룩 선택: 음악에 어울리는 팔레트, 세계관, 모자 및 액세서리를 선택합니다(랩은 체인과 그릴, 댄스 음악은 헤드폰과 바이저, 컨트리는 카우보이 모자, 포크는 꽃, 록은 스터드). 항상 이모지 얼굴을 리드로 유지하고, 모든 리드가 무언가를 착용하는 스웩 규칙을 유지합니다.
  • 가사 스타일: 베이스가 강한 트랙은 하드 팝과 쉐이크; 부드러운 트랙은 부드러운 슬라이드와 페이드; 후렴구와 훅은 더 큰 글꼴. 언어는 주어진 가사를 따릅니다(방언이나 피진을 "교정"하지 마십시오).
  • 연주곡: 가사 레이어 없음; 드롭에서 제목, 섹션 이름 또는 짧은 분위기 단어를 사용하고, 소품이 이야기를 전달하도록 합니다.
  • 빌드하기 전에 한 줄로 사용자에게 읽기(BPM, 느낌, 섹션 맵)를 확인합니다.

1. 노래 분석 (작업 공간)

  • pip install --break-system-packages -q librosa를 실행한 후, BPM 범위에 걸친 저대역(<130 Hz) 플럭스에 대한 콤 검색을 통해 정확한 BPM과 첫 비트 오프셋을 얻습니다; 마디당 킥(K)과 음량(R)을 출력하여 인트로, 그루브, 드롭 및 드롭아웃을 확인합니다. 프롬프트에 적힌 BPM을 신뢰하지 마십시오(Suno 프롬프트는 140이라고 했지만 트랙은 150이었습니다).
  • 비트당 정수 프레임을 제공하는 경우(120, 125, 150 BPM) 25fps를 사용합니다.
  • 가사 타이밍: 음성 모델은 작업 공간에 다운로드할 수 없으며, 셸에서 Descript 저장소로의 업로드가 차단됩니다. Descript file_upload_ui를 호출하고, 사용자에게 오디오를 드롭하도록 요청한 후, wait_for_job을 실행한 다음, export_transcript를 srt로 내보냅니다. 명확한 랩/말하기 부분에는 라인 수준 타이밍을, 빽빽하거나 노래하는 부분에는 블록 수준(또는 누락된) 타이밍을 예상합니다; 사용자의 실제 가사를 해당 타임스탬프에 수동으로 일치시키고 나머지는 마디에 걸쳐 균등하게 추정합니다. 어떤 섹션이 추정되었는지 사용자에게 알립니다.
  • 씬 테이블을 작성합니다: 섹션, 시작 마디, 이모지, 세계관, 행동, 팔레트. 씬 경계는 마디 위에 있습니다(반 마디도 괜찮습니다). 보컬이 없는 곳에 연주 씬(타이틀 카드, 드롭)을 추가합니다.

2. Blender 설정

  • blender__get_scene_info로 연결을 확인합니다. 저장된 파일을 지우기 전에 물어봅니다. 일찍 저장합니다(폴더를 요청하십시오; Blender의 Python은 사용자 폴더를 직접 읽을 수 있으므로 사운드 스트립을 복사하지 않고 오디오를 제자리에서 가리키도록 합니다).
  • 평면 2D: y=-20에서 +Y 방향을 바라보는 직교 카메라, ortho_scale 16(뷰는 16 x 9 단위). 모든 것은 XZ 평면에 그려집니다; 깊이는 오브젝트의 Y(Y가 클수록 더 뒤에 있음).
  • 각 씬은 자체 컬렉션 S01_...에서 X = 인덱스 * 40에 위치합니다; 카메라는 위치 X에 LINEAR 키(각 씬 내부의 작은 드리프트 포함)와 컷당 타임라인 마커를 사용하여 씬 사이를 점프합니다.
  • 색상: view_transform='Standard', look None. 재사용 가능한 코드를 bpy.data.texts에 저장하고 각 호출의 상단에서 exec합니다.

3. 시간이 많이 드는 Grease Pencil 규칙 (Blender 5.x)

  • 데이터는 bpy.data.grease_pencils; layer.frames.new(1).drawing; drawing.add_strokes([n]); point.position=(x,0,z) 및 point.radius 설정; drawing.tag_positions_changed() 호출.
  • 채워진 각 스트로크에 0이 아닌 fill_id가 없으면 채우기가 렌더링되지 않습니다. 채우기용 고유 int로 stroke.fill_id를 설정하고 선용 0을 설정합니다. 채우기 전용 스트로크에서 stroke.hide_stroke = True를 설정합니다. 하나의 텍스트 글리프 실행의 모든 루프에 동일한 fill_id를 지정하여 문자 구멍이 잘리도록 합니다.
  • 재질: bpy.data.materials.create_gpencil_data(m); show_fill / show_stroke; fill_style='GRADIENT'를 통한 방사형 그라데이션. 재질 색상은 선형입니다: hex를 (v/255)**2.2로 변환하지 않으면 모든 것이 흐릿하게 보입니다.
  • 모든 레이어에서 layer.use_lights = False를 설정합니다.
  • 글꼴/곡선 텍스트 오브젝트는 렌더에서 Grease Pencil 뒤에 숨겨집니다. 텍스트를 GP로 변환: 임시 FONT 곡선을 만들고, evaluated_get(dg).to_curve(dg)를 수행하고, mathutils.geometry.interpolate_bezier로 베지어 스플라인을 샘플링하고, 루프를 GP 스트로크로 그립니다(먼저 외곽선 스트로크, 그 다음 채우기). 큰 씬의 뎁스그래프가 단어당 재평가되지 않도록 별도의 스크래치 씬에서 임시 작업을 수행합니다(486단어가 이 방법으로 3초가 걸렸습니다).
  • 반투명 채우기가 다른 반투명 채우기 위에 있으면 흐릿하게 보입니다; 광선과 광택에는 불투명한 더 어두운 색상을 선호합니다.
  • 드라이버: 자동 실행 Python은 일반적으로 꺼져 있으므로 모든 드라이버는 단순 표현식(sin abs exp fmod min max pi frame)이어야 합니다; driver.is_simple_expression을 어설트합니다.

4. 비트 표현식 (F0 = 첫 비트 프레임, FPB = 비트당 프레임 수)

PULSE = exp(-fmod(frame-F0+BIG, FPB)/(FPB*0.25))        # 각 비트에서 1, 감쇠
OFFP  = 동일, 반 비트 이동                               # 오프비트
HALF  = exp(-fmod(frame-F0+BIG, 2*FPB)/(FPB*0.45))      # 2비트마다
OFFB  = HALF가 한 비트 이동
SWAY(per,ph) = sin(pi*(frame-F0)/(FPB*per)+ph)
FR(bar) = F0 + round(4*FPB*bar)

dance(obj): 위치 Z += 바운스PULSE, 스케일 X (1+스쿼시PULSE), 스케일 Z (1-스쿼시PULSE), 회전 Y += 스웨이SWAY. 이웃 간에 PULSE와 OFFP를 번갈아 사용합니다. 손은 HALF/OFFB에서 어깨 으쓱. 카메라 ortho_scale = 16*(1 - zoom*PULSE)이며 키 처리된 zoom 사용자 정의 속성(드롭과 후렴에서 더 큼).

5. 한 번 빌드할 헬퍼 라이브러리

  • 도형: ell, rect, rrect, star, drop; F (채우기), S (선), P (채우기 + 잉크 외곽선).
  • emo(C,name,x,z,r,mood): 그림자, 노란색 그라데이션 원, 광택, 그 다음 분위기별 특징. o["r"]=r을 저장하여 액세서리가 크기를 조정할 수 있도록 합니다.
  • 스웩: chain(o,pendant,ice), grills(o), tattoo(o,kind,side) (눈물, 십자가, 별, 선, 텍스트), earring(o,side), hat(o,kind,col,col2,tilt) (자식 오브젝트로), headphones(o), hand(...) (반지 및 선택적 시계 포함).
  • 세계관: sky(C,X,top,mid,bot) (16색 밴드), ground, 조명이 켜진 창문이 있는 city 스카이라인, 회전 드라이버가 있는 wheel, phone.
  • preview(shots)는 33% 크기로 /tmp에 스틸을 렌더링하고 montage(paths)는 numpy로 하나의 이미지에 타일링합니다; blender__look(image=path)로 봅니다. 렌더링하기 전에 이 방법으로 모든 씬을 확인합니다.

6. 가사 레이어

  • 데이터: (kind, t0, t1, text) 형태의 목록으로, kind는 L 라인, A 애드립, H 훅 단어, B 큰 외침. 텍스트 블록에 JSON으로 저장합니다.
  • L: 단어로 분할, 크기 0.78에 0.44 간격으로 14.4 단위 너비로 줄 바꿈, 프레임 상단. 각 단어는 자체 GP 오브젝트이며 start + i*step(step은 라인 지속 시간에서 파생, 2~8프레임)에 나타나고 다음 라인의 시작 또는 씬 컷에서 숨겨집니다.
  • 단어별 드라이버: scale = vis * pop * (1+0.10*PULSE) (vis는 2프레임 인/아웃 램프, pop은 6프레임 오버슈트); location X/Z += shake*sin(frame*k+ph)*PULSE (베이스 진동용).
  • A: 분홍색, 기울어짐, 왼쪽과 오른쪽 교대. H: 노란색, 하단, 위에서 떨어짐. B: 금색, 크기 1.5, 상단.
  • 각 씬의 가사 오브젝트를 LYR_Sxx 컬렉션에 넣어 렌더링 청크가 나머지를 숨길 수 있도록 합니다.

7. 렌더링 (빠른 경로)

  • 전체 씬 렌더링은 모든 GP 오브젝트가 평가되므로 약 1.3초/프레임입니다. 대신 씬당 하나의 청크를 병렬로 렌더링: Sxx_, LYR_Sxx 및 CAMERA를 제외한 모든 컬렉션에 hide_render를 설정하고, 사운드 스트립을 제거하고, 오디오 없이 H264를 쓰는 씬당 백그라운드 Blender입니다. render_log.txt에 로그를 기록하는 분리된 실행기 프로세스(start_new_session=True)에서 한 번에 5개를 실행합니다.
  • 그런 다음 각 씬의 시작 프레임에 영화 스트립과 사운드 스트립이 있는 빈 공장 씬에서 H264 + AAC로 조합합니다. 해당 씬의 뷰 변환을 Standard로 설정하지 않으면 최종 비디오가 어둡고 채도가 낮게 나옵니다(공장 기본값은 AgX입니다).
  • 최종 파일이 확인될 때까지 청크를 삭제하지 마십시오.
  • 확인: mp4를 무비클립(프레임 수, fps, 크기) 및 사운드(레이트, 채널)로 로드합니다; Standard 뷰 변환으로 임시 시퀀서 씬을 통해 약 16프레임을 접촉 시트로 가져와서 확인합니다. 백그라운드 로그의 bgl 애드온 트레이스백은 무해합니다.
  • 빡빡한 루프에서 폴링하지 마십시오; 확인 사이에 약 5분간 대기하고 사용자에게 예상 시간을 알립니다.

8. 전달

  • mp4 및 .blend 파일의 위치를 알려줍니다(일반 텍스트와 computer:// 링크 포함). 접촉 시트를 보냅니다.
  • 확인하지 않은 사항(스틸은 보았지만 재생은 보지 못함)과 추정된 가사 섹션을 명시합니다.
  • 씬별 또는 가사 라인별 수정을 제공합니다; 타임라인 마커는 컷이며 가사 JSON은 타이밍을 보유합니다.

관련 스킬