無音カット(パイプラインエージェント1)
自動編集の最初のステップ。生録画とその発話レベルの文字起こしを入力として、無音のみを除去します:最初の単語前と最後の単語後のデッドエア、および閾値より長い単語間のポーズ(自然な呼吸程度に短縮され、完全なゼロギャップにはなりません)。発話内容はそのまま保持され、言い間違い、リテイク、どもりはカットミステークスエージェント(エージェント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、再エンコード、音声/映像同期保持)
# --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 | オフ | 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を上げてください。
次のエージェントへの引き継ぎ
<stem>.silence-transcript.json(およびレンダリングされたsilenced.mp4があればそれも)をカットミステークスエージェントに渡します。タイムスタンプは既に編集タイムラインに合わせて調整されているため、後続のビートタイミングやscripts/validate-beat-sync.mjsによる検証は追加調整なしで機能します。