Communitygithub.com

scrapbook-editor

生の縦型 (9:16) テイクを、ユーザーが検証済みの「スクラップブックスタイル」に加工して、完成されたショート動画に編集します。

scrapbook-editor とは?

このスキルは、話者の縦型セルフテイク(9:16)を、検証済みのスクラップブックスタイルのショート動画に変換します。ユーザーが2026-10-05に検証したスタイルを完全に再現し、あらゆるテイクに適用します。具体的なスタイル要素として、ポーズをすべてカット(ジャンプカット、そのたびにフレームがワイド/クローズに切り替わる)、低い位置に3語ずつ表示されるキャプション(発話中の単語は黄色)、フック部分は2種類のフォント(重要な単語はFrauncesで黄色、その他はArchivoで白)で紙の上にラインを引いた表現、小冊子の切れ端コラージュ、マーカーハンド(Gochi Hand)による手書き風テキスト、赤マーカーの描画(単語の取り消し線や下線)、話者の頭周りに配置されるダイカット絵文字ステッカー、GIPHYから取得した実際の反応GIFをポラロイド風に画面中央の同じ位置に大きく(幅の0.80)表示し、落下・フリックアウトさせる動き、各セクションを同じ切れ端にカメラがパンチインしながらスイングインする演出などが含まれます。また、音楽ベッドや各要素の着地音も追加されます。このスキルはshort-editorスキルのエンジン上で動作し、トランスクリプション、レンダリング、ミックス、プレビュー、ビルド、検証は同じファイルを共有します。パイプラインは、作業ディレクトリのセットアップ、質問(音楽、ブランドカラー、実素材、ボーナス要素)、トランスクリプション、ポーズカット(ジャンプカット)、顔認識、判断(各フレーズに最適なビジュアル要素を選択)、各要素の実装(フック、紙、反応GIF、ステッカー、キャプション、音楽)、レンダリング、検証という流れで進行します。ユーザーは動画や音声を直接確認できないため、各処理は測定(tighten.py, face.mjs, measure.mjs)と合成フレームのプレビュー(preview.mjs)、フレーム単位の動き確認(build.sh --slice)に基づいて行われ、verify.mjsが最終チェックを担当します。

対応✓Claude Code~Codex CLI✓Cursor✓Gemini CLI
npx skills add https://github.com/ihsaneGTM/gtm-skills/tree/main/plugins/video/skills/scrapbook-editor

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

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

ドキュメント

scrapbook-editor: 生テイクがスクラップブックショートになる

ユーザーから自分の話している縦型テイクが1つ渡されます。このスキルは、そこからすべてのポーズをカットし、フレームをスクラップブックに変えます。まるでモーションデザイナーがAfter Effectsでやるように、話者がそのスクラップブックを通して語ります。リファレンスにあるタイトルは2つのフェイス(白い文字、重要なものは美しいセリフ体で色付き、紙の上にライン)と、フックにはステッカー、インターネットの反応ミームがポラロイドとして顔の上にドロップされ、タイトルと非常に重要な単語だけは紙の切れ端で表示され、話しながら赤いマーカーが描画され、リストアップするものにはステッカー、名前の出てくる実際のスクリーン、低い位置に単語ごとに表示されるキャプション、音楽ベッド、そして着地するものそれぞれに効果音が付きます。

スタイルは検証済みです(ユーザー、2026-10-05):完全に再現してください。 § スクラップブック言語(パイプラインの下)は、検証済みカット(workspace/videos/scrapbook-dev-sales.mp4、その計画:example/plan.mjs)の見た目です。同じフィギュア、同じサイズと場所、同じフェイス、紙、動き、サウンドとレベルで、あらゆるテイクに適用します。これは実際の編集(72.7秒のリスト動画「7 Claude skills」、ユーザーがクライアント向けに編集:example/README.md はその完全な構造)の測定から始まり、6回のレビューを経て確定しました(§ ユーザーの決定)。init.sh がそれをスキャフォールドします。他の見た目を発明してはいけません。ユーザーが変更を依頼していないものは決して変えてはいけません。

このスキルは、short-editor スキルのエンジン上で動作します。 トランスクリプション、レンダリング、ミックス、プレビュー、ビルド、検証は同じファイルです。../short-editor/SKILL.mdの § 前提条件、§ ファイルの場所、§ 4 から § 6 を一度読んでください。これらはここに書かれている通りに適用され、このファイルは異なる点のみを記述します。最初のカットの前、毎回実行する前に以下を読んでください:

  • scripts/example/README.md:リファレンス編集の詳細な流れと開発カット
  • ../../references/pitfalls.md § トランスクリプションとキャプション、§ 作業方法:編集を記述する際の罠(その他のセクションは該当するステップになった時に読んでください:§ 手動で測定する前のオーディオ、§ ffmpeg と § 独自のコマンドを実行する前のシェル;エンジンのツールは残りのルールに従います)

