デモビデオ
ユーザーの実際の画面録画から構築されたプロダクトデモ、ストアプレビュー、または機能ループです。インターフェースは決して再生成されません。録画はカット、スピード調整、ズーム、フレーム追加、キャプション、ナレーションが施されます。Appleはプレビューについても同じルールを定めています(2.3.4: アプリ自体のビデオ画面キャプチャ、ナレーション、オーバーレイが許可されます)。1つの cut.json に録画、順序付けられたシーン、バリアントが保持されます。democut.py がローカルの ffmpeg を使用してファイルに変換し、再カットは無料です。
ステップ 0 — 事前確認
セッションごとに一度:
python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" tools
kind: "ffmpeg_missing"→ ローカルでのカットが不可能です。その旨を伝え、references/routing-utility.mdにある有料ユーティリティルートを提案するか、ユーザーに ffmpeg のインストールを依頼してください。他のツールで代用しないでください。can.burn_captions(libass)、can.duck(sidechaincompress)、can.webmを確認します。欠けている機能は、約束できる内容に影響しますが、主張する内容には影響しません。- 何かが生成される場合(ナレーション、音楽、サウンド、吹き替え、プレート)のみ:
command -v genmedia python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" preflightblockersが空でない、CLI が見つからない、または 0.7.0 より古い場合 →/genmedia-skills:setup。キーがない場合 → ユーザー自身がgenmedia setupを実行するか、FAL_KEYをエクスポートします。待機します。キーを読み取ったり、表示したり、要求したり、入力したりしないでください。config.announce_above_usdとconfig.confirm_above_usd(デフォルトは 0.50 と 2)を保持します。 - 最初に再開:
.genmedia/projects/<slug>/demo-video/cut.jsonが存在する場合 → そこから続行し、同じ製品に対して2つ目のカットを開始しないでください。
UX ルール
- ユーザーの言語で返信します。ナレーション、
say行、画面上のテキストは、提供された言語のままにします。モデルプロンプトは英語です。パス、ID、フィールド名はそのままにします。 - チャット内に JSON、フィルターグラフ、リクエスト ID、ツールのナレーションを表示しないでください。長いステップごとに最大1行のステータス行のみ表示します。
- 質問予算: 2、一度に1つ、ラベル付きオプション、回答がない場合のみ:
- Q1 録画: ファイルが指定されなかった場合、パスを尋ね、
references/recording-tips.mdの短いキャプチャリストを渡します。映像のデフォルトはありません。 - Q2 出力先: リクエストに明記されていない場合: A ウェブサイトデモ (16:9) · B App Store プレビュー · C App Store ヘッダーまたは検索結果ビデオ · D Google Play プロモ · E Product Hunt ローンチビデオ · F 無音ループまたは GIF。複数選択可能。1つのカットですべてに対応します。 その他はすべて、納品時に記載するデフォルトです: デモは 60 秒、ストアプレビューは 20 秒、App Store ヘッダーまたは検索ビデオは 12 秒、ループは 6 秒。デモではナレーションオン、ループまたはヘッダー/検索ビデオではオフ。音楽は明示された場合のみオフ。キャプションはサイドカーファイル。カット、ディゾルブなし。ストアやソーシャルターゲットが要求しない限り、デバイスフレームなし。
- Q1 録画: ファイルが指定されなかった場合、パスを尋ね、
- カットカードはハードストップです。 シーンリスト(時間、内容、発言、長さ)を表示し、何かを生成またはレンダリングする前に「はい」を待ちます。沈黙は承認ではありません。また、古いバージョンへの「はい」は、このバージョンへの「はい」ではありません。
- 画像の前にナレーション。 シーンごとに音声を生成し、
timeで測定し、画像をそれに合わせてカットします。文の長さを推測してシーンタイミングを決めないでください(references/narration-and-audio.md)。 - 納品前に確認。 ポスターフレームと完成ファイルのコンタクトシートを読み、GIF の最初のフレームを読みます。検証に合格しても、間違った画面を表示しているデモはやはり間違いです。
- 事実とプライバシーはユーザーから提供されます。 評価、カウント、賞、顧客名、ロゴは、ユーザーが提供した場合にのみ表示されます。フレームに実際のデータが表示されている場合、修正方法は新しい録画であり、ぼかしではありません。その旨を明確に伝えてください。
- コスト: カット、フレーム、ループ、チェックはすべて USD 0 です。生成を行う前に、事前確認のゲートを見積もり、適用します:
announce_above_usd未満 → 実行して状態を表示。confirm_above_usdまで → 1行表示してから実行。それ以上 → 明示的な「はい」が必要。記憶から価格を見積もらないでください。 - 制限あり: ステップごとに最大3回の修復試行。毎回何かを変更します。コンテンツポリシー拒否は変更せずに再送信しません。リクエスト ID のあるジョブは再開され、再送信されません。
発見ガードレール
scripts/video-surfaces.json は日付付きキャッシュです(verified_on、democut.py specs によって読み取られます)。null は、公式ページから誰も読み取っていない数値です。記憶から決して埋めないでください。ストアがファイルを拒否した場合、公式ページが優先され、行が修正されます。
セッション内のエンドポイントへの最初の有料呼び出しの前:
genmedia models --endpoint_id <endpoint_id> --json
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" schema <endpoint_id>
status は active である必要があります。フィールド、列挙型、制限はスキーマから取得します。アクティブでない場合 → references/routing-audio.md のそのタスクの次のティア。エンドポイント ID の代わりにプロンプトを使用して genmedia run を実行しないでください。新しいリリースは、fal-ai/ だけでなく、ベンダーの名前空間の下にあります。
ルーティング
| ニーズ | 方法 | 理由 |
|---|---|---|
| トリム、スピード、ズーム、フレーム、結合、オーバーレイ、ミックス、ラウドネス、GIF、チェック | democut.py(ローカル ffmpeg) | 正確、無料、繰り返し可能。プロダクトのピクセルはモデルを通過しません。 |
| 録画や結果を視聴せずに確認 | democut.py analyze、sheet、grab。frames.py sheet | 推測ではなく、検出器とコンタクトシート。 |
| ナレーション | fal-ai/elevenlabs/tts/eleven-v3。トルコ語: fal-ai/gemini-3.1-flash-tts | デフォルトの TTS。トルコ語パスはスキーマ検証済み。 |
| 音楽、UI サウンド | elevenlabs/music/v2.5(正確な長さ)、fal-ai/elevenlabs/sound-effects/v2 | 長さ制御。1秒あたり低コスト。 |
| 単語精度のキャプションタイミング | fal-ai/elevenlabs/speech-to-text/scribe-v2 → audiokit.py captions | 単語タイムスタンプ。 |
| 完成ファイルの別言語 | fal-ai/elevenlabs/dubbing | 言語ごとに1回の呼び出し。 |
| デバイスフレーム、エンドカード、画面上の正確なテキスト | /genmedia-skills:launch-graphics(layers、合成 PNG) | テキストは正確であるべき場所で合成され、生成されません。 |
| フレーム付きデバイスの背景プレート | bytedance/seedream/v5/pro/text-to-image | ビデオごとに1枚のプレート、文字なし。 |
| ローカル ffmpeg なし | references/routing-utility.md の fal-ai/ffmpeg-api/* | 呼び出しごとに数セント、フォールバックでありデフォルトではありません。 |
タイブレーカーとトラップ:
- インターフェースは決して生成、再スタイル、リフレーム、または「強化」されません。
video-reframe、video-edit、アップスケーラーは UI テキストを再描画します。これらは生成された映像向けであり、録画向けではありません。 - ズームはソースフレームの分数で指定し、
grab --gridまたはsheet --gridで読み取ります。holdで詳細を表示、pushで視線を誘導(1回)、pullでコンテキストを表示(1回)(references/editing.md)。 - ストアプレビューは、短いエンディングを持つデモではありません。独自のシーンサブセットを持つ独自のバリアントです。
- Play と Product Hunt は YouTube URL を受け付けます。ファイルではないため、ファイルを納品し、誰がアップロードするかを伝えます。
- App Store ヘッダーまたは検索結果ビデオ(iOS 27 クリエイティブアセット)は、独自の無音ループバリアントです:
appstore-header-video(3840x1646)またはappstore-search-video(3:2)、30 または 60 fps、5-30 秒、1つのアイデア、2 秒以上のシーン、開始位置で終了。Apple はユニバーサルビデオをリストしていません。静止画はlaunch-graphicsの作業です(references/surfaces.mdセクション 1a)。 - 電話の録画には電話のフレームが必要です。
timeは 30% のアスペクト比の不一致を拒否します。 - 焼き付けは
can.burn_captionsの場合のみ。それ以外の場合は、サイドカーファイル、または有料の字幕ルートを使用し、その旨を明示します。 - ユーザーがモデルを指定した場合 → ライブチェック後に使用します。
ワークフロー
- 取り込み。 目標、ターゲット、録画、ブランド。ユーザーが指定したすべてのファイルを読み取ります。次に、録画ごとに:
応答には、サイズ、fps、再生時間、オーディオ、埋め込まれたレターボックス、およびアスペクト比に適合するターゲットが含まれます。ターゲットよりも小さい録画、または実際のデータを表示している録画は、編集後ではなく、今すぐ再撮影を依頼します(python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" init --slug <slug> --name "<Product>" --target web-16x9 python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" source add --slug <slug> --id app --file ./recordings/demo.mov --os desktopreferences/recording-tips.md)。 - 確認。
シートを読みます。python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" analyze --slug <slug> --source app python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" sheet --slug <slug> --source app --count 12 --cols 4 --griddead_spansとkeep_spansは候補であり、編集ではありません。静止画面が目的であることもあります。grab --at <s> --gridでズームインするフレームを取得します。 - カットカード。 シーンを順に: id、ソース in/out、速度、ズーム、視聴者に表示されるもの、音声の内容、長さ。次にバリアント、生成されるもの、ユーザーから必要なもの、前提条件。表示し、停止し、「はい」を待ちます(
references/editing.md)。 - ナレーション、測定(デモに音声がある場合のみ)。
references/narration-and-audio.mdに従って1バッチの価格を設定して実行し、シーンごとに1ファイルを作成し、数値に基づいて画像を決定します:python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" price fal-ai/elevenlabs/tts/eleven-v3,elevenlabs/music/v2.5 --explain python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" batch --plan .genmedia/projects/<slug>/demo-video/voice-plan.json - カットを記述。 Write または Edit ツールを使用して
.genmedia/projects/<slug>/demo-video/cut.jsonを編集します:scenes、audio、variants。すべてのフィールドはreferences/cut-json.mdを参照。デバイスフレームはlaunch-graphics layersから取得します(references/frames-and-loops.md)。 - ゲート。
レンダリング前にすべてのエラーを修正します:python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" time --slug <slug>scene_shorter_than_voice(スパンを長くする、速度を落とす、または単語を削る — 音声を速くしない)、duration_out_of_range(ストアターゲット)、wrong_size、fps_not_allowed、transition_too_long、frame_aspect_mismatch、overlay_invisible。警告(quick_cut、fast_motion、narration_muted(クリエイティブアセットビデオの場合))に対処するか、保持するものを説明します。 - ビルド。
600000 ms Bash タイムアウト。シーンはコンテンツごとにキャッシュされます。リビジョンは変更された部分のみ再レンダリングします(python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" build --slug <slug>--scene <id>、--force)。次にキャプションとループ:python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" captions --slug <slug> --variant <id> --formats srt,vtt python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" gif --slug <slug> --variant loop-16x9 --budget-mb 3 --seconds 6 - 結果を確認。 ポスターフレーム、完成ファイルのコンタクトシート、GIF の最初のフレームを読みます:
最初の 3 秒、ズームされたフレーム(判読可能か?)、最後のフレーム(収まっているか?)、すべてのフレームにプライベートデータがないか確認し、キューファイルを一字一句読みます。python3 "${CLAUDE_SKILL_DIR}/scripts/frames.py" sheet genmedia-output/<slug>/demo-video/<variant>/<slug>.mp4 --count 9 --cols 3 - 検証して納品。
正確なサイズ、fps、プラットフォームウィンドウ内の再生時間、コーデックとプロファイル、バイト上限、オーディオ設定、測定されたラウドネスとトゥルーピーク、ループターゲットの継ぎ目(python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" validate --slug <slug>loop_seam)。次に納品メッセージ。リビジョン: カットを編集し、再ビルドし、再度検証します。
納品
<Product> デモ: genmedia-output/<slug>/demo-video/
マスター 16:9: web-16x9/<slug>.mp4 (1920x1080, <n> 秒) · ポスター web-16x9/<slug>-poster.png
App Store プレビュー: appstore-iphone/<slug>.mp4 (886x1920, <n> 秒, H.264 High, AAC 256k) <ビルドされた場合のみ>
App Store ヘッダー / 検索ビデオ: appstore-header-video/<slug>.mov (3840x1646, <n> 秒, <fps> fps, 無音ループ) · App Store Connect で選択するポスターフレーム: <t> 秒 <ビルドされた場合のみ>
Play プロモ / Product Hunt: 同じマスター — 両方のプラットフォームが YouTube URL を受け付けるため、アップロードしてリンクを貼り付けます <ビルドされた場合のみ>
ループ: loop-16x9/<slug>-loop.mp4 · <slug>-loop.gif (<n> MB, <w>px@<fps>) · 最初のフレーム <slug>-loop-first.png <ビルドされた場合のみ>
キャプション: <variant>/<slug>.srt, .vtt (<language>) <ビルドされた場合のみ> · manifest.json
あなたの録画は変更されていません: カット、<待機していた部分は速度調整>、<何を>ズーム、<描画されたデバイスに>フレーム追加。インターフェース内の何も再生成されていません。
あなたのために選択された設定: <長さ、シーン数、ナレーション オン/オフ、音楽、キャプション、フレーム、フィット — ユーザーが設定しなかったすべてのデフォルト>
ストアノート: <該当するものがあれば1行ずつ: App Store プレビューは 15-30 秒、デバイスあたり最大3つ、画面キャプチャのみ (2.3.4) · ヘッダーと検索ビデオはミュートループ (検索: 決してミュート解除しない)、iOS 27 および iPadOS 27 以降で表示、承認されるとポスターフレームは固定 · Play プロモの最初の 30 秒のみ自動再生 · Product Hunt の画像、GIF を含む、は 3 MB 未満、GIF はホバーでアニメーション>
生成されたもの: <なし、USD 0 | ナレーション <n> 行 (<model>)、音楽、推定 USD <x>> · ファイルはローカルです。何もアップロードされていません。
次のステップ: 変更するシーンと内容 (in/out、速度、ズーム、単語) を指定してください。再カットは無料です。
パス、サイズ、画面上のテキストは変更せずにそのまま翻訳します。
エラー
| シグナル | 対応 |
|---|---|
kind: "ffmpeg_missing" | ローカル ffmpeg がありません。ここではカットを作成できないことを伝え、references/routing-utility.md の fal ffmpeg-api ルートを提案するか、ユーザーにインストールを依頼します。 |
source_changed | 録画が移動または変更されました。source add --replace を実行し、すべての in/out を再確認します。古いタイミングは意味をなしません。 |
time からの check_failed | 各エントリはシーンと番号を示します。カットを修正します。エラーが存在する間は何もレンダリングされません。 |
scene_shorter_than_voice | スパンを長くするか、speed を下げるか、単語を削ります。ナレーションの速度を合わせるために速くしないでください。 |
duration_out_of_range | 公式ウィンドウから外れました(App Store プレビュー 15-30 秒、ヘッダーおよび検索ビデオ 5-30 秒)。そのバリアントのみシーンを削除または短縮します。 |
wrong_size、fps_not_allowed、fps_too_high | バリアントのサイズまたは fps がその行の制限に違反しています。オーバーライドを削除するか、行が受け付ける値(specs)を選択します。 |
validate からの loop_seam | ループが再始動時にジャンプします。開始状態で終了するか、同じ領域を保持し、ビルドし、再度検証します。 |
frame_aspect_mismatch | ソースのアスペクト比がデバイスフレームと一致しません。ソースのトリミングを調整するか、別のフレームを選択します。 |
[…] 翻訳のため一部省略
ループと GIF に関する注意
ループは、cut.json 内で loop バリアントとして定義されている必要があります(例: loop-16x9)。democut.py gif は、指定された秒数と最大ファイルサイズ(--budget-mb)に基づいて、ループから GIF を生成します。GIF は、動きがあり、ファイルサイズ制限内に収まるように最適化されます。
グローバル設定
- コスト制限:
config.announce_above_usd(デフォルト: 0.50 USD)未満の生成コストは自動的に実行され、ユーザーに通知されます。config.confirm_above_usd(デフォルト: 2.00 USD)までのコストは、1行で要約され、実行前にユーザーの確認が必要です。それ以上のコストは、明示的な承認が必要です。 - 言語: ユーザーの言語での会話。ナレーション、画面上のテキスト、
sayフィールドは元の言語を保持します。 - ファイル: すべての出力は
genmedia-output/<slug>/demo-video/ディレクトリに保存されます。
依存関係
ffmpeg(ローカルインストール必須、または falffmpeg-api経由で利用可能)genmediaCLI(生成 AI モデルとのインタラクションに必要)python3(スクリプト実行に必要)
トラブルシューティング
- ffmpeg が見つからない: ユーザーにシステムへの ffmpeg インストールを依頼するか、有料の
ffmpeg-apiルートを提供します。 - 生成 AI モデルが利用できない:
genmedia modelsでエンドポイントのステータスを確認し、必要に応じてセットアップガイドを提供します。 - カット.json のエラー:
democut.py timeの出力を注意深く読み、各エラーを一つずつ修正します。 - ループの継ぎ目: ループがスムーズでない場合、
loop_seamエラーが報告されます。開始フレームと終了フレームが近づくようにシーンを調整します。