
本工作流为幼童古诗跟读短视频:统一 AI 原创 Q 版男童主角 + 水彩绘本风静态插画缓慢运镜 + edge-tts 慢速卡通配音 + PIL 叠字幕/封面,全片本地合成,不消耗 AI 视频额度。本文档把整个系统、每步操作、命令与验收口径一次讲清。
Ubuntu 笔记本(引擎)合成/归档
局域网 NAS(成品库)
| 角色 | 职责 | 关键路径 |
|---|---|---|
| 云端沙箱 | AI 素材生成(image_edit 身份锚点派生)、Prompt 留档、成片拉回核对 | ~/poem_video/ |
| Ubuntu 笔记本 | 素材下载归档、配置校验、静态帧预览、配音叠字合成、封面/描述生成、9104 桥接服务 | /home/<user>/poem_video/ |
| NAS | 成片/封面/描述/素材库/日志/备份 统一落盘 | /mnt/nas_backup/Ubuntu/读古诗/ |
连接方式:云端经 SSH 隧道操作笔记本(非 22 端口,走自定义 frp 端口);笔记本经 9104 桥接服务(systemd 用户级 poem-video.service)接受本机与外部触发合成。所有产物优先落 NAS,NAS 不可达时自动回退笔记本本地目录。
-
选诗并定姿势
确定诗句、作者、拼音;按每句诗的情绪和动作意象设计 6 张插画(题署 + 4 个跟读场景 + 结尾全诗页),姿势不能千篇一律站立远望,要匹配诗句内容。
-
云端生图
以固定题署图为身份锚点,用 image_edit 逐张派生 9:16 素材;图内禁止任何文字,禁止可识别真人照片。
-
素材自动归档
把生图 URL 交给笔记本脚本 poem_archive.py:自动下载到本地工作目录并归档 NAS 素材库;NAS 不可达时自动回退笔记本本地并写日志。
-
写配置
编写 configs/<诗id>.json(语速 rate -18%、结尾静音 3+2 秒、固定 5 话题标签、输出到对应序号文件夹)。
-
校验与预览
validate_poem.py 结构+素材校验(目标 0 提醒);preview_frames.py 出静态帧,人工核对字幕安全区与 end 全诗页排版。
-
合成落 NAS
触发 9104 POST /render:配音 → 叠字 → 分段合成 → 拼接 → 生成竖/横封面与描述 md,四件产物直写 NAS 对应序号文件夹。
-
验收与保护
核对产物 MD5、描述 md 句读与话题;复核既有成片 MD5 零改动(严禁覆盖定稿)。
-
发布
抖音草稿子系统按策略停用;封面人工复核后手动发布,流程不自动上传平台。
早期版本人物姿势过于单调,来来去去都是站立远望。现已确立新原则:每句诗的动作要贴合诗句内容和情绪,让小朋友看插画就能理解诗在写什么。
| 诗句 | 匹配动作 |
|---|---|
| 墙角数枝梅 | 凑到梅树枝旁,鼻子凑近花朵认真闻香 |
| 凌寒独自开 | 缩着脖子、搓小手哈气,呼出白气看寒梅 |
| 遥知不是雪 | 蹲下来,小手轻摸梅枝上的花和雪,歪头分辨 |
| 为有暗香来 | 闭眼仰脸,深深吸鼻子闻香气,神情陶醉 |
| 千山鸟飞绝 | 手背身后,仰头四处张望天空找飞鸟 |
| 万径人踪灭 | 蹲在雪地里,小手指着自己的脚印 |
| 孤舟蓑笠翁 | 趴在大石头上,双手托腮看远处孤舟 |
| 独钓寒江雪 | 蹲在岸边,握小木棍假装钓鱼 |
| 春风又绿江南岸 | 张开双臂,感受春风吹过两岸新绿 |
| 明月何时照我还 | 坐船头,手托腮望月,神情思念 |
| 环节 | 程序 | 说明 |
|---|---|---|
| 配音 | edge-tts | 音色 zh-CN-XiaoyiNeural(卡通女声),rate=-18%,pitch 留空 |
| 视频合成 | ffmpeg (docker) | 音频统一 24000Hz/单声道防拼接漂移 |
| 正文/字幕字体 | 霞鹜文楷 Regular | LXGW WenKai,SIL OFL 1.1 免费商用 |
| 题署/标题 | 霞鹜文楷 Medium | LXGWWenKai-Medium.ttf |
| 拼音 | Noto Sans CJK SC | Regular |
| 封面艺术字 | 站酷快乐体 | ZCOOL KuaiLe,官方免费商用 |
| 桥接服务 | 9104 | systemd 用户级,全局串行锁,超时 600 秒 |
- 主角固定:约 5 岁 AI 原创虚构男童,束发髻、浅米色交领古风棉袍、白袜黑布鞋、水彩绘本风;每张以固定题署图为身份锚点派生,保持外貌服装一致。
- 六张结构:title 题署页(人物中下部、上部留白)+ s1..s4 每句一景(动作按诗句情绪设计)+ end 结尾页(人物上半部、下半部干净留白供全诗排版)。
- 图内禁止任何文字、字母、数字、水印、边框、印章——所有文字由脚本后期 PIL 叠加。
- 比例 9:16(1536×2730);生图 Prompt 逐张留档。
–item title.png=https://…/xxx \
–item s1.png=https://…/xxx \
–item s2.png=https://…/xxx \
–item s3.png=https://…/xxx \
–item s4.png=https://…/xxx \
–item end.png=https://…/xxx
脚本行为:下载到 assets/<id>/ → 归档 NAS 读古诗/assets/<id>/(MD5 逐位校验);NAS 不可达回退本地并写日志。
每首诗一份 configs/<id>.json,引擎通用不改。
| 输出目录 | NAS 下对应序号文件夹:读古诗/01_咏鹅/、读古诗/14_梅花/ 等,按诗序编号 |
| 句读交替 | 首句逗号、偶句句号、第三句逗号、末句句号 |
| 话题标签 | 固定 5 个:#古诗 #古诗启蒙 #幼儿启蒙 #亲子共读 #<诗题> |
| 结尾全诗页 | 静音不读题,基准 3.0s + 额外停留 2.0s;底板 [110,786,W-110,1514] 圆角 26,半透明深墨底 (18,22,18,148);行距 108;列宽自适应 col_w=800.0/max_n;上留空 30、下留空 50 |
| 安全区 | 字幕 x100–930 / y200–1500 |
| 竖版封面 | 1080×1440(3:4),标题字号自适应 _fit_title_font(),人物居中 |
| 横版封面 | 1920×1440(4:3),人物右移 align=(0.62,0.5),标题在左,字号自适应 |
| 七言支持 | 每句 7 字时 end 页自动 7 列,列宽按 max_n 自适应,已用《泊船瓜洲》验证 |
python3 preview_frames.py –config configs/<id>.json # 输出 work/preview_<id>/ 六帧
预览帧人工核对:字幕在安全区内、end 全诗页排版不溢出、题署三行不重叠。
-H ‘Content-Type: application/json’ \
-d ‘{“id”:”<诗id>”}’
| 成片 | <诗名>_古诗跟读.mp4(1080×1920 竖屏,30fps) |
| 竖封面 | <诗名>_古诗跟读_封面竖版.jpg(1080×1440,3:4) |
| 横封面 | <诗名>_古诗跟读_封面横版.jpg(1920×1440,4:3) |
| 描述 | <诗名>_古诗跟读_作品描述.md(标题/简介/句读/固定 5 话题) |
| 序号文件夹 | 诗题 | 朝代·作者 |
|---|---|---|
| 01_咏鹅 | 咏鹅 | 唐·骆宾王 |
| 02_悯农其二 | 悯农·其二 | 唐·李绅 |
| 03_春晓 | 春晓 | 唐·孟浩然 |
| 04_静夜思 | 静夜思 | 唐·李白 |
| 05_画 | 画 | 唐·王维 |
| 06_风 | 风 | 唐·李峤 |
| 07_山村咏怀 | 山村咏怀 | 宋·邵雍 |
| 08_登鹳雀楼 | 登鹳雀楼 | 唐·王之涣 |
| 09_相思 | 相思 | 唐·王维 |
| 10_鹿柴 | 鹿柴 | 唐·王维 |
| 11_竹里馆 | 竹里馆 | 唐·王维 |
| 12_寻隐者不遇 | 寻隐者不遇 | 唐·贾岛 |
| 13_江雪 | 江雪 | 唐·柳宗元 |
| 14_梅花 | 梅花 | 宋·王安石 |
| 15_泊船瓜洲 | 泊船瓜洲(七言) | 宋·王安石 |
-
设计姿势并生图
按每句诗情绪匹配动作(参考第三章示例),以固定题署图为锚点 image_edit 派生 6 张,图内无文字。
-
归档素材
poem_archive.py –fetch 自动落本地 + NAS 素材库。
-
写配置
按规范写 configs/<id>.json(rate -18%、end 静音 3+2、tags 五项、outdir 指向对应序号文件夹)。
-
校验预览
validate 0 提醒 + preview 六帧验收(安全区、句读、end 全诗页排版、封面比例)。
-
合成
9104 POST /render 触发,串行执行,等返回 mp4 路径。
-
验收交付
复核四件产物齐全、MD5 记录、md 内容正确;拉回云端留档并交付。
| poem_video_flow.tar.gz | 引擎脚本、configs、assets 素材、prompts、n8n 模块、README(排除 work 中间产物) |
| n8n_workflow_export.json | 定时工作流单条导出 |
| n8n_db/database.sqlite | n8n 容器数据库快照 |
| 备份说明.txt | 时间、工作流 id、内容清单、已上线诗目 |
NAS 不可达时备份自动回退到笔记本本地 backup_local/ 并告警;自动保留最近 5 份。恢复:解压 tar.gz 到工作目录,数据库快照 docker cp 回容器后重启。
| 云端沙箱不可直连局域网 NAS(文件操作必须经 SSH 到笔记本);AI 动态视频片段与 PIL 手绘人物已被否决;远端 sudo 非交互不可用;定时触发时间待确认,工作流保持停用。 |