--- name: feishu-seedance-video-pipeline description: "Use when running a Feishu/Lark Base-centered Seedance video production pipeline: inspect/backfill the Base row, create/reference assets, build Row-24-style Chinese Seedance prompts, submit/poll/download via Volcengine Seedance 2.0, QA the result, record tokens/cost, and keep asset lineage auditable." version: 1.0.0 author: Hermes license: MIT metadata: hermes: tags: [Feishu, Bitable, Seedance, Video Generation, Asset Lineage, QA] related_skills: [builtin-image-generate-feishu, volcengine-seedream] --- # Feishu + Seedance 视频产线 ## Overview 这是默认视频产线 skill:以飞书多维表格作为工作流、资产台账和审计源,以 Volcengine Seedance 2.0 作为视频生成引擎。 目标不是“生成一条视频”这么窄,而是完成一条可复用、可追溯、可验收的 Base 行:脚本、角色资产、场景资产、参考图、Prompt、payload、Task ID、成片、抽帧、QA、tokens、成本、Prompt_Output_Map 都在同一行或可追溯链路里。 核心是 Director Module + Base Asset Ledger Write Guard + Reviewer Module:Director 先判断主要角色、角色参考资产、场景环境资产、空间调度和镜头拆分;Base 写入只能由 `asset_manifest.json` 机械生成并回读审计;Reviewer 在任何 billable Seedance POST 前做强制门禁,核验 Base 物料台账、baseline Prompt 对照、reference_image 绑定、Dialogue Lock、Prompt/Payload 一致性和 ledger audit。Reviewer 不出 `PASS_TO_SUBMIT`,禁止提交。Seedance API 只是执行层。 ## When to Use Use when: - 项目输入给出飞书 Base 行,要求准备、提交、复核或修复 Seedance 视频。 - 需求中出现“第 N 行”“补表”“上传多维表”“生成视频”“准备烧钱”。 - 需要生成或复用 Character Reference Sheet、Scene, Environment, and Settings reference image、Top-Down Blocking Map、keyframes。 - 需要把已经生成的视频、抽帧、QA、tokens、成本回填到 Base。 - 需要把一个可看版本固化为 baseline。 Do not use when: - 只是闲聊创意,不涉及视频生成或 Base 资产管理。 - 需求明确不用飞书 Base。 - 用户只要底层 Seedance API 问答;这时可仍参考本 skill 的 API 小节。 ## Default Policy - 默认模型:`doubao-seedance-2-0-260128`(Seedance 2.0 标准版 / 非 Fast)。 - 只有明确要求 Fast、低成本优先、或 Standard/Fast A/B 对比时,才用 `doubao-seedance-2-0-fast-260128`。 - 默认分辨率:`480p`,控成本。 - 默认比例:按项目;短剧/横屏 demo 通常用 `16:9`。 - 默认风格:邵氏电影质感 / 写实古风棚拍 / 武侠喜剧质感。项目指定其他风格时,以项目指定为准。 - 默认 Prompt:中文完整版,第24行 baseline 式细导演稿。 - 未经确认,不提交任何 billable Seedance POST。 - 提交前必须补齐 Base 中提交前已知字段,并 `record-get` 复核。 - 交付必须报 tokens 和估算成本。 - 使用官方 `asset://...` / Seedance 预置人像库时,不上传自生成 Character Reference Sheet 到该角色附件字段,避免误用。 - 使用官方 `asset://...` / Seedance 预置人像库时,必须生成 Wardrobe Reference image,并在每个 Seedance task 的 `content[]` 里作为 `reference_image` 输入;Prompt 中写全名 `Wardrobe Reference image`,不要写缩写。 ## Feishu Base as Source of Truth Base 行要回答: - 这条视频的剧情/脚本是什么? - 每个角色参考资产是什么,由什么工具和 Prompt 生成? - 场景、环境与设定参考图是什么? - 是否使用 Top-Down Blocking Map、keyframe 或 action reference? - Seedance 收到的完整 `content[]` 顺序和 text prompt 是什么? - 生成 Task ID、模型、时长、比例、分辨率、音频设置是什么? - 成片、抽帧、自审、转写、tokens、成本是什么? - 哪些附件是输入,哪些是输出,哪些只是审计说明? 常见字段: ```text 角色参考图(CRS)_角色名_工具 角色参考图(CRS)_角色名_Prompt 输入资产_角色名参考图 角色名参考图_URL 场景环境设定参考图(SES)_工具 场景环境设定参考图(SES)_Prompt 输入资产_场景环境设定参考图 场景环境设定参考图_URL 动作参考图 / 关键帧参考图 / Top-Down Blocking Map_工具 动作参考图 / 关键帧参考图 / Top-Down Blocking Map_Prompt 输入资产_动作时序参考图 Prompt Seedance视频_Prompt Seedance Payload文件 / 视频生成 Payload文件 Prompt文件 Reference_URLs Prompt_Output_Map 视频生成_计划参数 Seedance视频_TaskID 生成视频成片 质量检查抽帧图 QA摘要 Seedance视频_Tokens Seedance视频_估算成本CNY Local_Path 状态 ``` 字段名会变。永远先 `field-list`,再写。 ## Director Module Director Module 是本 skill 的第一步,也是核心决策层。 职责: 1. 从 Feishu Base 行和脚本中判断主要角色数量。 2. 决定每个主要角色是否需要独立 Character Reference Sheet,以及 CRS Prompt 要锁什么。 3. 决定环境是否需要 Scene, Environment, and Settings reference image,以及 SES Prompt 要锁什么。 4. 判断是否需要 Top-Down Blocking Map 或 keyframes。 5. 把视频拆成 4-6 组镜头,覆盖完整时长。 6. 为每组镜头写可直接进入 Seedance Prompt 的导演稿:景别、构图、运镜、动作、表情、空间锚点、道具连续性、对白/音效、禁止项。 配套文件: - `references/director-module.md`:Director 的职责、判断规则、输出 schema、门禁。 - `references/base-asset-ledger-write-guard.md`:Base 资产台账写入门禁;要求 `asset_manifest.json`、写入 payload、`record-get` 回读和机械审计。 - `references/reviewer-module.md`:Reviewer 强制门禁;任何 billable Seedance POST 前必须产出并上传 `reviewer_report.md`,结论为 `PASS_TO_SUBMIT` 才能提交。 - `templates/director-decision-output-template.md`:每次处理新 Base 行时先填写的结构化导演方案模板。 - `templates/reviewer-report-template.md`:Reviewer 报告模板。 工作原则:先产出 `director_plan`,再写 CRS/SES/Seedance Prompt。没有导演方案就直接写 Prompt,视为不合格。 ## Reviewer Module Reviewer Module 是提交前强制审查层。它不负责创作,只负责拦截不符合流程和规范的任务。 位置:Director Module、物料准备、Prompt/Payload 构建之后;任何 billable Seedance POST 之前。 硬规则: - 每条新视频必须产出 `reviewer_report.md`,上传到当前 Base 行。 - Reviewer 结果只能是 `PASS_TO_SUBMIT` 或 `BLOCKED`。 - `BLOCKED` 时禁止提交 Seedance。 - 若需求要求参考第 N 行或历史 baseline,Reviewer 必须先拉取该行 Prompt 和资产记录做对照。 - Reviewer 必须检查:当前 Base 行物料台账、Character Reference Sheet / Scene, Environment, and Settings reference image / Wardrobe Reference image、Prompt 完整度、payload.content[] 顺序、Dialogue Lock、Prompt/Payload一致性、附件回填、状态字段。 详见:`references/reviewer-module.md` 与 `templates/reviewer-report-template.md`。 ## End-to-End Workflow ### 1. Inspect row and fields ```bash BASE='[REDACTED]' TABLE='[REDACTED]' REC='rec...' WORK=/tmp/feishu_seedance_pipeline mkdir -p "$WORK" lark-cli base +field-list --as user \ --base-token "$BASE" --table-id "$TABLE" \ > "$WORK/fields.json" lark-cli base +record-get --as user \ --base-token "$BASE" --table-id "$TABLE" --record-id "$REC" \ > "$WORK/record.json" ``` 读取 `data.record`,不要假设一定有 `data.record.fields`。当前 `lark-cli base +record-get` 可能直接把字段平铺在 `data.record` 根部(例如 `data.record["Prompt文件"]`),而不是放在 `data.record.fields`。Reviewer/回填验证脚本应兼容两种结构:优先 `data.record.fields`,不存在时把 `data.record` 本身当字段 dict。`field-list` 的字段数组在当前 `lark-cli` 版本里是 `data.fields`,不是 `data.items`。 如果用户给的是“基于某行/刚才那条视频”的新脚本,先 `record-get` 旧行复用可用资产,再创建新行。新行创建可用: ```bash lark-cli base +record-batch-create --as user \ --base-token "$BASE" --table-id "$TABLE" \ --json '{"fields":["资产名","Prompt"],"rows":[["...","..."]]}' ``` 返回里不一定有标准 `records[]`。优先从 `data.record_id_list[0]` 读取新行 ID;不要用宽松正则直接抓第一个 `rec...`,会误抓到正文里的 `record` 字样。随后立刻写入 `record_id.txt` 并 `record-get` 复核。 ### 2. Prepare or verify assets 每个主角独立 Character Reference Sheet,除非需求明确要群像表。 本 skill 自带五份可直接调用的模板/参考文件: - `references/director-module.md`:Director Module 规则,判断主要角色、Character Reference Sheet / Scene, Environment, and Settings reference image / Top-Down Blocking Map / keyframes 需求、镜头拆分和门禁。 - `templates/director-decision-output-template.md`:处理每条 Base 行时先填写的结构化 `director_plan` 模板。 - `templates/character-reference-sheet-prompt-template.md`:主要角色 Character Reference Sheet 完整 Prompt 模板与 QA 门禁。 - `templates/scene-environment-settings-prompt-template.md`:Scene, Environment, and Settings reference image 完整 Prompt 模板与 QA 门禁。 - `templates/seedance-row24-director-template.md`:符合第24行/第28行风格的 Seedance 中文细导演稿模板,要求逐秒时间轴绑定镜头语言、空间锚点、动作、对白/音效。 先填写 Director `director_plan`,再生成或复用具体资产。 Character Reference Sheet 要点: - 单角色,不混多个主角。 - 4:3 横向布局优先。 - MAIN IDENTITY + SCALE SHEET 最大。 - 表情、头部角度、姿态、服装/配件、手/爪动作齐全。 - 不要把场景、字幕、Logo、水印塞进角色表。 - 生成后用视觉自审,不合格不要当 PASS。 Scene, Environment, and Settings reference image 要点: - 锁环境、光线、材质、空间锚点、关键道具。 - 通常不要出现主角、动物、人物剪影。 - 16:9 单张电影画面,不要拼贴、分镜板、蓝图、文字、箭头。 - 默认邵氏电影 / 古风棚拍 / 武侠喜剧质感,除非项目指定别的风格。 Top-Down Blocking Map / keyframes: - 只在动作、站位、接触关系复杂时用。 - 面向 Seedance 的参考图应少文字、少箭头、少网格,避免模型复现图表风格。 - Prompt 里写全名 `Top-Down Blocking Map`,不要只写 `TDBM`。 ### 3. Publish references Seedance API 需要可访问 URL 或 `asset://...`。 本机 HTTPS 发布例: ```bash SRC="/path/to/reference.png" OUTDIR="/var/www/example.com/media/seedance" sudo mkdir -p "$OUTDIR" sudo cp "$SRC" "$OUTDIR/reference.png" sudo chmod 644 "$OUTDIR/reference.png" curl -L -s -o /tmp/ref_check.png -w '%{http_code} %{content_type} %{size_download}\n' \ "https://example.com/media/seedance/reference.png" ``` Feishu 附件上传要求相对路径: ```bash cd /path/to/files lark-cli base +record-upload-attachment --as user \ --base-token "$BASE" --table-id "$TABLE" --record-id "$REC" \ --field-id '输入资产_场景环境设定参考图' \ --file scene_reference.png ``` ## Seedance API Essentials Endpoint: ```text POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{task_id} Authorization: Bearer Content-Type: application/json ``` Content rules: ```json {"type":"text","text":"完整中文Prompt"} {"type":"image_url","image_url":{"url":"https://..."},"role":"reference_image"} {"type":"image_url","image_url":{"url":"asset://asset-id"},"role":"reference_image"} {"type":"image_url","image_url":{"url":"https://..."},"role":"first_frame"} {"type":"image_url","image_url":{"url":"https://..."},"role":"last_frame"} ``` 不要在 API Prompt 里写 `@Image1`。参考图绑定靠 `content[]` 顺序和 `role`。 默认 payload: ```json { "model": "doubao-seedance-2-0-260128", "duration": 12, "resolution": "480p", "ratio": "16:9", "generate_audio": true, "return_last_frame": false, "content": [ {"type": "text", "text": "..."}, {"type": "image_url", "image_url": {"url": "https://example.com/character_or_scene.png"}, "role": "reference_image"} ] } ``` 提交: ```bash curl -sS -X POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \ -H "Authorization: Bearer ${VOLCENGINE_API_KEY}" \ -H "Content-Type: application/json" \ -d @payload.json | tee post_response.json | jq . ``` 轮询: ```bash TASK_ID="cgt-..." for i in {1..80}; do curl --max-time 30 -sS "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/${TASK_ID}" \ -H "Authorization: Bearer ${VOLCENGINE_API_KEY}" \ | tee result_latest.json | jq '{status, usage, error, content}' sleep 15 done ``` ## Row-24 Director Prompt Standard Prompt 不合格的典型病:只写剧情,不写镜头。 必须包含: 1. 整体硬约束:片长、比例、分辨率、音频、模型意图、可见角色数量、服装/身份锁。 2. 风格锁:默认邵氏电影质感 / 写实古风棚拍 / 武侠喜剧质感。 3. 参考图用途:按 `content[]` 顺序说明,不写 `@Image`。 4. 空间关系:左右、前后、入口、出口、最终位置、空间锚点。 5. 道具状态:初始状态、变化节点、禁止继承场景图里的错误道具。 6. 逐秒时间轴:每段同时写镜头、运镜/切换、空间锚点、动作、表情、对白/音效。 7. 音频:`generate_audio=true/false`,对白逐句列明。 - 项目输入给出明确对白台词时,必须逐字保留原文、标点、语气词、波浪号和说话顺序;不得改写、合并、移动、补台词或删台词。 - 导演稿可以补动作、表情、镜头、音效,但对白内容必须与用户脚本完全一致。 - 提交前必须做 Dialogue Lock 复核:抽取用户对白数组,与 Prompt 中对白数组逐项比对;不一致不得提交 billable POST。 - 若需求要求“像某真实演员/配音演员/名人”的声音,不要在模型 Prompt 或 payload 中写具体真人姓名;改写成抽象表演特征,例如“夸张港式无厘头国语男声、尖亮、拖腔、节奏欠揍、喜剧感强”。 8. 限制项:无字幕、无气泡、无文字、无分镜格、无箭头、无水印、无额外角色、无身份漂移、无道具漂移。 时间轴模板: ```text [0-2秒] 镜头构图与运镜:中广角建立镜头,镜头从桌面空间锚点轻轻推近。角色动作:...。空间锚点/道具连续性:...。对白/音效:...。 [2-4秒] 镜头构图与运镜:切到中近景,保持角色左右关系不变。角色动作:...。空间锚点/道具连续性:...。对白/音效:...。 ``` 提交前复核: ```text Prompt == Seedance视频_Prompt == payload.content[0].text == 本地 prompt 文件 模型 == doubao-seedance-2-0-260128,除非用户另指定 Fast 或 A/B 对比 无 @Image 无未解释 CRS / SES / TDBM / BGM 等缩写 每个时间段都有镜头语言 未擅自提交生成 ``` ## Multi-Act / Short-Drama Extension 当项目输入给出“多幕/多场/短剧”脚本,且要求每一幕独立生成时: - Base 仍采用同一行作为整组短剧的 source of truth;不要为每幕拆新行,除非需求明确要求。 - 每一幕对应一个独立 Seedance prompt 文件、payload 文件、Task ID、成片和抽帧;最终再用 ffmpeg 拼接成完整视频。 - 多幕共享同一组主要角色 Character Reference Sheet 与同一张 Scene, Environment, and Settings reference image,除非某一幕明确换角色或换场景。 - 使用官方 `asset://...` / Seedance 预置人像库时,必须生成 Wardrobe Reference image:同一套服饰的前/侧/后/细节多视图;每个 act / 每个 Seedance task 的 `content[]` 都必须加入这张 Wardrobe Reference image 作为 `reference_image`。Prompt 中写全名 `Wardrobe Reference image`,不要写缩写。 - 同一行的 `Seedance视频_TaskID` 写入多行清单,例如 `Act1: cgt-...\nAct2: cgt-...`。 - `生成视频成片` 字段上传每幕成片和最终拼接成片;`质量检查抽帧图` 字段上传每幕抽帧和最终抽帧。飞书附件字段会 append,同一字段多次上传是预期行为。 - `Seedance视频_Tokens` 和 `Seedance视频_估算成本CNY` 写合计值;QA摘要里列每幕 tokens/成本和总计。 - `Reference_URLs` 字段实测会把 JSON/多 URL 字符串自动改写成奇怪 Markdown 链接;优先写短说明或资产标签清单,真实可访问 URL 以 payload 文件、附件和本地 `reference_urls.json` 为准。 - `Prompt_Output_Map` 必须说明:共享 CRS/SES、每幕 payload 文件、每幕 Task ID、最终拼接文件。 - 每一幕都必须单独执行 Dialogue Lock;跨幕不得合并、改写、挪动台词。若同一幕里有重复对白(如两次“还疼么?”),验证时必须用顺序扫描 `find(..., previous_pos+1)`,不要用 `prompt.index()` 列表,否则重复句会误判顺序失败。 多幕拼接命令: ```bash cat > "$WORK/run/concat_list.txt" < ffprobe.json ffmpeg -y -hide_banner -loglevel error -i output.mp4 -vf "fps=1,scale=240:-1,tile=5x3" -frames:v 1 contact_sheet.jpg ``` 对白/配音自动转写检查【暂时禁用】: ```bash # 暂停使用 Whisper 做中文对白 QA:中文识别准确率不足,容易误判。 # 仅保留音轨存在性/规格检查;对白内容以人工验收为准。 # 未来替换为更高准确率模型后再恢复自动转写模块。 # ffmpeg -y -hide_banner -loglevel error -i output.mp4 -vn -ac 1 -ar 16000 audio.wav # whisper audio.wav --language Chinese --model tiny --output_dir whisper --output_format txt --fp16 False ``` QA 摘要至少包括: - 实际尺寸、fps、时长、音轨。 - 角色身份稳定性。 - 空间关系/道具状态。 - 关键动作是否完成。 - 是否有字幕、文字、水印、额外角色。 - 音轨存在性;对白内容以人工验收为准,暂不使用 Whisper 中文转写做判断。 - tokens 和估算成本。 - 结论:baseline / candidate / reject。 QA 注意: - 视觉模型可能因为人物服装/内容安全策略对抽帧返回 403。不要硬编视觉自审;在 QA 中明确“自动视觉审查失败,需人工验收”,仍然回填抽帧图。 - `browser_navigate` 在本 VM 可能因 Chrome sandbox 失败;需要可视检查时可先用 `agent-browser open --args "--no-sandbox"` 打开,再截图/人工核对。 ## Cost Calculation 成功任务 GET 结果通常含 `usage.total_tokens`。 公开估算口径: - Seedance 2.0 标准版:不含视频输入约 `46 元 / 1,000,000 tokens`;含视频输入约 `28 元 / 1,000,000 tokens`。 - Seedance 2.0 Fast:不含视频输入约 `37 元 / 1,000,000 tokens`;含视频输入约 `22 元 / 1,000,000 tokens`。 - 图生视频/文生视频默认按“不含视频输入”估算,除非 payload 有 `video_url`。 ```bash TOKENS=$(jq -r '.usage.total_tokens // .usage.completion_tokens' result_final.json) MODEL=$(jq -r '.model // "doubao-seedance-2-0-260128"' payload.json) HAS_VIDEO=$(jq '[.content[]? | select(.type == "video_url")] | length > 0' payload.json) python3 - <