用途
Podcast Ad Removal 是一个用于自动去除播客广告的技能流程。它的输入是播客名称,默认处理该播客最新一期,也可以由用户指定某一期的标题、期号或日期。流程会下载音频、转写、识别广告段落、切除广告,并把无广告版本上传到临时托管。
主要能力
- 通过 iTunes 搜索 API 查找播客源,并核对 collectionName 与 artistName,避免同名播客混淆。
- 解析 RSS 源,按 pubDate 排序选取最新一期;若用户指定某一期,则按标题、期号或发布日期匹配。若指定期无法找到,会停止并说明,不会用最新一期替代。
- 下载音频 enclosure,并校验文件大小与 enclosure length 属性,确认下载的是音频而非错误页面。
- 使用 faster-whisper 转写,默认 small.en 模型与贪心解码。
- 通过阅读带时间戳的文字稿来定位广告段落,而不是仅靠正则匹配。
- 对广告边界落在同一转写段内的情况,使用词级时间戳精确定位切点。
- 切除广告后,用 ffprobe 校验前后时长差是否等于切除范围总和。
- 将清理后的文件上传到 Litterbox,设置 72 小时过期,并检查响应头确认 content-type、content-length 与 accept-ranges。
使用方式
流程按步骤执行,各步骤之间不提示用户,除非某一步失败。
- 查找源:用 iTunes 搜索 API 查找播客,选择匹配的结果,下载 feed.xml。不使用带 auth= token 的私有 Patreon 源。
- 选取期数:解析源并按 pubDate 排序,默认取最新一期;指定期则按标题、期号或日期匹配。继续前会显示所选标题、日期和时长。
- 下载:用 curl 下载 enclosure,校验大小与文件类型。
- 转写:在后台运行 transcribe.py,默认 small.en 模型与贪心解码。
- 阅读文字稿找广告:用正则辅助搜索广告相关行,再打印各簇附近的段落,人工阅读判断每段广告的起止。
- 精确定位边界:当边界落在某个转写段内部时,对该约 15 秒窗口做词级时间戳转写,把切点放在最后一个内容词之后、下一个内容词之前。
- 切除:把每个确认的广告段作为 --range START:END 传给 remove_ads.py,生成 episode.clean.mp3,并用 ffprobe 校验时长差。
- 上传:上传到 Litterbox,72 小时过期,并检查响应头。用户明确说不要上传时才跳过。
最终报告会先单独一行给出链接,然后报告期目标题与发布日期、前后时长与总切除时长、每个切除范围的时钟时间,并说明切点未经试听、哪些接缝值得检查。若要在 Voice 中收听,需在 Chrome 中打开链接、下载、用 Files 应用移入 Audiobooks 文件夹,再在 Voice 中打开该文件夹;Download 文件夹不能作为资料库文件夹。
适用场景
- 用户想去除某一期播客中的赞助商和广告段落,得到无广告 MP3。
- 用户希望自动完成从查找源、下载、转写到切除和临时分享的完整流程。
- 用户指定了具体某一期,需要按标题、期号或日期定位。
限制
- 项目路径固定为 /Users/mtm/pdev/taylormonacelli/steamysquirrel,依赖其中的 transcribe.py 和 remove_ads.py,以及已安装 faster-whisper 的 uv 环境。
- 转写耗时较长,30 分钟一期约需 24 CPU 分钟,机器负载高时会更久。
- 广告识别依赖阅读文字稿,正则仅作提示;remove_ads.py 给出的范围可能吞掉真实内容或延伸到文件末尾,必须人工核对后才能切除。
- 本机 ffmpeg 是 Docker shim,需要 Docker Desktop 运行。
- 上传使用 Litterbox 临时链接(72 小时过期),因为文件是他人版权音频,不使用永久公开托管。
- 切点未经试听,接缝处可能需要人工检查。
- 若指定期在源中找不到,流程会停止并报告候选,不会用最新一期替代。