Communitygithub.com

ブロックタウン

「この街で/この世界で」スタイルの縦型ルールストーリービデオを、アイデアから完成品の1080x1920 MP4まで作成します。ルール、脚本、ナレーターの声、Blenderでコードから構築された世界とキャラクター、Three.jsでのレンダリング、ショット、ライフレイヤー、スマホ画面や小道具、カラオケ字幕、ElevenLabsまたは無料効果音、安定した声のミックス、音楽ファイルまでを一貫して生成します。ユーザーが「この街で」「この世界で」ビデオ、Robloxストーリー、ブロックタウン、タウンキット、/block-town と言った時、またはその脚本を書く、声を作る、アニメートする、キャラクター・小道具・スマホ画面・ランドマークを街に追加する、レンダリングする、字幕と音声を仕上げる、といった依頼があった時に使用します。

ブロックタウン とは?

Block Town(ブロックタウン)スキルは、ユーザーのアイデアを元に「この街で/この世界で」スタイルの完全な縦型ストーリービデオ(1080x1920 MP4)を自動生成するための包括的なツールキットです。Roblox風の3DタウンをBlenderでコードから構築し、Three.jsでレンダリングすることで、高品質かつ高速(66秒の動画で約10〜12分)に動画を生成します。キャラクターの呼吸や視線、タグのアニメーションなど、生命感あふれる「ライフレイヤー」を標準搭載し、静止画にならないよう徹底しています。また、Fish Audio(声)やElevenLabs(効果音)との連携、カラオケ字幕、音声レベリング、BGMの追加など、動画制作に必要な全工程を7つのゲートに分割し、各段階でユーザーに確認を取りながら進めるワークフローを備えています。このスキルはClaude Code, Cursor, CodexなどのAIエージェント環境で使用することを想定しており、ユーザーが「この街でビデオを作って」と依頼した際に、スクリプト作成から最終MP4出力までを一貫して支援します。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/chihabMe/block-town/tree/HEAD

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

ブロックタウン は何をしますか?

このフォルダは完全なキットです:街、キャスト、動き方、レンダラー、声、サウンド、音楽設定、そしてアイデアから完成した縦型ビデオまでのステップがすべて含まれています。スキルフォルダはこのファイルを含むディレクトリであり、以下では SKILL と呼びます。エピソードはその外側に置かれ(ユーザーがフォルダ名を決めます)、以下では EPISODE と呼びます。絶対パスを使用してください。

構築前に読むこと:docs/ROBLOX_LOOK.md(世界、キャスト、小道具、ショットの作り方)、docs/RENDER.md(Three.jsレンダラー、ライフレイヤー、タグ、スマホ画面、印刷された小道具)、docs/SCRIPT.md(ストーリーの書き方)、docs/VOICE.md(声と音楽)、docs/SOUND.md(効果音、ElevenLabs、安定した声のミックス)。docs/PROMPTS.md には各段階用のプロンプトがあります。docs/GUIDE.md は元のブロックルックマニュアルです:マップ、pose()、動きとカメラのルールは今も適用されます。

ビデオの作り方(ep05以降)

Blender がエピソードの Python コードからすべてを構築しポーズを付けます。Three.js が最終フレームを描画します。Blender のレンダラーはデザインシートとショットの静止画にのみ使用します。

episode.py ──(Blender: 街を構築、全フレームにポーズ、ライフレイヤー)──> bake: scene.glb + anim.bin + materials.json
           ──(Three.js in headless Chrome)──> EPISODE/frames/f_####.jpg  (1フレーム約0.1~0.15秒)
           ──(finish.py: 字幕、レベル調整済み音声、効果音、音楽)──> EPISODE/<name>.mp4 および <name>_music.mp4

66秒のエピソードの場合、フレームから完成MP4まで約 10~12分 かかります(Blender EEVEEでは約3時間かかっていました)。

