Communitygithub.com

RolynTrotter/vibe-podcast

ソース素材(YouTube 講義、講演、過去のエピソード)から引用可能な発言を抽出し、タイムスタンプ付きクリップと引用テロップ(Citation lower-third)を生成します。ソース動画の文字起こしや特定のトピックに関する発言の検索、エピソード用の引用抽出、講演やレクチャーからの引用テロップ作成を依頼されたときに使用します。

vibe-podcast とは?

このスキルは、ポッドキャスト制作においてソース素材から引用を効率的に抽出し、編集可能なクリップとテロップデータを生成するエージェントワークフローを提供します。YouTube 講義や自身の過去エピソードなどの動画をダウンロードし、mlx-whisper で高精度に文字起こし(単語レベルのタイムスタンプ付き)した後、ユーザーの判断で引用として適切な箇所を選び、quote.json に構造化データとして記録します。そこから citekit.py が自動的に引用レビューシート、編集用クリップ情報、FCP 用テロップ XML を生成します。主に Claude Code や Cursor などの AI エージェントと連携し、macOS 上の Python と ffmpeg 環境で動作します。YouTube のダウンロードには yt-dlp と Firefox のクッキーが必要ですが、トランスクリプト修正や引用データ作成はエージェントが自律的に実行可能です。誤認識の修正機能や復元可能な編集履歴により、再実行しても修正が保持される信頼性の高い設計になっています。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/RolynTrotter/vibe-podcast/tree/HEAD/.claude/skills/citations

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

引用:ソース → 文字起こし → 引用 → キューとクリップ

ツール: agent-citations/citekit.py(stdlib Python に mlx_whisper と ffmpeg を追加)。入力ファイルを上書きすることはなく、--force なしでは自身の出力を置き換えません。

バッチ構成

active_edits/<subject>/ 以下に、被写体ごとに1つのフォルダを作成します:

sources/video_sources.txt          ユーザーが指定したURLのリスト
sources/audio/<id>.m4a .info.json  yt-dlp によるダウンロード(ステップ1)
sources/transcripts/<id>.json .md  ステップ2
podcast/<ep>.json .md              自身のエピソードのキャプションをインポート(ステップ2b)
sources/quotes.json                ステップ3(あなたが作成)
sources/citations/                 ステップ4の出力

1. ダウンロード(ユーザーが実行)

ここでは YouTube が匿名での yt-dlp をブロックしています。以下のコマンドを実行するのではなく、ユーザーにこのコマンドを伝えてください。Firefox のクッキーと tv/safari クライアントが必要で、音声は小さく保持します(Whisper に必要なのは 16 kHz モノラルのみ):

cd active_edits/<subject>/sources && for id in ID1 ID2; do yt-dlp --cookies-from-browser firefox --extractor-args "youtube:player_client=tv,web_safari,mweb" -f "wa/w" -x --audio-format m4a --postprocessor-args "ExtractAudio:-ac 1 -ar 16000" --write-info-json --write-auto-subs --sub-langs en --sub-format json3 --no-overwrites -o "audio/%(id)s.%(ext)s" "https://youtu.be/$id"; done

チャンネルのバックログを処理する場合は、まず一覧表示してから選択します:yt-dlp --flat-playlist --print "%(id)s %(duration_string)s %(title)s" https://www.youtube.com/@CHANNEL/videos。 リストが長い場合は、Jev(vibe-classification)でタイトルをトリアージします。

2. 文字起こし

  • citekit.py transcribe sources/audio/<id>.m4a:mlx-whisper large-v3-turbo、単語タイムスタンプ付き。 初期プロンプトには動画のタイトルと説明文が設定され、これによりほとんどの固有名詞の表記が修正されます。この Mac では約 85倍速で動作します(15分の動画で約35秒、モデルは初回のみダウンロード)。
  • citekit.py captions sources/audio/<id>.en.json3:YouTube の自動キャプション。即座に処理されますが、句読点はありません。 tv クライアントでは自動キャプションが保存されないことがよくあります。
  • 2b. 自身のエピソード:citekit.py itt EP.itt --id podcastN --media EP.mp4 --out active_edits/<subject>/podcast --fix 'REGEX=>Right'。 FCP のキャプションは名前を誤認識します。エピソード1の場合:--fix '\bver ?m+[iu]l+e?\b=>Vermeule' --fix '\bvermil\b=>Vermeule' --fix '\bAsian Vermeule=>Adrian Vermeule'。 エピソード1では、podcast/podcast1.fixes.json に単語レベルの修正が記録されています(Schmidt→Schmitt など)。再インポート時にこれらの修正が再適用されます。

文字起こしの誤りをその場で修正(確認不要)

明らかな聞き間違い(名前、引用の文字化け、吃音を Whisper が倍にしてしまった場合など)に気づいたら、修正します: citekit.py fix TRANSCRIPT 'old words=>new words' [...] [--near SECONDS]。これにより <id>.json/.md がインプレースで編集されます(新しい単語は古い区間のタイミングを引き継ぎ、マッチはセグメントをまたがることができ、末尾の句読点は引き継がれます)。 修正前のエンジン出力は <id>.raw.json として保持され、すべての修正は <id>.fixes.json に記録されます。transcribe と itt はこのログを再実行するため、修正は再実行後も維持されます。判断に迷う場合は、推測せずにその箇所を聞き直します:ffmpeg -ss T -to T2 -i audio.m4a x.wav && mlx_whisper x.wav --output-format txt。まず修正し、その後修正された単語を引用します。locate は文字起こしと照合します。

