この記事はCodex製です。
##依頼内容と課題
- 既存の
shorts-ball-battle-v2のシード違いではなく、テーマのニュアンスを維持したまま「未知の新規シナリオ」で20本生成したい。 - 過去バッチの流用のみでは、見た目・展開が既視感に寄りやすい。
manifest.json/ YouTube メタデータの出力規約(タイトル=本文+絵文字+ハッシュタグ、100文字以内)も満たす必要がある。
##アプローチ
- 新規ジェネレータ
scripts/shorts-ball-battle-v5-batch.tsを追加。 - シナリオを20本新規定義(
mirror-maze〜crown-heist)。 - 共通物理エンジン(球体衝突 + 壁反発)に対して、シナリオごとに以下ハザードを組み合わせる設計にした。
- 収縮セーフゾーン
- 中央ホール吸引
- パルス衝撃
- ガスト(突風)
- 回転重力
- 可動ウォール
- 1シナリオごとに
buildParamsで乱数パラメータを与え、同シナリオ内でも挙動差分を出す構成にした。 - YouTube メタデータは
buildYouTubeMetaで正規化し、タイトルルールを強制。 package.jsonにshorts:ball:battle:v5を追加。- フィードバックを受けて、以下を追加実装した。
- 音声トラック再導入(AAC, 48kHz, 2ch)
- 動画終盤の「FINAL RESULT」パネル(勝者と上位チーム数)
- 実行ログに最終順位の出力(
[result] ...) - 背景・球体描画のスタイル分岐(画一感を下げる)
- 運用ルールを「まず1本生成→フィードバック待ち」に変更
- 再フィードバックを受けて、さらに以下へ修正した。
- 表示をV2寄りに簡素化(背景は単純グラデーション+境界線)
- 球体描画のエフェクトを最小化(単色+ハイライト)
- ホール表現を暗転塗りつぶしから輪郭線に変更
- 終盤結果表示を小型化して過剰演出を抑制
- ハザード強度を全体的に減衰(
hazardMulを縮小) - さらに
v5をいったん保留し、v2ベースへ回帰して新規ピースを追加する方針へ切り替えた- 追加ピース:
center-claim - 目的: 表示/演出はV2のシンプルさを維持しつつ、内容は未知シナリオにする
- 追加ピース:
##アウトプット
- 追加ファイル:
scripts/shorts-ball-battle-v5-batch.ts
- 変更ファイル:
package.json(shorts:ball:battle:v5スクリプト追加)
- 生成実行:
- コマンド:
bun run shorts:ball:battle:v5 -- --piece all --concurrency 2 --seed 2026022508 --output ./output/shorts-ball-battle-v5-batch-20260225-004750
- 結果:
output/shorts-ball-battle-v5-batch-20260225-004750に mp4 を20本生成manifest.json,youtube-metadata.json,youtube-metadata.csvを出力- 実行ログ上の完了値:
20/20 videos,104.30MB,1200.81s
- コマンド:
- フィードバック反映後のサンプル1本:
- コマンド:
bun run shorts:ball:battle:v5 -- --piece reactor-core --concurrency 1 --seed 2026022512 --output ./output/shorts-ball-battle-v5-feedback-20260225-0108
- 出力:
output/shorts-ball-battle-v5-feedback-20260225-0108/01-reactor-core-seed1399395227.mp4
- 確認:
ffprobeでcodec_name=aac,sample_rate=48000,channels=2を確認
- コマンド:
- シンプル化再調整後のサンプル1本:
- コマンド:
bun run shorts:ball:battle:v5 -- --piece mirror-maze --concurrency 1 --seed 2026022513 --output ./output/shorts-ball-battle-v5-feedback2-20260225-0122
- 出力:
output/shorts-ball-battle-v5-feedback2-20260225-0122/01-mirror-maze-seed1399395228.mp4
- 実行ログ:
[result] mirror-maze T1:60 T2:60
- 確認:
ffprobeでcodec_name=aac,sample_rate=48000,channels=2を確認
- コマンド:
- V2回帰版の新規サンプル1本:
- 実装:
scripts/shorts-ball-battle-v2-batch.tsに新規シミュレーションsimCenterClaimを追加PieceId/PIECE_IDS/PIECESにcenter-claimを追加
- コマンド:
bun run shorts:ball:battle:v2 -- --piece center-claim --concurrency 1 --seed 2026022514 --output ./output/shorts-ball-battle-v2-center-claim-20260225-0135
- 出力:
output/shorts-ball-battle-v2-center-claim-20260225-0135/01-center-claim-seed1399395229.mp4
- 確認:
ffprobeでcodec_name=aac,sample_rate=48000,channels=2を確認
- 実装:
- V2回帰版の新規20本(ユーザOK後の本生成):
- コマンド:
bun run shorts:ball:battle:v2 -- --piece center-claim --repeat 20 --concurrency 4 --seed 2026022515 --output ./output/shorts-ball-battle-v2-center-claim-batch20-20260225-0148
- 出力:
output/shorts-ball-battle-v2-center-claim-batch20-20260225-0148に mp4 を20本生成manifest.json,youtube-metadata.json,youtube-metadata.csvを出力
- 実行ログ:
Batch completed. 20/20 videos | 95.22MB | 938.86s
- 確認:
- 全20本で音声ストリームあり(
ffprobe集計:20 aac,48000,2) - ファイル名は
01-center-claim-r01-...mp4から20-center-claim-r20-...mp4まで連番で生成
- 全20本で音声ストリームあり(
- コマンド:
##参照した一次情報
Bun Runtime Documentation
FFmpeg Documentation
FFmpeg rawvideo Demuxer/Muxer Reference
@napi-rs/canvas (GitHub)
YouTube metadata limits (Google Help)
##一次情報・一次ソース
-
(推論)「未知性」を高めるため、固定シナリオ + 可変パラメータ設計が、単純シード差し替えより内容差分を出しやすいと判断した。