Egyptian promo video(エジプト・プロモーション動画)
全編をローカルマシン上で約60~70秒の縦型プロモーション動画にビルドします:
script.json ──► 音声(Gemini TTS、無料) ──► ラインごとのクリップ ──► タイムライン
screenshots ──► promo.html(seek(t) アニメーション) ──► puppeteer フレーム ──► ffmpeg
synth.cjs(オリジナルビート+SE) ──► サイドチェインダッキングミックス ──► loudnorm −14 LUFS ──► MP4 + WhatsApp コピー
すべてのシーンは、ナレーションのラインの長さに正確に一致するため、単語や声を変更すると動画全体のタイミングが自動的に再調整されます。
実証済みの例(レストラン注文システム:電話フックの混雑 → WhatsAppの痛点 → 解決策の提示 → メニュー → カート → QRテーブル → 注文追跡 → ダッシュボード → 統計 → ブランド+CTA)がデフォルトテンプレートです。他の製品にも、エンジンではなくシーンを変更することでこの構造を再利用できます。
必要なもの
- Node 18+、ffmpeg/ffprobeがPATHに含まれていること、Google Chrome(または
CHROME_PATHを設定)。 - ビルドフォルダ内:
npm i puppeteer-core qrcode msedge-tts@2(Cドライブが満杯の場合はnpm_config_cacheとTEMPを別のドライブに指定)。 - 音声用の無料 Google AI Studioキー(aistudio.google.com/apikey)。ユーザー自身が
VIDEO/.envにGEMINI_API_KEY=…を貼り付けます — ファイルはキーを空にして作成し、チャット内でキーを貼り付けたり出力したりしないでください。初回呼び出しで「Generative Language APIがこのプロジェクトで無効」と表示される場合があります:エラーのコンソールリンクをユーザーに渡して「有効化」をクリックしてもらい、1分後に再試行してください。
フォルダ構成
ユーザーのプロジェクト内(例:marketing/video-<brand>/)に VIDEO/ を作成します:
VIDEO/.env GEMINI_API_KEY= (ユーザーが入力)
VIDEO/script.json assets/script.example.json のコピー、編集済み
VIDEO/build/ このスキルからの scripts/* + assets/template/*
VIDEO/build/img/ promo.html で使用するスクリーンショットとロゴ
VIDEO/vo/ s01.wav … s10.wav (音声クリップ)
VIDEO/out/ レンダリング結果、sheet.jpg、timeline.json
ワークフロー
1. ブリーフィング(自分で見つけられないことだけ質問)
製品とその機能、ターゲット(誰が買うか)、ブランド名とその発音、カラーパレット+ロゴ(ユーザーのコード内を確認:tailwind config、icon.svg、Logoコンポーネント)、CTA、連絡先情報があれば。デフォルト形式:9:16、60~70秒、エジプト方言、男性のエネルギッシュな声。
2. スクリプト → script.json
10行、各シーン1行。実績のある構成:
- フック(0~4秒):視聴者が共感する痛みの質問(「今日、何件注文を逃した?…電話が忙しかったから?」)。
- 痛点:現在の悪い方法、損失で締めくくる。
- 解決策の提示:「じゃあ、想像してみて…」+製品(ここでビートドロップ)。 4~9. 各シーン1つの機能、それぞれ実際のスクリーンショット付き。
- ブランド+CTA:誰が提供しているか、購読/連絡への招待。
voice はTTSが読み上げる内容:エジプト人が話すように書く(عامية、「…」で息継ぎ、「?」で疑問調、数字は「أربعة وعشرين」、QRは「كيو آر」)。subtitles は視聴者が読むもの(数字「٢٤」、QR、ブランドはラテン文字)。headlines はシーン1~9の2~5単語のキネティックタイトル;強調する単語を *…* で囲む。
統計、パーセンテージ、価格、賞、またはお客様の声を創作しないこと — 視聴者とクライアントは検証できず、法的リスクが生じます。単に述べられたメリットで十分に売れます。
V/P/Gを含むブランド名:アラビア語にはVがないため、「نوفيكس」は「NOFIX」と読まれます。voice には ڤ(「نوڤيكス」)またはラテン文字(「NOVIX」)で書き、ステップ4で check-v.cjs を使用して確認します。
3. スクリーンショット(実際の製品、電話サイズ)
Puppeteerを 390×844, deviceScaleFactor 3(→ 1170×2532)で使用し、build/img/ に保存します。テンプレートが期待するファイル名:phone-home.png, phone-sweets.png, phone-restaurant.png, phone-options.png, phone-cart.png, tracking.png, dashboard-cancel.jpg, dashboard-stats.jpg, dashboard-products.jpg — 製品に応じてリネーム/置き換えます(詳細は references/template.md 参照)。
- リブランド/汎用デモ:
evaluateOnNewDocument+MutationObserverでスクリプトを注入し、古いブランド名を書き換え、ロゴのsrcを置き換え、電話番号を非表示にし、ブランド写真を差し替えた後、innerTextで残骸がないか確認します。 - ログイン済みページ(ダッシュボード):ユーザーが既にサインインしているアプリ内ブラウザペインを使用し(パスワードは絶対に入力しない)、375×812のビューポートをエミュレートし、
javascript_toolで同じDOM置換を適用して、そこでスクリーンショットを撮影します(ファイルが保存されるのでコピーできます)。ペインはタスク中にサイズがリセットされる場合があるため、各ショットの前にモバイルビューポートを再適用します。 - 実際の顧客データ:キャプチャ前に画面上の名前/電話番号をマスクします。現実的な状態(新規注文、キャンセルリクエスト)が必要な場合は、明確にラベル付けされたデモレコードを作成し、キャプチャ後、それらのレコードだけを削除し、削除されたことを確認します。
4. ナレーション
無料で自然なエジプト方言の声は、Gemini TTS(scripts/vo-gemini.cjs)から提供されます:
gemini-3.8-flash-ttsには92のネイティブエジプト方言の声(ar-eg-*、例:ar-eg-concierge-1若々しい/明るい、ar-eg-commercial-11広告声、ar-eg-storyteller-3カジュアル)があります。無料枠:このモデルは1日10リクエストのみ。gemini-3.1-flash-tts-previewには別の無料クォータがありますが、一般的な声のみ(Puck陽気な男性 — ユーザーの選択、Orusしっかりした男性、…)で、スタイルテキストでエジプト方言に誘導します。- コマンド(
VIDEO/buildから実行):node vo-gemini.cjs voices→ar-EGの声をリスト表示。node vo-gemini.cjs sample <voice> [voice...]→ 各声でフック行をvo/samples/にサンプリング(1リクエストずつ)。mp3に変換して送信し、ユーザーが耳で選べるようにします — あなたは聴けません。node vo-gemini.cjs all <voice>→ 1リクエストでスクリプト全体を生成し、ポーズで区切って10クリップに分割(クォータを節約し、1回の連続テイクのように聞こえます)。古いクリップはバックアップされます。node vo-gemini.cjs line <voice> <n>→ 1行だけ再録音。- モデルを切り替えるには
GEMINI_TTS_MODEL=gemini-3.1-flash-tts-previewを使用します。
- サンプルは賢く使う(5声で5リクエスト)。3.8のクォータが切れた場合、次の選択肢を提案:リセット(太平洋時間の真夜中頃)まで待つ、または今日は3.1で録音する。追加のGoogleアカウントでクォータを増やすよう提案しない — GoogleのAPI利用規約は制限回避を禁止しており、両方のアカウントが停止される可能性があります。
- フォールバック:
vo-edge.cjs(Microsoftar-EG-ShakirNeural、無制限、キー不要 — ユーザーはロボット的/非エジプト的と評価)、またはユーザーがスマートフォンでラインを録音し、あなたがトリミング/ノーマライズしてvo/sNN.wavに配置。ElevenLabsは優れていますが有料です。
すべてのテイクを確認 — あなたは聴けないので:
node transcribe.cjs [s05 s06…]は各クリップをGeminiテキストモデルで文字起こしします。各文字起こしがスクリプト行と一致する必要があります。クリップの末尾に次の行の単語がある場合、カットが遅すぎます:ffmpeg -af silencedetect=noise=-38dB:d=0.1でポーズを見つけ、末尾を次のクリップに移動します(-ssの落とし穴についてはgotchasを参照)。vo/take/のオリジナルから修正します。node check-v.cjs s10は、ブランドの子音が /v/ か /f/ かを(クリップごとに2回)質問します。既知の不良テイクをコントロールとして含めることで、チェックが機能していることを確認します。
5. テンプレートのテーマ設定
テンプレートには img/qr.png(node -e "require('qrcode').toFile('img/qr.png','<サイトURLまたはブランド>',{errorCorrectionLevel:'H',margin:1,width:680})" で作成 — 視聴者がスキャンできるため、実際の場所またはプレーンテキストを指定)、img/rest-logo.svg(デモビジネスのロゴ)、およびブランドアイコン(例では img/novix-icon.svg)も必要です。
assets/template/promo.html は NOVIX スタイル(ネイビー #0B1020、青→紫のグラデーション)。:root 変数、ステージ背景とグローカラー、.hl グラデーション、チップス/リング/字幕ピル、QRカード、最終シーン(ロゴ、ワードマーク、タグライン、CTA、機能ライン)を編集してテーマを変更します。references/template.md に各要素の場所とシーンの配線が記載されています。
6. チェック、プレビュー、レンダリング
VIDEO/build から:
node build.cjs --check— スクリーンショットなしですべての約2000フレームを実行;5分のレンダリング後ではなく、数秒でJSエラーをキャッチします。node build.cjs --preview 3→out/sheet.jpg。それを見る(画像を読む):ヘッドラインの折り返し、画面外の要素、コントラスト(例:オレンジのカードの上にオレンジのテキスト)、古いブランドの残骸などを確認。node build.cjs(バックグラウンドで実行、66秒で約5分)。動画と音声の長さ(一致する必要あり)およびラウドネス(≈ −14 LUFS)を報告します。- WhatsAppコピーをSendUserFileで送信(フルファイルは通常30MBを超え、デスクトップでのみ表示されます)、両方のファイルの場所をユーザーに伝え、文字起こしとフレームでチェックしたが聴いていないことを明確に伝えます。
7. 音楽
synth.cjs はオリジナルの98 BPM中東トラップビート(ダルブッカ、808、Dヒジャーズの撥弦ウード風リード)を、解決策提示シーンでのドロップと、ビジートーン/ウィッシュ/ディン/ビープ/ポップの効果音とともに作曲します。ライセンスライブラリ(例:Epidemic Soundコネクタ)はプレビューのみ許可し、ダウンロードは許可しない場合があります — プレビューは広告用ライセンスがないため、使用しないでください。
納品
- 最終ファイル:
out/<name>-9x16.mp4(1080×1920、30 fps、H.264、AAC、−14 LUFS)およびout/<name>-9x16-whatsapp.mp4。 - プレースホルダー(エンドカードの電話番号欠落など)があれば指摘し、次のステップ(連絡先情報の追加、横向きバージョン、サイトへの埋め込みなど)を提案します。
- スクリーンショットを公開ホスティングする必要があった場合(クラウド動画ツールでのみ必要)、ユーザーにその場所を伝え、削除を提案します。
何かを実行する前に references/gotchas.md を読んでください — このビルド中に遭遇したすべての失敗と修正がリストされています。