ステップが必要とする時に読んでください:../../references/audio-spec.md レベルの項(ラウドネス標準、聞こえるレベルとしての測定方法)。エンジンのフィギュア:node plugins/video/skills/short-editor/scripts/api.mjs <module> [figure]、ソースから直接取得しないでください。

私はビデオを見たり、音声を聞いたりできません。 どこでポーズが入るか、顔がどこにあるか、サウンドがどのくらいの大きさで着地するか:それぞれが測定(tighten.py、face.mjs、measure.mjs)であり、その後合成フレームの確認(preview.mjs)とフレームごとの動きの確認(build.sh --slice)を行います。verify.mjs は「準備完了」と壊れたファイルの間に立ちはだかります。絶対にスキップしないでください。

以下のパスはすべて、GTM by Pipecorn フォルダのルートからの相対パスです。$K は plugins/video/skills/scrapbook-editor/scripts(このスキル)、$E は plugins/video/skills/short-editor/scripts(エンジン)を意味します。両方とも絶対パスで実行してください。

前提条件(事前確認:作業開始前にチェック)

エンジンのもの:ffmpeg + ffprobe が PATH に存在すること(brew install ffmpeg)、および python3(Xcode Command Line Tools)が必要であり、これらはここからインストールできません。不足しているものがあれば停止してコマンドを表示してください。その他はすべて自動で準備されます:$K/py.sh はエンジンの bootstrap.mjs(Node パッケージ、numpy を含む音声認識 venv)を実行します。init.sh は3つのフェイス(Archivo、Fraunces、紙のマーカーハンド(デフォルトは Gochi Hand:Google Fonts, OFL))をプロジェクトの assets/fonts/ にフェッチ(または ~/Library/Fonts から検索)し、sounds.mjs は紙のサウンド(8つの Mixkit 録音、マシンごとに1回、plugins/video/assets/sfx/paper/ に、決してコミットしない:Mixkit ライセンスによりビデオ内での使用は許可されますが再配布は許可されていません)を準備し測定してプロジェクトの assets/sfx-paper/ に配置し、シェルフから Motionix パック(plugins/video/assets/sfx/motionix/、explainer スタイルで準備済み;パック内にライセンスの記載なし:公開前にその README を確認してください)を assets/sfx-motionix/ にコピーします。システム全体にインストールされるものはありません。

オプション(不足していてもブロックにはならず、その旨を伝える):

  • swiftc(Xcode Command Line Tools):face.mjs が Apple Vision で顔を見つけるために必要です。これによりポラロイドが顔の上に着地し、ステッカーが頭の周りに配置されます。これがない場合は、プレビューフレームで顔を読み取り、project.json の face({x, y, w, h}、フレームの割合)を設定してください。
  • .env.local 内の GIPHY_API_KEY:検証済みスタイルの実際のリアクション GIF に必要です(gif.mjs)。無料:developers.giphy.com → Create an App → API(GIPHY が推奨する SDK ではありません:SDK は GIPHY 自身のピッカーを表示するアプリ向けです。gif.mjs は API を呼び出します)、1時間あたり100コール、編集には十分です。これがない場合:ユーザーが提供する GIF(media.mjs)または生成されたリアクション画像を使用します。その旨を伝えてください。
  • .env.local 内の GEMINI_API_KEY:生成されたイラストやリアクション画像に使用します(picture.mjs、Nano Banana 2、1Kあたり約 $0.07)。
  • /Applications 内の Google Chrome(または Chromium、Brave、Edge):話者が名前を挙げた公開ページのスクリーンショット(capture.mjs)を、ユーザーが独自のキャプチャを持っていない場合に使用します。

ファイルの場所

エンジンが言う通り、そしてこの方法のみ:編集ごとに1つの作業ディレクトリ、workspace/projects/<slug>/(スラッグは他のプロジェクトと重複しない)、完成ファイルは workspace/videos/<slug>.mp4。同じテイクであっても、他のプロジェクトのファイルを決して置かないでください。一時ファイルはプロジェクトの tmp/ に置き、/tmp には置かないでください。スキルの scripts/ は読み取り専用のままにします。編集の画像は assets/media/ に配置します。

パイプライン

0. 作業ディレクトリをセットアップする

$K/init.sh workspace/projects/<slug> <source.mp4> workspace/videos/<slug>.mp4