絶対にしないこと

  • Robloxのカタログアイテム、ダウンロードしたモデル、映像、他のクリエイターのストーリーや音声は使用しません。画像内のすべてはコードで構築されるか、blockworld/pictures.py で描画されます。バイラル動画は技術の研究用に閲覧することはあっても、再利用は決してしません。
  • ユーザーの同意なしに有料APIを呼び出しません。Fish Audio(声)とElevenLabs(効果音)は有料です:実行前にその費用を伝えてください。sfx_gen.py は残りクレジットを確認し、予備を残して停止します。予備の値を上げたり、「もう一度試す」ために生成をループしたりすることは、許可なく行わないでください。何かをダウンロードする前に確認を取ること。
  • このキットには音楽や参照用の音声クリップは含まれていません。音楽はユーザーが提供するファイルのみを使用し、_music.mp4 コピーにのみ含めます。そのファイルが他のクリエイターの動画から切り取られたものである場合、_music.mp4 は投稿してはならないと明確に伝えてください:クリーンな <name>.mp4 を投稿し、曲はTikTokのサウンドピッカーで追加するよう指示します。
  • 8人のレギュラーキャラクター(色、髪型、服)は変更しないでください:blockworld/town.py。
  • 進行中のエピソードを別のルックに切り替えないでください。
  • 説明のない抽象的なグラフィックは使用しません。2つの小さなフィギュアの間にあるビーム、線、またはグローは、視聴者に何も伝えません(ep05の「すべてのバーを配る」ビームは「青い線」と読まれました)。物事自体を見せてください:タグから飛び出すバー、減少するカウンター、それを伝えるスマホ画面。

ルック

新しいエピソードは Robloxルック を使用します:build_town(..., style="roblox")。丸い頭とアニメ顔、レイヤードヘア、プリント服、光沢のあるプラスチック、太陽/霧/雨のムード、3単語のカラオケ字幕。古い ブロックルック(立方体の頭、フラットな色)は、そのルックで開始したエピソード用にまだ存在します:style なしの build_town(...) はブロックルックになります。そのため、新しいエピソードでは常に style="roblox" と記述してください。

品質基準(ユーザーが拒否した点、またはリクエストした点)

  • 何も決して静止させないこと。 ライフレイヤーを有効にしてレンダリングします(BT_LIFE=1、render_threejs.sh のデフォルト):呼吸、視線、重心移動、カットごとのバウンス、カメラの揺れとズームイン、揺れる木、漂う雲、浮遊タグ、回転するローディングスピナー、脈動するWi-Fiリング、跳ねる信号バー。カメラだけがゆっくり動くショットは弱いショットです:そのショットに独自のアクションを与えてください。
  • タグや吹き出しは決して隠れたり、途切れたりしないこと。 ライフレイヤーはそれらをすべての上に描画し、髪の上に持ち上げ、TikTokのセーフエリア内(x 5~85%、y は字幕より上)に収めます。2つのタグが互いに重ならないことを確認してください(まだ自動化されていません)。
  • すべての画面は本物のスマホのように見えること:big_phone(screen=...) と pictures.py の画像(ステータスバー、「No Service」、アプリアイコン、それを支える手)を使用し、3Dテキストが入った白い箱では絶対にありません。手持ちのスマホはロック画面を表示します。
  • 小道具はスマホサイズで読めること:紙の地図は実際に描かれた地図(paper_map())、看板は完全にフレーム内に収める(カメラを引いてください:10スタッドの看板は9:16で約25スタッドの距離が必要)。
  • 声が決して小さくならないこと。 finish.json で {"voice": "vo/voice_level.wav", "loudness": "static"} と設定します:ナレーションは文ごとにレベル調整され、ミックス全体に固定ゲインが適用されるため、大きな効果音があっても声が小さくなりません。測定:短期ラウドネスは動画全体を通して±1 dB以内(-14 LUFS目標)に保つ必要があります。
  • エフェクトを積み重ねたり、耳障りにしないこと。 一瞬に一つの音、瞬間より長く続かない、0.5秒以内に2つの「エラー」音を鳴らさない。

エピソード制作:7つのゲート

各ゲートの後で停止し、結果を表示し、ユーザーを待ちます。本当に創造的な選択がある場合、2~3の選択肢を提示し、どれをお勧めするか述べてください。

ゲート作成するものユーザーに見せるもの
1 ルール3つのルール(ユーザーのアイデアまたは docs/SCRIPT.md のテストから)、それぞれにムードとランドマーク案テーブル
2 脚本EPISODE/script.txt(一行一文)と EPISODE/SCRIPT.md:オプションAとB、ビートテーブル、批評家スコア脚本
3 声vo.py、words.py、voice_check.py(無料Fishテイク)、level_voice.pyvo/voice.wav、その数値
4 デザインEPISODE/design/episode.py:すべての新しいランドマーク、小道具、衣装、キャラクターの静止画1枚ずつ、EPISODE/pictures.json と pictures.py(すべてのスマホ画面と印刷小道具用)DESIGN_SHEET.jpg + 画面類
5 スチルすべてのショットを含む EPISODE/episode.py、check、スチル、修正、contact_sheet.pyCONTACT_SHEET.jpg
6 フック最初の約15秒:render_threejs.sh EPISODE 0 F1、サウンドキュー、finish.pyMP4
7 フル動画render_threejs.sh EPISODE、サウンド、finish.py(クリーンファイル+音楽ファイル)。承認後、有料ボイステイク両方のMP4

