dsh-plugin-auto-video
Verifieddsh-plugin-auto-video · v1.0.0 · MIT · Web UI
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.
Install
dsh plugin add dsh-plugin-auto-video Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Creators
Readme
DSH 自动成片
给我一段文案,直接给你一个 mp4。
一个 DeepSeek Harness(DSH)插件:把纯文字变成成片 —— 自动配音、精确对齐的字幕、背景音乐,以及你自己的图片/视频拼接, 全部在本机用 ffmpeg 合成。
不用剪辑软件,不上传任何东西,不需要剪辑基础。
为什么要这样做
原方案是生成剪映草稿来驱动剪映,但实测走不通,证据很硬:
- 上游库自己的文档就写着:「剪映 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 跑的同一套检查。它覆盖了这个环境里最关键的两条规则:
- 不许静态
import '@deepseek-ai/*'—— 装进 profile 的插件解析不到这些包, 静态引入会在加载时ERR_MODULE_NOT_FOUND。 - 绝不导出
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。三条路, 从最省事排起:
先暂存,再到网页上批准 —— 暂存不需要 2FA,所以 CLI 不会卡你;第二步在浏览器里 用你的 passkey / Windows Hello 完成验证,不用手输 6 位验证码:
npm stage publish # 这一步不会要 2FA然后打开 npmjs.com → Staged Packages → 审查 → 点 Approve(浏览器会弹 2FA)。 注意:全新包第一次暂存会先发一个公开的占位版本(你暂存的内容在批准前不公开), 等于顺便把包名占住了。
这次发布手动给一个 OTP(需要你的验证器 App):
npm publish --otp=123456建一个允许绕过 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 搜群号。 插件设置页最下面也有同一张卡片,点一下就能进群。