SaaS プロモ (テンプレート: "skill 1")
このスキルは、1つの設定ファイル promo.json から完成したプロモーションビデオを生成します。クラシックな約11秒のカット、または promo.json に chapters がある場合は約50秒のロングカットです。すべてのフレームはヘッドレスChrome上でキャンバスシーンとして描画されます。ストックフッテージ、AIビデオ、テンプレートサービスは一切使用しません。
- 画像: ユーザー自身のスクリーンショット、アプリUI、デザイン、または動画の静止画。不足分は組み込みのUIカードで補います。
- テキスト: ユーザー自身のテキスト。
- 音声: すべてのキューにエフェクトが付き、オリジナルのシンセベッドまたはユーザー自身のトラックが流れます。
構造は固定されており、リファレンスリール skill 1 .MP4(TikTokのSaaSエージェンシーリール)のペーシングを再現しています。技術のみがコピーされており、そのフッテージ、言葉、ブランディング、ウォーターマークは一切使用されません。
| 時間 | シーン |
|---|---|
| 0~0.5秒 | 大きなグリフ(# < @ ! ?)が中央でフラッシュ。紫とライムのネオンバー、4点スパークルが薄暗いドットマトリクスグリフフィールド上でストロボ点灯。 |
| 0.5~3.3秒 | text.typed がカーソルとともに入力される。26枚のカードが遠くから飛来し、3Dリングとして単語を周回(最初はハーフトーンドット、次に実際の画像)。リングは加速し、カメラの前を急通過してブラーアウト。 |
| 3.3~6.45秒 | 雲、鳥、蝶がいるペイントされた草原。パステル調から彩度が上がる。3枚のカードが右からスライドインし、残りが12枚のベントー壁に飛び込む。bento[0] がヒーローカードにタイプ入力、bento[1] が背の高いガラスカードに縦書きでタイプ入力、2枚のカードが画像を交換、bento[2] が白いカードにタイプ入力。その後カメラがそのカードにズームイン。 |
| 6.45~約8.8秒 | 暗いドットウェーブフィールド。光るグラデーションオーブがポップインし、左にスライド。headline が単語ごとに表示(ブラーからシャープへ)、次に sub がワイプイン。すべてがデフォーカス。 |
| 約8.8~11.1秒 | グリッチ(色相シフト、スライス)からヒーローへ:青からオレンジの空に長時間露光の青/白の花、飛び交う ! @ # $ % * 記号とデジタルレイン。from がブラーイン・アウト、次に to がブームとともに着地し、オプションのロゴがその下に表示される。フェードアウトで終了。 |
長さは約11.1秒です。見出しが長いと少し伸びます。サブラインは常に約0.85秒表示されるためです。
ロングカット(約50秒):chapters
"chapters"(製品、プロジェクト、テーマごとに1つ)を追加すると、同じ4つのシーンが各1.5小節のビートとして繰り返され、フィナーレは2小節となります。
| ビート | 再生内容 |
|---|---|
| イントロ | オープン(typed + すべてのスワール)→ 壁(すべての画像、bento)→ オーブ(headline / sub) |
| 各チャプター | オープン(チャプターの typed、その画像をスワールに含む。typed がない場合はスキップ)→ 壁(その画像を先頭に、その bento、その wall ルック)→ オーブ(その headline / sub / orb カラー) |
| エンド | フィナーレ(from / to / url / ロゴ)、2小節 |
3つのタイプライターオープナーを持つ4チャプターで合計23小節、109 BPM で約50秒です。
- 画像: 各画像に
"tag"を付けてチャプターに分類します。 - 壁のルック:
"meadow"(昼)、"dusk"(夕暮れ)、"dark"(チャプターのオーブカラーで発光するドットウェーブフィールド)から選択。これらを交互に使用することでチャプターを区別します。 - 音楽同期:
musicを使用する場合、assets.pyが曲のテンポとドロップ(エネルギーの最大の上昇ポイント、キックドラムにスナップ)を測定します。ビデオは、イントロスワール後の最初のカットがドロップに合うように開始され、以降のすべてのカットはバーグリッド上に配置されます。- 出力された
music: … bpm, drop at … s行を確認してください。間違っている場合は、自分でbpmとmusicDrop(曲の秒数)を指定してください。 sfxLevel(例:-4)を使用して、エフェクトを曲の下に収まるように調整します。
- 著作権: 商用曲を使用すると、公開時に動画がミュートされたり、クレームが付く可能性があります。この点に言及し、公開投稿にはプラットフォームのサウンドライブラリを推奨してください。
必要環境: ffmpeg、Node 22以上、Google Chrome または Chromium(CHROME_PATH)、および numpy と scipy をインストールした Python(PROMO_PY。promo.sh が自動で探します)。
ワークフロー
1. プロモに必要なものを集める
- カード(8~20枚の画像): プロダクト、ウェブサイト、アプリ、ダッシュボードのスクリーンショット、デザイン作品、ユーザーの動画からの静止画。画像と動画の両方が使用可能。動画の場合は
"at"秒、または長さの30%の位置の静止画が使われます。横向きの画像はワイドスロットに、縦向きの画像は縦長スロットに配置されます。8枚未満の場合は、組み込みのUIカード(検索バー、フォーム、チャート、グラデーションオーブ、ピルなど。text.labelsでラベル付け)が残りを埋めます。まず画像を確認し、ほとんど空の画像は除外してください。 - テキスト: シーンが一定の速度でタイプ・表示するため、短く簡潔にしてください。
typed: 句読点を含む1つの単語または名前、約4~8文字("SaaS."、"KumNit.")。bento: 3つの短いフレーズ(1語、2~4語、2~3語)。headline: 5~8語。sub: 最大約90文字の1行。from/to: 最後の "From … / To …" のペア。- クメール語(
"lang": "km")の場合は、自然なクメール語で記述してください。一度に1つずつ表示されるべきheadline、from、toのチャンクの間にはスペースを入れてください。Kantumruy Pro フォントがバンドルされています。
- オプション:
logo: 最後の行の下に表示されます。不透明なロゴは角丸のアプリアイコンになります。text.url: エンドカードにウェブサイトの行を表示します。hero: 花の代わりにユーザー自身のフィナーレ画像を使用します。backdrop: ペイントされた草原の代わりに画像を使用します。music: ユーザー自身のトラック。ロングカットでは、そのドロップが最初のカットに合うように調整されます。上書きするにはmusicStartを設定します。chapters: 約50秒のロングカット。各チャプターのtag、typed、bento、headline、sub、wall、orbを指定します。sfxDir: ユーザー自身の効果音フォルダ。colors: ネオン、オーブ、空、シンボルのブランドカラー。
2. プロジェクトを書く
プロジェクトフォルダを作成し、examples/kumnit-saas.json(または -km.json)を promo.json としてコピーし、編集します。すべてのキーは references/config.md で説明されています。パスはプロジェクトフォルダからの相対パスです。
3. プレビュー(約10秒)
<skill>/scripts/promo.sh <project>/promo.json --preview
これにより、画像の準備(および音楽の測定)が行われ、12枚の静止画(ロングカットのビートごとに1枚)が out/<name>-preview.png にレンダリングされます。これを確認し、以下をチェックしてください。
- タイプされた単語がカードと重なっていない。
- テキストが詰め込まれていない。長いテキストは収まるように縮小されますが、読みにくくなります。
- ヒーローカード(大きく左側)に適切な画像が表示されている。
cardsの最初の横向き画像が使用されます。 - フィナーレのテキストが花やヒーロー画像の上で読める。
4. レンダリング(1分未満。ロングカットは約4分なのでバックグラウンドで実行)
<skill>/scripts/promo.sh <project>/promo.json
ステージは次の順序で実行されます: assets、plan(タイムラインとシーンからのサウンドキュー)、render(3つのChromeレンダラー、--jobs N)、mix、encode。
--from mixはフレームを再レンダリングせずにサウンドを再ミックスし、エンコードし直します。--from renderは画像を再描画します。
出力: out/<name>-1080p60.mp4 および out/<name>-contact.png(ビデオ全体から約30フレーム)。
5. 引き渡し前に確認
- コンタクトシートを確認します。
ffprobeで約11.1秒(クラシック)またはビートの合計時間(ロング。build/cues.jsonに各ビートがリストされています)が表示されるはずです。ミックスは -14 LUFS / -1 dBTP にノーマライズされています。次のコマンドで測定できます:ffmpeg -i out.mp4 -af ebur128 -f null -- ミックスステージで、
sfxDirから使用された効果音の数とシンセサイズされた効果音の数が表示されます。 - 結果の音声は聞こえないため、確認した内容をユーザーに伝え、聴いてもらうよう依頼してください。イントロのクリックと草原のインパクトが最も大きな音です。
チューニング
- タイミング:
scripts/scene.mjsの先頭にあるplan()にクラシックシーンの時間が保持されています。beatSpecs()がビートをレイアウトし、mapT()がそれらの時間を各ビートに移動・伸縮します。audio.pyがbuild/cues.jsonから読み取るため、cuesFor()のサウンドキューは自動的に追従します。
- ルック:
- 色は
colorsから取得されます。 - ベントーレイアウトは
scene.mjsのSLOTSテーブルです。 - 草原、花、オーブは
buildMeadow、drawFlower、drawOrbで描画されます。
- 色は
- サウンド:
scripts/audio.pyのSFXテーブルにあるファイル名がsfxDirで試行され、キューごとにバリアントが選択されます。ベッドのコードとセクションはmake_bed()にあります。 - サイズ: テンプレートと同様、1920×1080のみ。縦9:16版には独自のレイアウトが必要です。