エディトリアルショート(Fringe Lines) は何をしますか?
このルックはGreg Isenbergのショート動画をモデルにしています。すべてのショートを以下の基準に従って作成してください:
- 話している人の顔が6秒以上続かないようにする。
- 3〜5秒ごとにグラフィックまたはレイアウトの変更を入れる。
- キャプションは単語ごとに表示し、いくつかのオレンジ色のイタリックキーワードを含める。
- グラフィックは発言内容に従い、説明する単語に合わせて表示する。
0. 前提条件(マシンごと)
pipeline/setup.shで仮想環境~/.shorts-skillと Remotion の node_modules を~/.cache/fringe-lines-videoにインストールする。- エピソードのトランスクリプトが存在すること:
work/<ep>/words-quinn.jsonおよびwork/<ep>/words-doom.json(pipeline/transcribe_verbatim.pyから生成)。 - Remotion ソース:
pipeline/remotion/src/ShortV2.tsx(レイアウト)およびGraphics.tsx(グラフィックタイプ)。
1. 瞬間を選ぶ(30〜50秒)
- 単語ファイルから、自己完結したテイクを検索する。条件:
- 強いオープニングライン(主張、数字、告白)。
- 1つのアイデア。
- 終盤にオチまたは決めゼリフがあること。
- 良いシグナル:
- 具体的な数字(パーセンテージ、金額、人数)。
- 名前の付いた企業や製品。
- 逆張りの意見。
- 個人的な実験(「Codexにやらせてみた…」)。
- 前後の文脈に依存するクリップは避ける(「さっき言ったように」「あの件」)。
- 複数の
--rangeをつなぎ合わせてもよい。文の切れ目でカットし、継ぎ目で単語が重複しないようにする。
2. カットする
work/<ep>/shorts.sh に行を追加して実行する:
b --name short-NN --range START:END [--range ...] --replace "27=>27%" --replace "claude=>Claude"
build_short.pyは以下を行う:- フィラー、言い直し、長いポーズを削除。
- アクティブなカメラを選択。
work/<ep>/short-NN/clip.mp4とprops.jsonを書き出す。- プレーンなv1ショートをレンダリングする。
--replaceはキャプションテキストを修正する。空の右辺はその単語を非表示にする。- 必ず修正するもの:数字("27"→"27%")、製品名(Claude、Codex、Descript、GTM、SQL)、Whisperの聞き間違い。
- 正確な出力タイミングを取得して仕様を記述するには、タイミングを表示する:
python3 -c "import json;p=json.load(open('work/<ep>/short-NN/props.json'));print(' '.join(f\"{w['text']}@{w['startMs']/1000:.1f}\" for w in p['words']))"
3. スタイル仕様を記述する:work/<ep>/short-NN/style.json
{
"hook": {"text": "Microsoft wants *27%* of its staff to quit", "end": 2.8},
"outro": {"text": "Grow *without* growing *headcount*", "hold": 2.0},
"emphasis": ["microsoft", "27%", "leave"],
"scenes": [
{"at": 0.0, "mode": "full"},
{"at": 3.0, "mode": "graphic", "graphic": {"type": "stat", "kicker": "Microsoft buyout offer", "value": 27, "suffix": "%", "label": "of employees offered a payout to *leave*"}},
{"at": 6.2, "mode": "card"}
]
}
時間はカットクリップ内の秒数で、ステップ2の単語タイミングから取得します。
一貫性を保つためのルール:
- 構造:
- シーン0は常に
fullで、4〜8単語のhookを約2.5〜3秒で終了させる。 - 主張を述べる。クリップの要約はしない。
- シーン0は常に
- リズム:
- モードを
full→graphic→card→graphic→card… と交互に配置し、40秒のショートに3〜6個のグラフィックを入れる。 - 後半で1回だけ、インパクトのあるリアクションや笑いのために
fullを再度使用する。
- モードを
- タイミング:
- 各グラフィックは、説明する単語の 0.1〜0.3秒前 に開始し、2.5〜5秒間表示する。
- 2つのグラフィックを直接連続させてもよい(例:$20のカードの直後に$100のカード)。
- 強調: 10〜18個のキーワード(数字、名前、オチの単語)を選ぶ。マッチングは小文字で、句読点は無視する。
- アクセント: テキストフィールド内で
*word*はオレンジのイタリックで表示される。1文字列につき1〜2個使用する。 - アウトロ: 2秒のエンドカードで、要点を言い換える短い行、または視聴者への質問を表示する。
- 正確性:
- 画面に表示する数字は、番組内で話された内容と一致しなければならない。
- チャートは概略図とする:形状(up/flat/down)を使用した
linesを使用し、架空の軸や値を決して使用しない。 - 話者が曖昧にした場合は、「おおよそ」や「〜」で曖昧にする。
グラフィックタイプ(Graphics.tsx):
| タイプ | フィールド | 使用目的 |
|---|---|---|
stat | kicker, prefix, value (数値、カウントアップ), decimals, suffix, label | 1つの見出しとなる数字 |
people | kicker, value (文字列), label, filled (0–1) | 人数 / 人の割合 |
lines | kicker, series: [{label, shape: up|flat|down}], caption | トレンド対トレンド |
quote | text, by? | 決めゼリフ(画面に表示) |
headline | source, title, highlight | ニュース、発表、「評決」 |
list | title, items[] | ステップ、製品、何が悪かったか |
新しいグラフィックタイプが必要な場合は、Graphics.tsx とそのユニオン型に追加する。カードスタイルは維持すること:白またはインクカード、36pxの角丸、スプリングの入口アニメーション、およびローカルフレーム f で動作するアニメーション。
4. レンダリング
~/.shorts-skill/bin/python pipeline/style_short.py --ep <ep> --name short-NN --spec work/<ep>/short-NN/style.json
- 顔トラック(
pipeline/face_track.py、YuNet)は一度計算され、short-NN/faces.jsonにキャッシュされる。これにより、円形PiPとカードが顔の中心に配置される。クリップを切り直した場合はファイルを削除すること。 - 効果音は合成される:シーンチェンジごとにウィッシュ音、グラフィック着地時にポップ音。ミックスレベルは
--sfx-db -20。 - ラウドネス:−14 LUFS。
- 出力:
out/shorts/<ep>-short-NN-v2.mp4。
5. QA(常に、報告前に行う)
フレームを抽出して確認する:
for t in 1.5 5 10 15 20 25 30 35 40; do ffmpeg -v error -y -ss $t -i out/shorts/<ep>-short-NN-v2.mp4 -frames:v 1 -vf scale=270:-1 /tmp/q_$t.png; done
以下の各項目を確認する:
- フック: 読みやすく、顔を覆っていないこと。
- グラフィック: キャプションブロック(y≈1340–1600の位置)と重なっていないこと。テキストがカードからはみ出していないこと。長い統計値(「+$500K」など)は自動的に縮小される。
- PiP: 顔が円の中心にあること。
- キャプション:
*の漏れがないこと。キーワードがオレンジで表示されていること。 - ラウドネス:
ffmpeg -i out.mp4 -af ebur128 -f null - 2>&1 | grep " I:"が約 −14 と表示されること。
ユーザーに報告する内容:
- ショートの内容と長さ。
- 確認が必要な数字。
- 残っている過激な表現。