Stickman Story Reels は何をしますか?
プロンプトを、60〜90秒の縦型リールに仕上げます。視聴時間のために最適化されたフックファーストのスクリプト、コードで描かれたスティックフィギュアのショット、単語タイミングのキャプション付き音声、サウンドデザイン、そして人々がコメントしてパート2を待ちたくなる2択の投票機能が含まれます。PlotVote インタラクティブストーリー (@plotvote) のワークフローから構築されています。
このパイプラインは決定論的です。episode.json(スクリプト、タイミング、動き)と scenes.js(描画)を作成すれば、scripts/reel.py が残りの処理(音声 → サウンド → ビルド → チェック → レンダリング)を実行します。画像モデル、ストックフッテージ、音声以外の有料ツールは不要です。
セットアップ(マシンごとに1回)
python3 --version(3.9+)、ffmpeg -version、node --version(18+)を確認してください。初回レンダリング時は npx を通じて HyperFrames とヘッドレス Chrome をダウンロードします。これは正常な動作で、1分ほどかかります。音声を使用するには、プロジェクトフォルダ内の .env ファイルに ELEVENLABS_API_KEY=... を設定するか(または環境変数としてエクスポートしてください)、ユーザーに設定してもらいます。キーを決して出力しないでください。キーがない場合でも、--draft モード(無音、実速度でタイミング調整)ですべてが動作します。
ターミナルセッションごとに、以下のシェル関数を1回定義してください(文字列変数ではなく関数として定義します。zsh と bash の両方で動作します)。以下のコマンドはこれを使用します。
reel() { python3 "<このスキルのフォルダ>/scripts/reel.py" "$@"; }
ワークフロー
1. 要求を理解する
- 「このストーリーを作って」 明確なプロンプトがある場合 → 1つの強力なスクリプトを作成し、ビルドします。
- 「選択肢をください」または「スクリプトのアイデアを」 → 3つの完全なオプションを提案し(プレイブック §10 参照)、ユーザーが選択したらビルドします。
- 「次のパート」または「Xが投票で勝ちました」 → シリーズを継続します。結果から始め、最後の手がかりを明らかにし、真実の答えを与え、事態をエスカレートさせ、新しい投票を提示します(プレイブック §9)。シリーズのバイブルが存在する場合はそれを読んでください。
- スクリプトのみ(またはシェルが利用できない場合)→ スクリプトテーブル、および自分でレンダリングする場合のために
episode.jsonとscenes.jsを提供します。
2. スクリプトを書く
毎回、最初に references/viral-script-playbook.md を読んでください。 そこには、視聴者が3秒以上視聴し続けるかどうかを左右するルールが書かれています。プロット、シリーズ、シーズンを考案する場合は、references/story-engines.md も読んでください。
スクリプトをテーブル(# · 声 · 発話 · 画面表示)として書き、約210〜230単語(標準のペースで約85秒)を目指してください。プレイブックの音声前チェックリストを実行してください。よく間違えられるポイント:フレーム1は動いていなければならない;どこで、いつ、誰が5秒以内にわかること;すべての決定は12歳児テストに合格すること;キャラクターは一人称で自身の秘密を明かすこと;投票は両方の選択肢に代償がある、物理的な1単語の行動であること;投票後のささやく手がかりは、以前に仕掛けられた何かを指し示すこと。
ユーザーが選択肢を求めている場合、またはクレジットが消費される前に承認を必要とする場合がある場合は、スクリプトテーブルを表示して待機します。それ以外の場合はそのまま続行します。
3. リールを準備する
reel new reels/<スラッグ>-part1 --title "<タイトル> — Part 1"
これにより、小さな動作するスターターから episode.json と scenes.js が作成されます。これらをあなたのストーリーに置き換えてください。
4. ショットを描画する (scenes.js)
references/drawing-kit.md を読んでください。 また、examples/sundown-part1/scenes.js をパターンライブラリとして開いてください(クリーチャーが身を乗り出す、引きの地図、ルールの壁が一行ずつ明らかになる、ストップモーションのクリーチャー、窓のすれ違い、話すラジオ、木々の中の懐中電灯、選択の分割、カバー)。
スクリプトテーブルの各ショットにつき1つの関数です。各関数は、キットのヘルパー(defs(), sky(), forest(), cabin(), room(), water(), stick(), kid(), creature(), phone(), radio(), chip(), ring(), splitChoice()…)から構築された1080×1920 SVG を返します。キットにない設定(ウォーターパーク、列車、砂漠など)は通常のことです。rect、path、ヘルパーを使用して、描画キットの「新しい設定の構築」セクションに従って描画してください。動いたり、単語上に表示されるべきすべての要素に id を付けてください。キャプションバンド(y 1180–1380)と右端140ピクセルに顔を配置しないでください。カバー用(主題をタイトルの下に配置)および投票カードのインセット用に mode を追加してください。
5. エピソードをワイヤリングする (episode.json)
references/episode-format.md を読んでください。 すべてのシーンについて:draw, say 行、kenburns、および発話単語に合わせた animate エントリ("at": "faster")を設定します。次に:声(他のキャラクターの fx とキャプション tag 付き)、時計付きの HUD ピル、単語に合わせた手動配置の sfx、bed キュー、投票シーン(2つの選択肢、インセット、手がかり行)、cover、および post({vote_line} を含むキャプション、ピン留めコメント、posts_at)。声、音、キャプションについては references/sound-voice-posting.md を参照してください。
6. 下書きパス(無料)
reel voice reels/<スラッグ> --draft # 無音、実速度のタイミング
reel sound reels/<スラッグ>
reel build reels/<スラッグ>
reel check reels/<スラッグ>
reel snap reels/<スラッグ> --at scenes # ショットごとに2枚の静止画(または --at 0.5,12,30.5 秒)
reels/<スラッグ>/snaps/ 内のすべての静止画を確認してください。描画キットの可読性ルールが警告する内容を修正します:暗すぎて読めないもの、キャプションの下の顔、小さすぎる被写体、タイミングの悪い露出。check が「Check passed」を表示する必要があります(all はチェックが合格しないとレンダリング前に停止します)。以下の警告は予想されており、問題ありません:「nested structure」、「track too dense」、「composition file too large」、およびインセットの「overflowing」(クロップ)。
7. 音声とレンダリング
reel all reels/<スラッグ> # 音声 (ElevenLabs) → サウンド → ビルド → チェック → レンダリング
reel frames reels/<スラッグ> --every 2 # リール全体のコンタクトシート、レビュー用
印刷された長さを確認してください(60〜90秒;オーバーしている場合は設定をカットしてください)。renders/review.png を確認してください:被写体は読みやすいか、キャプションはクリアか、名前付きのものはその単語に合わせて動いているか、投票カードと手がかりのインセットが表示されているか。ライン1を聞いてください;単語が聞き間違えられる可能性がある場合は、単語を変更して音声を再生成してください(変更したラインのみクレジットを消費します)。
8. 納品
ユーザーに renders/<スラッグ>.mp4、renders/cover.png、および POST.md(キャプション、ピン留めコメント、代替テキスト、投票終了時間)を提供します。シリーズの場合は、リールフォルダの隣に bible.md を作成または更新します:キャスト、ルール、正史、手がかり、そして各投票オプションに対して次のパートがどのように始まるかの1行(story-engines §4)。
コマンド
| コマンド | 機能 |
|---|---|
reel new <dir> --title "…" | リールフォルダを準備する |
reel voice <dir> [--draft] | 音声 + 単語タイミング → timing.json、assets/audio/narration.wav |
reel sound <dir> | 19の効果音 + アンビエント音を合成する |
reel build <dir> | index.html、cover/、POST.md をコンパイルする |
reel check <dir> | HyperFrames の lint、レイアウト、コントラストチェック(失敗時は非ゼロで終了) |
reel snap <dir> --at scenes | コンポジションからの PNG 静止画、ショットごとに2枚(または --at 1,5.5,9 秒) |
reel render <dir> [--draft] | −14 LUFS の MP4 + cover.png + コンタクトシート |
reel all <dir> [--draft] | 音声 → サウンド → ビルド → チェック → レンダリング(チェック失敗時は停止) |
reel frames <dir> --every 2 | レンダリングされた MP4 全体のレビューシート |
トラブルシューティング
"word" isn't spoken there: 時間参照はキャプションのスペルを使用し、そのシーン内でのみ検索されます;エラーはそのシーンの発話を表示します。2回目の出現にはword#1を、別のシーンにはsN:wordを、オフセットにはstart+0.2を、絶対時間には12.5sを使用してください。- Voice not found: プリセット名(Liam, Brian, George, Daniel, Callum, Bill, Roger, Chris, Eric, Will, Harry, Charlie, River, Adam, Sarah, Matilda, Jessica, Alice, Lily, Laura, Bella)または音声 ID を使用してください。
- Credits ran out: すでに音声化された行はキャッシュされています;チャージして
voiceを再実行してください。 - A blank or black shot: そのセット内の JavaScript エラーです。
checkがそれを表示します;修正後に再度ビルドして関数をテストしてください。 - Over 90 s: 設定行と形容詞をカットしてください;フック、ツイスト、投票、手がかりは維持してください。
npxornodeerrors: Node 18+ をインストールしてください;初回実行時はnpxに HyperFrames と Chrome のダウンロードを許可してください。
このスキルに含まれるもの
scripts/reel.py: CLI。scripts/synth.py: 19の効果音とアンビエント音(ドローン、風、パルス、ハム、水)、すべて合成。assets/kit.js: 描画キット。assets/runtime.js、assets/base.css: キャプション、HUD、投票カード。references/:viral-script-playbook.md(常に読む)、story-engines.md(プロット、シリーズ、バイブル)、episode-format.md(仕様)、drawing-kit.md(描画)、sound-voice-posting.md(音声、サウンド、キャプション、投稿、安全性)。examples/sundown-part1/: 完全な89秒のパート1(episode.json+scenes.js)。examples/starter/:newが使用する4ショットのスターター。examples/script-pitches.md: さらに5つの完全なパート1スクリプト(THE WHEEL, LAST CAR, LOW TIDE, 3:33, ROW ONE)。