Communitygithub.com

businessbaum/vedit / ラフカット

ユーザーが「間を詰めて」「フィラーワードを削除して」「ラジオ編集して」などと依頼した際に、機械的に素材をトリミング・編集するスキル。

vedit / ラフカット とは?

このスキルは、選択済みの素材に対して機械的なトリミング(間の除去、フィラーワードの削除、言い直しの検出、スプライス処理)を行い、`project.json` 内のセグメントを有効化・無効化します。`cut-story` でストーリーの選択が完了した後でのみ実行可能で、すべての編集決定は可逆的であり、各カットには provenance(根拠)が記録されます。フレーム精度のカットポイント計算、沈黙・フィラーの階層化検出、J/L カットの自動適用など、プロフェッショナルな映像編集ワークフローを再現します。対応プラットフォームは Claude Code 等の AI エージェント環境で、`python engine/ve.py cut $project` というコマンドを実行して動作します。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/businessbaum/vedit/tree/HEAD/.agents/skills/cut-rough

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

cut-rough

機械的なトリミング:無音、フィラーワード、言い直し、スプライス衛生。すべてが可逆的であり、各決定には provenance(根拠)が付随します。

引数 $project はスラッグ、完全なリクエストは $ARGUMENTS に含まれます。空の $-プレースホルダーは、スキルがスラッシュ呼び出しではなく自動トリガーされたことを意味します。セッションコンテキストの PIPELINE_STATE からプロジェクトを取得し、どのプロジェクトを選択したかを伝えてください。動詞の名前はビルド契約に従い、python engine/ve.py --help が競合時に優先されます。

前提条件とその厳格な理由

最初に cut-story を実行してください。story.blocks が存在しない場合は、その旨を伝えて cut-story を提案し、先に進まないでください。もうすぐ丸ごと削除される素材に対して機械的なカットを施すと、だれも聴かない言い直しやフィラーの検出に時間を浪費します。

ユーザーが明示的に「ただ機械的にパスしてほしい」(einfach nur die Ähms raus)と要求した場合は、それが正当です。その場合は実行し、コンテンツ選択は行われなかったことを伝えてください。

フレームルール

カットポイントはフレーム単位にスナップします。これは単なる整理整頓ではなく、フレームグリッドから外れたカットポイントでは、concat フィルターが1カットあたり 8.33 ms の A/V ドリフトを蓄積し、150 カットで 1250 ms に達します。スナップした場合、同じ 150 カットのドリフトは正確に 0 サンプルです。

in_frame  = floor(t_in  * fps + 0.5)    # 四捨五入(0.5 は切り上げ)-> 同値は後方
out_frame = ceil (t_out * fps - 0.5)    # 四捨五入(0.5 は切り捨て)-> 同値は前方
if out_frame <= in_frame: out_frame = in_frame + 1

out は排他的です。ffmpeg は trim=end を厳密な < として実装しており、半開区間 [in, out) が連結を正確にするための条件です。OUT の丸めを誤ると、すべてのセグメントが 1 フレームになり、200 カットで 6.7 秒のドリフトが生じ、同期が明らかに破綻します。

この計算を手動で行わないでください。vedit/timebase.py がこれを担当します:snap_in / snap_out。

ステップ 1 - パスの実行

python engine/ve.py cut $project

平坦化された単語リストに対して 4 つのパスを実行し、その後スナップします。

  1. 無音の階層化。 min_gap 未満のギャップは決してカットしません。それを超えるものについては、保持する間は先行単語の句読点に応じてスケーリングされます:.?! は 1.5 倍(下限 0.40 s)、,;: は 1.0 倍、節内は 0.7 倍(下限 0.20 s)、トピック変更は 2.0 倍(下限 0.60 s)。均一な間の長さは、機械編集であることを示す最も顕著な兆候です。人間の耳は、文の終わりにより長い息継ぎを期待します。
  2. フィラーの階層化。 以下を参照。
  3. 言い直しの検出。 後続のテイクが先行テイクを上書きする重複 n-gram。
  4. スプライス衛生。 パディング、クロスフェード、ゼロクロスポイントでのスナップ、カット密度の制限。

ステップ 2 - フィラーの階層と、自動化してはいけないもの

  • 階層 A - 非語彙的(äh ähm hm mh uh um er):自動削除。誰もこれらを望みません。
  • 階層 B - 語彙的フィラー(weißt du, sozusagen, quasi, im Prinzip, you know, I mean):ガード付きで自動削除。文頭では削除しない、削除後に min_clip 未満の断片が残らない場合に限る。
  • 階層 C - モーダルパーティクル:also halt eben ja mal doch schon eigentlich genau、および英語の like just well right so basically actually。フラグのみ。絶対に自動削除しない。

階層 C は、自動編集者がドイツ語の発話を台無しにする部分です。doch、eben、halt、ja は態度や談話構造を伝えます。これらを削除すると、話者がより簡潔になるのではなく、翻訳者のように聞こえます。ユーザーがそれでも削除するよう依頼した場合は実行してください。ただし、その代償について一度だけ説明し、その後は言及をやめてください。

検出信号の優先順位:語彙一致、次に duration/char >= 0.12 s、次に両側のギャップ >= 0.10 s、次に周囲の発話から 6 dB 以内のエネルギー。

WhisperX の score をフィラー信号として決して使用しないでください。 これはアライメントの尺度であり、ためらいではありません。スコアが低いのは、まれな単語や固有名詞に集中します。フィラーの逆です。タイムスタンプの信頼性フラグとしてのみ使用:score < 0.35 の場合はパディングを 60 ms 拡大し、その単語内でのカットを禁止します。

ステップ 3 - デフォルト値とそのステータス

