Xのダウンロードボタンを押すだけで、動画と文字起こしテキストが揃うようにした。保存フォルダを見張ってwhisperを回す常駐スクリプト

未分類

Xのダウンロードボタンを押すだけで、動画と文字起こしテキストが揃うようにした。保存フォルダを見張ってwhisperを回す常駐スクリプト

Xで気になった動画をChrome拡張機能のボタンで落とすと、十数秒後に「文字起こしを開始」のトーストが出る。 1分もしないうちに「文字起こし完了(20 秒)」のトーストが出て、保存フォルダの下の「文字起こし」フォルダに、動画と同名の.srtと.txtが置かれている。 2026年9月10日に作った常駐スクリプトtranscribe-watchの動きで、同じ日の午後から実際に使っている。

朝にEasyTranscribeの中身を読んで、文字起こしの材料はopenai-whisperとffmpegだけだと分かった。 それなら画面を開いてボタンを押す操作も要らないはずで、動画が置かれるフォルダを見張る形にした。

結論を先に置く。

  • 人の操作はダウンロードボタンを押すことだけになった。ファイルを探す、コマンドを打つ、アプリを開く、のどれも無い
  • 手に入るのは動画のmp4と、同名の.srt(時刻つきの字幕形式)と.txt(本文だけ)。1分28秒の英語動画は20秒でテキストになった
  • テキストになった瞬間に、生成AIでの要約、記事への引用、英語動画の翻訳が同じ手順で済む
  • 中身はopenai-whisperとwatchdogとトースト用のPowerShellをPythonで束ねた小さなもの。手元のGPUで動き、音声を外部に送らない

何が落ちてくるか

流れは図1のとおりで、人が関わるのは①だけである。

ユーザーがダウンロードボタンを押すと保存フォルダに動画が置かれ、常駐スクリプトが変更通知で気づいて開始トーストを出し、whisperをGPUで実行してsrtとtxtをフォルダに置き、完了トーストを出すシーケンス図
図1: 人の操作は①だけ。②以降は常駐スクリプトが勝手に進め、開始と完了をトーストで知らせる

拡張機能が動画を保存すると、常駐スクリプトがフォルダの変更通知で気づく。 書き込みが終わるのを待ってから「文字起こしを開始」のトーストを出し、whisperをGPUで回す。 終わったら同じフォルダの下の「文字起こし」に.srtと.txtを置き、「文字起こし完了」のトーストを出す。

保存フォルダはこうなる。

G:\マイドライブ\twitter_download\
├── 20260910_Ray Dalio_2097714517027282944.mp4
└── 文字起こし\
    ├── 20260910_Ray Dalio_2097714517027282944.srt
    └── 20260910_Ray Dalio_2097714517027282944.txt

.srtは時刻つきなので、動画のどこで何を言ったかがそのまま分かる。

1
00:00:00,000 --> 00:00:05,540
Almost every technology boom has created a bubble that creates a bust.

2
00:00:05,920 --> 00:00:07,680
And the productivity comes along.

.txtは本文だけを1キュー1行で並べたもので、そのまま生成AIに渡せる。

テキストになると何ができるか

動画のままでは、見直すのに動画と同じ時間がかかる。 テキストになった瞬間に、次の使い方が全部同じ手順になる。

  • 要約する。.txtをClaudeやChatGPTに渡して「3行で」と頼む。動画を見直す時間がゼロになる
  • 記事に引用する。.srtに時刻があるので「0分5秒でこう言った」と書ける。この記事の引用もそこから取った
  • 翻訳する。whisperは言語を自動判定するので、英語の動画は英語のテキストになる。上の動画がそれで、テキストになっていれば翻訳は一瞬で済む
  • 検索する。テキストなのでgrepやGoogle Driveの検索で中身から探せる。Drive経由でMacからも同じファイルが見える

以前は、ダウンロードしたあとにファイルを探し、コマンドを打つか文字起こしアプリを開いて動画を選び、出力を開く、という手順を毎回やっていた。 その全部が消えて、残ったのはダウンロードボタンだけになった。

仕組みの要点

詳細は書かないが、動きを決めている点だけ挙げる。

  • 監視はフォルダの変更通知だけで、定期巡回はしない。待機中のCPUはゼロで、動画が置かれた瞬間に気づく
  • 監視するフォルダは4つ。X用とYouTube用の保存先に、Google Driveが使えないときに拡張機能が退避する2つを加えた
  • whisperはファイルごとに子プロセスで回す。GPUのメモリ不足で落ちても監視本体は生き残り、メモリも仕事のたびに解放される
  • 出力は仮名に書き切ってから正式名へ改名する。正式名の.srtと.txtがあれば中身も揃っているので、状態ファイルを持たない
  • 失敗は1分、5分、30分、2時間と間隔を延ばして再試行し、5回失敗したら諦めてトーストで知らせる
  • 速度は、5分10秒の動画が64秒(RTX 3070、モデルはlarge-v3-turbo)。実時間の約5倍
  • Windowsのタスクスケジューラでログオン時に起動し、通知を逃したときは動画をショートカットに落として手で回せる

材料はPython 3.11、openai-whisper、watchdog、PowerShellのトースト通知で、外部サービスは使っていない。 判定はすべて純粋関数に閉じ込め、33件の単体テストで固めた。 設計はCodexに4回レビューさせ、再起動時の取りこぼし、退避先の監視漏れ、失敗の手動復旧、出力の途中欠けなど7点を実装前に直した。

割り切り

  • 監視が止まっていた間に届いた動画は処理しない。開始トーストが出ないことで気づけるので、ショートカットに落として回す
  • 再試行の予定はメモリ上に持ち、監視を再起動すると消える
  • Windows専用。Macで動かすならmlx-whisperに差し替えることになる

自分の動画を人に見せるためのツールではなく、自分が見た動画をテキストとして手元に残すためのツールである。 ダウンロードボタンを押した動画は、押した時点でもう検索も要約も翻訳もできる状態になっている。

参考リンク

#文字起こし#Whisper#自動化#Python#Chrome拡張#ローカルAI