ゲートの詳細は docs/PROMPTS.md にあります(プロンプト1で全体を実行します)。examples/ep05-wifi をコピーして開始してください:これはこの方法で作られた完成エピソードで、デザインシート、42ショット、スマホ画像、キュー、設定が含まれています。

有料の最終テイクは新しい録音です:words.py と level_voice.py を再度実行し、check を行い、再レンダリングします(ショットはワードタイムに従います)。そのため、ゲート3では無料テイクのタイミングを承認しますが、ユーザーが投稿したい場合はゲート6の前に有料テイクを作成してください。

コマンド

# 声(ゲート3)
python3 SKILL/blockworld/vo.py EPISODE                 # Fish "Roblox"ボイスで1テイク(vo_config.json)
python3 SKILL/blockworld/vo.py EPISODE --post-only     # 保存したテイクのタイトネス/プレゼンス/テンポを再調整、新しい呼び出しなし
python3 SKILL/blockworld/words.py EPISODE              # ワードタイム → vo/times.json
python3 -I SKILL/blockworld/voice_check.py EPISODE     # ペース、間、明るさをバイラル範囲と比較
python3 -I SKILL/blockworld/level_voice.py EPISODE     # 各文を1つのレベルに → vo/voice_level.wav

# 小道具用画像(ゲート4)
python3 -I SKILL/blockworld/pictures.py EPISODE        # EPISODE/pictures.json → EPISODE/pictures/*.png

# ショット(ゲート4-5):Blender、常に run.py を通して --factory-startup 付きで実行
blender -b --factory-startup --python-exit-code 1 -P SKILL/blockworld/run.py -- EPISODE check
BT_LIFE=1 blender -b --factory-startup --python-exit-code 1 -P SKILL/blockworld/run.py -- EPISODE stills [shot ...]
blender -b --factory-startup --python-exit-code 1 -P SKILL/blockworld/run.py -- EPISODE frame 12.5
python3 -I SKILL/blockworld/contact_sheet.py EPISODE   # ショットごとに番号付き静止画1枚 → CONTACT_SHEET.jpg

# 最終フレーム(ゲート6-7):Three.js
bash SKILL/blockworld/render_threejs.sh EPISODE              # 全フレーム → EPISODE/frames/(66秒で約10分)
bash SKILL/blockworld/render_threejs.sh EPISODE F0 F1        # F0..F1のみ(フック、再レンダリングしたショット)

# 効果音(ゲート6-7):docs/SOUND.md 参照
python3 -I SKILL/blockworld/sfx_gen.py --credits             # ElevenLabsクレジット残高確認
python3 -I SKILL/blockworld/sfx_gen.py el-tag-pop ep07-...   # sfx/ELEVENLABS_LIST.md から名前付きサウンドを生成
python3 -I SKILL/blockworld/cues.py EPISODE cues_spec.json   # ワードによるキュー("say": "froze")→ EPISODE/cues.json

