dsh-video-transcribe:贴视频链接,本机离线出文稿

前言

DeepSeek Harness(DSH)面向智能体开发时,网络侧常见的能力是 web_search 和 web_fetch——二者都是文本通道,没有浏览器或播放器,拿不到视频画面与音轨,因此宿主本身无法「看视频、听音频」。

若要把某条在线视频变成可检索、可摘要的文字,常见做法是再挂一层云端转写 API,或手工下载后用本地工具跑 ASR。DSH 桌面端本机往往已经具备语音输入用的 SenseVoice int8 模型(位于 ~/.dsh/speech-to-text/sensevoice,由 sherpa-onnx 推理),缺的主要是「从 URL 取出音轨并接到识别链路上」这一段。

下面介绍社区插件 dsh-video-transcribe(维护者 wqzhellohhwy,分类:联网工具):在 profile 中启用后,模型可通过工具 video_transcribe 提交 http(s) 视频链接,由本机 yt-dlp、ffmpeg 与 sherpa-onnx/SenseVoice 完成下载、转码与离线转写,长音频自动分片,不调用云端转写服务。

这是什么

dsh-video-transcribe 是 DeepSeek Harness 的 bundle 插件(npm 包名 dsh-video-transcribe,当前版本 0.2.0,MIT 许可证)。它注册单一工具 video_transcribe,把「取音轨 → 16 kHz 单声道 PCM → 分片 → 本地 ASR」串成一条链路,媒体与推理均在本机完成。

插件目录页:https://www.skillhub.cn/plugins/wqzhellohhwy/dsh-video-transcribe
源码与说明:https://github.com/wqzhellohhwy/dsh-video-transcribe

SkillHub 等社区目录独立于 DeepSeek / 幻方,并非官方应用商店;安装前建议自行阅读源码与许可证,并记住插件以当前 DSH 进程权限运行。

为什么需要分片

README 中的实测结论:SenseVoice 训练与使用场景以约 30 秒以内语音为主。若把整段长音频一次性交给 sherpa-onnx-offline,进程可能仍以退出码 0 结束,但后半内容会被静默丢弃——子集转写字数甚至超过整段一次性输入的字数。

因此插件在转码后强制分片(缺省目标片长约 30 秒,切点可在 ±1.5 秒内吸附到较安静处),再批量送入 sherpa 推理。同一 README 中,约 69 分钟视频在分片路径下产出约 25,500 字符,而修复前单遍路径曾出现 0 字产出。分片失败时作业会直接失败,不会回落为「整段单遍」(避免残缺文稿被当成完整结果)。

核心功能与依赖

处理流水线

yt-dlp          取音轨(并写 info.json,标题/时长等元数据)
  → ffmpeg      转为 16 kHz 单声道 PCM wav(SenseVoice 输入规格)
    → 分片      约 30 秒一片,切点可吸附静音
      → sherpa-onnx + SenseVoice   本机推理出文稿

本机依赖

依赖 缺省位置 说明
yt-dlp <DSH_HOME>/video-transcribe/bin/ 取音轨
ffmpeg 同上 转码
sherpa-onnx-offline 同上 推理(README 注明 sherpa-onnx v1.13.8 官方预编译静态版)
model.int8.onnx、tokens.txt <DSH_HOME>/speech-to-text/sensevoice/models/sensevoice-onnx/ 复用已有 SenseVoice 模型,无需另下

前三个可执行文件不在位时,插件仍会注册,但调用会返回明确缺失项与期望路径。URL 仅接受 http(s),不处理需登录/付费/DRM 而无法取到的音轨。

工具 video_transcribe

参数 适用 action 说明
action 全部(必填) start / status / list / cancel
url start 视频或音频页面链接
jobId status / cancel start 或 list 返回的作业 id
language start auto(缺省)/ zh / en / ja / ko / yue
label start 作业标签,仅影响 list 展示
waitSeconds start 当场最多等待秒数,缺省 45、上限 120;0 表示立即返回

