製品プロモーション動画(promo-video)
あなたが行うことはたった2つ:ショットを選ぶ、テキストを埋める。コードは書かない、template/、scripts/、industries/ 内のファイルは一切変更しない、座標、フレーム数、色の値は指定しない。
以下 <SKILL> = このファイルが存在するディレクトリ。コマンドは全て Node 22 / Python 3.10 で実行。English speaker or English video needed → read <SKILL>/SKILL.en.md instead.
手順
- 業種と言語を決める。
meta.industry:software(デフォルト)/food(フード)/ecommerce(EC実物)/education(教育)/beauty(美容)/travel(旅行・宿泊)。間違った業種を選ぶと、使えるショットやコンプライアンスルールが正しく適用されない。meta.lang:zh(デフォルト)/en。動画に英語字幕が必要で、ユーザーが英語圏の場合はenにする(使用方法は手順5を参照)。- 業種が software 以外の場合 → 先に
<SKILL>/industries/<industry>/recipe.mdを読む(英語プロジェクトの場合はrecipe.en.md):この業種で推奨されるショットの組み合わせ、brief-template.md(この業種のブリーフで質問すべき項目)、test-brief.md/expected.md(コンプライアンス違反の例)が記載されている。この手順を飛ばすと、簡単にブロックされる内容を書いてしまうことになる。
- ブリーフを読む。対応する
brief-template.mdの項目に従って理解する。「製品名 / 一言のセールスポイント / 課題のシーン / コアとなるアクション / 2~4個のセールスポイント」が不足している場合は、まず質問し、データや機能をでっち上げない。meta.productはブリーフの製品名をそのままコピーする。動画全体(フックカプセル、エンドカードのブランド)でこの名前だけを使い、エンドカードのbrandは一字一句同じでなければならない。meta.action:必須。一言で「ユーザーが何をする → 製品が何を提供するか」(例:「レシートを撮る → 金額とカテゴリが自動で入力される」)、画面描写は不要。デモンストレーション系のショット(chat/phone/mockApp/photoShot)の画面テキストはこのアクションを反映する必要があり、検証で確認される。- ブリーフに「入手方法」の内容がある場合 → そのまま
meta.ctaに書き、エンドカードのctaもそれをコピーする。ブリーフに「なし」とある場合 → 両方とも書かない。自分で「アプリストアでXXを検索」などと書かない。 - ブリーフにない機能は、セールスポイントやエンドカードに書かない。
- ブリーフに「数字と出典」の内容がある場合 → 各項目を
meta.factsにコピーする。形式は[{"id":"f1","text":"原文…"}](単なる文字列の配列ではない)。画面上に表示される単位付きの数字(時間、パーセンテージ、倍率、人数、金額)は、すべてここで同じ数字を見つけられる必要がある。出典のない数字はすべてエラーとして扱われ、警告ではない。データが本当にない場合は、定性的な表現を使い、数字をでっち上げない。ショットのparams.refs: ["f1"]で、特定の表現(例:「できたて」)と特定の fact を関連付けることができる。これは業種ルールの確認に使用される。 - 動画全体で、同じ事柄の所要時間は一つの数字のみを使用する:counter で 3分と書いたら、他の場所で「秒で」「3秒」と書いてはいけない。フックで「半日」と書いたら、counter の古い値も「半日」でなければならない。検証でエラーになる。
compareの同じ欄のstatとitemsも矛盾してはいけない(例:左欄に「5分」と「3日」の両方を書くなど)。 - デフォルトの15~45秒の長さ範囲を超えたい場合(例:業種推奨構成で27秒以上必要な場合)、
meta.durationRange: [15, 60]のように2要素の配列を書く。 - 下部に常駐させる小さなテキスト(例:「期間限定キャンペーン。詳細はクーポン詳細ページをご確認ください」)が必要な場合、
meta.noticesに最大3つの文字列の配列として書き、下部に1行で表示される。
- ディレクトリを作成する:
promo/<製品名英語>/、ストーリーボードはpromo/<製品名英語>/storyboard.jsonに書く。ユーザーから提供されたスクリーンショット/録画/ロゴは同じディレクトリにコピーする。 - テーマを選ぶ(
meta.theme):- 感情、ソーシャル、ライフ →
warm-emotion - 開発者、AI、ハードコアツール →
tech-dark - 健康、学習、家計簿、軽量ツール →
fresh-light - オフィス、B2B、効率化 →
business-blue - 祝日、プロモーション、新商品 →
festival-red - ハイエンド、ミニマル、デザイン →
mono-premiumブランドカラーがある場合はmeta.brandColor(#RRGGBB)を書く。これはアクセントカラーのみを変更する。
- 感情、ソーシャル、ライフ →
- 5~9個のショットを選ぶ(ショットの説明は
<SKILL>/shots.md、18個のショットの一覧表は最上部にある)。hookは最初のショット(2~3秒)、endCardは最後のショット(4秒)でなければならない。 コアアクションをデモンストレーションするショットが1つは必須(手順2で書いたmeta.action)。検証でエラーになる。chatは messages + panel(質問 → 回答)を書く。またはmockAppは input(ユーザー入力/質問)+ 結果(dashboard の stat、editor の items、done)を書く。スクリーンショットがある場合はphoneを使う。meta.industryが使用可能なショットを決定する(industries/<industry>/rules.jsonのenabledShots、または recipe.md を直接参照)。許可されていないショットを選ぶと検証でエラーになる。7つの業種別ショット(software ではデフォルトで無効):photoShot実写写真/ショート動画(料理、商品、作品、部屋、共用スペース、キッチン)priceCard価格表;storeCard店舗/地図/予約;reviewCard実際の顧客レビュー(原文をそのまま引用。誇張した書き換えは不可)factSheetスペック表/開封リスト/コース概要/試験情報/カラーチャート;credCard資格/実績カードbeforeAfter前後比較スライダー(美容業のみ利用可能。consent:true+retouched:falseが必要) 中間部は製品タイプに応じてショットを選び、固定テンプレートを使わない。featuresセールスポイントカードは必須ではない。2つのハード要件(検証で警告される):- 中間部に少なくとも1ショットは {compare, steps, phone, meter} から選ぶこと。
- quickList と counter は同時に使用しない(両方使うと、hook → quickList → mockApp → counter → endCard という誰でも同じテンプレートになってしまう)。
software 業種で使用可能な組み合わせ(一つ選び、製品に合わせて変更する。他の業種は
industries/<industry>/recipe.mdの推奨構成に従う): - C向け感情/ソーシャル(チャット、感情、伴走):hook(bubble) → chat デモ(2~3文の字幕で書く)→ meter または compare で「この一言の重み」を伝える → quickList クイックカット → endCard
- ツール効率化(ライティング、家計簿、公開、編集):hook(stat) → compare で「以前 vs 現在」を伝える → mockApp editor/form デモ「入力 → 結果」→ steps で使い方を説明 → endCard;または hook → quickList で面倒なことを伝える → mockApp → steps → endCard
- B2Bデータ/オフィス(レポート、会議、CRM):hook(icon) → phone スクリーンショットに注釈、または mockApp dashboard に input「質問 → データ出力」→ compare または meter で効果を伝える → steps → endCard;ブリーフに時間が書かれている場合のみ counter を使用(その場合は quickList は使わない)
総尺は20~30秒が最適(15~45秒、または
meta.durationRangeのカスタム範囲が許容される)。同じタイプのショットを連続して使わない。隣接する2つのショットの mood の差が0.5を超えないようにする(中間にトランジション用のショットを挿入する)。そうしないと背景がハードカットになる。
- 字幕を書く(各ショットの
caption):1ショット1文、TikTok風の大きな文字で、視聴者に向けて語りかけ、画面の動きを説明しない(❌「カードが一枚ずつ出てきて、何ができるかを説明する」これはショットの説明であり、字幕ではない)。- 中国語:最大2行、
\nで改行。各行 ≤12漢字(英数字は0.5文字とカウント)。meta.lang: "en"の場合、英語字幕はラテン文字数で換算(中国語制限の約1.8倍)。具体的な数字はdocs/shots/<type>.en.mdを参照。 {}で最も重要な2~5文字を囲み、強調色に変更。各captionにつき最大1箇所。- hook の caption = カバータイトル。ユーザーの課題や常識を覆す質問を書く。
- endCard には caption を書かず、スローガンは
params.sloganに書く。 - 同じ字幕は最大5秒間表示される。5秒を超えるショット(例:8~10秒の chat)の場合、caption を2~3文の配列で書き、このショットの時間を均等に分割する:
"caption": ["まずは焦らずに、\n相手が求めてるのは{あなたの気持ち}", "一つ選んで入力欄に、\n送るかどうかは{あなた次第}"] - 字幕はユーザーの状況や製品による変化を伝え、前後のショットと繋がるものにする。画面の動きはコンポーネントの仕事であり、書く必要はない。字幕で「」で囲んだ単語は、このショットまたは前のショットの画面上に登場している必要がある(検証でエラーになる)。
- 字幕に数量を書いた場合(「この4つの」「3つの返信」)、このショットのアイテム数と一致している必要がある(検証でエラーになる)。
- 汎用的な文(「3つのこと、{それは…}」「この3ステップ」「こんな時、あなたも…」)は使わない。また、examples、shots.md、spec の字幕やパラメータをそのままコピーしない。検証で警告が出され、直接穴埋めできる文型を提示する。サンプルは形式の確認のみに使用する。
- 文字を重ねない(「排期排期」)、文字を削って文字数を稼がない(「卡脖子」を「卡脖」と書くなど)、誤字脱字を書かない(「登陆」は「登录」とすべき。ただし、上陸用舟艇や月面着陸に関する記述は除く)。文字数オーバーの場合は、文全体を言い換える。
- 絶対的な表現は書かない(「全部解決」「はっきりくっきり」「安全安心」「100%」):製品が実現するのは難しいため、検証で警告が出る。控えめな表現に置き換える。
- 改行はバックスラッシュ一つ
\nのみを使用。字幕内で引用符を使う場合は「」を使用し、英語の二重引用符"は使わない。
- 中国語:最大2行、
moodを書く(0~1):課題/緊張 0.8~1、転換点 0.5、製品とセールスポイント 0~0.3、エンドカード 0。背景色とBGMがこれに追随する。- storyboard.json を書く。形式は最後の完全な例を参照。時間は
dur(秒)で、0.5の倍数で書く。 ファイルは UTF-8 エンコーディングでなければならない。中国語のWindowsはデフォルトでGBK。エディタ/ファイル書き込みツールで直接UTF-8で書く。PowerShellを使用する場合は[IO.File]::WriteAllText($p, $json, [Text.UTF8Encoding]::new($false))。Pythonを使用する場合はopen(p, "w", encoding="utf-8")。中国語の書き込みにecho >、Out-File(5.1版)は使用しない。chatのpanel.repliesは、製品提案として**「私」**が相手に送るメッセージ。私の立場で書く(私が残業すると言っているのに、提案の返信を「もう残業しないで、一緒にいて」としてはならない。それは相手の口調である)。panel がある場合はtypingを書かない。 - 検証する。エラーを一つずつ修正し、通過するまで繰り返す:
エラー形式は「第Nショット(タイプ)フィールド:問題 → 修正方法」で、「修正方法」に従う。結果は3段階:node <SKILL>/scripts/validate.mjs promo/<製品名>/storyboard.json- エラー(errors):修正必須。修正しなければ動画は生成されない。
- 警告(warnings):可能な限り修正(文案の品質、構造がテンプレートに似すぎていないか)。修正しなくても動画は生成されるが、納品時になぜ修正しなかったかをユーザーに説明できる必要がある。
- 要人力確認(human):検証で判断できないもの(例:「このレビューは本当に一字一句同じか」「この資格情報は確かにブリーフに基づいているか」)。storyboard は修正せず、そのままユーザーにリストアップし、ユーザー自身に確認させる。
- 動画を生成する(約2分、BGMは自動生成される):
node <SKILL>/scripts/make.mjs promo/<製品名>/storyboard.json --out promo/<製品名>--outは必須(テスト時は--round <ラウンド>に変更。生成物は統一してtests/<ラウンド>/<製品名>/に配置。同じラウンドの複数の動画は同じラウンド名を使用し、自分でタイムスタンプのディレクトリを生成しない)。 生成物:video.mp4、sheet.png(毎秒1フレームのコマ送り画像)、check/(第0フレーム + 各ショット終了前のフルサイズフレーム)、report.txt(テキストレイアウトレポート:単語の分割、幅オーバーの有無を含む)、layout.json。 特定のフレームだけを素早く確認したい場合:--stills 0,3.5,8(秒)を追加。単一フレームのみ出力し、動画全体は出力しない。 - まず
report.txtの末尾にある「機械チェック」「テキストレイアウトレポート」「レイアウトチェック」を確認する(make.mjs が自動実行:バックスラッシュ、製品名、入手方法、字幕表示時間、エンドカードのアイコンと免責事項の小さなテキストが重なっていないか、単語の分割/幅オーバー行の有無をチェック。レンダリング時に各テキストブロックの位置を計測し、テキストがカードで切り取られていないか、2つのテキストブロックが互いに重なっていないか、テキストが x150~930 の範囲外に出ていないかをチェック)。✗ がある場合は先に修正する(レイアウト ✗ は通常、特定のフィールドに書きすぎが原因:項目を削除するかテキストを短縮する)。次にsheet.pngとcheck/を以下のチェックリストで確認し、問題があれば storyboard.json を修正して手順9に戻る。 - 納品:
video.mp4のパス、sheet.pngのパスをユーザーに渡し、「公開前チェックリスト」(下記参照)を添付する。手順9の「要人力確認」項目はそのままリストアップし、ユーザーに一つずつ確認させる。ユーザーに代わって判断を下さない。
チェックリスト(コマ送り画像を見ながら、各項目について画面の様子に基づいて結論を書き、単にチェックを入れない)
- 第0フレームに大きなタイトル + メインビジュアルがあり、空白や中途半端な状態ではない。カバーに
\n、バックスラッシュなどの奇妙な文字がない。 - 各ショットに動く主役(ポインター、数字、カード、チャットバブル)があり、静止画ではない。「画像の拡大縮小」でごまかしていない。
- 字幕が主体を覆っていない、途切れていない、単語が分割されていない(単語が2行に分かれていない)。字幕と画面が同じことを伝えており、前後のショットのストーリーが繋がっている。
- 字幕は視聴者に向けた言葉であり、ショットの説明ではない(「カードが一枚ずつ出てくる」ような画面の動きを説明する文がない)。
- コアアクションが実際に実演されている(「入力/質問 → 結果」が見える)。既存のパネルが表示されているだけではない。
- 背景色が感情の変化に応じて変化している:課題は赤みがかった色、セールスポイントとエンドカードは寒色系。
- エンドカードの製品名が
meta.productと一致している。入手方法はブリーフの原文、または表示しない。URL、QRコードがない。 - 数字に矛盾がない:比較内の前後の数字を自分で計算する(30分 vs 5秒なのに、結論が「25分節約」ではならない)。画面の数字は
meta.factsに出典がある。 - 誤字脱字がない、文字数を稼ぐために文字を削って作った単語がない(「自動アップロード」を「自動ップロード」としない)、絶対的な表現がない。
- 業種別ショットが正しく使用されている:
beforeAfterは美容業のみ。reviewCardの引用は原文のまま。誇張した書き換えがない。
公開前チェックリスト(納品時にユーザーに添付する。自分だけで確認して終わりにしない)
- 「要人力確認」項目をすべてリストアップする:手順9の検証結果の
humanリストをそのままユーザーに転記する。自分で「問題ないだろう」と判断しない。よくあるもの:reviewCard/credCardの引用がブリーフの原文と一字一句同じかどうか、プラットフォームのルールの解釈に更新がないか、業種の資格が全て揃っているか。 meta.industryは正しく選択されているか(間違っていると、利用可能なショットとコンプライアンスルールがすべて間違ったものになる)。- 実写出演者、顧客レビュー、前後比較写真が含まれる場合、その当事者から書面で同意を得ているか(
consent/retouchedなどのフィールドは検証に必要なだけで、実際に同意を得ることはユーザーの責任であり、検証が代わりに確認できるものではない)。 - 動画を公開するプラットフォーム(抖音/ビデオアカウント/小紅書/海外)が
meta.platformと一致しているか。対応するプラットフォーム固有のルール(例:ショッピングカートに価格字幕を表示できないなど)を確認済みか。 - 日中二言語プロジェクト:英語字幕はネイティブスピーカーに確認してもらったか。機械は文字数とセンシティブワードしかチェックしておらず、不自然な表現は見分けられない。
ハードルール(検証でエラーになる)
- 第1ショットは
hookであること。endCardは最後に配置すること。 - 総尺は15~45秒(または
meta.durationRangeのカスタム範囲)であること。各ショットには独自の長さ範囲がある(shots.mdを参照)。 - 各フィールドに文字数制限があり、超えた場合は文全体をもっと短い表現に置き換える。単語から文字を削って文字数を稼がない。また、英語に置き換えない(
meta.lang: "en"の場合、英語には独自の文字数制限がある。対応フィールドの説明を参照)。 - shots.md にリストアップされているフィールド、オプション値、アイコン名のみ使用可能。スペルミスや余分なフィールドがあるとエラーになる。
- 少なくとも1ショットは
meta.actionを実演すること(手順5を参照)。同じ字幕は最大5秒間表示されること。 - エンドカードの
brand=meta.product。エンドカードのcta=meta.cta(ブリーフにない場合はどちらも書かない)。 - 画面上のテキストにバックスラッシュを含めない(JSON で
\\nと書くと、そのまま画面に表示される)。 - 画面に表示してはならないもの:URL、QRコード、「スキャン」、@アカウント、「XX番:名前」、「フォロー/XX番を検索」。製品自体のカテゴリ語(例:「公众号」のレイアウトツール)は誘導にはならない。その単語を
meta.allowWordsに追加する。検証を通過させるために製品名を変更しない。 - 「広告法」の最上級表現を使用してはならない:最も、第一、唯一、初めて、最優先、独占的、最高級、絶対的、100%、全ネット、はるかにリード…(「最近/最後/最初の一歩」などは該当しない)。確かな根拠がある場合のみ
meta.allowWordsに記述する。 - 単位付きの数字(時間/パーセンテージ/倍率/人数/金額)は
meta.factsで同じ数字を見つけられなければならない。見つからない場合は捏造とみなされ、すべてエラーになる。 - 業種ルールは3段階:block は全てブロック(例:医療・美容効果の主張、割引前価格の根拠なし、実際のレビューに月の記載なし)。warn は警告のみでブロックしない。human は検証で判断できないため、納品時にユーザーにリストアップする(上記「公開前チェックリスト」第1条を参照)。
- 素材ファイルのパスは storyboard.json があるディレクトリからの相対パスであること。ファイルが存在している必要がある。スクリーンショットは png/jpg/webp、録画は mp4 をサポート。
禁止事項
template/、scripts/、industries/内のファイルは一切変更しない。座標、ピクセル、フレーム番号、色の値、CSS は指定しない。- ユーザーから提供されていないデータや出典を捏造しない。画面上の数字は
meta.factsで見つけられる必要がある。出典がない場合は「サンプルデータです。実際とは異なります」と書く。 - サードパーティのアプリ名、ロゴ、ブランドカラー(例:某チャットアプリの緑色のバブル)を表示しない。呼称は「相手」「同僚」「お客様」を使用する。
- 実在の人名、電話番号、アカウント名を書かない。
bgmフィールドを使用しない(make.mjs が自動的に入力する)。- 業種コンプライアンスのグレーゾーンの問題(例:「これは医療用語に当たるかどうか」)を自分で判断しない。検証でブロックされたら修正する。検証は通ったが確信が持てない場合は、「要人力確認」に書いてユーザーに渡す。自分で「問題ないだろう」と結論づけない。
よくあるエラーと修正方法
| エラー | 修正方法 |
|---|---|
| 第N行 … 文字、各行最大12文字 | 短くする、または意味の切れ目で \n を使って2行に分割する |
| {} 強調を2箇所使用 | 最も重要な1箇所だけ残す |
| {} がペアになっていない | 各 { には対応する } が必要。行をまたがない |
| 「広告法」最上級表現「最も」を含む | 検証可能な表現に置き換える:「最速」→「3秒で結果表示」 |
| 第1ショットは hook であること | 最初に hook を追加する |
| endCard このショットには字幕を書けない | caption を削除し、大きな文字は params.slogan に書く |
| 不明なフィールドがある | エラー内の「使用可能なフィールド」を確認し、スペルを修正する(例:mockApp は variant ではなく kind を使用) |
| 「xx」というアイコンは存在しない | shots.md 上部のアイコンリストから選択する |
| 総尺 … が15~45秒の範囲内でなければならない | ショットを追加/削除するか、dur を変更する |
| 素材ファイルが見つからない | パスを確認する。storyboard.json があるディレクトリからの相対パスであること |
| JSON 解析エラー:第N行 | その行を確認する:カンマ忘れ、末尾のカンマ、字幕内の英語の二重引用符(「」に変更) |
| この字幕が画面にN秒表示される | caption を2~3文の配列にするか、このショットを2つのショットに分割する |
| 動画全体にコアアクションを実演するショットがない | chat(質問 → panel 回答)または mockApp(input + 結果)を追加する |
| エンドカードの製品名が meta.product と一致しない | brand を meta.product と一字一句同じに変更する |
| cta を書いたが、meta.cta が空 | ブリーフに入手方法がある場合は meta.cta に書いてからコピーする。ない場合は cta を削除する |
| リテラルな \n がある | JSON 内の改行はバックスラッシュ1つのみ |
| プラットフォーム名「公众号」が含まれている(警告) | 製品自体のカテゴリ語の場合:meta.allowWords に追加する。誘導の場合:削除する |
| 必須フィールド meta.action がない | 「ユーザーが何をする → 製品が何を提供するか」を一文で書く |
| meta.facts に出典がない数字がある | ブリーフにこの数字がある場合は、そのまま meta.facts({"id":"f1","text":"…"} 形式)にコピーする。ない場合は、具体的な数字を定性的な表現に置き換える |
| 字幕にショットの説明語が含まれている(例:「カードが一枚ずつ出てくる」) | これは視聴者に向けた字幕であり、編集者への指示ではない。ユーザーの視点に立った文に置き換える |
| 「登陆」は誤字。「登录」が正しい | 「登录」に修正する(「登陆艦/月球着陸」などは該当しない) |
| 「一清二楚」は絶対的な約束 | 控えめな表現に置き換える。例:「重要な情報は確認できる」 |
| 「XX」業種ではショット「YY」は利用不可 | この業種で利用可能な別のショットに変更する。または meta.industry の選択が間違っていないか確認する |
| [B-xxx] 業種コンプライアンスルールに抵触 | エラー情報の「修正方法」に従う。確かな根拠がある最上級表現のみ meta.allowWords を検討する(warn レベルのみ有効。block レベルの場合は削除必須) |
実際のスクリーンショットがない場合
mockApp ショットを優先的に使用する(動きがある)。どうしても「スマホでここをタップ」を実演する必要がある場合は、まず mockApp をレンダリングしてスクリーンショットを作成し、phone で使用する:
cd <SKILL>/template
npx remotion still src/index.ts Screen <ストーリーボードディレクトリの絶対パス>/screen.png --frame=145 --props=<ストーリーボードディレクトリの絶対パス>/screen-props.json
screen-props.json には {"type":"mockApp","theme":"<テーマ>","dur":5,"params":{...mockApp の params...}} と書き、<SKILL>/examples/_src/screen-props.json を参照する。その後、phone ショットで "src": "screen.png" と書き、meta.disclaimer に「デモ画面です。内容はシミュレーションです」と書く。
その他のサンプル(構造はそれぞれ異なる。「製品タイプ」に基づいて選択し、字幕をそのままコピーしない)
<SKILL>/examples/jev.json:C向け感情、software 業種(チャットデモ2文の字幕 → メーター → クイックカット → エンドカード;入手方法「公式サイトからAndroid版ダウンロード」)<SKILL>/examples/ledger.json:ツール効率化、software 業種(課題のクイックカット → 比較 → mockApp レシート撮影結果 → 数字 → エンドカード;ブリーフに入手方法なし、エンドカードに cta なし)<SKILL>/examples/meeting.json:B2Bオフィス、software 業種(スクリーンショット注釈 → シミュレーション画面 → 数字 → 手順 → エンドカード;入手方法「公式サイトで無料トライアルを申し込む」)<SKILL>/examples/en-focus.json:meta.lang: "en"の英語サンプル(架空のアプリ。英語字幕の書き方を示す)- 他の業種(food/ecommerce/education/beauty/travel)のコンプライアンスサンプルは
industries/<industry>/test-brief.md+expected.mdにある。test-brief はサンプルブリーフ、expected にはこのブリーフに基づいて書かれたストーリーボードのどの部分がブロックされるか、その理由が明確に書かれている。新しい業種の最初の動画を作成する際は、まずこれら2つのドキュメントを読むことを推奨する。
完全なサンプル(examples/ledger.json、検証を直接通過可能)
{
"meta": {
"title": "家計簿「省心」プロモーション動画(課題 → 製品 → 3つのセールスポイント → エンドカード)",
"product": "省心家計簿",
"theme": "fresh-light",
"disclaimer": "デモ画面です。データはサンプルです",
"action": "レシートを撮る → 金額とカテゴリが自動で入力される",
"facts": [
{"id": "f1", "text": "トライアルユーザーは今月、先月より約1260円多く貯蓄できました(サンプルデータ)"},
{"id": "f2", "text": "デモ家計簿サンプル項目:出前 ¥1280、タピオカコーヒー ¥480、解約し忘れた自動更新 ¥150、深夜タクシー ¥620(サンプルデータ)"},
{"id": "f3", "text": "手動記帳は平均約5分。本製品の撮影記帳は約10秒(サンプルデータ)"},
{"id": "f4", "text": "デモ認識結果:ランチ ¥580、今月の食費予算を62%使用(サンプルデータ)"}
]
},
"shots": [
{
"type": "hook",
"dur": 2.5,
"caption": "給料が入ったばかりなのに、\n月末にはまた{底をつく}",
"mood": 0.85,
"params": {"visual": "stat", "text": "¥ 0", "sub": "今月のお金、どこに消えた?", "badge": "レシートを撮って記帳", "tone": "bad"}
},
{
"type": "quickList",
"dur": 3.5,
"caption": "お金、どこに消えたか、\n{ひとつも思い出せない}",
"mood": 0.8,
"params": {
"title": "今月の不明な出費",
"items": [
{"text": "出前", "tag": "¥1280", "tone": "bad", "icon": "bell"},
{"text": "タピオカコーヒー", "tag": "¥480", "tone": "warn", "icon": "heart"},
{"text": "解約し忘れた自動更新", "tag": "¥150", "tone": "bad", "icon": "calendar"},
{"text": "深夜タクシー", "tag": "¥620", "tone": "warn", "icon": "clock"}
]
}
},
{
"type": "compare",
"dur": 4.5,
"caption": "家計簿をつけるのに、\n{もう根性はいらない}",
"mood": 0.45,
"params": {
"mode": "lr",
"left": {"title": "手動記帳", "items": ["毎回手入力", "分類は勘", "そのうち挫折"], "tone": "bad", "icon": "doc", "stat": "5分", "level": 8},
"right": {"title": "省心家計簿", "items": ["レシート撮影で自動認識", "自動で分類", "月末はワンタップで振り返り"], "tone": "good", "icon": "bolt", "stat": "10秒", "level": 2},
"meterLabel": "手間",
"verdict": "記帳はたったの10秒"
}
},
{
"type": "mockApp",
"dur": 4.5,
"caption": "レシートを撮るだけで、\n{金額も分類も自動入力}",
"mood": 0.25,
"params": {
"kind": "editor",
"title": "記帳する",
"source": "サンプルデータ。実際のユーザーの請求書ではありません",
"input": "撮影:ランチのレシート",
"button": "認識",
"items": [
{"text": "ランチ ¥580"},
{"text": "店舗:一階のラーメン屋"},
{"text": "分類:食費(自動)"},
{"text": "今月の食費 62% 使用"}
],
"highlight": 3,
"done": "記帳完了"
},
"note": "コアアクションのデモ:ユーザーがレシートを撮影 → 製品が金額、店舗、分類を表示"
},
{
"type": "counter",
"dur": 3,
"caption": "月末に見てみると、\n{なんと黒字!}",
"mood": 0.1,
"params": {"to": 1260, "prefix": "¥", "label": "先月より多く貯蓄", "sub": "サンプルデータ。結果は個人差があります", "icon": "money", "tone": "good"}
},
{
"type": "endCard",
"dur": 4,
"mood": 0,
"params": {
"brand": "省心家計簿",
"slogan": "使ったお金、\n{ぜんぶ把握}",
"points": ["レシート撮影で自動記帳", "家計簿はあなたのスマホだけに保存"],
"icon": "money"
}
}
]
}