# 仕上げ(ゲート6-7)
python3 -I SKILL/blockworld/finish.py EPISODE                # 字幕+声+効果音(+音楽)→ MP4ファイル
  • check は何もレンダリングしません:すべてのショットを実行し、ショットテーブルを表示し、2.5秒を超えるショットについて警告します。
  • 自動静止画チェック(blockworld/stillcheck.py、ep08以降):すべてのショットで focus(character, tag, ...) を呼び出します。check と stills はその後、顔の隠れ(柱、人、タグ、キャラクター自身の腕による)、顔が字幕帯の下にある、タグがセーフエリア外(x 5-85%、TikTokのトップバーと字幕の間)、タグ同士の重なり、レンズから1スタッド以内のものを報告します。結果は EPISODE/still_check.txt に出力されます。スチルを見せる前にすべての行を修正し、その後も実際に目で確認してください:フレーミングや画像が台詞を伝えているかどうかは判断しません。
  • 60 fps モーションブラー(オプション):finish.json で "render_fps": 240, "blur": 4 と設定すると、毎秒240フレームをレンダリングし、4フレームずつ平均して60 fpsにします。動画1秒あたり約1.6分のレンダリング時間が必要です。
  • カラーターン(オプション):finish.json で "grade": {"word": 24, "ramp": 0.5, "saturation": 0.6, "brightness": -0.05, "cool": 0.1, "vignette": true} と設定すると、その脚本ワード(物語の転換点)から画像がより寒色、暗く、フラットにフェードします。字幕はグレーディングされません。finish.py EPISODE --plain は、比較用に <name>_plain.mp4(30 fps、ブラーなし、グレードなし)も書き出します。
  • ep08 (episodes/ep08-price-tags-10s) はこれらの10秒テストで、約1秒のショットで構成されています。
  • stills はショットごとに2枚の半分サイズのBlender画像(30%と85%の時点)を EPISODE/stills/ に書き出します。BT_LIFE=1 を使用して、タグが最終レンダリングと同じように配置されるようにします。すべてのスチルを確認してから いずれかを表示してください。
  • render_threejs.sh はコマンドがタイムアウトした場合、バックグラウンドで実行されます(66秒で約10分)。初回使用時に2つのnpmパッケージをインストールします(blockworld/threejs/)。ChromeまたはChromiumが必要です(CHROME=/path で選択)。ベイク結果は EPISODE/threejs/ に保持されます。ユーザーが動画を承認した後、このフォルダと frames/ を削除してください。
  • episode.py、セットピース、または画像を変更した後は、render_threejs.sh を再実行してください(ベイクはコードを読み込みます。実行間でキャッシュされるものはありません)。
  • render_all.sh(Blender EEVEEフレーム)は比較用にのみ保持されています:1フレーム約3~6秒かかります。
  • フック:render_threejs.sh EPISODE 0 F1 を実行します。ここで F1 は約15秒後の最初のカット直前のフレームです。次に finish.py を実行し(存在するフレームを使用します)、フル動画で上書きされないようにMP4ファイル名を変更します。
  • 動画全体にわたってフレームを確認し(各ショットにつき最低1フレーム)、ラウドネスを測定してから完了とします。聞くことができない場合は、そのことを明確に述べ、代わりに確認した内容をリストアップしてください。

配置場所

パス内容
blockworld/town.py通り、キャスト、pose()、ライト、カメラ、build_town(style=...)
blockworld/roblox.pyRobloxルック:rchar、プラスチック、ムード、rule_sign、giant_clock、puddles
blockworld/rprops.py既製小道具:信号バータグと飛ぶバートークン、実際の画面と手が付いたスマホ、照らされて印刷された写真、折りたたみ地図、ポスター、サッシュ、シルクハット、バス、ドア、ビーム、鳩、Wi-Fiタワー
blockworld/pictures.py、blockworld/pictures/pictures.json からスマホ画面、ロック画面、地図を描画します。キットのデフォルト画像
blockworld/anim.pyワードタイミングヘルパー、カード(タグ、吹き出し)、stand、walk、ランナー
blockworld/life.pyライフレイヤー(BT_LIFE=1):アイドルモーション、カメラ、シーンの揺れ、スピナー、タグ配置
blockworld/threejs/レンダラー:bake.py(Blender側)、scene.html + capture.mjs(Three.js側)
blockworld/render_threejs.shベイク+描画、最終フレームを作成する通常の方法
blockworld/vo.py、words.py、voice_check.py、level_voice.py声、ワードタイム、声チェック、レベル調整
blockworld/sfx_gen.py、sfx/ELEVENLABS_LIST.mdElevenLabs効果音:ジェネレーターとプロンプトリスト
blockworld/finish.py字幕、声、効果音(ループするBGMも)、音楽、ステディミックス、MP4ファイル
blockworld/cues.pyワードによるキューのリスト → cues.json
sfx/効果音:Pixabayセット(sfx/CREDITS.md);ElevenLabsサウンドは生成されると el-*.mp3 / epNN-*.mp3 としてここに配置されます(ep05時点ではまだありません)
examples/ep05-wifi完全な作業エピソード(Robloxルック、Three.jsレンダラー)
examples/ep00-roblox-look、examples/ep01-introRobloxルックとブロックルックの短いデモ

関連スキル