长任务采用作业制:状态落在 <DSH_HOME>/video-transcribe/jobs/<id>/job.json,DSH 重启后仍可查;阶段包括 download → convert → segment → transcribe。同一时刻只跑一个转写作业(推理峰值内存可达数 GB 量级),后续任务排队。

工具只输出全文文稿,摘要、翻译或结构化由调用它的模型自行处理。

安装与启用

插件走标准 bundle 机制:在 profile 的 package.json 中加入 link 依赖,并把包名写入 dsh.profile.bundles。仓库自带 dsh.bundle.patch,会插入相应 bundle 配置,一般不必手写完整 cordis.patch.yml。

在 profile 目录中按 README 示例修改(将 <本仓库绝对路径> 换成你 clone 或解压后的插件目录):

{
  "dependencies": {
    "dsh-video-transcribe": "link:<本仓库绝对路径>"
  },
  "dsh": {
    "profile": {
      "bundles": ["@deepseek-ai/dsh-base", "dsh-video-transcribe"]
    }
  }
}

在该 profile 目录执行:

pnpm install

link 依赖不联网。完成后重启 DSH 实例生效。

说明:桌面版(Electron)的 desktop profile 由应用独占管理,CLI 会拒绝 dsh plugin --profile desktop;通过修改 package.json 的方式仍可用,但需重启桌面版后插件才会上线。

运行环境要求 Node.js >= 20(见 package.json engines)。

配置(可选)

如需改缺省语言、线程数、分片长度等,可在 profile 的 cordis.patch.yml 中按 id 覆盖(与 bundle 层为完整替换语义):

- id: video-transcribe
  name: dsh-video-transcribe
  config:
    language: zh
    threads: 8
    maxDurationSec: 7200
    chunkSeconds: 30

常用字段包括:language(缺省 auto)、threads(缺省 min(8, 核数-1))、maxDurationSec(缺省 14400,超限拒绝)、chunkSeconds(缺省 30;README 建议勿调到 120 以上,过长片长会明显丢内容)、waitSeconds / maxWaitSeconds(控制 start 当场等待)。完整列表见 GitHub README「配置」一节。

典型用法

启动转写(示例为 B 站链接,语言指定中文):

video_transcribe({ action: "start", url: "https://www.bilibili.com/video/BV...", language: "zh" })

start 会等待至多 waitSeconds(缺省 45 秒):若作业在此前完成,直接返回全文;否则返回 jobId,再用 status 轮询:

video_transcribe({ action: "status", jobId: "20261008-002519-349225" })

作业完成时 status 返回完整文稿。还可用 list 查看队列、cancel 取消指定作业。

仓库内验证命令(在插件目录执行):

node selftest.mjs
node e2e.mjs "https://www.bilibili.com/video/BV..."

selftest.mjs 覆盖纯函数、分片与注册契约等;e2e.mjs 走真实工具入口做端到端转写(无参数时 README 说明会跑默认的长视频用例)。

适用场景与限制

适合:需要把公开 http(s) 视频/音频页面转成文字,且希望数据不出本机、不依赖云端 ASR API 的 DSH 用户;与已有 SenseVoice 语音输入能力共用模型,无需重复下载大模型。

注意:

  1. 标点与断句不可靠,英文标点尤其弱;专有名词易出现音近错字,引用术语宜对照原视频。
  2. 纯画面、无解说的视频没有音轨可转,得不到内容。
  3. 不绕过站点登录或 DRM;取不到音轨即失败,并返回结构化错误码(如 download_failed、segment_failed、transcribe_empty 等)。
  4. 插件设计强调「静默丢内容比报错更糟」:长音频必须分片;产出密度过低会在结果中告警(lowYieldThreshold),便于发现异常片段。

结尾

dsh-video-transcribe 补上了 DSH 文本网络面无法触及的视频音轨:一条链接、本机 yt-dlp + ffmpeg + sherpa-onnx/SenseVoice,零云端转写 API。若你在做基于 DSH 的资料整理、播客归档或长视频文稿化,可在 SkillHub 查看简介并在 GitHub 阅读完整 README 与依赖放置说明。

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

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

Xiaoye