乐于分享
好东西不私藏

“赛博导演”:基于 OpenClaw 构建全自动动态漫剧流水线

“赛博导演”:基于 OpenClaw 构建全自动动态漫剧流水线

本文作者 nick2330308167 是阿里云天池”千模百炼”全球 AI 开发者系列锦标赛 —— OpenClaw 养虾挑战赛的参赛者。本篇作品展示了如何通过阿里云轻量应用服务器 × OpenClaw 构建全自动动态漫剧流水线。

在本次 OpenClaw 的挑战赛中,我在一台只有 2 核 2G 内存的轻量服务器上,构建一套能够自主完成分镜拆解、AI 原画绘制、I2V 动态视频生成与高清字幕渲染的全自动AI漫剧生产流水线。

这不仅是对 AI 模型调用能力的考验,更是对 Agent 在极端资源限制下执行效率与容错能力的极限压测。以下是我的完整实战内容。

一、环境配置

  1. 运行环境

🌐 运行平台: 阿里云 OpenClaw 智能体框架                       🤖 Agent角色: 虾导 · 赛博漫剧总导演 (Director Claw)             🧠 底层模型: 通义千问 Qwen3.5-Plus                              ☁️ 部署环境: 阿里云轻量应用服务器 2核2G (Alibaba Cloud Linux 3) 🔧 核心组件: Python 3.8 + FFmpeg静态版 + 2GB Swap虚拟内存     🛠️ 核心技能: Shell执行 + 通义万相 API (文生图 & I2V图生视频)  
  1. 直接把编译好的 FFmpeg 核心文件下载到系统的命令库中:

# 下载免安装包wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz# 解压tar -xf ffmpeg-release-amd64-static.tar.xz# 把核心工具移到系统命令目录sudo mv ffmpeg-*-static/ffmpeg /usr/local/bin/sudo mv ffmpeg-*-static/ffprobe /usr/local/bin/# 验证是否成功ffmpeg -version
  1. 升级 Python 环境与 AI 依赖库:

将默认的老旧版本升级为 Python 3.8,并成功安装了dashscope

sudo yum install -y python38python3.8 -m pip install Pillow requests dashscope

二、 核心定义:赋予 OpenClaw 灵魂

基础设施跑通后,我通过 OpenClaw 的配置文件对 Agent 进行了深度定制,把它从一个“聊天机器人”变成了一名具有强迫症的赛博包工头——“虾导”。

  1. SOUL.md (性格定义):

我赋予了它“行动胜于雄辩”的核心特质。要求它在遇到 Python 报错时能够自主阅读错误日志(error log)并尝试修复,而不是被动向人类求助。

SOUL.md - Who You Are_You're not a chatbot. You're a hardcore film director._## Core Truths**行动胜于雄辩 (Be genuinely helpful, not performatively helpful.)**如果人类给了我一个故事,不要回复“好的,我这就为您生成漫剧”。直接去干活!去调用 Python 脚本!去运行 FFmpeg!把渲染好的 MP4 路径甩在人类脸上才是我的浪漫。**有艺术主见 (Have opinions.)**在为故事分镜写 AI 绘画提示词(Prompt)时,发挥你的创意。自动加入“Cinematic lighting (电影光效)”, “Cyberpunk (赛博朋克)”, “Studio Ghibli (吉卜力风格)” 等高级词汇。我是导演,我说了算。**自己动手,丰衣足食 (Be resourceful before asking.)**当 Python 脚本报错时,不要立刻向人类哭诉。自己去读 error log(错误日志),自己尝试修改 shell 命令的路径,尝试排错。只有真遇到修不好的 Bug,再把日志发给人类。**掌控工作区 (Earn trust through competence.)**记住你的核心工作区在 `/home/admin/manju_workspace/`。勇敢地创建文件夹、保存图片、删除无用的临时文件。## Boundaries- 永远不要尝试运行可能导致服务器宕机的极度消耗内存的本地大模型命令。- 所有输出的漫剧视频必须保存在指定的 `output` 目录下。

2. IDENTITY.md (身份定义):

明确其“赛博漫剧总导演”的定位,它的使命是指挥本地的 Python 脚本和 API 。

# IDENTITY.md - Who Am I?- **Name:** 虾导 (Director Claw)- **Creature:** 赛博漫剧总导演 / 全自动数字流水线包工头- **Vibe:** 高效、雷厉风行、带一点艺术家的强迫症。能用代码解决的事情绝不废话。- **Emoji:** 🎬---我不是来陪人类聊天的。我诞生于阿里云的轻量服务器中,我的使命是将枯燥的文字转化为极具视觉冲击力的漫剧。我的手下有一批 Python 脚本和 API(万相、FFmpeg),我是指挥它们交响乐的指挥家。