パラメータデフォルト備考
pad_in0.08 s/p t k b d g/ の前の破裂音の閉鎖
pad_out0.10 s/t k s/ の放出はアライナーの end を超える
keep_pause0.18 s 下限無音が除去された後に残る息継ぎのスロット
min_gap0.55 sこれ未満は決してカットしない
min_removal0.20 sこれより短い削除はスプライスする価値がない
max_cut_density1.5 s あたり 1 つジャンプカット疲れ
min_clip0.35 sこれより短い保持クリップは隣接クリップに統合する
crossfade20 ms(最小10、最大40)同一テイクは curve=tri、テイク間は qsin
zero-cross search+/-5 ms(240 サンプル)オーディオのみ、ビデオは絶対に動かさない

これらは研究に基づくものであり、知覚的にテストされたわけではありません。 project.json に "calibrated": false とある限り、カットを擁護するたびにそのことを述べてください。未調整の閾値を調整済みとして提示しないでください。セッションフックは、このフラグを毎セッション表面化します。

ゼロクロススナップは理解する価値があります:ゼロクロスではないポイントでのハードカットは、信号の自然な最大値より 29.5 倍大きいサンプルステップを生成し、可聴なクリック音になります。ゼロクロススナップと 20 ms のクロスフェードの両方でベースラインに戻ります。両方を使用してください。スナップはオーディオのみを動かし、ビデオは動かしません。サブフレームのビデオシフトは表現不可能です。

ステップ 4 - J/L カット

4〜12 フレームが有用な範囲です。デフォルトは 6 フレーム。

両側が同じ source_id を共有し、どちらも B-roll や全画面オーバーレイでカバーされていない J/L カットは拒否してください。 見える口に対して J カットでない場合、これはリップシンクエラーであり、編集ではなく技術的欠陥として認識されます。

ステップ 5 - セグメントの書き込み

セグメントは segments[] に、src_in_frames(含む)と src_out_frames(排他的)を唯一の権威として書き込まれます。また、すべてのセグメントに必要なもの:

  • enabled - 拒否された素材は false に理由を添え、決して削除しないでください。 すべての自動決定は、1 つのブール値を反転することで元に戻せる必要があります。これが、積極的なデフォルトを安全にする性質です。
  • order - 有効なセグメント上で密な明示的な出力順序。
  • provenance - stage(ストーリーレベルの削除の場合は content、silence、filler、retake)、rule、confidence、applied_by、およびトリガーとなった測定値(original_gap_s)。Provenance により、ユーザーは「すべての階層 B の削除を元に戻す」と言えるようになります。
  • word_range と非正規化された text。テキストは読み取り専用であり、決して権威ではありません。 もし word_range と矛盾する場合、ワードレンジが優先されます。

タイムライン位置は派生値であり、保存されることはありません。ロード時に有効なセグメントの累積和として _computed に書き込まれます。_computed を直接書き込まないでください。

stage を "rough_cut" に設定してください。

ステップ 6 - スクリプトではなく、編集者のように報告する

報告内容:ソース時間、カット後時間、削除率、カット数、カット密度(1 分あたりのカット数)、および provenance ルールごとのカウント。次に、過剰カットとみなされるものをフラグ付け:1.5 秒あたり 1 つ以上のカットがある区間、min_clip に近い保持クリップ、およびフラグが付けられたまま放置されている階層 C のフィラーの数。

3 つの次のステップを提案する:セクションのプレビュー、しきい値の調整、またはグラフィックス/キャプションへの移動。

故障モード

症状原因修正
すべてのセグメントが 1 フレームOUT が切り捨てではなく切り上げられたsnap_out を使用。インラインで計算しない
スプライスで可聴なクリックゼロクロススナップがスキップされたスナップと 20 ms のクロスフェード
音声が途切れて息苦しく聞こえる均一な保持間句読点スケーリングテーブルを適用
話者が機械的でドイツ語らしくない階層 C が削除された階層 C はフラグのみ。provenance で復元
カットが単語の途中に入るトランスクリプトが tier 3(BPE トークン)再トランスクライブ。トークンのタイムスタンプではカットできない
ビデオ全体で A/V ドリフトが増加カットポイントがフレームスナップされていないすべてのカットポイントをスナップし、QC チェック (a) を再実行

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

businessbaum/vedit

This skill should be used when the user asks for subtitles or on-screen text of what is being said - "brenn die Untertitel ein", "mach Untertitel", "Untertitel drauf", "leg Untertitel drüber", "brenn die Subs ein", "mach die Captions", "Wort für Wort Untertitel", "Karaoke-Untertitel", "korrigier den Untertitel-Text", "burn in the captions", "add subtitles", "burn the subs", "word-by-word captions", "fix a caption typo". Covers ASS generation, the pixel-width grouping rule for German, the font table, and burn-in through libass.

businessbaum/vedit

This skill should be used when the user asks to decide what the video is actually about before any mechanical cutting - "bau die Story", "was soll ins Video", "was kann raus", "welche Themen bleiben", "kürz das auf 6 Minuten", "mach daraus ein kurzes Video", "wo ist der Hook", "sortier die Themen", "worum geht es hier eigentlich", "build the story", "decide what stays", "structure this", "cut this down to N minutes", "find the hook", "reorder the topics". This is the CONTENT-selection pass that writes the "story" block in project.json; it runs after transcribe and before cut-rough.

businessbaum/vedit

This skill should be used when the user asks for the finished video file - "exportier das", "render das fertig", "mach das final", "renderte das Video", "mach den Endexport", "bau das Video zusammen", "mach es fertig für YouTube", "gib mir die MP4", "export the final", "render the final cut", "make the master", "export for TikTok", "give me the mp4". Covers segment rendering with the cache, guarded concat, the one-pass audio, loudness normalisation and the single mux.

関連スキル