npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsh-plugin-auto-video

v1.0.0

Published

Turn a script into a finished video locally: AI voiceover, perfectly timed subtitles, background music and your own photos/clips assembled, then encoded straight to MP4 with ffmpeg. No video editor required.

Readme

DSH 自动成片

给我一段文案,直接给你一个 mp4。

一个 DeepSeek Harness(DSH)插件:把纯文字变成成片 —— 自动配音、精确对齐的字幕、背景音乐,以及你自己的图片/视频拼接, 全部在本机用 ffmpeg 合成。

不用剪辑软件,不上传任何东西,不需要剪辑基础。

English · 更新日志 · MIT 许可


为什么要这样做

原方案是生成剪映草稿来驱动剪映,但实测走不通,证据很硬:

  • 上游库自己的文档就写着:「剪映 6+ 版本对 draft_content.json 进行了加密,故本系列功能目前仅支持剪映 5.9 及以下版本」
  • 在一台真实的 剪映 7.9.0.12811 上实测,草稿文件确实是密文 —— base64 解开后, gzip / zlib / brotli 全部失败
  • 而草稿生成器产出的是明文 JSON,所以剪映根本不显示这些草稿,更谈不上导出。 这不是代码质量问题,是格式层面的死路

所以本插件干脆不要编辑器,自己编码出片。结果反而更好:没有版本耦合、没有加密格式、 不用等软件重新扫描文件——做完就是一个能直接播放的 MP4。

它怎么工作

文案
 ├─ 按标点切成短句
 ├─ 逐句 edge-tts 合成 → 量每句时长      ← 字幕之所以能精确对齐人声,就在这一步
 ├─ 累积时间轴 → 生成 SRT
 ├─ 画面:给了图片/视频 → 等比裁切到统一尺寸后依次出现
 │         没给素材     → 动态渐变背景 + 大标题
 ├─ 背景音乐(本地文件,或剪映云曲库)
 └─ ffmpeg:混音 + 烧录字幕 + h264/aac → MP4
  • 配音:微软 edge-tts(在线、免费、自然),内置 7 个中文音色
  • 编码:imageio-ffmpeg 自带的完整 ffmpeg 7.1(含 libx264 + libass)
  • 中文字幕:libass + 微软雅黑烧录,已目视确认

安装

方式一:本地文件夹或 git 仓库

DSH → 设置 → 插件 → 安装本地目录 → <本文件夹>

方式二:从 npm 安装(可选)

包本身是可直接发布到 npm 的(没有设 private),而且 dsh-plugin-auto-video 这个包名在公共源上还没被占用。DSH 的插件管理器会按顺序询问注册表(先配置的,再回退 registry.npmmirror.com),并且对注册表 spec 会跳过 GitHub 连通性预检 —— 所以对 只想用插件的用户来说,从 npm 装是最省事的路。

dsh plugin --profile <profile> add dsh-plugin-auto-video

从 npm 装进 profile 后,插件在 node_modules 下,旁边没有工作区的 runtimes/ 文件夹, 所以运行环境的默认位置会自动退到 $DSH_HOME/auto-video/venv —— 点一次 「一键装好运行环境」就在那里建好。云端配乐同理(旁边没有剪映工具包),改用本地音乐文件即可。

装完之后

打开 设置 → 自动成片,点一次 「一键装好运行环境」。 它会建一个插件私有的 Python 环境并装两个包(edge-tts、imageio-ffmpeg), 大约 40 MB,不改动你的系统环境。

⚠️ 「装上了」不等于「启用了」。 DSH 要求包出现在 profile 的 dependencies 里 并且名字出现在 dsh.profile.bundles 里。装完请到 设置 → 插件 确认那个开关是 开着的 —— 关着的话插件根本不会挂载,设置页也就不会有这一节。

设置页里有什么

全部用大白话写的,不用术语:

  • 状态卡:运行环境 / 合成引擎 / 配音字幕组件 / 成片文件夹,每项带绿黄红点和人话解释
  • 声音:女声·温柔自然(推荐)/ 女声·活泼年轻 / 男声·清亮年轻 / 男声·沉稳解说 / 男声·新闻播报 / 东北口音 / 陕西口音
  • 画面方向:横屏 1920×1080 / 竖屏 1080×1920
  • 背景音乐音量:滑块,附「有人说话的时候,60% 左右刚好听得清又不吵」
  • 字幕大小:滑块,0 = 自动
  • 把字幕烧进画面:开关
  • 素材文件夹:把图片视频丢进去,做片子时自动按文件名顺序用上
  • 默认背景音乐:留空则不加配乐
  • 做一条试试:填名字 + 文案 → 出片 → 可以在页面里直接播放
  • 成片列表:最近做好的片子,点播放预览、可「在文件夹里显示」
  • 所有技术参数藏在折叠的「高级」里

给 agent 用的

插件会注入一段系统提示词,告诉 agent 怎么一行命令出片。如果能解析到 @deepseek-ai/dsh-tools,还会注册两个模型可见工具:autovideo_environment、autovideo_make。

命令行等价用法:

python py/auto_video.py --json 请求.json

请求字段

| 字段 | 含义 | |---|---| | script | 必填 —— 要念的文案 | | title | 成片名,同时作为文件名 | | voice | 例如 zh-CN-XiaoxiaoNeural(默认) | | orientation | landscape 横屏 / portrait 竖屏 | | media | 图片/视频的绝对路径数组 | | bgm / bgmQuery | 本地音乐文件 / 剪映云曲库 id 或关键词 | | bgmVolume | 配乐音量 0~1,默认 0.6 | | subtitleFontSize | 字幕像素,0 = 自动 | | burnSubtitles | 是否烧录字幕,默认 true | | outDir | 成片输出目录 |