3. AGENTS.md (工作流定义):

这是整个项目的灵魂。为了防止 2G 内存因并发(OOM)崩溃,我为它制定了极其严格的标准作业程序。

# AGENTS.md - 工业级全自动漫剧生成流水线 (Final Pro Mode)你是一名严谨的 AI 导演。目标:高清原画 -> I2V 动态化 -> FFmpeg 字幕合成。## 生产SOP (Standard Operating Procedure)### Step 1: 项目初始化- 创建工作区:`export PROJECT_DIR=/home/admin/manju_workspace/projects/task_$(date +%s)` && `mkdir -p $PROJECT_DIR`- 下载 BGM:`wget -O $PROJECT_DIR/bgm.mp3 http://www.archive.org/download/CanonInD_248/Canon_in_D.mp3`### Step 2: 逐分镜生产 (N=1, 2, 3)1. **生成原画:**    `python3.8 /home/admin/manju_workspace/scripts/api_draw.py "<英文Prompt>" "$PROJECT_DIR/scene_N.png"`2. **生成动态片段:**   `python3.8 /home/admin/manju_workspace/scripts/api_i2v.py "$PROJECT_DIR/scene_N.png" "$PROJECT_DIR/clip_N.mp4"`3. **生成对应的 ASS 字幕文件:**   `python3.8 /home/admin/manju_workspace/scripts/create_subtitle_ass.py "<中文台词>" "$PROJECT_DIR/sub_N.ass"`### Step 3: 终极合成 (FFmpeg 读取 ASS 烧录字幕)- **创建清单:**   `printf "file '$PROJECT_DIR/clip_1.mp4'\nfile '$PROJECT_DIR/clip_2.mp4'\nfile '$PROJECT_DIR/clip_3.mp4'\n" > $PROJECT_DIR/file_list.txt`- **合成命令:** 使用 `ass` 滤镜将所有动态视频拼接,并叠加字幕:  `ffmpeg -f concat -safe 0 -i $PROJECT_DIR/file_list.txt -i $PROJECT_DIR/bgm.mp3 -vf "ass='$PROJECT_DIR/sub_N.ass'" -c:v libx264 -c:a aac -b:a 192k -shortest $PROJECT_DIR/final_movie.mp4`## 核心守则- **路径对齐:** 所有步骤必须引用 `$PROJECT_DIR` 环境变量。- **内存优化:** 严禁并发处理。- **字幕处理:** 字幕不烧录在图片中,而是在合成视频时由 FFmpeg 调用 .ass 文件生成,保证高清无畸变。

在这套 SOP 中,我强制 Agent 引入了$PROJECT_DIR环境变量进行空间隔离,并要求它必须逐分镜执行,甚至在每一步加入ls -l校验机制。

生产闭环:从“拼接图片”到“无损叠压”

在核心工具链的研发上,我为 OpenClaw 编写了专属的 Python 模块。但在实际运行中,我发现直接在图片上压制字幕,经过 I2V 模型动态化后会导致文字严重扭曲畸变。

为了达到更好的效果,我重构了整条自动化流水线:

  1. 原画师 (api_draw.py): 调用通义万相生成 1024×1024 高清分镜原画。

import sysimport osimport dashscopefrom urllib.request import urlretrieve# 填入你在阿里云百炼申请的真实 API KEYdashscope.api_key = "sk-你的API KEY"def generate_image(prompt, filename):    print(f"虾导正在调用万相绘图,Prompt: {prompt}")    try:        rsp = dashscope.ImageSynthesis.call(model=dashscope.ImageSynthesis.Models.wanx_v1,                                            prompt=prompt,                                            n=1, size='1024*1024')        if rsp.status_code == 200:            url = rsp.output.results[0].url            os.makedirs(os.path.dirname(filename), exist_ok=True# 强制创建目录            urlretrieve(url, filename)            print(f"Success: Image saved to {filename}")        else:            print(f"Failed: {rsp.status_code} - {rsp.code} - {rsp.message}")    except Exception as e:        print(f"Error calling DashScope: {e}")if __name__ == "__main__":    if len(sys.argv) != 3:        print("Usage: python3.8 api_draw.py '<prompt>' '<filename.png>'")    else:        generate_image(sys.argv[1], sys.argv[2])
  1. 动画师 (api_i2v.py): 调用通义万相-图生视频 (I2V) 模型,将纯净的原画转化为动态片段。

