Communitygithub.com

デモビデオ (demo-video)

ユーザーの実際の画面録画から、トリミング、スピード調整、ズーム、フレーム追加、キャプション、ナレーションを施したプロダクトデモ、ストアプレビュー、App Storeヘッダー/検索動画、ループGIFを作成します。ローカルのffmpegで処理し、モデルはプロダクト以外の要素(ナレーション、音楽、UIサウンド)のみ生成します。

デモビデオ (demo-video) とは?

このスキルは、ユーザーの実際の画面録画を基に、アプリのデモ動画、App Storeプレビュー、App Storeヘッダー/検索動画、Google Playプロモ動画、Product Huntローンチ動画、チェンジログ用のGIFループなど、様々な形式のプロダクトデモ動画を生成します。`Claude Code`、`Cursor`、`Codex`などのAIエージェント上で動作し、`democut.py`スクリプトを介してローカルのffmpegで処理を行うため、高速で反復可能です。Appleのガイドライン(2.3.4)に準拠し、画面録画のインターフェース自体は一切変更せず、ナレーション、音楽、UIサウンドのみを外部モデルで生成・追加します。`cut.json`ファイルで録画、シーン、バリアントを管理し、作り直しも無料です。対応プラットフォームは、macOS、Linux(ffmpegがインストールされている環境)で、Eleven Labs(ナレーション、音楽、効果音)やGemini TTS(トルコ語ナレーション)などの生成AIサービスと連携します。このスキルは、生成されたBロールや説明動画、有料広告、スクリーンショットなどには使用できません。

対応✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/funi-ai/claude-plugins/tree/main/plugins/genmedia-skills/skills/demo-video

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

デモビデオ

