ショート動画の組み立て
short-start フローの一部です。メディア詳細は short-media、アニメーションは short-animation、確認・レンダリングは short-review を参照してください。サポートツール: hyperframes, hyperframes-cli, media-use。
事前にプロジェクトの RULES.md と ROTEIRO.md を読んでください。プロジェクトの kit.json には 必ず handle(クリエイターが選んだ @)が設定されている必要があります。空欄または "@SEU_CANAL" のままの場合は、続行する前にクリエイターに確認してください。
1. ナレーション
- mp3 を
assets\audio\narracao_raw.mp3にコピーします。 silencedetect=n=-40dB:d=0.6で長い無音を検出します。フック部分に該当する無音は短くし、トーンがエネルギッシュな場合は 0.8 秒以上の無音をさらに短縮します。tools\ffmpeg_recipes.mdにある接続レシピを使用してください。build\transcribe.pyで文字起こしを行い、各単語のタイムコードを含むassets\audio\narracao_words.jsonを生成します。- レベル調整を実行:
python -I -X utf8 build\level_voice.py <mp3> <words.json> video\assets\audio\narracao.mp3 template\video\からhyperframes.json,package.json,meta.json,AGENTS.md,CLAUDE.mdをvideo\にコピーします。meta.jsonのidを調整してください。
2. メディア
- 内蔵ブラウザで Pexels.com のページを開き、
tools\pexels_search.jsを実行して複数の検索を一度に行います。 - サムネイルをダウンロードし、ffmpeg の
tileで一覧シートを作成してから確認して選択してください。 - ロゴ、ブランドロゴ、チームのユニフォーム、ナレーションの内容に合わないものは除外します。
curl -L -A "Mozilla/5.0" -e https://www.pexels.com/を使ってassets\video\stock\にダウンロードします。- 楽曲: Pixabay から、「Content ID Registered」 のないトラックだけを
video\assets\audio\musica.mp3として取得します。 - 効果音:
tools\sfx\README.mdを参照し、video\assets\sfx\に配置します。 - クリップはレシピに従ってカット(縦 1080×1920 または TV ウィンドウ 1000×750)し、
video\assets\video\に保存します。フック用に反転クリップも作成します。 - シェルの
cutコマンドを関数名に使わないでください(システムのcutが隠れてしまうため)。
3. シーン (build\generate.py)
template\build\generate.pyをベースにします(コメント付き)。SCENES = [(名前, 開始, 終了)]を使って単語のタイムコードを指定します。各シーン内の時間は相対時間(0 = シーン開始)です。lib_shortのパーツを使用:- テキスト:
kline/words_js/slam/punch/shake/label; - 数値:
onUpdateを使ったカウンター; - いいね&共有:
like_block/plane_svg; - インタラクション:
comment_card/follow_card/step_badge。
- テキスト:
- すべてのシーンにアニメーションを付けます。 リストの進行状況を示す必要がある場合は、テーマに沿ったインジケーターをオーバーレイシーンとして追加します(例:ライブラリの
pavio_scene。アイテムごとに導火線が燃え、クライマックスで爆発します)。 - 字幕:
write_captions(WORDS, TOTAL, SKIP, alt_from, alt_top)。SKIPでは、シーンのタイポグラフィですでに発話が表示されている部分をカバーします。 - インデックス:
write_index(TOTAL, SCENES, SFX, dur_voz, 0.1, handle=HANDLE)。HANDLEはkit.jsonからbuild.ps1を経由して渡されます。 - @マークは字幕の下に配置します(
WM_TOP)。手動でマークの位置を指定しないでください。 - ループ: 最後のシーンは、フックの 0 フレームに反転クリップを合わせ、同じタイトルで終了します。
- エンディングは動画のトーンに合わせます。 重く暗くスローな動画では、派手な演出は避けてください。
- HyperFrames のルール:
class="clip"+data-start/data-duration;- clip 自体の visibility や opacity はアニメーションさせず、内部の要素のみアニメーション;
- 後続の fromTo では
immediateRender:falseを使用; - 各
<audio>は固有の id と track を持つ; - 動画は常に
muted; - SVG の線には
pathLength="1"を指定して描画エフェクトを実現。
4. 生成、確認、レンダリング
build\build.ps1内の$alvosを調整: 撮影シーン、.fv(全画面)、.tv(TV ウィンドウ)。powershell -ExecutionPolicy Bypass -File build\build.ps1 -Duracao <TOTAL>を実行。出力をSelect-Object -Firstにパイプしないでください。npx --yes hyperframes@<バージョン> check --jsonを実行し、エラーを修正します。以下のエラーは想定内で、残しても構いません:- 半透明ブランドマークのコントラスト;
- ループタイトルが短すぎる。
- スナップショットを取得 (
snapshot -o <フォルダ> --no-end --at "...") し、連絡先シートを確認。以下の点に注意:- テキストが画面外にはみ出ていないか;
- 字幕が読めないか;
- 要素が隠れていないか;
- 停止しているシーンがないか。
render --quality standard -o renders\<名前>_master.mp4でレンダリングし、ebur128=peak=trueで測定(目標: 約 -13.5 LUFS、ピーク -2 dBTP 未満)。- x264 CRF 19、AAC 192k、
+faststartでデスクトップにコピーします。 - ループを確認: 0 フレームと最終フレームを横に並べ (
hstack)、同一であることを確認します。 - 決定事項、測定値、目視確認のみ行った項目(「誰も音を聞いていない」)を
video\REVIEW.mdに記録します。
5. 納品
動画、タイトル(TikTok と YouTube、それぞれ 5 個の # 付き)、説明文、固定コメントを送信します。投稿時刻を伝え、48 時間後のスクリーンショットを依頼してください。