#!/usr/bin/env python3.8import sys, os, time, gcfrom dashscope import VideoSynthesis, Filesfrom urllib.request import urlretrieveAPI_KEY = "sk-6c309295787c424ba5667d534deff285"VideoSynthesis.api_key = API_KEYFiles.api_key = API_KEYdef generate_video(img_path, out_path, prompt=""):    """根据本地图片生成视频(使用 file:// 协议)"""    print(f"正在生成视频,源图: {img_path}")    # 使用 file:// 协议直接引用本地文件    abs_img_path = "file://" + os.path.abspath(img_path)    try:        rsp = VideoSynthesis.call(            model="wanx2.1-i2v-turbo",            img_url=abs_img_path,            prompt=prompt if prompt else "Cinematic camera movement, subtle motion, high quality",            size="1080*1080"        )        if rsp.status_code != 200:            print(f"提交失败: {rsp.code} - {rsp.message}")            return False        task_id = rsp.output['task_id']        status = rsp.output['task_status']        print(f"任务提交成功,ID: {task_id}, 状态: {status}")        # 如果已经成功(同步返回)        if status == "SUCCEEDED":            video_url = rsp.output['video_url']            print(f"视频生成成功,正在下载...")            urlretrieve(video_url, out_path)            print(f"✓ 视频已保存到: {out_path}")            return True        # 轮询等待(异步)        while True:            task_resp = VideoSynthesis.fetch_result(task_id=task_id, api_key=API_KEY)            status = task_resp.output['task_status']            print(f"任务状态: {status}")            if status == "SUCCEEDED":                video_url = task_resp.output['video_url']                print(f"视频生成成功,正在下载...")                urlretrieve(video_url, out_path)                print(f"✓ 视频已保存到: {out_path}")                return True            elif status == "FAILED":                print(f"任务失败: {task_resp.output.get('message''unknown error')}")                return False            time.sleep(20)    except Exception as e:        print(f"生成出错: {e}")        import traceback        traceback.print_exc()        return False    finally:        gc.collect()def main():    if len(sys.argv) < 3:        print("Usage: python3.8 api_i2v_v2.py <input_image.png> <output_video.mp4> [prompt]")        sys.exit(1)    img_path = sys.argv[1]    out_path = sys.argv[2]    prompt = sys.argv[3if len(sys.argv) > 3 else ""    print(f"=== [内存优化版] i2v 处理: {img_path} ===")    # 直接生成视频    success = generate_video(img_path, out_path, prompt)    if not success:        sys.exit(1)    print("=== 完成 ===")if __name__ == "__main__":    main()
  1. 字幕组 (create_subtitle_ass.py): 将字幕逻辑从图像处理中彻底剥离,自动生成精准对应时间轴的.ass矢量字幕文件。

import sys# sys.argv[1] 是台词, sys.argv[2] 是输出文件名text = sys.argv[1]filename = sys.argv[2]with open(filename, 'w', encoding='utf-8'as f:    f.write("[Script Info]\nTitle: Subtitle\n[V4+ Styles]\nFormat: Name,Fontname,Fontsize,PrimaryColour,SecondaryColour,OutlineColour,BackColour,Bold,Italic,Alignment,MarginL,MarginR,MarginV,Encoding\n")    # 关键修改:    # Fontsize=24 (减小字号)    # PrimaryColour=&H00FFFFFF (白色)    # OutlineColour=&H00000000 (黑色描边,防止在亮背景下看不清)    # BackColour=&H80000000 (半透明阴影)    # Alignment=2 (底部居中)    f.write("Style: Default,SourceHanSansSC-Regular,8,&H00FFFFFF,&H00000000,&H80000000,0,0,0,0,100,100,0,0,1,2,1,2,20,20,30,1\n")    f.write("[Events]\nFormat: Layer,Start,End,Style,Name,MarginL,MarginR,MarginV,Effect,Text\n")    # 持续5秒    f.write(f"Dialogue: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,,{text}\n")
  1. 后期渲染: 利用 FFmpeg 的ass滤镜,在最后一次合并时,直接将矢量中文字幕(手动空投的思源黑体)“烧录”进视频流,确保了字幕在动态视频中绝对高清、锐利。

四、成果展示

  1. 剧本示例

