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_scale16(뷰는 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은 타이밍을 보유합니다.