Skip to content

dsh-plugin-auto-video

Verified

dsh-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 合成。

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

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 仓库或本地文件夹安装插件同样可行,完全不需要注册表账号。

交流群

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

DSH 交流群二维码

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

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

许可

MIT