無音カット(パイプラインエージェント 1)
自動編集の最初のステップです。生の録画とその単語レベルのトランスクリプトを受け取り、無音のみを除去します:最初の単語の前と最後の単語の後のデッドエア、およびしきい値より長い単語間のポーズ(自然な呼吸の間隔までトリミングし、完全に無音にはしません)。話者の言葉はそのまま残します。言い間違い、リテイク、どもりはcut-mistakesエージェント(エージェント 2)の役割です。
このエージェントは決定論的でトランスクリプト駆動型であるため、その出力(*.silence-transcript.json)は、後続のエージェントやビート同期バリデーターにクリーンな形で渡されます。
使用するタイミング
- 「無音をカットして」「ポーズをトリミングして」「デッドエアを除去して」「ペースを調整して」
- マスター編集ワークフローの最初の段階として、文字起こしの直後に使用します。
前提条件
単語レベルのトランスクリプトJSONが必要です。ElevenLabs Scribe形式({ words: [{ text, start, end, type }], audio_duration_secs })または汎用形式({ words: [{ text, start, end }] })のいずれかに対応しています。ワークスペースの文字起こしツールで生成してください:
node scripts/transcribe-elevenlabs.mjs path/to/raw.mp4 # -> path/to/raw.json
使用方法
# 1) 計画のみ — カットを計算し、EDLと再調整されたトランスクリプトを書き出す(動画には触れません)
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcript.json> \
--out-dir video-projects/<slug>/assets
# 2) 動画を指定 — ffmpegコマンドも書き出す(レンダリングはまだ行いません)
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcript.json> \
--video video-projects/<slug>/assets/raw.mp4 --out-dir video-projects/<slug>/assets
# 3) カット動画をレンダリング(ローカルffmpeg、再エンコード、A/V同期を維持)
# --apply を追加して実際にffmpegを実行します
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcript.json> \
--video video-projects/<slug>/assets/raw.mp4 --apply \
--output video-projects/<slug>/assets/edited-silenced.mp4
オプション
| フラグ | デフォルト | 意味 |
|---|---|---|
--video <path> | — | ソース動画のパス。ffmpegコマンド/レンダリングを有効にします。 |
--out-dir <dir> | トランスクリプトと同じディレクトリ | 出力ファイルの書き出し先ディレクトリ |
--output <path> | <video-stem>.silenced.mp4 | カット動画の出力パス |
--gap <s> | 0.55 | トリミング可能な無音と見なす最小のポーズ(秒) |
--head-pad <s> | 0.22 | 最初の単語の前に残す無音の長さ(秒) |
--tail-pad <s> | 0.34 | 最後の単語の後に残す無音の長さ(秒) |
--apply | off | 実際にffmpegを実行してカットをレンダリングする |
決定方法(無音ルール)
--gap(0.55秒)未満のポーズはそのまま残します — 自然な話のリズムです。- トリミングされたポーズに対しては、自然な呼吸の間隔が保持され、コンテキストに応じて調整されます:長いポーズ(≧2秒)では0.24秒、文の終わり(
. ! ?)の後では0.20秒、それ以外では0.14秒。保持される呼吸は、前のフレーズの終わりにやや近くなるように調整されます。 - 先頭/末尾のデッドエアは
--head-pad/--tail-padにトリミングされます。 - 削除範囲は統合され、保持範囲はその補集合となります。カットはffmpegの
trim/atrim+concatフィルターグラフでレンダリングされます(*.silence-filter.txtスクリプトに書き出され、-/filter_complexで渡されます)。そのため、ビデオとオーディオの同期が保たれます。
出力(--out-dirに書き出されます)
| ファイル | 目的 |
|---|---|
<stem>.silence-edl.json | 保持/削除範囲、長さ、パラメータ — 編集リスト |
<stem>.silence-transcript.json | 編集タイムラインに再調整された単語のトランスクリプト(エージェント 2 + ビートに渡されます) |
<stem>.silence-decisions.md | 人間が読める要約と、トリミングされた最大のポーズ |
<stem>.silence-filter.txt | ffmpegフィルターグラフ(--video指定時のみ) |
<video-stem>.silenced.mp4 | カット動画(--apply指定時のみ) |
標準出力に表示されるJSONサマリーには、removed、removedPct、範囲の数、出力パスが含まれており、マスターワークフローでのログ記録と連鎖に役立ちます。
チューニングの注意点
- トークヘッドYouTubeのデフォルト(
--gap 0.55)では、典型的な生のテイクから約15〜20%の純粋な無音が除去されます。よりテンポの速いカットには--gapを低く設定し、より自然な呼吸の間隔を残すには--gapを高く設定します。 - 文の区切りでのカットが強すぎると感じる場合は、文末の呼吸の長さを増やすか、
--gapを上げてください。
次のエージェントへの引き渡し
<stem>.silence-transcript.json(およびレンダリングされたsilenced.mp4があればそれ)をcut-mistakesエージェントに渡します。タイムスタンプは既に編集タイムライン上で調整されているため、下流のビートタイミングやscripts/validate-beat-sync.mjsは追加の調整なしで動作します。