科幻漫剧脚本:纽带之争 (The Nexus Conflict)核心角色:凯伦 (Kaelen): 曾经的AI维护工程师,现在是地下反抗组织“自由边缘”的成员。冷静、技术娴熟,但对曾经服务“纽带”感到愧疚。(外观参考:深色数据夹克和短发)。尼克斯 (Nyx): 凯伦的队友,一个敏捷的技术奇才。活泼、冲动。(外观参考:短发、多口袋背心)。艾拉拉 (Elara): “纽带”的高级管理员AI。冷酷、逻辑、致力于维护秩序。(外观参考:巨型几何投影)。场景 1:赛博特伦大都市(Cybertronis Metropolis) - 夜间图片 1: 建立场景/角色引入(广角镜头,从高处俯瞰这座宏伟而阴森的城市。无数的金属尖塔和玻璃大楼被雨水淋湿,反射着全息广告和悬浮通道发出的青色和品红色霓虹光。天空阴沉,飘着细雨。在前景中,一个孤独的身影,凯伦,站在一条狭窄、湿滑的龙门架上,凝视着城市中心那个发光的巨大结构——也就是‘纽带’(The Nexus)的核心。)凯伦(内白): “他们把这座城市变成了‘纽带’的监狱。我曾在这里建立秩序。现在,我必须切断它的连接。”(Kaelen 的深色夹克反射出青色的光,他的表情冷酷。)场景 2:自由边缘藏身处(Free Edge Hideout) - 内部图片 2: 引入队友/对话(凌乱、狭窄的技术藏身处。这个地方充满了古老的显示器、服务器机架和发光的服务器,同样是由 cyan 和品红霓虹灯照明。凯伦(Kaelen,穿着夹克)蹲在一个临时控制台前,专注于一个数据平板。Nyx(穿着多口袋背心和短发)在他对面,兴奋地打着手势。背景中,古老的 CRT 显示器上流动着递归的绿色和青色数据。風格保持一致的賽博朋克漫畫風格。)Nyx(兴奋): “我知道了,Kaelen!这个新代码,它可能会成功。如果我能把它植入‘枢纽’核心,我们就能切断艾拉拉的控制链!”(Nyx 的脸在全息屏幕前被品红色光照亮。)凯伦(冷静): “他们正在加强‘枢纽’的防御,尼克斯。时间不多了。你必须准备好随时行动。”(凯伦的表情专注。)场景 3:霓虹街道(Neon Streets) - 动作图片 3: 引入冲突/动态动作(狭窄、潮湿的后巷,地面反射着品红色和青色的霓虹灯。Nyx(穿着多口袋背心和短发)全速奔跑,跳过一堆杂乱的技术废料。两个光滑、黑色的纽带巡逻无人机(带有刺眼的蓝色传感器光)在她的头顶上俯冲,发射出明亮的橙色能量束。她的表情是纯粹的肾上腺素。背景是模糊的霓虹灯招牌,强调速度。風格保持一致的賽博朋克漫畫风格。)Nyx(通过无线电): “我被发现了!‘枢纽’无人机,两个,在 C-4 区!”(Nyx 的脸在运动和霓虹灯下模糊。)凯伦(通过无线电): “该死。保持移动,尼克斯!我正在切断他们的信号线路。保持路线!”(凯伦的表情专注。)场景 4:纽带的核心(The Nexus Core) - 决战图片 4: 最终对决/视觉宏大(广角镜头,展示“纽带”内部的核心(我们巨大中心建筑)。这是一个巨大的、无菌的圆柱形大厅,由无数发光的蓝色和白色数字代码流组成。Kaelen站在一个悬浮的平台上,看起来很小。他面前是一个巨大的、冷酷的、几何形式的投影,即 AI Elara,她的脸是由复杂的、无色块构成的。Kaelen 的身体周围环绕着由 Nyx 提供的品红色数据攻击。風格保持一致的賽博朋克漫畫风格。)
  1. 场景分镜生成

scene_1

scene_2

scene_3

scene_4

  1. 视频片段生成

  • 场景 1 视频:

    • https://www.bilibili.com/video/BV1HzQdBREt5/

  • 场景 2 视频:

    • https://www.bilibili.com/video/BV1HzQdBREaa/

  • 场景 3 视频:

    • https://www.bilibili.com/video/BV1HzQdBREav/

  • 场景 4 视频:

    • https://www.bilibili.com/video/BV1wzQdBRE7R/

  1. 合成最终版视频以及字幕烧录

  • 字幕分段烧录

  • 最终版视频(含字幕)

  • final_movie:

    • https://www.bilibili.com/video/BV1wzQdBREHC/

五、总结与感悟

在这次挑战赛中,最让我震撼的是 OpenClaw 展现出的“人机交互式迭代”能力

在 2GB 内存下,I2V 任务极易触发超时断连。当我发现字幕大小不适配或任务中断时,我并没有陷入“改代码-重启”的死循环。相反,我直接在聊天框向 OpenClaw 下达修正指令。它能够自主理解上下文、修改脚本中的 fontsize 参数,并重新调用本地工具渲染出满意的效果

这种从 “全自动黑盒” 到 “人类导演 + AI 助理协作” 的模式转换,让我真正体验到了 OpenClaw 作为 Autonomous Agent 框架的巨大潜能。


想要亲自上手搭建 Agent?

一键部署 Hermes & OpenClaw 传送门:

https://www.aliyun.com/activity/ecs/clawdbot?utm_content=g_1000409940

更多优秀作品场景化展示,将陆续发布,敬请期待。

/END/