ビデオ編集スキル
生のトークヘッド録音は、通常20〜40%が無音です。間、"えー"、言い間違い、同じ文章を2回言うなどです。それらを手動でカットするのは、録画時間よりも時間がかかります。このスキルは最初の編集を行います。文字起こしを読み取り、すべてのカットに理由を付けて計画し、計画を表示し、ジャンプカットにパンチインとクリーンなオーディオを加えてレンダリングし、キャプションとチャプターを作成し、承諾後に投稿します。必要なものはすべてこのフォルダに含まれています。
4つのコミットメント:
- ユーザーの発言はそのまま残します。 間、フィラー、吃音、言い直し、およびユーザーが承認した範囲のみが削除されます。意味が編集されることはありません。
- レンダリング前に計画を立てます。 カットリストは最初に表示され、承認されます。
- 承諾なしに投稿されることはありません。
- ユーザーが使用を許可された映像のみ。 自分の録画、または許可を得たものに限ります。
Windowsでは、すべてのコマンドでpython3の代わりにpyを使用してください。
ステップ0: セットアップとソース
python3 scripts/check_setup.pyを実行します。ffmpeg、Pillow、文字起こしルート、OpenCVの状態と、不足している場合のインストールコマンドを報告します。必須: ffmpegとPillow。
以下の項目について、見えないものだけを1回のメッセージで質問してください:
- どのファイルか、そしてそれはユーザーのものか?
- 出力先: YouTube(16:9)、ソーシャル(縦型)、または両方。
- 編集のタイトさ: youtube(デフォルト: 0.5秒以上の間をカット、自然なビートを保持)、tight(0.3秒、高速なYouTubeおよびソーシャル用)、またはpodcast(穏やか、パンチインなし)。
- 習慣で使用していて安全にカットできる単語(「みたいな」、「だから」、「つまり」、「基本的に」など)。これらは他の文では意味を持つため、オプトイン式です。
- そのまま残さなければならないもの(デモ、間を意図したジョーク、スポンサー読みなど)。
ステップ1: 文字起こし
python3 scripts/transcribe.py VIDEO --out work/ --terms "製品名、専門用語、ゲスト名"
--termsで名前や専門用語を指定して正しく綴られるようにします。それでも聞き間違いがある場合は、レンダリング前にedit.jsonの"replace"で修正します。投稿済みの動画に焼き込まれたキャプションは修正できません。
同じ3つのルートがあり、トレードオフは一度説明します:
| ルート | 方法 | コストと速度 |
|---|---|---|
| 既存の文字起こし | --from captions.srt | 無料、即時。単語のタイミングは推定され、ほとんどの「えー」が欠落しているため、フィラー除去は弱い |
| Groq または OpenAI | GROQ_API_KEY または OPENAI_API_KEY | Groqはオーディオ1時間あたり約0.04ドル、処理時間は1〜2分 |
| ローカル | pip install faster-whisper | 無料でプライベート。--model smallで動画時間の約半分から1倍の処理時間 |
文字起こしエンジンはフィラーを書き留めるように指示されます。Whisperはデフォルトでそれらを落とします。それでも見逃された音(誰も書き留めなかった「んー」、息遣いなど)は、エディターによってオーディオ自体から見つけ出されます。
ステップ2: 編集計画
work/transcript.txtを一度すべて読んでください。次にedit.jsonを記述します(フォーマットはscripts/edit_video.pyの先頭にあります):
- スタイル:
"style": "youtube"、"tight"、または"podcast"(閾値はreferences/editing-rules.mdにあります)。制限を超える間は自然なビートに短縮されます。文の途中では短く、文の後では長く、話題の変更では最も長くなります。 - フィラー: デフォルトリスト(「えー」、「あー」、「えっと」、「うーん」、「んー」)は安全です。ユーザーが依頼した場合にのみ、習慣単語を
extra_fillersに追加します。 - 脱線と無駄なセクション: 脱線、「聞こえますか?」、本題に入る前の長い前置きなど。理由を付けて
cutに追加し、ユーザーに伝えます。 - 保護: 残さなければならないものは
keepに追加します。無音部分も含みます。 - 質問カードや目に見えるインタビュアーがいるインタビュー: ユーザーが特に指示しない限り、質問(各カードの約3秒間を
keepに)を保持します。これがないと、すべての回答が「だから…」で始まり、文脈が失われます。 - 聞き間違えた名前:
"replace": {"Cyrus Rex": "OSIRIS-REx"}のように指定します。 - チャプター(YouTube用): 話題の変更点から3〜10のチャプターを作成します。最初は0:00、それぞれ最低10秒、視聴者が得られるものに基づいて名前を付けます(「Part 2」ではなく「カメラが故障した理由」)。時間は元の動画のものを基準にし、スクリプトが調整します。
次に計画を作成します:
python3 scripts/edit_video.py edit.json --transcript work/transcript.json --out edited/ --plan
edited/edit-plan.mdには、新しい長さ、トーク部分内部からの削除量と長い間やカードからの削除量の内訳、1分あたりの単語数ペース、および1秒を超える各削除の理由と単語が記載されます。すべての言い直しと吃音行を読み、「可能性のある言い直し」リストも確認します。同じように始まる2つの完成した文は自動的にはカットされません。それぞれを判断し、本当に言い直しであればcutに追加します。ユーザーにサマリー、言い直し、選択した脱線、チャプターを表示し、承諾を得ます。
ステップ3: レンダリング
python3 scripts/edit_video.py edit.json --transcript work/transcript.json --out edited/
実行内容:
- 制限を超える間を自然なビートに短縮し、フィラー、吃音、言い直し、およびすべての
cut範囲を削除します。スタイルの最小値(youtubeでは0.4秒)より短い削除はそのままにします。ジャンプカットのコストが節約効果を上回るためです。 - 音を聞いて各カットを配置します。単語の端は実際に音が止まり始める場所に移動するため、単語の終わりが切られることはなく、文字起こしで見逃された音(書き留められていない「んー」)も見つけ出されます。
- 画像も確認します。タイトルカードやショットチェンジはきれいにカットされ、カードの数フレームが残ることはありません。
- パーツのグループを1パスでレンダリングするため、カット数がいくつでも音と画像の同期が保たれます。
- パンチイン: ジャンプカットを隠す必要がある場合に、フルフレームと1.1倍のパンチインを切り替えます。常に1秒以上を削除したカットで発生し、それ以外では同じフレーミングが4秒続いた後でのみ発生し、新しいカメラショットへのカットでは発生しません。
"punch_in": 0でオフにできます。 - オーディオ: 作業レベルへのゲイン調整、ランブルフィルター、測定された室内ノイズに基づくノイズリダクション(室内がすでに静かな場合はスキップ)、穏やかなコンプレッション、ピークリミッター、および-14 LUFSへの2パスラウドネス処理。
- キャプション: 常に
captions.srt(最大42文字の2行、各1〜7秒、小さな単語の後や名前の中での改行なし)を書き出し、YouTubeにアップロードします。"captions": {"burn": true}でソーシャル用に動画に焼き込みます(ソーシャルではミュートで視聴されることが多いため)。縦型バージョンではデフォルトで焼き付けられます。SRTもアップロードするYouTube動画にはキャプションを焼き込まないでください。視聴者が両方を見ることになります。 - 縦型:
"format": "vertical"でfocus_xに基づいてクロップされた1080x1920バージョンを作成します。
edited/edited.mp4、captions.srt、chapters.txt、edit-report.md、manifest.jsonを書き出します。
ユーザーに表示する前に確認: cuts.jpg(最大のカットの直前と直後のフレーム。カードのフラッシュ、異なるショットへのジャンプ、固まった表情がないか確認)を開き、manifest.jsonの警告(同期、190語/分を超えるペース、ラウドネス)を読みます。言い直しで間違ったテイクが保持された場合、ペースが息苦しい場合(より穏やかなスタイルに変更)、またはカットのランディングが悪い場合(その箇所をkeep)は修正して再レンダリングします。
ステップ4: WoopSocialで投稿
接続、アップロード、投稿方法: references/woopsocial.md。簡略版:
social_accounts_list。接続されていない場合: このエージェントのための1つの接続パス(無料プラン: 2つのソーシャルアカウント)、次にプラットフォームごとにoauth_create_authorizationを実行。- アップロードセッションで
edited.mp4をアップロード(media_uploads_create_sessionをmanifest.jsonのバイトサイズと共に実行、python3 scripts/upload_parts.py session.json edited/edited.mp4、media_uploads_complete_session)。 - YouTube:
title(主要な検索ワードを先頭に、70文字未満)、privacy、および視聴者が得られるものについての1行で始まり、chapters.txtのチャプターが続く説明。captions.srtは後でYouTube Studioでアップロードします(WoopSocialはキャプションファイルを送信しません)。 - 投稿内容(ファイル、タイトル、説明、アカウント、タイムゾーン付き時間)を表示し、明確な承諾を得ます。次に
posts_createとposts_getを実行します。
ステップ5: 結果を読む
1週間後、social_account_posts_listを実行します。収集日とともに、視聴回数、いいね、コメント(報告されている場合)が表示されます。未報告は「報告なし」を意味します。再生維持率と平均視聴時間はYouTube Studioにあります。ユーザーに確認してください。視聴者が早期に離脱する場合、次の編集では冒頭をよりタイトにします。特定のチャプターで離脱する場合、そのセクションが長すぎたことになります。
品質基準
プロの編集者がこれを納品するでしょうか?単語が切れている、カットが息継ぎの途中でポップノイズを伴う、パンチインが数秒ごとに変わる、ペースが考え込む余地を残さない、または意味が変わっている場合は、リジェクトします。
エッジケース
- カメラに2人いる場合:
formatは元のままにします。パンチインはワイドショットでも機能します。 - 音声付き画面録画:
"punch_in": 0を設定します。 - 音声の下に音楽がある場合: 無音検出が音楽を音として認識します。
"voiced_gaps": falseを設定します。 - 非常に長い録音(1時間以上): 動作しますが、レンダリング時間は動画の長さとほぼ同じです。最初に計画を立て、一度だけレンダリングします。
- 意図的に発話がない部分がある場合(デモなど):
keepします。
リファレンス
references/editing-rules.md: 閾値、フィラー、言い直しパターン、パンチイン、オーディオチェーン、キャプションとチャプター(出典付き)。references/woopsocial.md: 接続、アップロード、投稿、結果の読み取り。