claude-watch について
claude-watchは、動画や動画URLからフレームと文字起こしを取得し、タイムスタンプ付きの学習ノートにまとめるClaudeスキルです。チュートリアルや講義の学習に使え、ノートはファイルとして保存されます。
主な機能
- 01動画URLとローカル動画の処理
- 02フレームと文字起こしの抽出
- 03シーンごとのタイムスタンプ付きノート作成
- 04区間指定とフレームサンプリング調整
- 05再視聴時のキャッシュ再利用
活用シーン
- 01オンラインチュートリアルを学習ノート化
- 02ローカル画面録画から要点を抽出
- 03講義の指定区間に絞って確認
- 04視聴済み動画について追加で質問
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ devinilabs/ claude-watch --skill claude-watchインストール後、Claude Code で/claude-watchを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.gitignoreCHANGELOG.md.gitattributesLICENSEREADME.mdconftest.pypyproject.toml.claude-plugin/marketplace.jsonplugin.json.codex-plugin/skill.json.github/workflows/release.ymlcommands/claude-watch.mdhooks/hooks.jsonhooks/scripts/session_start.shscripts/__init__.pylibrary.pyframes.pydownload.pybuild-skill.shresolve.pyscenes.pysetup.pywhisper.pywatch.pytranscribe.pytests/__init__.pytest_download.pytest_library.pytest_frames.pytests/fixtures/build_fixture.sh詳細
/claude-watch — Claude が動画を学習ノートに変換します
動画の入力がなくても問題ありません。このスキルを使えば動画を用意でき、視聴するたびに保存済みのノート成果物も作成できます。
ステップ 0 — セットアップ前チェック(成功時は何も出力しません)
/claude-watch の呼び出しごとに実行します。
python3 "${CLAUDE_SKILL_DIR}/scripts/setup.py" --check
終了コード:0 準備完了(何も出力せず続行)、2 バイナリが不足、3 API キーが不足、4 両方が不足しています。終了コードが 0 以外の場合は、インストーラーを実行します。
python3 "${CLAUDE_SKILL_DIR}/scripts/setup.py"
macOS では ffmpeg と yt-dlp が自動的に brew install されます。Linux/Windows では、適切なコマンドが表示されます。コメントアウトされたプレースホルダーを含む ~/.config/claude-watch/.env(モード 0600)を作成します。
その後も Whisper キーが不足している場合は、AskUserQuestion を使って、Groq キー(推奨 — より低コストで高速)と OpenAI キーのどちらを持っているかユーザーに尋ね、~/.config/claude-watch/.env に書き込みます。ユーザーが希望しない場合は --no-whisper を指定して実行します。ネイティブ字幕のない動画では、フレームのみが返されます。
使用する場面
- ユーザーがチュートリアル/講義/講演の URL を貼り付け、学習したいと言った場合
- ユーザーがローカルの画面録画や動画を指定し、ノートを求めた場合
- ユーザーが
/claude-watch <url-or-path> [topic]と入力した場合
呼び出し方法
ステップ 1 — 入力を解析します。 ソース(URL またはパス)と、ユーザーが指定したトピックを分けます。トピックはノートで強調するセクションを決めるためのものです。スクリプトには渡さず、要約に反映します。
ステップ 2 — watch スクリプトを実行します。
python3 "${CLAUDE_SKILL_DIR}/scripts/watch.py" "<source>"
オプションのフラグ:
--start T/--end T— セクションに絞ります(SS、MM:SS、またはHH:MM:SS)--max-frames N— 上限を引き下げます(デフォルトは 80)--resolution W— 画面上の文字が小さい場合、フレーム幅を 1024 px に引き上げます--scene-threshold X— 感度(デフォルトは 0.30。カットを減らすには値を上げ、増やすには値を下げます)--max-gap S— カバレッジの間隔の上限を秒単位で指定します(デフォルトは 45)--whisper groq|openai— バックエンドを指定します--no-whisper— Whisper を完全に無効にします--out-dir DIR— ライブラリのルートディレクトリを上書きします
ステップ 3 — すべてのフレームを読み込みます。 スクリプトの最後に、各フレームのパスとタイムスタンプを列挙した構造化された === frames === ブロックが出力されます。すべてを並列で Read します。コンテキスト内に画像として表示されます。
ステップ 4 — 文字起こしを読み込みます。 === transcript === ブロックに transcript.json(フォーカスモードの場合は transcript.window.json)へのパスが示されます。これを Read します。{t_start, t_end, text, speaker_break} のリストです。
ステップ 5 — ライブラリディレクトリに notes.md を書き込みます。 以下の厳密なテンプレートを使用します。<library_dir>/notes.md に保存し、その後、チャットに 3 行の要約を出力します。
- タイトルとスラッグ
- セクション数と主要な概念
- ノートファイルへのパス
ライブラリディレクトリを削除しないでください。これは成果物です。
ノートのテンプレート(構造の変更不可)
# <Video Title>
**Source:** <URL or path> · **Duration:** MM:SS · **Watched:** YYYY-MM-DD
## TLDR
<3-4 sentences: what the video is about and the single most important takeaway.>
## Key Concepts
- **<concept>** — <one-line definition> · `[t=MM:SS]`
- ...
## Notes
### [t=00:04] <Section title you derive from on-screen + spoken content>

**On screen:** <Transcribe / describe the slide, code, diagram. If code, transcribe verbatim.>
**Said:** <Relevant transcript excerpt for this scene, lightly cleaned.>
**Synthesis:** <Your connection — what this section is teaching, how it links to prior section.>
### [t=00:31] <next section>
...
## Code & Commands
<every code-on-screen frame's content as a runnable fenced block, language-tagged, with [t=MM:SS] back-link>
```python
# [t=03:45]
def forward(x):
return x @ W + b
```
## Diagrams Referenced
- `[t=02:10]` — <one-line description of the diagram in frame 0008>
- ...
## Open Questions
- <things mentioned but not fully covered, or follow-ups to explore>
テンプレートに組み込まれたルール
- 1 つのシーンを 1 つのセクションにします。 各フレームの
t=MM:SSをセクションの基準点として使用します。 - 明らかに同じトピックの隣接するシーンはまとめてもかまいません。その場合は、括弧書きで明記します:(t=02:10 と t=02:42 のシーンを統合)
- **コードブロックは適切な言語タグを付けてフェンスで囲み、**フレームの内容を一字一句そのまま書き起こします。
- 「On screen」ブロックはタイトルスライドでも必須です。 構造を統一するためです。
- タイムスタンプは絶対時刻(動画上の実際のタイムライン)です。YouTube の場合、視聴者は
<URL>&t=<seconds>を貼り付けて該当箇所に移動できます。
再実行
ユーザーが同じ URL を再度視聴すると、スクリプトはキャッシュ済みのダウンロード、文字起こし、シーンを再利用します。再生成されるのはフレームとノートのみです。すべてを再実行するには、まず <library_dir>/meta.json を削除します。
エラーが発生した場合
- セットアップ前チェックの終了コードが 0 以外 →
setup.pyを実行し、AskUserQuestionでキーについて尋ねます。 - 文字起こしがない → スクリプトは
transcript_source: noneを出力します。フレームのみでノートを作成し、その旨をユーザーに伝えます。 - 長い動画のスキャンが疎であることを示す警告 → ユーザーが見たい部分に絞って
--start/--endを指定し、再実行することを提案します。 - Whisper の失敗 → Groq が失敗した場合は
--whisper openaiで再試行し、OpenAI が失敗した場合はその逆を行います。
トークンの予算
コストの大半はフレームが占めます(512 pxで60フレームの場合、入力トークン約50~80k)。トランスクリプトは低コストです。--resolution 1024 にするとフレームあたりのコストが4倍になります。画面上の小さな文字を読む必要がある場合に限って使用してください。
このセッションですでに視聴した動画についてユーザーから追加質問があった場合は、スクリプトを再実行しないでください。ライブラリのディレクトリはディスク上にあります。必要なフレームだけを再度Readしてください。
セキュリティ
yt-dlp、ffmpeg、ffprobeをローカルで実行します- 字幕がない場合に限り、抽出したモノラル16 kHz音声をGroq(優先)またはOpenAI Whisper APIに送信します
- キーの読み取り/書き込みには
~/.config/claude-watch/.env(モード0600)を使用します - 成果物を
~/claude-watch/library/<slug>/に保存します。慎重を期す場合は、初回実行後にディレクトリを確認してください - 音声をWhisperに送信する呼び出しを除き、APIキー、動画ファイル、元のURLを記録または送信することはありません