3. 引用のマイニング(あなたの判断)

  1. エピソードの文字起こしがある場合はそれを読み、ホストが被写体について述べている主張を、それぞれのエピソード内の時間とともにリストアップします。それらが、クリップが裏付けたり反論したりできる瞬間です。
  2. 各主張について、citekit.py search 'regex' sources/transcripts/ で候補を検索し、ヒット箇所周辺の .md を読みます。講義全体も読んでください。最良の引用はホストが挙げたものとは限りません。
  3. 良い引用は、短く(5~25秒程度)、自己完結しており、話し手自身の立場であることが明確で(相手の主張を要約しているものではない)、テロップとして引用可能です。文字起こしの正確な単語を維持してください。クリーンアップしないでください。そうしないと locate で見つけられなくなります。
  4. sources/quotes.json を作成します:
{"project": "Ep1 Vermeule citations", "fps": 29.97, "episode": "../podcast/podcast1.json",
 "quotes": [{"id": "publius-weak-exec", "source": "Bw9M01S8MFI", "approx": 1234,
   "text": "exact words from the transcript",
   "episode_at": 2575, "episode_context": "hosts on Hamilton and the Roman dictator",
   "why": "his own statement of the thesis", "tags": ["executive", "Federalist"],
   "citation": {"author": "~Adrian Vermeule", "title": "The Publius Paradox", "date": "5 Jun, 2018",
                "publication": "Chorley Lecture, LSE"}}]}

episode(quotes.json からの相対パス)は、私たちのエピソードの文字起こしです。これにより、各引用の episode_at(ホストがその主張をしたおおよその時間)が挿入ポイントになります:その時点で再生されているホストの文の終わりです。引用は思想のまとまり全体を取ってください。次の文がそのイメージや議論を完成させるなら、それも含めます(5~25秒のクリップが目標であり、絶対的な上限ではありません)。

citation のデフォルトは動画タイトル、アップロード日、チャンネルです。実際の発表会場と日付(説明文から)は、トップレベルの "sources": {"<id>": {"citation": {...}}} に講義ごとに1回だけ記述します。引用個別の citation はそれを上書きします。著者には番組の ~ プレフィックスが付き、\n で長いタイトルを2行に分割できます。

彼が引用している内容(Hamilton、Kafka、Digest など)は、必ず原文と照合してください。Whisper はもっともらしい誤った単語を聞き取ります。Publius の講義では、Kafka の「犠牲の水差し(sacrificial pitchers)」を「絵(pictures)」と聞き間違えました。

4. キューとクリップ

citekit.py cues sources/quotes.json は各引用を単語タイムスタンプにスナップし(曖昧一致、一致スコアが 0.8 未満の場合は警告)、sources/citations/ に出力します:

ファイル用途
citations.mdレビューシート(エピソード順):挿入時刻(記録時および先行挿入後)、カット直前のホストの発言、引用、ソース/クリップ時間、YouTube ?t= リンク
clips.jsonエージェント編集用:ソースのイン/アウト、パディング後のイン/アウト(デフォルトは各側5秒、--pad-before/--pad-after または引用ごとの pad_before/pad_after で変更可能)、insert_at、insert_at_after_earlier_inserts、insert_after
citation_cues.jsonagent-motion/titles_fcpxml.py 用:クリップ挿入後のエピソードに合わせた Citation v2 テロップ。話し手が発言を始めるタイミングで表示されます。配置されていない引用は最後尾に並べられます
download_clips.shユーザーが実行:パディングされた範囲のみのフル品質動画をダウンロード(--download-sections)

その後、citekit.py audio-clips sources/citations/clips.json でローカル音声からパディング付き音声プレビューを切り出し、耳で確認します。FCP にテロップを配置するには、motion-graphics スキルに従います:python3 agent-motion/titles_fcpxml.py sources/citations/citation_cues.json -o citations.fcpxml。

注意事項

  • transcribe は自身で 16 kHz WAV にデコードし、動画よりも大幅に短い音声は拒否します。異なる -f で再開された yt-dlp ダウンロードは、1つの .m4a に2つのコーデックを結合します(2026-10-18 に確認:AAC-LC の後に HE-AAC)。ffmpeg は切り替え以降をすべて静かにドロップします。--no-continue で再ダウンロードしてください。フォーマット変更をまたいで再開しないでください。

  • クリップは耳で確認するか、低コストで確認します:mlx_whisper citations/audio_clips/<id>.m4a --output-format txt で、引用とその前後数秒のリードイン/テールが表示されるはずです。

  • Whisper のタイムスタンプは単語レベルで約 ±0.3 秒の精度です。そのためクリップパディングが存在します。FCP iTT キャプションは行全体にしか時間を設定できないため、itt は各行に単語を均等に配置します。

  • Wispr Flow コネクタは Meeting Recorder の文字起こしのみを読み取ります。ファイルの文字起こしはできません。

関連スキル