podcast2md — Podcast Episode Link → Chapter Transcript
Purpose
- Input: A podcast episode page or direct audio URL supported by yt-dlp
- Output:
<out-dir>\<slug>\chapters.md — a full transcription split by the show's existing chapters; no summary, no fabricated content
- Engine: Local CapsWriter-Offline (fun_asr_nano), script automatically launches server/client
Running (use the deployed copy, must be in the same directory as start_server.exe)
python "D:\iStall\CapsWriter-Offline\podcast2md.py" "episode-URL"
python "D:\iStall\CapsWriter-Offline\podcast2md.py" "episode-URL" --transcribe-timeout 10800
- Source repo:
D:\iStall\podcast2md\ (podcast2md.py + README.md + PODCAST2MD.md). Edit only the repo version, then copy it to D:\iStall\CapsWriter-Offline\ for deployment.
- Full parameter table, pipeline details, and exit codes: read
D:\iStall\podcast2md\PODCAST2MD.md as needed; do not read the whole thing by default.
Key Parameters
| Parameter | Default | Description |
|---|
--out-dir | <script-dir>\work | Output in work\<slug>\chapters.md |
--force | off | Delete existing episode directory and re-run; discards manual edits |
--polish | off | basic only removes filler words via rules, not model-based polishing; use off for faithful original |
--server-timeout | 600s | Wait time for server startup |
--transcribe-timeout | 7200s | Transcription wait; increase for long episodes (e.g., 10800) |
Gotchas (read before running)
- Long audio (>1h) takes tens of minutes to transcribe: run as a background process + poll logs, don't wait in the foreground and hit tool timeouts.
- Server stays resident after transcription (reuse for faster next run); exit via tray menu.
- Exit codes: 3=download failed, 4=server failed, 5=transcription failed, 6=output already exists/locked, 7=split or validation failed.
- Logs:
<out-dir>\_podcast2md_server.log and <slug>\logs\.
- ffmpeg must be in PATH, otherwise client transcription will fail.
- Speaker diarization is not performed; multi-speaker transcripts require post-processing.
Local Verified Facts (verified 2026-10-19, cite directly without re-probing)
- ffmpeg 8.1.2 is in PATH — prerequisite for client file transcription is met; if unsure, run
ffmpeg -version to check, don't infer
- No dedicated NVIDIA GPU; transcription runs on CPU: a 30–60 minute show takes about 10–30 minutes, 1+ hour takes 40–90 minutes; FunASR-Nano tested: a 95-minute recording pure transcription approximately 46 minutes (about 0.5x real-time, including model loading, see work\full.out.log 2026-10-17)
- FunASR-Nano reference script tested characteristics: 15-second segments (60-second segments repeat "um"), JSONL incremental disk writing for crash recovery, silence segments skipped by energy threshold
- Bilibili subtitle coverage: Official/UP CC subtitles are not universal, AI subtitles are more common — first probe with
yt-dlp --list-subs then decide the route, don't assume coverage
Local Audio / Adjacent Scenario Division
- Local audio files (recordings, downloaded mp3/wav, no link): Do not use this CLI. Use FunASR-Nano: venv
D:\iStall\FunASR-Nano\.venv, weights D:\iStall\model-cache\huggingface\local\Fun-ASR-Nano-2512-hf; long audio must be split into segments for recognition (60-second segments repeat "um"), see D:\iStall\FunASR-Nano\work\full_transcribe.py.
- Bilibili and other video with subtitles: First probe for subtitles (
yt-dlp --list-subs); if CC/AI subtitles exist, pull them directly to form the text, no need to run speech recognition.
- Subtitle to article (remove timestamps, create prose): That is the srt-translator workflow, not this CLI.