@lim324/dsh-video-summary:在 DSH Web GUI 里把视频链接做成带时间轴的总结记录

前言

用 DSH 读 B 站或 YouTube 时,链接不能直接当上下文交给模型:常见做法是手动拉字幕,或每次让 agent 自己拼 yt-dlp 和转写命令,流程要在对话里重复讲一遍,结果也不易回看。

@lim324/dsh-video-summary(仓库 Limsanity/dsh-video-summary)把「链接 → 转录稿 → 总结 → 归档」收成一条本机流水线:工具负责取数与转写,侧栏面板负责列表与详情,数据落在宿主磁盘上。转写与总结走 agent 工具调用,音频不离开本机。

这是什么

这是 DSH Web GUI 客户端插件(维护者 Limsanity,MIT 许可,package 版本 0.1.1)。左侧边栏增加「视频总结」入口,主列展示已处理视频;粘链接回车会新开 DSH 会话,由 agent 调用 video_summary 等工具完成转录与保存。

插件在 当前 dsh 进程权限 下运行;安装前建议阅读仓库源码与许可证,并自行评估对 yt-dlp、本地 Python/Whisper 环境的信任边界。

核心功能

工具面(Cordis)

工具 作用
video_summary({ url, force?, lang? }) 取元数据;有字幕则用字幕,否则下载音频并用本地 Whisper 转录;创建或更新一条记录;返回带 [mm:ss] 的文稿。同一链接再次调用会回放已存记录(除非 force: true)。
video_summary_save({ id, summary, takeaways? }) 写入总结与可选要点,状态变为「已总结」。
video_summary_list({ query?, limit? }) 列出历史记录。
video_summary_transcript({ id, offset?, maxChars? }) 分段读取完整文稿(长视频)。

video_summary 会把发起调用的会话 id 写入记录,面板中「回到会话」可跳回当时对话。

面板

  • 顶部:粘链接并回车,等价于让 agent 总结该视频;任务文本会预填到新会话输入框。
  • 列表:封面、标题、平台/作者/时长、状态(转录中 / 待总结 / 已总结 / 失败)、字数、搜索与筛选。
  • 详情:Markdown 总结、要点、可展开转录稿(可复制)。
  • 删除:记录与同目录下 transcripts/<id>.json 一并删除。

有转录任务时每 3 秒刷新列表,平时 20 秒;页面在后台时停止轮询。

数据目录

默认在 $DSH_HOME/video-summary/:

$DSH_HOME/video-summary/
  library.json                 # 记录元数据、总结、状态、会话 id
  library.json.bak             # 落盘前的上一版
  transcripts/<id>.json        # 转录稿(按需读取)
  work/<id>/                   # 下载音频;转录成功后默认删除(config 中 keepAudio: true 可保留)

可通过环境变量 VIDEO_SUMMARY_DIR 或插件 config 的 dataDir 改路径。不同 $DSH_HOME 的实例不会自动同步;要共享需指向同一 dataDir。

依赖与 ASR 后端

依赖 用途
yt-dlp 元数据、字幕、音频
ffmpeg faster-whisper 解码
mlx-whisper(首选,Apple GPU) 探测为 probe.asr.backend === "mlx"
Python + faster-whisper(兜底) CPU 转录

README 记载同一约 4 分半视频:MLX 约 13 秒,faster-whisper(CPU int8)约 57 秒。未装 mlx-whisper 时自动退到 CPU。面板顶部展示探测结果,缺组件时会红字提示。

健康检查:GET /v-sum/health(含 probe.ytDlp、probe.ffmpeg、probe.asr 等)。

安装与启用

官方 README 给出的本机安装步骤如下。需 Node.js >= 22;构建阶段临时安装 esbuild。

git clone https://github.com/Limsanity/dsh-video-summary.git
cd dsh-video-summary
npm i --no-save esbuild   # 只在构建时需要

# 1. 构建(宿主 + 客户端 + asr.py / asr_mlx.py)
node build.mjs

# 2. 挂进 web profile(目录软链 + 依赖项)
ln -sfn "$PWD" ~/.dsh/profiles/web/node_modules/@lim324/dsh-video-summary
# package.json 的 dependencies 里加: "@lim324/dsh-video-summary": "link:<上面这个路径>"

# 3. 在 profile 的 cordis.patch.yml 末尾加一行(不要同时写进 dsh.profile.bundles,
#    否则同一插件会被 bundle patch 和用户 patch 各插一次 → 两行同 id)
- insert:
    - id: video-summary
      name: '@lim324/dsh-video-summary'

cordis.patch.yml 支持 live reload:改完后一般无需重启 dsh,刷新页面即可见侧栏入口。

若在 Apple 设备上使用 MLX 后端,README 建议在数据目录下单独 venv 安装(示例路径可按本机调整):

uv venv --python /opt/homebrew/bin/python3.13 ~/.dsh/video-summary/venv
uv pip install --python ~/.dsh/video-summary/venv/bin/python mlx-whisper

插件 config(节选)

- id: video-summary
  name: '@lim324/dsh-video-summary'
  config:
    maxChars: 24000      # 单次返回给模型的文稿上限
    asrLang: zh
    asrBackend: auto     # auto | mlx | faster-whisper
    preferLangs: [zh-Hans, zh-CN, zh, en]
    keepAudio: false
    whisperModel: auto
    mlxModel: ''
    mlxPythonPath: ''
    pythonPath: ''
    ytDlpPath: ''
    dataDir: ''

典型用法

1、在 Web GUI 打开「视频总结」,顶部输入框粘贴 B 站或 YouTube 链接并回车。

2、DSH 新开会话,输入框已预填总结任务;回车启动 agent。agent 调用 video_summary,得到带时间戳的文稿后撰写总结,再调用 video_summary_save 写回面板。

3、在列表中打开记录查看总结与转录稿;需要续读长稿时,agent 可调用 video_summary_transcript。要从历史会话继续聊,用记录上的「回到会话」。

同一 URL 再次总结时,除非传入 force: true,否则会直接回放已有转录,避免重复下载与转写。

适用场景与注意

适合:经常在 DSH 里消化长视频、希望转录与总结留在本机且可检索回看的 Web 用户;已具备或愿意配置 yt-dlp、ffmpeg 与 Whisper 相关环境。

注意:

  • 不要同时在 dsh.profile.bundles 与 cordis.patch.yml 里 insert 同一 id,否则配置里会出现重复插件行。
  • B 站封面经 /v-sum/cover 代理,规避浏览器直连 CDN 的 Referer ACL 403。
  • 社区目录页:skillhub.cn 上的插件条目。DSH 插件生态强调「一切皆插件」;该目录为社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

@lim324/dsh-video-summary 把视频链接、本地转写和 agent 总结接到一块:工具固定取数流程,面板固定归档与回看,数据在 video-summary 目录下由同一 dsh 实例共享。进一步了解实现与 issue,见 GitHub 仓库;在目录站检索可选用关键词「视频总结」或包名 @lim324/dsh-video-summary。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye