Communityライティング&編集github.com

BingWuJ/podcast2md-skill

ポッドキャストのエピソードリンクを、チャプターごとに整理された完全な文字起こし原稿に変換します(ローカルのCapsWriter-Offline音声認識を使用、chapters.mdを生成、要約ではありません)。

podcast2md-skill とは?

このスキルは、ポッドキャストのエピソードURL(yt-dlp対応)を入力として、音声をダウンロード・文字起こしし、番組の既存チャプターに分割された完全な文字起こし原稿(chapters.md)を生成するCLIツールです。要約や内容の創作は行わず、あくまで忠実な転写を提供します。音声認識エンジンにはローカルのCapsWriter-Offline(FunASR-Nanoベース)を使用し、スクリプトが自動でサーバーとクライアントを起動するため、ユーザーはURLを指定するだけで利用可能です。長時間の音声でもCPU上で動作し、バックグラウンド実行とログ監視に対応。Bilibiliなどの字幕付き動画に対しては字幕の事前検出を行い、無駄な音声認識を避けるなど、最適な文字起こしルートを選択します。

対応~Claude Code~Codex CLI~Cursor
npx skills add BingWuJ/podcast2md-skill

Installed? Explore more ライティング&編集 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

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

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

ドキュメント

podcast2md — ポッドキャストエピソードリンク → チャプター別文字起こし原稿

位置づけ

  • 入力:yt-dlp が対応するポッドキャストエピソードページまたは音声直接リンク
  • 出力:<out-dir>\<slug>\chapters.md——完全な文字起こしを番組の既存チャプターで分割;要約ではなく、内容を創作しない
  • エンジン:ローカルのCapsWriter-Offline(fun_asr_nano)、スクリプトが自動でserver/clientを起動

実行方法(配置用コピーを使用、start_server.exe と同じディレクトリに配置すること)

python "D:\iStall\CapsWriter-Offline\podcast2md.py" "エピソードURL"
python "D:\iStall\CapsWriter-Offline\podcast2md.py" "エピソードURL" --transcribe-timeout 10800
  • ソースリポジトリ:D:\iStall\podcast2md\(podcast2md.py + README.md + PODCAST2MD.md)。スクリプトの変更はリポジトリ側で行い、変更後 D:\iStall\CapsWriter-Offline\ にコピーして配置する。
  • 完全なパラメータ一覧、パイプラインの詳細、終了コード:必要に応じて D:\iStall\podcast2md\PODCAST2MD.md を参照すること。デフォルトで全文を読まなくてよい。

主要パラメータ

パラメータデフォルト説明
--out-dir<スクリプトディレクトリ>\work成果物は work\<slug>\chapters.md
--forceオフ既存のエピソードディレクトリを削除して再実行;手動での変更は失われる
--polishoffbasic はルールベースでフィラーワードを除去するのみで、モデルによる推敲は行わない;忠実な原稿が必要な場合は off を使用
--server-timeout600sserver 起動待機時間
--transcribe-timeout7200s文字起こし待機時間;長い番組の場合は調整すること(例:10800)

注意点(実行前に必ず読むこと)

  • 長時間音声(>1時間)の文字起こしは数十分かかる:バックグラウンドプロセスで実行 + ログをポーリングし、フロントエンドで待機してツールがタイムアウトしないようにすること。
  • 文字起こし後もserverは常駐し(再利用により次回を高速化)、停止はトレイアイコンから行う。
  • 終了コード:3=ダウンロード失敗、4=server失敗、5=文字起こし失敗、6=成果物が既に存在/使用中、7=分割または検証失敗。
  • ログ:<out-dir>\_podcast2md_server.log および <slug>\logs\。
  • ffmpeg が PATH に含まれている必要がある。含まれていない場合、clientでの文字起こしは必ず失敗する。
  • 話者分離は行わない;複数話者の原稿は後処理が必要。

ローカル実機検証済みの事実(2026-10-19 確認済み、直接引用してよく再検出は不要)

  • ffmpeg 8.1.2 が PATH に含まれている——clientでのファイル文字起こしの前提条件は満たされている;不明な場合はまず ffmpeg -version で実際に確認してから判断すること。推測で書かないこと
  • 本機には独立したNVIDIA GPUはなく、文字起こしはCPUで実行:30–60分の番組は約10–30分で原稿出力、1時間以上は40–90分;FunASR-Nano 実測で95分の録音の純粋な文字起こしに約46分(モデル読み込みを含め、約0.5倍速、work\full.out.log 2026-10-17 参照)
  • FunASR-Nano 参考スクリプトの実測特性:15秒区切り(60秒まとめて処理すると「嗯」が繰り返される)、JSONLによるセグメント単位のディスク保存で途中再開可能、無音区間はエネルギースレッショルドでスキップ
  • Bilibili の字幕カバレッジ:公式/UP主のCC字幕はすべての動画にあるわけではなく、AI字幕の方が一般的——まず yt-dlp --list-subs で検出してからルートを決定すること。仮定でカバレッジを断言しないこと

ローカル音声ファイル / 周辺シナリオの役割分担

  • ローカル音声ファイル(録音、既にダウンロード済みのmp3/wav、リンクなし):本CLIは使わない。FunASR-Nanoを使用:venv D:\iStall\FunASR-Nano\.venv、重み D:\iStall\model-cache\huggingface\local\Fun-ASR-Nano-2512-hf;長時間音声は必ずセグメントに分割して逐次認識すること(60秒まとめると「嗯」が繰り返される)、参考 D:\iStall\FunASR-Nano\work\full_transcribe.py。
  • Bilibiliなど字幕付き動画:まず字幕を検出(yt-dlp --list-subs)、CC/AI字幕があればそのまま字幕を原稿として取得し、音声認識を実行する必要はない。
  • 字幕から記事への変換(タイムコード除去、整形):それは srt-translator のワークフローであり、本CLIの役割ではない。

関連スキル