ユーザーの実際の画面録画から構築されたプロダクトデモ、ストアプレビュー、または機能ループです。インターフェースは決して再生成されません。録画はカット、スピード調整、ズーム、フレーム追加、キャプション、ナレーションが施されます。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" preflight
    
    blockers が空でない、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 ルール

  1. ユーザーの言語で返信します。ナレーション、say 行、画面上のテキストは、提供された言語のままにします。モデルプロンプトは英語です。パス、ID、フィールド名はそのままにします。
  2. チャット内に JSON、フィルターグラフ、リクエスト ID、ツールのナレーションを表示しないでください。長いステップごとに最大1行のステータス行のみ表示します。
  3. 質問予算: 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 秒。デモではナレーションオン、ループまたはヘッダー/検索ビデオではオフ。音楽は明示された場合のみオフ。キャプションはサイドカーファイル。カット、ディゾルブなし。ストアやソーシャルターゲットが要求しない限り、デバイスフレームなし。
  4. カットカードはハードストップです。 シーンリスト(時間、内容、発言、長さ)を表示し、何かを生成またはレンダリングする前に「はい」を待ちます。沈黙は承認ではありません。また、古いバージョンへの「はい」は、このバージョンへの「はい」ではありません。
  5. 画像の前にナレーション。 シーンごとに音声を生成し、time で測定し、画像をそれに合わせてカットします。文の長さを推測してシーンタイミングを決めないでください(references/narration-and-audio.md)。
  6. 納品前に確認。 ポスターフレームと完成ファイルのコンタクトシートを読み、GIF の最初のフレームを読みます。検証に合格しても、間違った画面を表示しているデモはやはり間違いです。
  7. 事実とプライバシーはユーザーから提供されます。 評価、カウント、賞、顧客名、ロゴは、ユーザーが提供した場合にのみ表示されます。フレームに実際のデータが表示されている場合、修正方法は新しい録画であり、ぼかしではありません。その旨を明確に伝えてください。
  8. コスト: カット、フレーム、ループ、チェックはすべて USD 0 です。生成を行う前に、事前確認のゲートを見積もり、適用します: announce_above_usd 未満 → 実行して状態を表示。confirm_above_usd まで → 1行表示してから実行。それ以上 → 明示的な「はい」が必要。記憶から価格を見積もらないでください。
  9. 制限あり: ステップごとに最大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/*呼び出しごとに数セント、フォールバックでありデフォルトではありません。

タイブレーカーとトラップ:

  1. インターフェースは決して生成、再スタイル、リフレーム、または「強化」されません。 video-reframe、video-edit、アップスケーラーは UI テキストを再描画します。これらは生成された映像向けであり、録画向けではありません。
  2. ズームはソースフレームの分数で指定し、grab --grid または sheet --grid で読み取ります。hold で詳細を表示、push で視線を誘導(1回)、pull でコンテキストを表示(1回)(references/editing.md)。
  3. ストアプレビューは、短いエンディングを持つデモではありません。独自のシーンサブセットを持つ独自のバリアントです。
  4. Play と Product Hunt は YouTube URL を受け付けます。ファイルではないため、ファイルを納品し、誰がアップロードするかを伝えます。
  5. 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)。
  6. 電話の録画には電話のフレームが必要です。time は 30% のアスペクト比の不一致を拒否します。
  7. 焼き付けは can.burn_captions の場合のみ。それ以外の場合は、サイドカーファイル、または有料の字幕ルートを使用し、その旨を明示します。
  8. ユーザーがモデルを指定した場合 → ライブチェック後に使用します。

ワークフロー

  1. 取り込み。 目標、ターゲット、録画、ブランド。ユーザーが指定したすべてのファイルを読み取ります。次に、録画ごとに:
    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 desktop
    
    応答には、サイズ、fps、再生時間、オーディオ、埋め込まれたレターボックス、およびアスペクト比に適合するターゲットが含まれます。ターゲットよりも小さい録画、または実際のデータを表示している録画は、編集後ではなく、今すぐ再撮影を依頼します(references/recording-tips.md)。
  2. 確認。
    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 --grid
    
    シートを読みます。dead_spans と keep_spans は候補であり、編集ではありません。静止画面が目的であることもあります。grab --at <s> --grid でズームインするフレームを取得します。
  3. カットカード。 シーンを順に: id、ソース in/out、速度、ズーム、視聴者に表示されるもの、音声の内容、長さ。次にバリアント、生成されるもの、ユーザーから必要なもの、前提条件。表示し、停止し、「はい」を待ちます(references/editing.md)。
  4. ナレーション、測定(デモに音声がある場合のみ)。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
    
  5. カットを記述。 Write または Edit ツールを使用して .genmedia/projects/<slug>/demo-video/cut.json を編集します: scenes、audio、variants。すべてのフィールドは references/cut-json.md を参照。デバイスフレームは launch-graphics layers から取得します(references/frames-and-loops.md)。
  6. ゲート。
    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(クリエイティブアセットビデオの場合))に対処するか、保持するものを説明します。
  7. ビルド。
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" build --slug <slug>
    
    600000 ms Bash タイムアウト。シーンはコンテンツごとにキャッシュされます。リビジョンは変更された部分のみ再レンダリングします(--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
    
  8. 結果を確認。 ポスターフレーム、完成ファイルのコンタクトシート、GIF の最初のフレームを読みます:
    python3 "${CLAUDE_SKILL_DIR}/scripts/frames.py" sheet genmedia-output/<slug>/demo-video/<variant>/<slug>.mp4 --count 9 --cols 3
    
    最初の 3 秒、ズームされたフレーム(判読可能か?)、最後のフレーム(収まっているか?)、すべてのフレームにプライベートデータがないか確認し、キューファイルを一字一句読みます。
  9. 検証して納品。
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" validate --slug <slug>
    
    正確なサイズ、fps、プラットフォームウィンドウ内の再生時間、コーデックとプロファイル、バイト上限、オーディオ設定、測定されたラウドネスとトゥルーピーク、ループターゲットの継ぎ目(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(ローカルインストール必須、または fal ffmpeg-api 経由で利用可能)
  • genmedia CLI(生成 AI モデルとのインタラクションに必要)
  • python3(スクリプト実行に必要)

トラブルシューティング

  • ffmpeg が見つからない: ユーザーにシステムへの ffmpeg インストールを依頼するか、有料の ffmpeg-api ルートを提供します。
  • 生成 AI モデルが利用できない: genmedia models でエンドポイントのステータスを確認し、必要に応じてセットアップガイドを提供します。
  • カット.json のエラー: democut.py time の出力を注意深く読み、各エラーを一つずつ修正します。
  • ループの継ぎ目: ループがスムーズでない場合、loop_seam エラーが報告されます。開始フレームと終了フレームが近づくようにシーンを調整します。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

funi-ai/ads

Ads from the user's REAL product: UGC and polished ad videos (presenter, unboxing, showcase, testimonial, TV spot) and static ads with copy. Physical products: keyframes locked to the product photo, Seedance clips or TTS + OmniHuman, GPT Image 2.5 copy. Apps and SaaS: real captures and recordings, composited, never regenerated. Use when: "make a UGC ad for this product", "15 second TikTok ad", "static ad with this headline", "app install ad from my screen recording", "A/B ad variants", "bu ürün için reklam videosu yap", "uygulamam için reklam hazırla", "indirim görseli hazırla". Chain: consumes `product-photoshoot` stills, `character` @handles, `launch-graphics` pages; produces ads and a manifest. NOT for: text-free product photos (use `product-photoshoot`); posters (use `image`); listing cards (use `marketplace-cards`); store screenshots, OG cards (use `launch-graphics`); one clip (use `video`); organic shorts (use `short-video`); product demos (use `demo-video`); thumbnails (use `youtube-thumbnail`).

funi-ai/youtube-thumbnail

Thumbnails and covers that survive at small size: YouTube thumbnails (16:9), Shorts, Reels and TikTok covers (9:16), podcast and course covers (1:1), from a title plus an optional face photo, @handle character, brand colours or a frame of the user's own video. Text baked in by GPT Image 2.5; faces locked through reference edits. Use when: "make a thumbnail for my video", "YouTube thumbnail with my face", "Shorts cover", "podcast cover art", "thumbnail from this frame", "change only the text on the thumbnail", "videoma thumbnail yap", "kapak görseli hazırla", "küçük resimdeki yazıyı değiştir". Chain: consumes an @handle from `character` and stills or frames from `image` and `video`; produces sized PNG and JPEG. NOT for: posters, photo edits (use `image`); logos (use `brandkit`); link cards, OG images (use `launch-graphics`); ad creatives (use `ads`); the video (use `video`, `short-video`); new characters (use `character`); batches (use `pipelines`); model choice (use `models`); setup problems (use `setup`).

関連スキル