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 つのパスを実行し、その後スナップします。
- 無音の階層化。
min_gap未満のギャップは決してカットしません。それを超えるものについては、保持する間は先行単語の句読点に応じてスケーリングされます:.?!は 1.5 倍(下限 0.40 s)、,;:は 1.0 倍、節内は 0.7 倍(下限 0.20 s)、トピック変更は 2.0 倍(下限 0.60 s)。均一な間の長さは、機械編集であることを示す最も顕著な兆候です。人間の耳は、文の終わりにより長い息継ぎを期待します。 - フィラーの階層化。 以下を参照。
- 言い直しの検出。 後続のテイクが先行テイクを上書きする重複 n-gram。
- スプライス衛生。 パディング、クロスフェード、ゼロクロスポイントでのスナップ、カット密度の制限。
ステップ 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_in | 0.08 s | /p t k b d g/ の前の破裂音の閉鎖 |
pad_out | 0.10 s | /t k s/ の放出はアライナーの end を超える |
keep_pause | 0.18 s 下限 | 無音が除去された後に残る息継ぎのスロット |
min_gap | 0.55 s | これ未満は決してカットしない |
min_removal | 0.20 s | これより短い削除はスプライスする価値がない |
max_cut_density | 1.5 s あたり 1 つ | ジャンプカット疲れ |
min_clip | 0.35 s | これより短い保持クリップは隣接クリップに統合する |
| crossfade | 20 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) を再実行 |