動画ストーリーテリング
長尺動画の視覚レイヤーを構築し、視聴者が9分経過しても方向性を失わないようにする方法。スクリプトのあるトークヘッド動画(ニュース解説、単一テーマの深掘り、比較、チュートリアル、ランキング形式など)に適用されます。
このアプローチが置き換えるのは「シーン思考」という失敗です。数秒ごとに新しいグラフィックが表示されると、視聴者は数秒ごとに理解を再開することを強いられ、どの個別のグラフィックにも問題がないため、フィードバックは「わかりにくい」「情報が多すぎる」という曖昧なものになります。
中立的な練習用ビートシートについては、リポジトリルートの docs/STORYTELLING-WORKBOOK.md を参照してください。再利用可能なデザインシステムは、このスキルの reference/design-system.md にあります。実際のオープンループ形状は reference/patterns/wall-of-slots/ にあります。プライベートなソース動画は必要ありません。
これは hyperframes-video-beats とは異なります。そのスキルはトークヘッドの上にオーバーレイカードを配置します。このスキルは、動画が主題としているものをデザインします。
1 · 4つの原則
一つの永続的なワールド
動画は単一の空間に存在し、決してリセットされません。視聴者が既に見たものはすべて、置かれた場所にそのまま存在し続け、新しい素材はそれを置き換えるのではなく追加されます。一度描かれた要素は、再描画、移動、または再ラベルされることはありません。
このスキルの他のすべてはこれに依存しています。空間が絶えず変化していてはカメラの行き先がなく、画面に他に何もなければスポットライトは意味をなさず、リセットされる世界ではオープンループは開いたままでいられません。
また、ワールドは滞在する価値がなければならないため、何かを構築する前に空間の文法を決定し、実行時間全体を通してそれを維持します。リファレンスビルドでは、左から右へは成果に向かう動き、上は人間に向かう動きで画面内で唯一の暖色、下は記録システムへの動きです。最初の2分間でそれを学習した視聴者は、残りの動画を無料で読み解くことができます。
意味を持たせるために、意図的に一度だけ文法を破ります。リファレンスビルドで10分間の中で唯一の右から左への動きは、「再開率」という言葉に合わせて、解決済みのチケットがキューに戻される場面です。それまでの3分間、方向に意味があったため、この動きは何の説明もなく受け入れられます。
カメラが編集である
新しいグラフィックにカットするたびに、視聴者は方向感覚を失います。固定された空間を移動する場合、そのコストはかかりません。プッシュインは「すでに理解しているものの一部を詳しく見る」という意味になり、プルバックはこれまでの構築がすべてそのまま残っているため、労力が報われる瞬間です。
3つの高度で作業し、隣接する高度間を移動します。
| 高度 | 表示内容 | 使用目的 |
|---|---|---|
| ワールド | 空間全体 | 方向付け、成果の提示、「ここが今いる場所」 |
| リージョン | 議論中のサブグラフ | 実行時間のほとんど |
| 詳細 | 単一の要素 | 数字、状態変更、決定 |
詳細からワールドへのジャンプは、意図的な成果のビートでない限り混乱を招きます。その場合、これが最良の選択肢です。
学習にそれぞれ再構築を要するルール:
- フレーミングは正確なワールドウィンドウとして名前を付け、スケール係数としては付けない。 ウィンドウの境界はラベルの間に配置する必要があります。「スケール0.6」としてフレーミングを指定すると、フレームの端で単語が半分に切られます。
- 同じ目的には同じウィンドウを再利用する。 方向付けショットが特定のウィンドウである場合、常にその正確なウィンドウを使用します。ほぼ同一のフレーミングは、ずれとして認識されます。
- 移動距離に応じて持続時間を変え、1つのグローバルプリセットは使用しない。
- カメラ移動と全フレームワイプは順番に行い、決して重ねない。 同時に行うと、コンテンツを切断します。先にカメラ、次にワイプ。
- カバーレイヤーは、その下をカメラが移動する前に不透明になる。 順序が逆だと、移動の一部が露出し、ジャンプカットとして認識されます。
- フレーム端から60px以内にラベルを配置しない。 要素がフレームからはみ出ると「世界は続いている」と読めますが、グリフの途中で切れた単語はバグとして認識されます。マスキングではなく配置で解決します。フェザーは約1800 px/sで移動するブレードを捉えられないからです。
- 同じ被写体に対する2つの連続した動きは、グリッチとして認識される。 リフレームが終了し、その後ワイプが開始するのは、ズーム、停止、そして2番目の動きです。クライアントはそれを「グリッチとポーズ」と呼びます。それらを1つのジェスチャーに統合します:共有の対称イーズ(power2.inOut)、同じフレームに着地することで、パネルがフッテージを押しのけているように読み取れます。関連:可視フッテージの移動にフロントロードイーズ(power3/4.out)を使用すると、移動の約90%が最初に発生し、停止に向けて低速になります。要素の出現に予約します。その場合、低速は落ち着きとして読み取れます。(実例のイントロでクライアントからフラグが立てられた改訂のコストが発生しました。)
注意はスポットライトである
どの瞬間にも、完全な明るさの要素は正確に1つだけです。既に描画されている他のすべては、控えめでありながら読み取れる状態を保ちます。 これはオプションではありません。このルールにより、ワールドに12もの要素が追加されても、決してごちゃごちゃして見えず、プルバックが圧倒的ではなく読みやすくなります。
階層は、アクティブと静寂の間の比率から生まれ、すべてを暗くすることからは決して生まれません。リファレンスビルドの最初のプロトタイプは最も明るいピクセルが101/255で、960x540では読めませんでした。修正は、より多くの薄暗さではなく、より明るいインクでした。
| 状態 | ターゲット輝度 (Y, 16-235) | リファレンスでの不透明度 |
|---|---|---|
| アクティブなストローク+ラベル | 200-235 | 1.0 |
| コンテキスト、描画され関連性あり | 120-150 | 0.56 |
| 役割を終えた、役目を果たした | 85-105 | 0.33 |
| 任意のラベル、任意の状態 | 90を下回らない |
実装は1つの関数で、すべてのナレーションビートで議論されているIDを指定して呼び出されます(build_s01.py、lit())。
def lit(t, active, warm=(), dur=0.5, floor=FLOOR):
active = list(active) + [g + "-l" for g in active if g + "-l" in order]
for gid in order:
if gid not in opac: # 未描画:点灯なし
continue
tgt = 1.0 if gid in active else (WARM if gid in warm else floor)
if gid not in active:
tgt = min(tgt, MUTED.get(gid, 1.0))
...
ここには3つの重要な詳細があります。
- ラベルは常にその要素の状態を継承する(
-lサフィックスの組み込み)。点灯した要素の下にあるラベルが読めないのは、まさに修正しようとしている欠陥です。 - 役割を終えた小道具は、不透明度0に退く。ただし
MUTEDキャップを介してであり、0.3ではありません。0.3にミュートすると、セクションの残りの間、説明のつかない紙吹雪が画面に残ります。ジェネレーターのルール:後で開始するlit()の前にmute()を発行します。そうしないと、トゥイーンが完了したときにミュートが上書きされます。 - 不透明度イベントはタイムライン順に発行する必要がある。そうしないと、トラッカーが古い状態を認識し、間違ったターゲットを計算します。順序不同の発行でエラーを発生させる
seq()ガードを維持します。 - ウィンドウごとに要素あたり1つの不透明度オーソリティ。 同じ要素の不透明度を異なる値に駆動する2つの同時アクティブトゥイーンは、スタンドアロンセクションではスムーズにレンダリングされますが、組み立てられたマスターでは約10Hzでストロボし、勝つトゥイーンがフレームごとに交互になります。リファレンスビルドでは、すべてのドックでこの欠陥が出荷されました。
lit()のようなスイープが明示的な明るくしたりミュートと重なる場合、後で開始するトゥイーンが唯一のドライバーとなり、スイープはそれらのIDをスキップします(lit(..., skip=(...)))。これをゲートします:組み立てられたレンダリングをスキャンし、すべての遷移ウィンドウで1フレームの行って戻る輝度ポップがないか確認します(リファレンスビルドのqa/v4/flicker/qa-flicker.mjs)。
オープンループは空間的である
「これについては後で戻ってきます」とは決して言いません。ワールド内に視覚的に未完了のものを残し、それに戻ります。視聴者が見ることができる約束は、視聴者が未解決だと感じることができる約束です。
メカニズムは形状に関係なく同じです。
- フックで、空間に、約束をするラインにそれを植え付ける。
- すべての境界で再表示する。 任意のセクションの受け渡しは境界です。再表示には約2秒かかり、定着のメカニズムです。これをスキップすると、成果が何も報われないことになります。
- 視覚的に進捗させる。 視聴者は未完結部分が縮小するのを見なければなりません。
- 開始した画像で閉じる。
スクリプトから形状を選択します。
| スクリプトの形状 | ワールド | 未完了なもの |
|---|---|---|
| N個の並列項目 | スパイン上のN個のソケット | 空のスロット(reference/patterns/wall-of-slots/ 参照) |
| 1つのプロセス、深い | レイアウトされた完全なパイプライン | 壊れた、または欠落したリンク |
| レベルまたは階層 | 上に積み上げられるスタック | スタックの最上部はゴースト |
| 比較 | 1つの共有軸上の2つの列 | 1つの列が空、または未完成のスコアカード |
| ニュースまたは発表 | タイムライン、またはランドスケープマップ | 右側、未来が空白 |
| チュートリアルまたはビルドアロング | ゴースト化された完成アーキテクチャ | まだ構築されていないすべてのノード |
項目をスロットに渡すのは、ライブカメラ移動(約1.4秒)であり、決して埋まった状態の事前作成画像へのカットではありません。視聴者は、学んだばかりのものがタイルになるのを見ます。動画に数字やカウンターがある場合は、同じ移動の中で、オドメーターのように、両方の数字に同じ開始、持続時間、イーズを使用してロールします。そうしないと、ロール途中で1つのバンドに統合されます。
カウンターには数字だけでなく名前が必要です。 隅っこの数字は視聴者にシーケンス内の現在位置を伝えますが、現在の項目が何であるかは伝えません。9分経過すると、「03」は何も伝えません。数字と現在の項目名(SUPPORT、VOICE AI)の1〜2語のラベルをペアにし、同じプレート化学で、数字と同じリジッドな備品として移動し、同じオドメーターロール内で交換します。リファレンスビルドのクライアントレビューで正確にこれが要求されました。ビジュアルは良かったが、視聴者はどのユースケースが画面に表示されているかを見失っていました。
2 · 規律
言葉にならないものは描画しない
すべての形状は、ラベル付き要素、ラベル付き要素間のコネクタ、移動する被写体、または周囲の背景のいずれかです。それ以外は何もありません。
これは、理解度スコアが7/10で、原因を特定したミュートテストレビューから生まれました。図はきれいでしたが、装飾はそうではありませんでした。意味のある形状と同じ太さとパレットで描かれた、ラベルのない十数個の形状。初めて見る視聴者は信号とテクスチャを区別できず、決してデコードされることを意図されていないものをデコードすることに実際の注意を費やします。それが「情報が多すぎる」が言葉から形に移されたものです。
予算:セクションあたり画面上約20単語。 文はありません。ラベルは1〜2単語で、その要素の下に配置します。リファレンスのセクション1は、84秒間で21単語です。
帰結:アンチパターンビジュアルは推奨事項に決して重ねない。 まずワールドをほぼ黒にし、または良い図がない場所に反例を配置します。
視聴者に追跡するものを1つ与える
状態が視覚的に変化する単一の移動する被写体でストーリーを運びます。データ行とスコアバーを備えたチップ、ドキュメント、リクエストなど。行が埋まり、バーが動き、境界の色が変わります。視聴者はその1つのオブジェクトを見るだけでセクション全体を追跡できなければならず、それは決してテレポートしてはなりません。描画されたコネクタに沿って一定速度で移動します。
1つのグローバルトークンセット
詳細は reference/design-system.md にあります。
| トークン | 値 |
|---|---|
| ストローク | 1.5 / 2.5 / 4 / 7、それ以外はなし |
| タイプ | 22 / 30 / 42 / 60 / 84 |
| 半径 | 10 / 22 / 40、常に superellipse(2) |
5色、5つの固定された意味、ゼロの装飾。暖色は人間が関与していることを意味し、それ以外は決して暖色になりません。タイプに純粋な白は使用しません。暗い背景でハレーションを起こします。
これが防ぐ失敗は、最初のビルドのクラフトレビューから:「すべての決定はローカルかつ正しく行われた。グローバルな決定は行われなかった。」 18のストロークの太さと9のタイプサイズ、そのほとんどが0.2刻みで、個々には見えず、集合的には致命的です。目は階層の代わりにノイズを得ます。ビルドを失敗させるトークンリンターでゲートします。
モーション
エントランスは cubic-bezier(0.16,1,0.3,1)、エグジットはエントランスより速く、持続時間は質量に応じて変化するため、290pxのノードと40pxのラベルが同じように減速することはなく、back.out はセクションごとに1回だけ、それに値するビートで使用します。
クロスフェードは決して使用しない。 フルブリードレイヤーは、すでに不透明な背景上でクリップによって出入りします。どの瞬間でも、ピクセルはグラフィックかフッテージのいずれかです。
3 · 構築契約
- セクションごとに1つのジェネレーター。
scripts/build_<id>.pyはcompositions/<id>.htmlのみを書き込みます。生成されたHTMLではなく、ジェネレーターを編集します。セクションルートindex-*.htmlは手動で管理されるため、フレーミングの変更はそこに行います。 - 共有モジュールは共有されたままにする。 共有形状を定義するものはすべて、すべてのセクションでインポートされます。セクションが並列エージェントによって構築される場合、共有モジュールに触れることを禁止します。分岐した形状は、すべてのハンドオフを静かに壊します。
- アセンブリの前にSVG defsの名前空間を分離する。 各セクションは独自の
gEdge、shadow、edgeFadeを定義します。1つの組み立てられたDOMでは、url(#id)はドキュメント順で最初の一致に解決されるため、以前のコンポジションがアンマウントされると、後続のすべてのグラフィックは何も描画しません。リファレンスビルドでのコスト:すべてのゲートが緑色で35秒の空の画面。組み立てられたレンダリングを見ることでのみそれを発見できました。 - すべてを単語レベルのトランスクリプトから単語の開始に合わせてタイミングを取り、アンカーワードの0.15〜0.25秒前に 入ります。セクションを均等にビートに分割しないでください。
- ギャップを監査する。 何も起こっていない約1.5秒以上のストレッチはデッドスクリーンです。ジェネレーターにそれらを出力させます。
- カットに空気を残す。 積極的なポーズキャッピングは、文の境界でほぼゼロのギャップを生成し、クライアントはそれを「スタッター」やジャンプカットとして聞きます。話者自身の基準に照らして調整します。話者の中央値より約10倍きつい文境界ギャップにフラグを立て(リファレンス話者は470ms、フラグが立てられた接合部は20〜40ms)、4〜8フレームの空気を挿入して修復します。単語には決して触れません。空気は、トラックの実際のルームトーンのドナースライスに10msのフェードを適用したものであり、決して
anullsrcではありません。デジタルサイレンスは-50dBFSのフロアに対して可聴なドロップアウトです。ビデオはフレームを保持します。文の間、トークヘッドはほぼ静止しており、4〜8フレームのホールドは見えません。挿入のみの変更はトランスクリプトを決定的にシフトするため、再トランスクリプションは必要ありません。インサートのエッジは発話の包絡線を尊重する必要があります。 ドナートーンを単語の末尾に1msで突き当てるのは[...]