エンジンのスキャフォールド(project.json はファイルから読み取り、subs.config.json、cut.mjs)、次にこのスキルの plan.mjs と edl.mjs(言語のすべてのフィギュア、コメント付き、記入準備完了)、project.json 内の言語のキー(style: "scrapbook"、accent、captionKeep)、顔、そしてこのソースの声に合わせて調整されたサウンド(voiceM、声の瞬間中央値、および sfxMasterDb 0:各ロールはその後、聞こえるように声の下の LU で設定されます)。以降のすべてのコマンドはそのディレクトリ内から実行してください。

0.2. まず、1つの質問で尋ねる

これらはユーザーに属し、推測できません。1つの AskUserQuestion にまとめてください:

  • 音楽。 デフォルトではベッドミュージック(3回目のレビュー:「背景音楽を入れる価値がある」):最初に Hip Hop 02(Mixkit, Lily J:検証済みカットのもので、スタイルのデフォルト;Mixkit ライセンスは公開ビデオでの使用を許可)を提案し、次に Convergence(他のスタイルのハウストラック)、シェルフの残り(plugins/video/assets/music/、その README)、最後に「音楽なし」を提案します。耳で選ぶには、ボード(各トラックで同じ12秒間、すべて同じレベル)を使用します: node $K/music-board.mjs --to 12 mixkit-hip-hop-02-738.mp3@0 [email protected] …(ビルド後、最後にプロジェクト自身のベッドを元に戻します)。これは声の下 15 LU になります($K/music.mjs、§ 見た目)。Mixkit 以外のトラック(Convergence、ridgeclub)はビデオの収益化をブロックする可能性があることを一度伝えてください。
  • ブランドの色(project.json accent;重要な単語が異なる場合の wordColor;設定されている場合のあなたのブランドのアクセント、workspace/brand/、plugins/video/references/brand-kit.md § あなたのブランド、一度設定):Fraunces の重要な単語と発話中のキャプションの単語。デフォルトは黄色 #FFD43B(Pipecorn のもの)。テイク上で確認してください:髪、肌、壁の上に配置されます(開発テイクでは、コーラルとオレンジは話者の髪と顔で消え、黄色はどこでも読み取れました)。そしてキャプションがそのまま書き込まなければならない名前(captionKeep:ブランド、製品、人名、「Station F」)。
  • 実際の素材:話者が名前を挙げるもの(自社製品、リポジトリ、ページ)のスクリーンショットや画面収録、ロゴ。これらがない場合、公開ページはキャプチャされます(capture.mjs)。プライベートな画面は決して発明してはいけません。
  • Pipecorn 汎用:すべてのスタイルのボーナス、毎回尋ねられ、デフォルトではオフ(plugins/video/references/pipecorn-generic.md):最後に約6秒間、Pipecorn、次にその価値が1つのスロットで次々と入れ替わり、再び Pipecorn、音楽なし。いいえ · はい、その場合どの価値(1~4;node $E/generic.mjs --list;デフォルトは電話カバレッジ、接続率、パイプライン)。
  • あなたの声を良くする:ボーナス、毎回尋ねられ、デフォルトではオフ(plugins/video/references/voice-clean.md):ElevenLabs のボイスアイソレーターがテイクから部屋の反響とノイズを取り除きます。いいえ · はい、声を良くしてください。ElevenLabs コネクタが必要です:キーがない場合は、それが存在することを一行で伝え(設定 › コネクタ › キーを追加)、続行します。「はい」の場合、ステップ1の前に: node plugins/video/motion/voice.mjs clean <source>、その後 project.json › source は <…>-voice.<ext>(同じ長さ、画像は未処理)。

GTM by Pipecorn ページから実行し、最初のメッセージのブリーフがそれに答えます。再度尋ねないでください。

1. トランスクリプション、逐語的に

$E/transcribe.sh --lang en      # 実際に話されている言語;翻訳しないこと

words.json、生テイクのクロック上。テイクがラッシュ(同じ文を数回試行)の場合は、最初にエンジンの rough-cut.mjs(short-editor/SKILL.md § 0.7)でアセンブルし、その後アセンブリをトランスクライブします。次に node $E/words.mjs(エンジンのもの):words-fixed.json、各単語の開始が無音から音声上に移動され、ポーズの前の実際の終了時刻が設定され、疑わしいものがリストアップされます。words.mjs env|end|say で1つを読む(short-editor/SKILL.md § 1)。このための独自のスクリプトは決して使わないでください。

2. すべてのポーズをカット:ジャンプカット

