前言¶
在 DeepSeek Harness(DSH)里做播客相关自动化,常见做法是直接让模型「猜」该在哪切、响度该调到多少、RSS 里 length 填多少。问题在于:切点错了文件照样能播,只是内容错位;RSS 里 <enclosure> 的 length 或 type 与真实文件不一致时,客户端往往会静默丢掉这一期。一期节目本质上是一个没有结构的长音频,结构藏在静音里——主持与嘉宾之间的停顿、片头与正文之间的停顿,才是可量化的断点依据。
下面介绍社区插件 dsh-tool-podcast(维护者 yuehancn)。它在 DSH 中注册一组工具,调用本机 ffmpeg / ffprobe 完成静音章节推断、按断点切段、响度归一化与 iTunes 兼容 RSS 写出,不在 Node 侧安装音频库。插件在 GitHub 开源,许可为 MIT;目录页见 SkillHub,源码见 yuehancn/dsh-tool-podcast。README 写明在 dsh 0.2.0-rc.2(preview)上构建与测试,apply(ctx) 插件规范稳定;若你使用更新版本,需自行核对兼容性。
这是什么¶
dsh-tool-podcast 是面向 DeepSeek Harness 的自建工具插件:把「先看清楚断点与规则」和「再动手切、归一、发源」拆开。核心设计是 podcast_chapters 独立存在,不是 podcast_trim 的内嵌参数——因为切错了没有明显报错,必须先可解释地给出断点,再按断点操作。
典型链路在 README 中概括为:
podcast_chapters(path="raw.mp3") → 章节数 / 断点秒数 / 依据规则
podcast_trim(path, cuts=[...]) → 多段文件,默认流拷贝
podcast_feed(...) → 客户端可用的 RSS,length 从磁盘读取
核心功能:五个工具¶
podcast_status¶
长分析前先确认环境:报告 ffmpeg / ffprobe 是否可执行、版本、可用操作、支持的输出格式,以及当前默认静音阈值等,避免路径未配好才在半路失败。
podcast_chapters¶
只算不切。 用 ffmpeg 的 silencedetect 找出静音区间,将满足时长与门限的区间转为章节断点;断点落在静音区间中点(离两侧说话最远,便于解释)。返回中的 rule 字段会写明所用规则,例如静音至少多长、低于多少 dB 算静音、切点在中点。
| 参数 | 说明 |
|---|---|
silenceDb |
噪声门限,低于此 dB 视为静音,默认 -35 |
minSilenceSeconds |
静音至少多长才算断点,默认 0.8 |
maxChapters |
超过则合并尾部,而非报错 |
podcast_trim¶
按给定断点切段,每段一个文件。cuts 为升序秒数列表,必填;第一段始终从 0 开始。
| 参数 | 说明 |
|---|---|
format |
mp3 / m4a / wav / flac / opus,默认跟随源扩展名 |
accurate |
true 时重编码、精确切点;默认流拷贝(-c copy) |
prefix |
输出文件名前缀,支持中文 |
流拷贝快但只能落在包边界;源编码与目标容器不兼容时必须重编码。返回的 mode 与 notes 说明本次走哪条路径及原因。
podcast_feed¶
写出 iTunes 兼容的 RSS 2.0 源。<enclosure> 的 length 一律从磁盘 stat,不接受调用方传入;type 由扩展名推导(如 .mp3 → audio/mpeg),未知扩展名会报错。写完后会重新解析文档做自校验,问题汇总在 problems 中。
podcast_normalize¶
使用 ffmpeg 的 EBU R128 loudnorm,跑两遍:第一遍只测量,第二遍用测量结果把响度落到目标。返回含 inputLufs、outputLufs、gainApplied。默认目标 -16 LUFS 适合播客;-14 LUFS 适合流媒体(可通过 targetLufs 等参数调整)。
安装与启用¶
一行安装(命令来自仓库 README):
dsh plugin --profile desktop add github:yuehancn/dsh-tool-podcast
支持的 profile 为 desktop(桌面版)与 web(Web 版)。安装完成后重启 dsh 即可使用。
本机需已安装可在 PATH 中调用的 ffmpeg / ffprobe,或在配置中写全路径。可选配置写入 ~/.dsh/profiles/<profile>/cordis.patch.yml,示例:
- id: tool-podcast
config:
ffmpegPath: C:/AI/ffmpeg/ffmpeg-release-full/bin/ffmpeg.exe
ffprobePath: C:/AI/ffmpeg/ffmpeg-release-full/bin/ffprobe.exe
outputDir: C:/Users/you/Music/podcast-output
silenceDb: -35
minSilenceSeconds: 0.8
常用字段包括:ffmpegPath、ffprobePath(默认分别为 ffmpeg / ffprobe)、outputDir(默认 podcast-output)、silenceDb、minSilenceSeconds、maxInputSeconds(默认 21600,即 6 小时上限)、timeoutMs(默认 900000),以及按工具关闭的 status / chapters / trim / feed / normalize 开关(默认均为 true)。
典型用法¶
建议按 README 中的顺序操作:
- 调用
podcast_status,确认 ffmpeg 可用与默认阈值。 - 对原始录音调用
podcast_chapters(path="raw.mp3"),查看章节数、断点秒数与rule是否符合预期;必要时调整silenceDb、minSilenceSeconds或maxChapters后重跑。 - 确认断点后调用
podcast_trim(path, cuts=[4.6, 8.8])(示例断点以你上一步结果为准),按需选择format、accurate、prefix。 - 对各段调用
podcast_normalize,将响度统一到目标 LUFS。 - 调用
podcast_feed(feedPath, title, episodes, ...)写出 RSS;检查返回中的problems是否为空。
仓库测试夹具为合成音频:4.0s 440Hz、1.2s 静音、3.0s 660Hz、1.2s 静音、4.0s 880Hz,共 13.4s,预期断点为 4.6s 与 8.8s——用于集成测试验证「中点切分」行为,而非事后反推。
适用场景与注意¶
适合谁: 在 DSH 对话或工作流里处理自建播客、访谈长录音,希望用静音可解释地分章、快速切段、统一响度,并生成客户端不易拒收的 RSS 的开发者。
运行方式: 插件以当前 dsh 进程权限在本机 spawn 调用 ffmpeg,不拼 shell 字符串;下载与写盘限定在你配置的 outputDir 与指定的 feedPath,README 说明不联网。安装前请自行阅读源码与 MIT 许可证,确认路径与输出目录符合你的安全策略。
SkillHub 分类为「模型推理」;就能力而言,本插件属于调用本机 ffmpeg 的播客生产工具链,与是否使用某一类模型无强绑定——在 DSH 中作为工具供智能体按需调用。
其他说明: README 提到对未闭合静音区间、流拷贝与编码兼容判据、RSS 长度自量等实现细节;仓库含针对真实 ffmpeg 的测试套件。社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系,DSH 生态理念是「一切皆插件」,本文事实均来自上述仓库 README 与 package.json(插件版本 1.0.0)。
结尾¶
dsh-tool-podcast 把播客制作里容易静默失败的三块——断点判断、切段方式、RSS 元数据——拆成可单独核对、可解释的工具步骤。若你在 Harness 里处理长录音与 RSS 发布,可按 README 安装命令接入,先用 podcast_chapters 看清断点,再 trim、normalize、feed。
- 目录页:https://www.skillhub.cn/plugins/yuehancn/dsh-tool-podcast
- GitHub:https://github.com/yuehancn/dsh-tool-podcast