在真机上验证过

下面每一项都是抽帧目视 + 检查流信息确认的,不是「文件存在就算成功」。

| 检查项 | 结果 | |---|---| | 纯文案(无素材) | 15.08 秒 / 2.2 MB / 1920×1080 | | 素材 + 云端配乐 | 18.0 秒 / 4.96 MB,云端音乐下载成 .m4a 并混音 | | 演示成片 | 55.61 秒 / 11.28 MB,4 个素材依次出现,带云端配乐 | | 音频确实有内容 | mean_volume -19.4 dB / max_volume -4.2 dB | | 流信息 | h264 High + aac LC 44.1kHz 立体声 | | 中文字幕 | 目视确认,随时间正确切换 | | 中文标题 | 目视确认(drawtext) | | 比例处理 | 16:9 铺满;异形图上下留黑边 | | node tools/smoke.mjs --make | 27 项全通过,含 Range 206 预览与目录外 403 |

开发

没有构建步骤,开发也不需要装任何依赖:

node tools/verify.mjs        # 静态自检:语法、manifest 不变量、工程约束
node tools/smoke.mjs         # 模拟 Host:加载插件并跑通每条路由
node tools/smoke.mjs --make   # 再真出一条成片(需要先装好运行环境)

tools/verify.mjs 只需要 Node,也是 CI 跑的同一套检查。它覆盖了这个环境里最关键的两条规则:

  1. 不许静态 import '@deepseek-ai/*' —— 装进 profile 的插件解析不到这些包, 静态引入会在加载时 ERR_MODULE_NOT_FOUND。
  2. 绝不导出 Config —— 它需要 schemastery,同样解析不到。配置改为手写归一化。

目录结构

DSH-Auto-Video/
├─ package.json          dsh.bundle.patch + dsh.client 声明
├─ cordis.patch.yml      insert 一行;每个默认值都有中文注释
├─ index.js              宿主半边:路由、提示词段、可选工具
├─ client.js             浏览器半边:设置页(含内嵌播放)
├─ icon.svg  locale/{zh,en}.json
├─ py/
│  ├─ auto_video.py      合成管线本体
│  ├─ check.py           环境自检(打印 READY=yes|no)
│  └─ setup.py           建 venv + 装 edge-tts 与 imageio-ffmpeg
└─ tools/
   ├─ verify.mjs         静态自检(CI 用)
   └─ smoke.mjs          Host 模拟测试

npm 包名是 dsh-plugin-auto-video,沿用其他 DSH 插件的 dsh-plugin-* 命名习惯; 仓库名是 DSH-Auto-Video。

已知边界

  • 配音走微软 在线 edge-tts 服务,需要网络
  • 云端音乐依赖剪映私有接口,上游一改就失效 —— 可以改用本地音乐文件
  • 不给素材时是渐变背景 + 标题,适合口播/资讯类;要更花哨的画面请自备图片或视频

发布到 npm(维护者用)

npm login
npm publish   # prepublishOnly 会先跑 verify + render + smoke,测不过就发不出去

几点说明:

  • 故意没有设 private —— 设了的话 npm publish 会被直接拒绝
  • 首次发布前建议把 package.json 里的 repository 填上,npm 页面上才会有回到本仓库的链接
  • 没有构建步骤、没有运行时依赖,所以发布出去的压缩包就是源码本身(外加 assets/、py/、tools/)

如果 npm 报 E403

403 Forbidden - PUT https://registry.npmjs.org/<包名>
Two-factor authentication or granular access token with bypass 2fa enabled is required to publish packages.

这是账号凭据问题,不是打包问题 —— 前面每一步(测试、打包、发请求)都已经成功了。 npm 官方文档的要求是:要么账号开 2FA,要么用允许绕过 2FA 的细粒度 token。三条路, 从最省事排起:

  1. 先暂存,再到网页上批准 —— 暂存不需要 2FA,所以 CLI 不会卡你;第二步在浏览器里 用你的 passkey / Windows Hello 完成验证,不用手输 6 位验证码:

    npm stage publish          # 这一步不会要 2FA

    然后打开 npmjs.com → Staged Packages → 审查 → 点 Approve(浏览器会弹 2FA)。 注意:全新包第一次暂存会先发一个公开的占位版本(你暂存的内容在批准前不公开), 等于顺便把包名占住了。

  2. 这次发布手动给一个 OTP(需要你的验证器 App):

    npm publish --otp=123456
  3. 建一个允许绕过 2FA 的细粒度 token(适合反复发布或自动化): npmjs.com → Access Tokens → Generate New Token → 选 Granular Access Token, 给 Read and write 的包权限,并打开 Bypass 2FA。然后:

    npm config set //registry.npmjs.org/:_authToken=npm_xxxxxxxx
    npm whoami        # 确认 token 被接受;这个 token 别贴到任何别的地方
    npm publish

如果你改用 CI 发布,npm 的 trusted publishing(GitHub Actions / GitLab CI/CD / CircleCI 通过 OIDC)可以完全不用 token。

或者干脆不走 npm —— DSH 从 git 仓库或本地文件夹安装插件同样可行,完全不需要注册表账号。

交流群

遇到问题、想提需求、想看看别人怎么用,都欢迎进群。

群号:1022445657 · 点击链接加入群聊【DSH交流群?!?!】

手机 QQ 扫上面的二维码;在电脑上直接点链接,或者打开 QQ 搜群号。 插件设置页最下面也有同一张卡片,点一下就能进群。

许可

MIT