Emoji Party (ビート同期エモージワールド歌詞ビデオ, Blender Grease Pencil)
ユーザーが任意のジャンルの楽曲(オーディオファイル)とその歌詞を提供するか、楽器演奏のみの場合は歌詞なしで提供します。あなたはフルレングスの1080pビデオを納品します。各セクションに1つの認識可能なエモージフェイスが割り当てられ、それぞれ独自のワールドとカラースキームの中で、共感できる何かをし、ビートに合わせて踊り、歌詞が画面にポップアップし、バスで揺れます。「Mr Me」(150 BPM, 4:12, 15シーン, ~840オブジェクト、約10分でレンダリング)で実証済みです。
0. クリエイティブルール(ユーザーから学んだもの)
- リーダーは感情を運ぶエモージフェイスであり、シーンごとに異なります(不安、ニヤリ、包帯、息を切らす、泣き笑い、シーッ、驚愕、オタク、怒り、熱、星目、口にジッパー、マネーマウス、後光、パーティー)。オブジェクト(ろうそく、コンパス、ダイヤモンド)は小道具のみで、決してリーダーにはなりません。
- すべてのリーダーにスワッグを: すべてのリーダーは何かを身につけています。ラップの場合はペンダント付きチェーン、グリル、顔のタトゥー、イヤリング、帽子(キャップ、デュラグ、バケットハット、ビーニー、クラウン)。他のジャンルについてはセクション0bを参照。
- シーンごとに共感できるアクション: 運転、自転車に乗る、試験を受ける、スマホで撮影、釣り、DJ、ウェイトリフティング、自撮り、お金を投げる。
- シーンごとに1つのパレットを歌詞のムードから選びます。歌詞のスタイルはシーン間で一定に保たれ、ビデオが一貫した作品として読めるようにします。
- 1人の繰り返し登場するリーダー(サングラスのエモージ)がコーラスを担当し、最後のコーラスでキャスト全員を引き連れて戻ってきます。
- オリジナルのエモージスタイルのキャラクターを描きます。ベンダーの絵文字セットをコピーしないでください。
- 最初に1つのテストシーン(または3つのパレットオプション)を表示し、すべてを構築する前に承認を得てください。SendUserFileでプレビュースチルを送信します。
0b. 音楽に適応する(任意のジャンル)
何かを選ぶ前にトラックを読み取ります。ジャンルは入力であり、仮定ではありません。
- テンポ検索: 60〜180 BPMを検索し、スネアまたはクラップがどこに落ちるか(ビート2と4)でハーフ/ダブルタイムを解決します。トラップやヒップホップは140〜150と読まれることが多いですが、ハーフタイムに感じられます。ドラムンベースは170+と読まれますが、ハーフスピードでアニメーション化できます。
FPB(感じられるビート)とグリッドビートの両方を保存します。 - 拍子: デフォルトは1小節あたり4拍。拍子をパラメータにします(ワルツは3、6/8拍子は6)。
FR(bar)と小節長さの式で使用します。 - テンポのゆらぎ(ライブバンド、古い録音): コムスコアが弱いかドリフトする場合は、トラックされたビートリストを使用し、固定周期の式の代わりにビートごとに
beat_phaseプロパティをキーイングします。 - フレームレート: 感じられるビートあたりのフレーム数が整数になるfpsを選択します。それ以外の場合は25にして、端数のビートを受け入れます。
- フィールによる動き:
- フォー・オン・ザ・フロア(ハウス、テクノ、ディスコ、アマピアノ): すべてのビートで均等なバウンス、安定した揺れ。
- ハーフタイム(トラップ、ヒップホップ、ドリル、ダブステップ): ビート1で大きなヒット、ビート3で後ろに傾く、小さなハットスピードのディテール。
- オフビート(レゲエ、ダンスホール、アフロビーツ、スカ): OFFPでバウンス、ヒップは2ビート周期で揺れる。
- 速い(ドラムンベース、パンク、ハードコア): 体はハーフスピード、手と小道具はフルスピード。
- 遅い(バラード、R&B、ソウル、ローファイ): 揺れのみ、長い周期、ほとんどスクワッシュなし、ポップの代わりにゆっくりとした歌詞フェード。
- スウィング/三連符(ジャズ、ブルース、シャッフル): オフビートをビートの3分の2に遅らせる。
- エネルギーによるカットレート: 落ち着いているときは8〜16小節、コーラスでは4小節、ドロップとピークでは1〜2小節。
- ジャンルと歌詞からルックを決定: 音楽に属するパレット、ワールド、帽子、アクセサリーを選択します(ラップにはチェーンとグリル、ダンスミュージックにはヘッドホンとバイザー、カントリーにはカウボーイハット、フォークには花、ロックにはスタッド)。常にエモージフェイスをリーダーにし、スワッグルールを守ります:すべてのリーダーは何かを身につけています。
- 歌詞スタイル: バスが強いトラックではハードポップとシェイク、柔らかいトラックではスムーススライドとフェード、チャントやフックでは大きなタイプ。言語は提供された歌詞に従います(方言やピジンを「修正」しないでください)。
- インストゥルメンタル: 歌詞レイヤーなし。タイトル、セクション名、またはドロップでの短いムードワードを使用し、小道具にストーリーを任せます。
- 構築する前に、1行でユーザーに読み取り結果を確認します(BPM、フィール、セクションマップ)。
1. 楽曲解析(ワークスペース)
pip install --break-system-packages -q librosaを実行し、BPM範囲での低バンド(<130 Hz)フラックスに対するコム検索で正確なBPMと最初のビートオフセットを取得。小節ごとのキック(K)とラウドネス(R)を出力して、イントロ、グルーヴ、ドロップ、ドロップアウトを確認します。プロンプトに書かれているBPMを信頼しないでください(Sunoプロンプトは140と言っていましたが、トラックは150でした)。- フレームレートは、ビートあたりのフレーム数が整数になる場合(120、125、150 BPMが該当)は25 fpsを使用します。
- 歌詞タイミング: 音声モデルはワークスペースにダウンロードできず、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 = index * 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()を呼び出します。 - 各塗りつぶしストロークにゼロ以外の
fill_idがないと塗りつぶしはレンダリングされません。塗りつぶしには一意のintstroke.fill_idを設定し、ラインには0を設定します。塗りつぶし専用ストロークではstroke.hide_stroke = Trueを設定します。1つのテキストグリフのすべてのループに同じ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を1ビートシフト
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 - ズーム*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でそれらを1つの画像にタイルします。blender__look(image=path)で表示します。レンダリング前にすべてのシーンをこの方法で確認します。
6. 歌詞レイヤー
- データ:
(kind, t0, t1, text)のリスト。kindはLライン、Aアドリブ、Hフックワード、Bビッグシャウト。テキストブロックにJSONとして保存します。 L: 単語に分割し、幅14.4単位、サイズ0.78、ギャップ0.44でフレーム上部に折り返します。各単語は独自の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 s/フレームです。代わりにシーンごとに1チャンクを並列レンダリングします。各シーンのバックグラウンドBlenderで、
Sxx_、LYR_Sxx、CAMERAを除くすべてのコレクションにhide_renderを設定し、サウンドストリップを削除し、H264(音声なし)を書き出します。render_log.txtにログを記録するデタッチされたランナープロセス(start_new_session=True)から5つ同時に実行します。 - その後、各シーンの開始フレームにムービーストリップとサウンドストリップを配置したファクトリー空シーンでH264 + AACをアセンブルします。そのシーンのビュートランスフォームをStandardに設定します。そうしないと、最終ビデオが暗く彩度の低いものになります(ファクトリーデフォルトはAgX)。
- 最終ファイルが検証されるまでチャンクを削除しないでください。
- 検証: mp4をムービークリップとして(フレーム数、fps、サイズ)およびサウンドとして(レート、チャンネル)読み込み。Standardビュートランスフォームの一時的なシーケンサーシーンを通して約16フレームをコンタクトシートに引き出して確認します。バックグラウンドログの
bglアドオントレースバックは無害です。 - タイトループでポーリングしないでください。チェックの間に約5分間スリープし、予想時間をユーザーに伝えます。
8. 納品
- mp4と.blendの場所を伝えます(プレーンテキストとcomputer://リンク)。コンタクトシートも送信します。
- 何がチェックされていないか(スチルは見たが、再生は見ていない)、どの歌詞セクションが推定されたかを明記します。
- シーンごとまたは歌詞行ごとの修正を提供します。タイムラインマーカーがカットであり、歌詞JSONにタイミングが含まれています。