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 | オフ | 既存のエピソードディレクトリを削除して再実行;手動での変更は失われる |
--polish | off | basic はルールベースでフィラーワードを除去するのみで、モデルによる推敲は行わない;忠実な原稿が必要な場合は off を使用 |
--server-timeout | 600s | server 起動待機時間 |
--transcribe-timeout | 7200s | 文字起こし待機時間;長い番組の場合は調整すること(例: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の役割ではない。