下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/org-spiderzhcl--quote-short-video.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-spiderzhcl/quote-short-video。把一段情绪/疗愈/励志文案,做成一条 9:16 竖版短视频——AI 只负责出意境图和语音,文字与节奏全部用 ffmpeg 精确合成,所以中文 100% 清晰、字幕与配音逐字对齐。支持缓慢推拉运镜、逐行浮现字幕、黑场转场、远风氛围音,内置 4 套色调主题。配音用微软神经网络语音(真人录音训练,无需任何参考素材)。适合金句视频、疗愈短视频、人生感悟口播、书摘语录、品牌情绪片。
触发词:把这段文案做成视频、做个情绪短视频、金句视频、疗愈短视频、人生感悟视频、文案配音、竖版短视频。
阅读全文 (展开查看完整说明)
概述
把一段文字,变成一条能让人看完、听懂、被打动的竖版短视频。
一条命令出片:写好一个 JSON 配置(图片 + 文案 + 运镜),跑 make_video.py 即可。
为什么不用「文生视频」直接出片
| 问题 | 本方案怎么解决 |
|---|---|
| AI 视频里的中文必然糊 / 错字 / 乱码 | 文字用 PIL 渲染,100% 清晰、字号精确 |
| 文生视频一般只有 5 秒 | 想要多长就多长,节奏完全可控 |
| 画面不可控、常有畸变 | AI 只负责「意境图」,动效交给 ffmpeg(缓慢推拉) |
| 生成成本高 | 一条 20 秒视频只需 3-6 张图 |
| AI 配音不自然 | 用微软神经网络语音(真人录音训练),不是机械 TTS |
你需要准备什么
| 项 | 是否必需 | 说明 |
|---|---|---|
| Python 3.8+ | ✅ | 系统装的即可 |
| ffmpeg(含 ffprobe) | ✅ | 画面与音频合成,见下方安装命令 |
pillow numpy | ✅ | pip install 一行搞定 |
edge-tts | 要配音就必需 | pip install edge-tts,需联网 |
| 每屏一张意境图 | ✅ | ⚠️ 本 skill 不出图,用任意生图工具(豆包/Midjourney/SD 等)按 Step 2 的公式出图 |
| 中文字体 | ✖ | 系统自带即可,脚本自动探测 |
💡 最短路径:装好 ffmpeg 和 3 个 pip 包 → 出几张图 → 写一个 config.json → 一条命令出片。
环境要求
| 依赖 | 要求 | 说明 |
|---|---|---|
| Python | 3.8+ | 仅用标准库 + Pillow |
| ffmpeg | 含 ffprobe,且在 PATH 中 | 画面合成、音频处理、时长探测 |
| Python 包 | pillow、numpy、edge-tts | 见下方安装命令 |
| 中文字体 | 系统自带即可 | 脚本会自动探测,无需配置 |
安装
# 1) Python 包
pip install pillow numpy edge-tts
# 2) ffmpeg
# Windows: winget install Gyan.FFmpeg 或到 ffmpeg.org 下载后把 bin 加入 PATH
# macOS: brew install ffmpeg
# Linux: sudo apt install ffmpeg (Debian/Ubuntu)字体:脚本按平台自动探测(Windows 优先思源宋体/华文宋体,macOS 优先 Songti/PingFang,Linux 优先 Noto CJK)。都找不到时,用环境变量指定你自己的字体:
export QSV_FONT_MAIN="/path/to/your-cjk-font.ttf"
export QSV_FONT_FALLBACK="/path/to/punctuation-complete-font.ttf"⚠️ 中文标点会变方块? 部分字体(例如某些版本的 Source Han Serif)不含中文标点字形,引号「"」、顿号「、」、破折号会渲染成 ▯。
脚本已内置逐字字体回退:主字体缺哪个字形,就单个字切到回退字体,风格保留、标点补齐。
你的文案里带引号或顿号时,务必先试渲一屏再批量出片。
工作流(6 步)
Step 1 · 拆句:把一段话拆成 3-5 屏
这是决定完播率的环节,不是简单切分。
硬规则
- 单行 ≤ 12 个汉字(超了就断句);单屏最多 2 行:上行 = 主句(大),下行 = 辅句(小)
- 第 1 屏必须是钩子,3 秒内能读完(前 3 秒决定生死)
- 每屏是一个「情绪台阶」,句间要有递进:提出问题 → 转折 → 落点
- 尊重原文:只做断句、去虚词、轻微精简,不要重写、不要自己加金句
示例(原文 2 句 → 3 屏)
原文:人最大的清醒,是不再盼着外界救赎自己。当你把目光从外界的喧嚣收回,
投向内心的旷野,就会惊觉,最踏实的温暖,从来都源于自我的滋养。
屏1 人最大的清醒 / 是不再盼着外界救赎自己 ← 钩子,冲突感最强
屏2 把目光从外界的喧嚣收回 / 投向内心的旷野 ← 转折 + 画面感
屏3 最踏实的温暖 / 从来都源于自我的滋养 ← 落点,回到自己身上文案越长,屏越多、片子越久,完播率越低。超过 6 屏(约 30 秒)就该考虑拆成两条发。
Step 2 · 生图:每屏一张意境图
用任意图像生成工具出图,一屏一张,全片色调必须统一。
统一风格公式(把 {} 换掉即可,其余照抄)
电影感竖构图摄影:{主体场景},{光线描述},画面下方三分之一是深色调留白区
(用于叠加文字),上方是{天空/环境}。低饱和{统一色调}胶片质感,浅景深,
{情绪氛围}的氛围。写实摄影风格,无文字无字幕无水印。| 项 | 要求 |
|---|---|
| 尺寸 | 竖版(如 1024x1536,脚本会自动裁成 9:16) |
| 色调 | 全片统一:暖金 / 冷蓝 / 黑金 三选一,写进每条 prompt |
| 场景 | 每屏要有「远→中→近」的变化,别三张都长一样 |
| 构图 | 必须让下 1/3 留白、偏暗,否则字压不住 |
| 禁忌 | 不要人物脸部特写、不要画面本身带文字 |
三种可套用色调:暖金(治愈/黄昏)金色调,逆光,夕阳,光斑 / 冷蓝(冷静)冷蓝色调,雾霭,清晨寒光 / 黑金(力量)大面积深色剪影,一点暖光,低调
💡 出图后务必逐张核对:色调不一致、画面太亮、下 1/3 太满,都要重出——图不对,成片就废。
量化判据:图的下方 40% 区域,平均亮度 ≤ 50、最亮区 ≤ 90,白字才压得住。
(纯亮背景的图,白字无论多大都会糊)
Step 3 · 生成配音
必须是「逐行独立合成」(不是整段合成):每行的真实时长可知,字幕才能和语音严格对齐。
用 scripts/tts_edge.py(微软神经网络语音,真人录音训练、无需参考音频、免费,需要联网)。
音色表(实测,按文案气质选)
| 音色 ID | 性别 | 官方标签 | 适配场景 |
|---|---|---|---|
zh-CN-YunxiNeural | 男 | Sunshine / Novel | 温润讲书腔,治愈、清醒克制类;最像真人坐着跟你讲 |
zh-CN-XiaoxiaoNeural | 女 | Warm | 温暖沉静,疗愈/安抚类首选 |
zh-CN-YunjianNeural | 男 | Passion | 浑厚有力,纪录片旁白感,格调重 |
zh-CN-XiaoyiNeural | 女 | Lively | 明亮年轻,轻松向文案 |
zh-CN-YunyangNeural | 男 | Professional | 新闻播报,偏正式(慎用) |
参数建议(治愈 / 内省类文案):rate="-15%"(放慢)、pitch="-3Hz"(更沉)。原速偏快,直接出会显得赶。
写 tts_edge_jobs.json:
{
"voice": "zh-CN-YunxiNeural",
"rate": "-15%",
"pitch": "-3Hz",
"volume": "+0%",
"out_dir": "tts_edge",
"to_wav": true,
"items": [
{ "text": "人最大的清醒,", "out": "s1a.wav" },
{ "text": "是不再盼着外界救赎自己。", "out": "s1b.wav" }
]
}运行:
python "<SKILL_DIR>/scripts/tts_edge.py" tts_edge_jobs.json两个必须知道的实测特性
- ⚠️ 每句尾部挂了约 1.1 秒静音、头部约 0.24 秒。必须靠
voice.trim_silence=true裁掉,否则句间会拖成一坨。 - ⚠️ 输出电平偏高且已压缩:RMS ≈ -25 dB、峰值 ≈ -5 dB。
→ voice_volume_db 只能给 +2 ~ +4,给高了直接削顶爆音。
进阶(可选):换成你自己的音色
本 skill 内置的是微软神经网络语音。若想用特定音色(自己录音、授权声线等),
可在本地部署 GPT-SoVITS(零样本音色克隆)或 CosyVoice / IndexTTS 等方案,
用同一个「逐行合成、输出 wav」的思路产出配音文件,再喂给
config.json的voice数组即可——渲染端不关心 wav 是谁生成的,只要时长准确。
Step 4 · 写 config.json
{
"theme": "warm_gold",
"tail_seconds": 2.5,
"crop_watermark_px": 72,
"audio": { "mode": "wind", "volume_db": -11 },
"voice": {
"enabled": true,
"pad_head": 0.40,
"pad_between": 0.16,
"pad_tail": 1.20,
"lead_in": 0.10,
"fade_in": 0.55,
"fade_out": 0.75,
"trim_silence": true,
"voice_volume_db": 3,
"bgm_volume_db": -26
},
"output": "output/quote_video.mp4",
"shots": [
{ "image": "assets/1.png",
"lines": ["人最大的清醒", "是不再盼着外界救赎自己"],
"motion": "in",
"voice": ["tts_edge/s1a.wav", "tts_edge/s1b.wav"] }
]
}所有相对路径的基准 = config.json 所在目录。
关键机制:当 voice.enabled=true 且该屏给了 voice 文件,👉 该屏时长不再用 seg_seconds,而由语音真实时长算出:
屏时长 = pad_head + 句1时长 + pad_between + 句2时长 + pad_tail字幕出现时刻 = 对应语音起始时刻 − lead_in。所以字幕和配音是逐句锁死的,不会漂移。没给 voice 的屏仍走固定 seg_seconds(两种模式可以在同一条片子里混用)。
motion 建议交替 in(推近) / out(拉远) / still,让镜头有语言变化。
Step 5 · 跑脚本
python "<SKILL_DIR>/scripts/make_video.py" config.json
# --silent 干净无音版(给平台叠 BGM 用)
# --keep-temp 保留中间产物便于调试脚本会依次:处理底图(裁水印→裁切→调色→压暗→暗角)→ 渲文字层 → 逐屏生成带推镜的片段 → 拼接 → 铺语音轨 → 混合氛围音 → 输出 mp4。
Step 6 · 自检后再交付
# 抽帧检查(把 8 换成你的成片时长的一半左右,多抽几个点)
for t in 2 5 8 11 15 19; do ffmpeg -y -v error -ss $t -i output/quote_video.mp4 -frames:v 1 check_$t.png; done检查清单:
- [ ] 每屏两行都完整显示,没有出画 / 被截断
- [ ] 文字在底部 300px 安全区之上
- [ ] 句与句切换处有黑场,不是硬切
- [ ] 字幕出现的瞬间,语音正好开口(配音版最容易翻车的地方)
- [ ] 语音不被垫底氛围音盖住
- [ ] 总时长 18-28 秒
参数速查
画面
| 字段 | 默认 | 说明 |
|---|---|---|
size | [1080,1920] | 成片分辨率 |
fps | 30 | 帧率 |
seg_seconds | 6.5 | 每屏时长(仅在该屏没有配音时生效) |
tail_seconds | 3.0 | 片尾留白(无字无语音),复用最后一屏图 |
crop_watermark_px | 72 | 裁掉底部 AI 水印高度;无水印图设 0 |
theme | warm_gold | 见下表 |
text_center_y | 0.70 | 文字块垂直中心;别大于 0.78(会进平台 UI 遮挡区) |
main_size / sub_size | 78 / 50 | 主 / 次行字号(按 1080 宽设计,自动缩放) |
line_gap | 46 | 两行间距 |
font_main | 空 | 留空 = 自动探测;也可显式指定字体文件路径 |
font_fallback | 空 | 留空 = 自动探测;主字体缺字形时逐字回退(补齐中文标点)。换任何字体后,用一个带中文标点的句子试渲一次 |
base_scale | 1.5 | 推镜平滑度,越高越平滑越慢 |
配音(voice 段)
| 字段 | 默认 | 说明 |
|---|---|---|
enabled | false | 开了才走「时长由语音决定」模式 |
pad_head | 0.45 | 本屏开始 → 第一句开口 |
pad_between | 0.18 | 两句之间的停顿 |
pad_tail | 1.35 | 最后一句说完 → 本屏结束(留白,别低于 0.8) |
lead_in | 0.12 | 字幕比语音提前多少秒出现 |
fade_in / fade_out | 0.60 / 0.75 | 字幕淡入 / 淡出时长 |
trim_silence | true | 自动裁掉语音首尾静音(必开) |
voice_volume_db | 0 | 人声增益。屏数越多峰值叠加越高(3 屏用 3~4,6 屏以上用 2);最终链已内置限幅(≈ -1 dB)兜底,但别指望它替你调增益 |
bgm_volume_db | -24 | 有配音时的垫底氛围音音量(比无人声时低很多) |
主题预设
| theme | 色调 | 压暗 | 适用 |
|---|---|---|---|
warm_gold | 暖白 + 暖金 | 中 | 治愈、黄昏、感恩(最稳) |
cool_dusk | 白 + 冷蓝灰 | 中偏强 | 冷静、克制、理性 |
ink_white | 灰白 + 黑白 | 强 | 力量感、厚重、金句 |
morning_mist | 白 + 浅灰 | 弱 | 清晨、轻快、明亮 |
垫底音(audio)
| mode | 说明 |
|---|---|
wind | 粉色噪声低通模拟远风,避免干巴(默认) |
none | 不加垫底音(配音版若只想要人声可用) |
file | 用自备音乐文件(path 字段),自动循环并淡入淡出 |
节奏调节经验
- 总时长:18-28 秒完播率最好。加了配音后时长由语速决定,想压缩就缩短停顿(
pad_tail、pad_between),别去加快语速。 - 想换气质先换音色,再调语速。同一条文案,男声温润 vs 女声温暖是完全两种观感。
- 首屏别用长句。第一屏超过 12 字,观众还没听完就滑走了。
- 一次说一件事。想塞 5 个观点,不如拆成 3 条视频。
平台侧注意事项
- 底部安全区:底部约 300px 会被昵称、文案、音乐条盖住,
text_center_y=0.70已留够。 - BGM:本方案的人声 + 远风垫音已能独立成片。若想叠平台 BGM,用
--silent版,或把bgm_volume_db再压低。 - 封面:截取第一屏「文字已完全浮现」的那一帧当封面,字大、对比强。
常见问题
| 现象 | 原因 / 处理 |
|---|---|
| 报错找不到 ffmpeg / ffprobe | 未安装或未加入 PATH。ffmpeg 安装包通常自带 ffprobe |
| 报错「缺少 Python 依赖」 | 按提示 pip install pillow numpy |
| 报错「找不到可用的中文字体」 | 系统没有中文 CJK 字体,或字体路径非标准。安装任意中文字体,或用 QSV_FONT_MAIN 指定 |
| 中文标点渲染成方块 ▯ | 主字体缺这些字形。脚本会自动回退;若仍出现,说明回退字体也缺,换一个字形完整的字体(如微软雅黑 / 思源黑体)指向 font_fallback |
| edge-tts 报网络错误 | 该后端需要联网;离线环境请自行准备配音 wav 文件 |
| 换配音后声音爆掉 / 削顶 | 增益给高了;把 voice_volume_db 降到 2~4 |
| 句与句之间停顿太长 | 每句尾巴自带静音,检查 trim_silence 是否被关掉 |
| 声音太赶 | 加大负向 rate(-15% → -20%),不要改 speed |
| 字幕和声音对不上 | 检查 trim_silence 是否开着;关掉它会把首尾静音算进时长 |
| 找不到图片 / 配音文件 | 相对路径的基准是 config.json 所在目录 |
| 人声太小 / 听不清 | 提高 voice_volume_db(每次 +2);同时降低 bgm_volume_db |
| 三屏色调不统一 | 回 Step 2 重出图,prompt 里固定同一句色调描述 |
| 白字看不清 / 糊在背景里 | 图的下 1/3 不够暗。重出图,让下方 40% 区域平均亮度 ≤ 50 |
| 人声峰值顶到 0 dB | 屏数多时语音峰值会叠加。降低 voice_volume_db(6 屏以上用 2) |
文件结构
quote-short-video/
├── SKILL.md
├── config.example.json # 视频配置模板
├── tts_edge_jobs.example.json # 配音任务模板
└── scripts/
├── tts_edge.py # 配音:微软神经网络语音(逐行合成)
└── make_video.py # 渲染:底图 + 文字层 + 音画对齐 + 合音安全说明
本 skill 除配音外全部为本地处理:
- 只读取 config 指定的图片 / 音频、以及系统字体;只写入 config 指定的
output路径 - 临时文件写在系统临时目录,运行结束自动清理(
--keep-temp可保留) - 不读取任何凭据、不删除用户文件、不上传任何本地文件
- 唯一的网络行为在
tts_edge.py:调用微软在线语音合成服务,只上传待朗读的文字 - 外部依赖:系统
ffmpeg(含 ffprobe)、Python 包pillow/numpy/edge-tts
卡住了?或者想更省事?
这个 skill 免费,它解决的是「图已经有了,怎么高效合成成片」这一段。
如果你卡在它前面,或者要的比它多:
- 没时间出图 —— 每屏意境图总是色调不统一、字压不住
- 要批量做 —— 一次几十条,不想一条条手工配
- 要固定音色 —— 品牌号需要一个专属声线(而非通用合成音)
- 想接进自己的业务 —— 批量出片流水线、代运营、二次开发
作者在做这块的代做与定制开发,可以在 SkillHub 作者主页或评论区找到我聊聊,说明你的场景即可。
只是用 skill 遇到问题,也欢迎直接在评论区留言,我会回。
By 日舍科技 · 免费使用,无需署名