$K/py.sh tighten.py --dry-run    # 何がカットされるか
$K/py.sh tighten.py              # source/tight.mov;project.json、words.json、shots.json が再参照
$K/py.sh tighten.py --keep 0.10 --min-pause 0.16    # デフォルト、リファレンスで測定

0.16秒以上のすべての無音が除去され、結合部分は0.10秒まで残ります(最後の音から0.06秒後、次の音の0.04秒前)。先頭の無音と末尾も同様です。リファレンスでは、残ったポーズは0.32秒を超えず、結合はおおよそ2〜3秒ごとに発生します:話者は画面上で息継ぎをしません。各結合はジャンプカットです:フラッシュやウーシュで隠しません。カメラは、そのカットでフレームをワイド/クローズに切り替えることでそれをマークします(§ 見た目)。

発話が停止する場所は測定され(10ms エンベロープ、ヒステリシスは室温 + 12 / 室温 + 5 dB)、Whisper から読み取ることは決してありません。Whisper の開始点はそれに対してチェックされます:測定された無音の内部で、その下にソフトな音(室温 + 9 dB)がある開始点は、その50ms 前でカットを停止します。室温トーン内の開始点は、Whisper が早すぎることを意味し(開発テイクで3回、0.35秒早かった)、発話が始まる場所に移動します。両方を報告します。

保持されたストレッチは、source/tight.mov に一度だけ書き込まれます。全体フレームで(各ストレッチの画像と音声は正確に同じ長さ:スナップなし、13回の結合で唇が音声より2フレーム遅れたことがある)、ソースのビット深度とカラータグを保持します(グレーディングは決して行わない)。その後、エンジンの rough-cut.mjs --adopt が行うように、project.json はそれを参照し(source、テイクは rawSource に残る)、words.json はそのクロック上に配置され(テイクのトランスクリプトは words.raw.json に残る)、shots.json は結合間のショットをリストします。エンジンのオンザフライ cuts ではありません:カットのあるプロジェクトはスライスでレンダリングできません。スライスこそが動きの中で瞬間を確認する方法です。tighten.py は常にテイクから再開するため、2回実行しても安全です。話者が希望するカット(リテイク、つまずき)は project.json の manualCuts(テイクの秒数)に入れ、その後再度 tighten.py を実行します。

テイク内のシーンの変更(最後のティーザーショット、別の部屋)は shots.json には含まれません:フレームの明るさがジャンプする場所を見つけ(ffmpeg … signalstats YAVG フレームごと)、それを計画に与えます(SCENE):そこではカメラがワイドになり、紙がそれをスイープインします。

3. 顔の位置

node $K/face.mjs      # assets/faces.json、毎秒5つ、出力タイムライン上

Apple Vision、カットを通過して。計画はカメラを通してそれを読み取ります(faces(P, camera(STEPS))):F.slot() はビデオのすべてのポラロイドが着地する場所です(フレームの中央線、顔の中央値の中心から0.08下、0.44-0.50:画面の中央)、F.faceLine() は顔自身のライン(その中央値の中心、0.36-0.50)で、顔の上に書かれるキーアイデアやパンチフレーズ用、F.top(t) はキーワード用の頭上の高さ、F.around(t0, t1, n) は頭の周りのスポット、F.over(t0, t1) は顔のボックス。tighten.py を実行するたびに再度実行してください。

4. トランスクリプトを読み、画像を決定する:判断ステップ

テイク全体を読み、リファレンスと同じ密度を与えます:1〜3秒ごとに新しいものを画面に表示(リファレンス:72.7秒で50フィギュア;開発カット:47.1秒で49フィギュア)。文ごとに、それを表現するフィギュアを§ 見た目から選択します:

  • フック(最初の文):リファレンスの3行のタイトル(白い線;約束の THE 単語は色付きで、周りに白い単語;紙の上の線)、文が役割、ツール、チームをリストまたは示唆する場合は頭の周りのステッカー。
  • 感情、コスト、失敗、誇張、比較:実際のリアクション GIF をポラロイドとして(検証済みカット:Pepe Silvia for 「search through thousands of platforms」、Key & Peele sweating for 「full disclosure, I'm not the best」、電話中の Buddy the Elf for 「what to say on a call」、「Let's get ready to rumble」 for 「versus」)、あごの上にキャプション、ショート動画で4〜5つ。
  • 通りすがりにリストされるもの(「良い点、悪い点、失敗点…」)と余談(場所、「シリーズ」、「お楽しみに」):ステッカー、単語ごとに1つ(紙はすべてのキーワードには使いません:キャプションがすでに単語を言っています)。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

関連スキル