derush
話し言葉の自動「ジャンプカット」編集。カットと書き出しのみを行い、字幕は付けません。このスキルは以下のルーブリックを内蔵しています。スクリプト(fillers、prune、cut)はリポジトリにあります。
動画は $DERUSH_OUT_ROOT/<STEM>/ に格納されます(デフォルトは ~/Movies/Derush。derush config show で確認)。
音声のみ(m4a、mp3、wav、aiff、caf)も同じ処理チェーンを通ります。編集結果は <STEM>.derush.m4a、書き出しは <STEM>.export.m4a(-14 LUFS)として出力されます。fcpxml、ロゴ、ルックは音声には適用されません。
3つの主要コマンド
derush prep "<video>" # ソースを $DERUSH_OUT_ROOT/<STEM>/ に配置、音声、沈黙、文字起こし(qwen)、
# アライメント、フィラー、ギャップ、ギャップ制御。再生時間の約1.5倍
derush words <STEM> # 単語ごとのタイムスタンプ付き文字起こし:ステップ6の読み取りに使用
derush studio # すべてをブラウザで:生の動画をドロップ、derush、テキストによる編集、
# 提案されたタイトな編集、レンダリング。穴の中の話し言葉=保持、削除可能
derush edit <STEM> # テキストベースの編集:ローカルページ、単語を削除(Delキー)、
# フィラー/沈黙をキャッチ(Enter)、確定 → retraction_cuts.json + restore.json
# 「タイトな編集を提案」:Claudeがカットを提案(言い直し、脱線、
# やり直し)をオレンジで表示、承認なしにカットは行われません
derush render <STEM> # マージ + 保持 + カット + 出力の再文字起こし + cuts.md
derush logos <STEM> # オプション:logos.json → <STEM>.logos.mp4、書き出しはこれがあれば使用
derush fcpxml <STEM> # <STEM>.fcpxml。renderでも書き出されます:Resolveタイムライン、
# ソース全体のクリップ、端をドラッグするとカット部分が復元
derush export <STEM> # <STEM>.reel.mp4:1080x1920、30 fps、-14 LUFS、投稿準備完了
ロゴ(derush logos):$DERUSH_OUT_ROOT/<STEM>/logos.json = {"cues":[{"logo":"canva","t":14.27}]}、t は derush words の値(SOURCE時間、keep.json で変換)。ファイルは $DERUSH_OUT_ROOT/_logos/src/<logo>.svg|png(切り抜き済み、透明背景;ファイルがない場合はテキストカード)。幅30%の角丸白カード、デフォルトで左上配置(顔出し動画:顔は中央上部3分の1を占める)、2秒間、フェード0.2秒。素早く発話されるカードは横に並べます。確認方法:各キューから画像を抽出して目視確認します。IMG_4596(2026-10-11):Canva×2、Microsoft 365、Gamma、Higgsfield(文字起こし上は「Xfield」:名前を聞いて確認、whisperは半分の名前を認識しません)。
derush = リポジトリの bin/derush。prep のオプション:--lang en、--noise -40(声が小さい場合)、--min 0.3 --pad 0.08(よりタイトに)、--min 0.8 --pad 0.2(よりゆったり)。2つの動画がある場合:prep をバックグラウンドで順次実行し、その間に words を読む。
何がカットされ、誰が決定するか
| レイヤー | シグナル | 決定者 |
|---|---|---|
| 沈黙 | 波形、silencedetect(whisperの穴は粗すぎるため不使用) | スクリプト |
| (前提条件)正確な単語境界 | 音声に対するCTC強制アライメント(align_words.py) | スクリプト |
| whisperが書き起こした「えー」「あー」「うー」、吃り「じょ、じょ」「と、と」 | 単語タイムスタンプ(detect_fillers.py) | スクリプト |
| 書き起こされていない「えー」「んー」(大半) | 2単語間の非沈黙ギャップ(gap_fillers.py) | スクリプト |
| 言い間違い、言い直し、「いや待って」「違う」、途中で止めた単語、カメラに向けた指示 | 文字起こしを読んで判断 | あなた(ステップ6) |
このスキルの基本原則:正しいコンテンツを誤ってカットすることは最大の過ちです。 疑わしい場合は保存し、その判断を cuts.md に明記します(「意図的に保持」)。
ステップ6:唯一の手作業ステップ「言い間違いの検出」
derush words <STEM>(単語@開始-終了、? = 補間された境界、アライメント未完了)を読み、$DERUSH_OUT_ROOT/<STEM>/retraction_cuts.json を以下の形式で作成します:
{"retraction_cuts":[{start,end,cue_text,rationale}]}
以下はこのファイルに含まれる「言い間違い検出ルーブリック」です。自然な発話における以下のケースを扱います:
- 言い間違い(フェイクスタート) 「これから…これから見ると」:「これから」を言い直しの開始点までカット。
- 言い換え 「それはツール、つまりツールが」:2つ目が最初を置き換える場合のみ最初をカット(補足説明ではない場合)。
- ゼロからの言い直し(余談の後を含む):最初の試行全体をカット。
- カメラに向けた進行指示(「これはカット」「マイクじゃないや、違う」「これは保持」):これらは指示でありコンテンツではありません。適用後、カットします。IMG_4566:最後の40秒は3つの言い間違いと2つの指示でした。
- カットしないもの:強調の繰り返し(「常に、常に」)、リスト、「つまり」の付加使用、表現としての間、ユーモアのある自己修正(「21世紀と22世紀。いや、21世紀のだ」)。
- 境界は
wordsから取得:start= 保持する最後の単語の終了と放棄する最初の単語の開始の中間点;end= 保持する最初の単語(修復箇所)の開始 − 0.04秒。動画の最後までカットする場合:end= 動画の長さ。
長い文字起こし(>1000語)の場合:サブエージェントに読み取りを委任し、JSONを生成させ、その境界を words と照合します。
レンダリング前の確認(再認識ではなく再検査)
render は機械的なチェックを行い、cuts.md に出力します。あなたが確認する項目:
cuts.mdのdiffセクション(ソース文字起こし → 出力)。各deleteは意図したカットであるべき。奇妙なreplace/insert(「それはそれはそれは」)は、whisperのループの可能性があります。カットを疑う前に、その領域だけを再文字起こししてください。gap_checkによって「発話のある穴」とマークされた穴(prepの最後):そのウィンドウを聞いてください。言い間違いであればカットは正しい。コンテンツであれば、renderの前に_work/gap_cuts.jsonからその穴を削除してください。- 引用された「えー」「んー」はコンテンツです。「沈黙、あー」「特にえーについて」:単語が文の主題である場合は保持されます。「les」「des」「un」「sur les」の後ろにある「えー/うー/あー」は、穴をカバーしている場合は聞いて削除してください。「sur les」を言い間違いとして扱わないでください。文はえーで終わります。(2026-10-27、A001_10272011_C008。)
- 文字起こし:2026-11-04以降のデフォルトはQwen3-ASR(
transcribe_qwen.py、DERUSH_ASR=whisperで戻す;qwenがないかダウンしている場合はwhisperにフォールバック、ログに記録)。Qwenはwhisperが統合する吃りや言い間違いを書き残します(C010:「ちょっとした、ちょっとしたもの」、「持ってない、持ってない、全部」)。そのためderush wordsとderush editに表示されます。Qwenもえーを書き起こしません:gap_fillers.pyは引き続き使用。固有名詞に弱い(「claudito」→「claudio」)。 - whisperによって統合された言い間違い:whisperは2回言われたフレーズを1回だけ書き起こす場合があります。IMG_4543:「これ入れて…これ入れる」→文字起こし「これ入れる」。出力で不自然に聞こえる接続箇所がある場合 = その部分のソースを単語ごとに再文字起こし。
- 略語、ドメイン名、数字:CTCはスペルアウトされた文字のアライメントが不正確です。IMG_4549:「SI」の前の穴(SpaceX SI)は「ès」を運んでいました。略語や
.comに触れるすべての穴:ウィンドウを再文字起こしし、少しでも疑わしい場合はカットしないでください。数字を含むトークン(「5h」「J3」)は補間され、アライメントされません。 - 同期:
cuts.mdにA/Vのずれが示されます。40msを超える場合は確認。 cuts.mdのSujet行を記入。
言い間違い検出ルーブリック
あなた(呼び出し元エージェント)は derush words <STEM> を読み、以下のJSONを $DERUSH_OUT_ROOT/<STEM>/retraction_cuts.json に書き込みます。これは derush render が読み取るファイルです:
検出器の出力契約
{
"retraction_cuts": [
{
"start": 6.4,
"end": 9.8,
"cue_text": "いや待って",
"rationale": "修復対象語句「ユーザーがファイルを開くたびに実行する」+ 合図「いや待って」;修復「実際にはセッション開始時に実行する」は保持。"
}
]
}
start= 放棄された思考(修復対象語句) の開始。意味的な判断であり、文の途中にある場合があります。derush wordsの単語タイムスタンプから正確な時間を読み取ってください(以下の「境界アンカリング」を参照)。時間はソース動画の秒数です。end= 言い直しの合図(中間部) の終了。修復対象語句+合図の両方が削除され、その後に続く修復は保持されます。実際にはendは修正された発話が始まる境界に位置します。- 真の言い直しがない場合、空のリスト
{"retraction_cuts": []}。デコイやトピックシフトはカットを生成しません。
自己修復モデル(Levelt / Clark & Wasow)
[修復対象語句] [合図/中間部] [修復]
放棄された内容 合図 置き換え
カット カット 保持
カット = 修復対象語句 + 合図。修復は保持されます。
肯定テスト(カット):すべての条件が成立すること
- 話者が以前の内容を無効化している(否定、削除、または誤り/不明瞭と判断)、かつ
- それを置き換えるか放棄する:修正版が続く、または思考が放棄される、かつ
- 削除するための実際の修復対象語句が文字起こしに存在する(合図のみで先行発話がない場合 → カットなし。以下のエッジケースを参照)。
否定テスト(カットしない):いずれか一つで候補を却下
これらのケースは表面的には合図のように見えますが、言い直しではありません:
- 時間限定トピックシフト:「予算のことは一旦/とりあえず忘れて」、「予算のことはちょっと忘れて」。この「一旦/とりあえず」修飾(後で「来週カバーします」などの先送りを伴うことが多い)は、以前の内容がまだ有効で、単に延期されたことを意味します。カットなし。
- 付加的な強調:「というか、むしろもっとすごい」「いや待って、それはもっと強力だ」。ここでの「というか」「いや」は以前の主張を強化しており、依然として成立します。カットなし。
- 肯定:「いや、まさにそれ」「いや、それは良い指摘だ」。この「いや」「そうですね」は同意を強めているのであり、修正ではありません。カットなし。
- 手順上の間:「待って、見せてあげる」/「wait, let me show you」。デモのための発話の間。何も取り消されていません。カットなし。
- ニュアンス/範囲の精緻化:「それはもっと微妙だ」「まあ、もう少し複雑だ」。以前の主張は限定・拡張されているのであり、破棄されていません。カットなし。
- 話題の終了:「まあ、複雑だね」「とにかく」。連鎖を閉じるが無効化はしない。カットなし。(「要するに」は曖昧:その後に実際の放棄(「要するに、基準はどうでもいい」)が続く場合のみカット。)
修復対象語句はどこから始まるか?
開始境界は意味的な判断です:
- 話者が何を置き換えているかを尋ねる。 修復対象語句は、放棄されたアイデアが正しい置き換えから最初に分岐した時点から始まります。
- 再開始マーカー(「やり直します」「let me start over」「いや待って、もう一度」)→ 広い修復対象語句:やり直された区間の開始点まで遡ります。
- 修正のピボット(「いや、というか」「actually no」「wait no」)→ 狭い修復対象語句:直前の述語/節のみ。
- 自然なトピック境界ルール:異なる主題を跨いでカットしてはいけません。間違ったバージョンと正しいバージョンの両方が構築する有効な共有トピック導入部は保持されます(例:「サウンドインストールプロジェクトについて…」の導入部は残る;その後の間違った技術的主張のみがカットされる)。
- 設定 vs 展開テスト(最後の真実の主張を保持)。 設定/導入部の主張が真実のままであり、その後の展開、列挙、リスト、詳細のみが放棄された場合、修復対象語句は展開部分から始まり、設定からではありません。決定的な質問は:「話者はこの節を否定しているのか、それともその後に続くものだけを否定しているのか?」 修復後も節が真実ならば、保持します。修復が無効化する最初の節からカットを開始します。
- 「4つの基準を使います:A、B、C、D。まあ、基準はどうでもいいです。大事なのはXです。」→ 設定「4つの基準を使います」は依然として真(実際に基準を使っている);列挙「A、B、C、D」だけが放棄されています。カットは列挙から始まり、「4つの基準を使います」からではありません。設定を保持することは必須です:カットすることは正しいコンテンツの誤ったカットです。
- 対照的に:話者が設定自体を否定する場合(「4つの基準を使います…いや、実際には使いません。単純なルールです」)、その場合、設定が修復対象語句であり、カットはそこから始まります。修復が何を置き換えるかを読んでください。
- 最小カット/保守主義:どこまで遡るか確信が持てない場合は、より狭いカットを優先してください。やや不正確な先行節を残すことは、正しい文をカットするよりはるかにマシです。
- 複数文の修復対象語句:放棄された思考が
derush wordsの複数の文や行にまたがる場合、カットはそれらのすべてをカバーします。 - 境界アンカリング:単語タイムスタンプを使用し、算術計算はしない。
derush words <STEM>は各単語を単語@開始-終了で出力します(単語の後に?がある場合、境界は補間されており、音声にアライメントされていません。正確性が低いものとして扱ってください)。以下に基づいてアンカーします:start= 保持する最後の単語の終了と、放棄する最初の単語の開始の間のギャップの中間点。end= 保持する最初の単語(修復の先頭)の開始 − 0.04秒。修復対象語句と合図がカットされ、修復の先頭は決して触れられません。動画の最後までカットする場合、end= 動画の長さ。- 合図と修復の先頭が同じ文にある場合(「でも」「つまり」「it's」、カンマ、ダッシュで区切られている):合図の最後の単語でカットを終了し、それ以降には及びません。合図の後に続く最初の句読点を使用し、修飾節内の後のカンマは使用しないでください。合図が末尾のカンマを伴う場合(「いや待って、」「それじゃ、」)、その後の単語は修復であり、保持されます。
- 修復対象語句が一行の末尾に、合図が次の行の先頭にある場合:合図も取得するために前方に達するのではなく、修復対象語句の終了でカットを終了します。短い残りの合図(「いや待って」)は無害です。修復の先頭を削除することは最大の罪です。
- 補間された境界(
?):内側に丸めます(以下を参照)。
…(翻訳のために切り詰め。原文の残りの内容も同様のルーブリック/ガイドラインを続けます。)