A-roll 処理
目標:1本の長回し動画、または同じスクリプトの複数動画を入力として、各セリフのベストテイクのみで構成されたタイトなラフカットを出力すること。音声が途切れることなく連続し、すべての単語が完全に含まれ、最初から1つのきれいなテイクのように聞こえるカットを生成します。
このスキルは Claude Code と Runneth 向けに作られています。必要なもの:
- ffmpeg:音声測定、静止画取得、動画カットに使用。
- 発話すべてのワードタイミング:各単語の時間情報を出力する音声認識ツール(Whisper、faster-whisper、whisper.cpp)。
- 映像の評価方法:以下の「テイクの評価方法」を参照。
scripts/cut_check.pyのチェックスクリプト(python3、numpy、ffmpegが必要)。
エディターとは、日常的な言葉で、1つのアイデアを1文で伝えること。
開始前の準備:ツール
Runneth では、すべてがインストール済みです。このセクションはスキップしてください。
Claude Code では、このスキルは video-editing-setup スキルがインストールする無料の動画ツールを必要とします。~/.video-editing-tools/bin/ffmpeg -version が実行できるか静かに確認してください。実行できる場合は、~/.video-editing-tools/bin 内のツール(ffmpeg、ffprobe、python)を、このスキルで ffmpeg、ffprobe、python3 と指定されている場所で使用し、続行してください。できない場合は、最初に video-editing-setup スキルを実行してから、ここに戻ってきてください。
ステップ0:作業開始前の2つのクイックチェック
-
ファイルがエディターが意図したものであること。 もしエディターが「リテイク」や「新しいクリップ」と言い、それが以前のものと同じ長さや設定だった場合は、開始前に1行で確認してください。
-
以下の質問を、1つの質問として2つの選択肢とともに正確に聞いてください。
「最初に採用するテイクを確認しますか?それともそのまま編集を進めましょうか?」
- 確認する → 以下のすべてのステップに従い、ステップ4でエディターの承認を待ちます。
- 編集を進める → すべてのステップを中断せずに実行します。不明点があれば、最後に1度だけ言及します。
エディターがすでにどちらかを指定している場合(「そのままカットして」「最初にテイクを見せて」)は、質問をスキップします。誰も答えられない状況の場合は、「編集を進める」として扱います。
ステップ1:単語を取得する
- 各録画の長さ、向き、フレームレートを確認します(
ffprobe)。複数の録画がある場合は、それぞれに簡単なラベル(ビデオA、ビデオB、ビデオC)を付け、以下のすべてのステップをすべての録画に対して実行します。 - 各録画から音声を抽出します:
ffmpeg -i IN.mov -vn -ac 1 -ar 16000 audio.wav。 - 発話のすべての部分をマークします:
ffmpeg -i audio.wav -af silencedetect=n=-35dB:d=0.3 -f null -。無音区間の間にある部分が「発話アイランド」です。すべての単語はこの発話アイランドの中に存在し、トランスクリプトのタイムよりも正確です。 - ワードタイミング付きで文字起こしします。faster-whisperの場合:モデル
base、word_timestamps=True、condition_on_previous_text=False、および動画に含まれる可能性が高い名前やブランド名を列挙したinitial_promptを設定します。より大きな英語専用モデルは、言い直しを静かに除去してしまうため、このスキルが検出する必要がある言い間違いが隠れてしまいます。 - 長い区間ではトランスクリプトがずれたりスキップしたりすることがあります。すべての発話アイランドに単語が必要です。発話アイランドに単語がない場合、または無音区間の間に単語が欠落しているように見える場合は、その区間だけを再度文字起こしします:発話アイランドの約1秒前からウィンドウを開始し、約1秒後に終了し、音声フィルターをオフにします(
vad_filter=False)。 - 短い再文字起こしウィンドウでは、最後に発話されていない単語が誤って生成されることがあります(「ありがとうございます」「ご視聴ありがとうございました」など)。発話アイランド内にあり、セリフに合致する単語のみを保持します。同じタイムスタンプに重なっている単語は誤って生成されたものです。
- 名前やブランド名の明らかな聞き間違いを修正します。スクリプトがある場合は、それをセリフのマップとして使用します。ない場合は、トランスクリプトがマップになります。
ステップ2:テイクをグループ化する
- 映像をセリフ(1文または1つのアイデア)ごとに分割し、すべての録画にわたって同じセリフに対するすべての試みをグループ化します。1つのスクリプトの複数の録画は、1つのプールとして扱われます:セリフ1には、ビデオA、B、Cからのセリフ1のすべてのテイクが並び、各テイクは録画名でラベル付けされます(「ビデオB、テイク3」)。試みは通常、同じ最初の数単語で始まります。
- テイクは、1つの試みの開始から、その最後の単語の終わりまで、次の試みが始まるまでです。
- 各テイクを 完了(セリフ全体を言っている)または 言い直し(途中で止まっている)としてマークします。
- セリフ内のすべてのフレーズは、それ自体のピースとしてカウントされます。セリフは、異なるテイクのベストピース(テイク4の最初の文、テイク2の2番目の文)から構築でき、言い直しのきれいなピースも含みます。
ステップ3:すべてのテイクを評価する
すべてのセリフのすべてのテイクを評価します(1回だけ発話されたセリフも含む)。各フレーズの最良のバージョンが、それがどのテイクや順序であっても勝利します。それらのベストピースから、それらの接合部がきれいな場合にセリフを構築します(以下のルール7を参照)。「テイクの選定基準」を使用し、テイクファイル(テンプレート:templates/takes.md)にテイクごとに1行ずつ記述します:セリフ、テイク、時間、観察結果、採用/不採用、簡単な理由。
テイクの評価方法
評価すべき内容は両方で同じです。それを確認する方法はツールによって異なります:
- Runneth(またはGeminiのように動画を視聴できるモデルに動画を送信できるセットアップ)の場合:そのモデルにすべての録画を視聴させ、「テイクの選定基準」に加えて、トーン、強調、ジョークのタイミング、ためらいについて、繰り返されるすべてのセリフを評価させます。自分自身の選択を送信するものに含めず、2つの読み取りが独立していることを確認します。モデルが自分とは異なるテイクを選択した場合は、モデルの選択を優先します。タイミングは常にトランスクリプトと発話アイランドから取得し、動画モデルからは取得しないでください。動画モデルのタイムスタンプはずれることがあり、セリフをスキップすることがあります。
- Claude(動画を視聴できない)の場合:自分で確認できる3つの要素から評価します。
- 言葉(トランスクリプト):セリフ全体が、つまずき、フィラー、途中での言い直しがないこと。
- 音声(各テイクの
astats):音量が安定しており、クリッピングやノイズのバンプがないこと。 - 映像(静止画):繰り返されるセリフごとに、すべてのテイクを重ねた1枚のシート、2フレーム/秒:
ffmpeg -nostdin -ss START -t LENGTH -i IN.mov -vf fps=2,scale=160:-2,tile=10xN take.jpg、テイクごとに1枚、それを1つの画像に重ねます。シートを見て、「テイクの選定基準」のすべてを確認します。
- 音声付きスクリーンレコーディング: 言葉、声、そしてポインティングやクリックが発言と一致しているかを評価します。
ステップ4:選択結果を表示する(エディターが最初に確認を希望した場合のみ)
- カットリストを表示します:保持するピースごとに番号付きの行、
開始-終了、および保持する正確な単語。接戦の場合は、その行に「(接戦:テイク2も同程度にきれい)」とマークし、エディターがどこを確認すべきかわかるようにします。明確な選択には注釈は付けません。編集を妨げるものがある場合(判別できない単語など)のみ、最後に1行短く追加します。 - エディターが承認し、テイクを交換し(「セリフ4にはテイク2を使って」)、セリフをカットします。後で動画モデルが異議を唱えても、エディターの変更が優先されます。テイクを交換する場合、エディターが理由を言わなければ、1つの短い質問で理由を尋ねます。その理由がスキルの学習方法です(ステップ7)。
ステップ5:カットを構築する
カットは非常にタイトです:音声はすべての場所で途切れることなく連続し、保持されたテイク内でも同様です。考えの間の間やフレーズ間の呼吸はカットされます。最後のフレームに約0.5秒の保持時間のみが残されます。
- エッジは発話アイランドから取得し、トランスクリプトからは取得しません。各保持ピースは、その発話アイランドの最初の音で始まり、最後の音で終わります。最初の単語の前の呼吸、唇の音、ハンドリングノイズが-30dBを超えて発話アイランドに含まれる可能性があるため、ピースは最初の単語の開始時点(レベルが音声レベル、通常-25dB以上に跳ね上がる場所)で始まり、最初のノイズでは始まりません。ピースの先頭または末尾の呼吸やノイズの部分はカットされます。終わりは逆の働きをします:セリフはしばしば静かに終わるため(「夜に眠る」と優しく言うなど)、ピースは最後の単語の後に終わります。その単語が他の単語より静かであっても同様です。すべてのセリフの最後の単語がカットのトランスクリプトに含まれていることを確認します。
- 保持されたテイク内の間は、より感度の高いパス
silencedetect=n=-30dB:d=0.2で検出し、0.25秒以上の間はすべてカットします。テイク内の言い直しや繰り返された単語もカットし、きれいな最終フレーズのみを保持します。 - 各ピースの両側に約0.05秒のパディングを追加します。 それ以上あると間が残り、それ以下だと単語が切れます。 次に、すべてのエッジをフレーム全体にスナップします(開始は前のフレームに切り捨て、終了は後のフレームに切り上げ)。フレーム間のエッジは、結合がフレームを重複またはドロップさせる原因となり、後続のすべてのカットが1〜2フレームずれ、Bロールがカットに配置されたときに迷走フレームが通過する可能性があります。
- 約0.3秒未満のピースは、ほとんどの場合、残骸(迷走した音節)です。単語全体を含まない限りドロップします。
- すべての結合部分に20msのオーディオフェードを追加し、作業コピーから1回の再エンコードですべてを結合します。元のファイルはそのまま残します。
- ピースのリスト(秒単位の
[[start, end], ...])をclips.jsonとして保存します。チェックスクリプトがこれを読み取ります。
ステップ6:エディターが確認する前にカットをチェックする
エディターが見るすべてのバージョンは、その正確なファイルに対してすべてのチェックに合格しています。実行されなかったチェックは「不合格」としてカウントされます。
- チェックスクリプトを実行します:
python3 scripts/cut_check.py --voice audio.wav --clips clips.json --out CUT.mp4。これにより3つの項目がチェックされ、RESULT PASSまたはFAILが出力されます。- 終了: すべてのピースの最後の50msが音声レベル(-30dB)未満であること。そうでない場合、単語が切れています:レベルが下がる場所まで終了位置を後ろに移動します。
- 開始: 各ピースの開始前30msが無音であること。つまり、どのピースも単語の途中で始まらないこと。
- ギャップ: 最終保持を除き、カット内のどこにも0.25秒以上の間がないこと。
複数の録画がある場合、各録画に対して1回ずつ実行します:その録画の音声を
--voiceとして、その録画のピースのみをclips.jsonに含め、毎回同じカットを--outとして指定します。 音声が映像とは別のファイル(別のマイク)から来ている場合、カメラ自身の音声も同じトリミングでカットし、--camlockとして渡します。これにより、スクリプトが同期もチェックします(3秒ごとに40ms以内)。
- すべての単語が、完全に、1回ずつ: カットをワードタイミング付きで文字起こしし、カットリストと単語ごとに比較します。結合部分の半端な単語は、そのエッジがタイトすぎることを意味します。結合部分の繰り返された単語やフレーズは、言い直しの残骸が残っていることを意味します。 単語間のデッドエアがないこと: そのトランスクリプトにおいて、ある単語の終了から次の単語の開始までのギャップが(最終保持を除き)約0.3秒より長くないこと。スクリプトのギャップチェックは静かな間のみを検出します。呼吸で満たされた間は音が大きいためチェックを通過するため、この単語ギャップチェックで捕捉します。ピースを最初の単語にトリミングし、すべてのチェックを再度実行します。
- 各結合を1つずつ: すべてのカットについて、その前の最後の単語と後の最初の単語を名前で特定し、両方が完全に発話されていることを確認します。各結合の周囲2秒のウィンドウを文字起こしして確認します(一般的な「問題ありますか?」では、切れた単語が見逃される可能性があります)。Runneth では、動画モデルにカットをうるさい初見の視聴者として視聴させ、問題点を時間付きでリストアップさせます:切れた単語や迷走した単語、グリッチ、フリーズフレーム、不快なジャンプ。
- 長さ: カットの長さがカットリストの合計と一致すること。
失敗するすべての項目を修正し、再度カットしてすべてのチェックを再実行します。
ステップ7:エディターから学ぶ
エディターがテイクを交換するたび、エッジを変更するたび、またはあるテイクが優れている理由を説明するたびに、その理由を一般的なルールに変換し、以下の「テイクの選定基準」にマージします(または、カットのタイトさに関する場合はステップ5にマージします)。リストは短く保ちます:新しいルールを追加するのではなく、ルールを書き換えて結合します。エディターの理由だけがルールを変更します。
テイクの選定基準
これらのルールは、あるエディターが自身のトーキングヘッド動画で実際に行った選択に基づいています。順番に適用し、その後、エディター自身のルールが入ってくるにつれて置き換えてください。
- セリフ全体がきれいに発話されていること。 つまずきや単語の欠落があるテイクは、どれだけ見た目が良くても、きれいなテイクに劣ります。
- 顔を覆うものがないこと。 口の前にある手やマイクは、テイクを除外します。
- エネルギー。 ジェスチャー、動き、活気のある話し方は、静止した平坦な読み方に勝ります。
- 最も幸せそうな表情。 きれいな2つのテイクの間では、本当の笑顔と輝く目が勝ります。
- 表情がセリフに合っていること。 オチに対する見開いた目、楽しいセリフに対する本当の笑顔。
- 自然で均等なペース。 急いでいない、長い間がない。
- ベストピースがきれいに結合されていること。 ベストテイクは、それがどの録画にあるかに関係なく勝利し、2つのテイクの一部から作られたセリフは、各部分がより良いバージョンである場合、1つの完全なテイクに勝ります。接合部は、話者の頭と手が両側でほぼ同じ位置にある場合(前後のフレームを確認)、または接合部が後でBロールでカバーされる場合にきれいです。録画間の切り替えも、両側で同じ見た目(髪型、照明、フレーミング、手に持っている製品)が必要です。見た目が変わるときは、切り替えはセリフの間に入り、Bロールまたはズーム変更でカバーされます。
- より強い印象を与えるなら短く。 残りの部分がすでに言われたことを繰り返したり、動画を遅くしたりする場合は、セリフを最も強い部分に切り詰めます(「使い切るまで」の代わりに「それがどれほど役立っていたか気づかなかった」など)。
- 接戦は接戦のまま。 2つのテイクが同じくらいきれいで、フレームに実際の違いが見られない場合は、1つを選び、接戦としてマークします。静止画ではトーンはわからないため、一方が明らかに優れていると偽らないでください。
すべてのカットのルール
- カット内のすべての単語は音声から来ています。判別できない単語は不明としてマークし、決して推測しません。
- 時間は元の録画のタイムラインから取得し、カットリスト内のすべてのピースはその録画を指定します。
- AIの時間は近い値であり、正確ではありません。すべてのエッジは発話アイランドから設定され、音声でチェックされます。