dsh-tool-podcast:在 DSH 里把一期录音做成播客

前言

在 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 中的顺序操作:

  1. 调用 podcast_status,确认 ffmpeg 可用与默认阈值。
  2. 对原始录音调用 podcast_chapters(path="raw.mp3"),查看章节数、断点秒数与 rule 是否符合预期;必要时调整 silenceDb、minSilenceSeconds 或 maxChapters 后重跑。
  3. 确认断点后调用 podcast_trim(path, cuts=[4.6, 8.8])(示例断点以你上一步结果为准),按需选择 format、accurate、prefix。
  4. 对各段调用 podcast_normalize,将响度统一到目标 LUFS。
  5. 调用 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye