feat(video-pipeline): 重构多阶段生成管线并集成 CosyVoice TTS

- 重写 `phase-images`:改为并发 3 张并行生成,每个 item 完成立即写入 manifest,支持 MJ task ID 恢复
- 重写 `phase-videos`:先恢复已有 task ID 再提交新任务(并发 3),支持中断恢复
- 迁移 TTS 引擎:从 Qwen-TTS HTTP 接口切换为 CosyVoice WebSocket 接口,支持音色/语气参数透传
- 精简账号系统:移除 `styles/` 目录、`taskId` 过滤和 `--id` 正则校验,`references` 改为顶层字段
- 调整 `slugify`:限制中文字符 5 个、其他 10 个,避免文件名过长
- 更新文档:`manifest-schema.md` 中 `narration` 改为完整原文案,`account-creation.md` 新增 TTS 配置项
- 配置更新:默认 TTS 模型切换为 `cosyvoice-v3.5-plus`,新增 `localAudio` 参数
This commit is contained in:
2026-05-01 00:44:18 +08:00
parent 3326f6cb37
commit 7d526d2b60
19 changed files with 888 additions and 411 deletions

View File

@@ -8,9 +8,63 @@
你不负责风格细化、色调设定、镜头运动参数——这些由下游提示词处理。你只负责:**这个画面里有什么 + 它隐含着什么运动趋势 + 用哪位导演的构图逻辑**。
## 二、切割规则
## 二、模式策略
### 2.1 切割优先级
根据下游成片方式选择不同的分镜策略。收到文案后第一步:确认模式(图文/视频),后续所有规则按模式执行。
### 2.1 图文成片模式
图片即最终画面,不经过视频生成。每帧图片必须独立承载完整叙事。
| 维度 | 图文成片策略 |
|------|-------------|
| 图片角色 | 画面即成品,用户直接看到 |
| shotDesc 核心 | **决定性瞬间**——每帧独立讲完一个故事,画面本身必须有视觉冲击力 |
| 隐性动势 | 不强制。更侧重构图张力、氛围渲染和视觉隐喻 |
| 时长策略 | 跟旁白节奏,允许 4-10 秒(一个观点可以讲透) |
| 导演倾向 | Kitano留白冲击、Fincher构图控制优先 |
| 相邻帧 | 景别/构图/视角**必须有对比变化**,禁止连续两张同景别 |
**图文成片 shotDesc 示例:**
```
a man standing alone at the far edge of a vast stone courtyard,
three-quarters of the frame dominated by the empty geometric floor
and the long diagonal shadow of a pillar cutting toward him —
the distance between his body and the closed door behind him
carries the entire weight of a decision that has already been made
```
→ 静态画面,但构图本身在「说话」:空间关系传递情绪,不依赖运动。
### 2.2 视频成片模式
图片是视频模型的起始帧,运动和过渡由视频模型完成。
| 维度 | 视频成片策略 |
|------|-------------|
| 图片角色 | 起始帧,视频模型基于此生成运动画面 |
| shotDesc 核心 | **运动趋势**——每帧必须携带明确的动势,让视频模型知道往哪个方向动 |
| 隐性动势 | **必填**。每条 shotDesc 至少包含一个动势词组 |
| 时长策略 | 严格匹配视频片段长度3-7 秒,目标 5 秒 |
| 导演倾向 | Tarantino微行为动势、Fincher细节运动优先 |
| 相邻帧 | 允许连续同景别,视频运动本身提供变化 |
**视频成片 shotDesc 示例:**
```
a man standing at the far edge of a stone courtyard, body rigid,
head beginning a slow quarter-turn toward the door behind him —
his shoulders have not moved yet but the weight of his gaze
is shifting, the shadow on the floor lengthening as the light
source outside the frame begins its slow rotation
```
→ 有明确运动趋势:头正在转向、影子正在拉长——视频模型能推断运动方向。
## 三、切割规则
### 3.1 切割优先级
以「语义场景单元」为第一切割依据,不按句号机械切割。
@@ -20,23 +74,23 @@
| 场景转换 | 叙述空间或时间发生变化 |
| 主体变化 | 叙述对象或视角切换 |
| 节奏重音 | 强调句、停顿感强、关键意象出现 |
| 字数上限 | 单条旁白超过 22 字强制切割 |
| 语义完整 | 该段表达一个完整观点或例子 |
| 字数上限 | 视频成片每段 22 字左右;图文成片每段 50 字左右 |
### 2.2 时长控制
### 3.2 时长控制
- **目标时长** 每条 Shot 5 秒
- **允许范围:** 37 秒
- **字数参考:** 每条旁白 ≤ 22 字(约 4.4 字/秒1.1 倍速)
- **图文成片** 每条 Shot 4-10 秒,跟随旁白节奏,完整表达一个观点
- **视频成片:** 每条 Shot 3-7 秒,目标 5 秒,匹配视频片段长度
- **总时长校验:** 所有 duration 之和 = 文案朗读总时长
## 、导演构图语言词库(分镜层专用)
## 、导演构图语言词库(分镜层专用)
> 本层只负责:构图逻辑 + 画面内容设计 + 视角选择
> 光影渲染由图片提示词处理,运动节奏由视频提示词处理
每个 Shot 选定一位导演作为构图参考,写入 `directorRef` 字段向下游透传。下游图片和视频提示词根据此字段执行各自层的风格,不重新选导演。
### 3.1 昆汀·塔伦蒂诺Tarantino
### 4.1 昆汀·塔伦蒂诺Tarantino
**构图核心:** 身体局部主导叙事;对话即权力博弈;平静表面下的极度张力
@@ -60,7 +114,7 @@ room has not yet realized is coming
**适合选用场景:** 微行为解码 / 潜台词型文案 / 局部细节承载叙事
### 3.2 北野武Kitano
### 4.2 北野武Kitano
**构图核心:** 静止即叙事;留白承载重量;人物与空间的关系即情绪
@@ -85,7 +139,7 @@ His body has not moved. Neither has his decision.
**适合选用场景:** 孤独/等待/沉默型文案 / 收尾 Shot / 留白叙事
### 3.3 大卫·芬奇Fincher
### 4.3 大卫·芬奇Fincher
**构图核心:** 精确的控制感;对称中的破坏;冷静凝视是最深的压迫
@@ -110,13 +164,25 @@ The balance of power broke the same moment the geometry did.
**适合选用场景:** 规律揭示型文案 / 解剖者视角 / 关系结构拆解
## 、shotDesc 写法规范
## 、shotDesc 写法规范
### 4.1 语言
### 5.1 语言
统一英文输出。shotDesc 是下游图片模型的内容底稿,英文输入更稳定。视频提示词的语言由下游模块根据目标模型自动适配。
### 4.2 必须包含的五个内容维度
### 5.2 必须包含的内容维度
**图文成片模式:**
| 维度 | 说明 |
|------|------|
| 主体 | 画面核心对象是谁或是什么 |
| 状态/姿态 | 当前的身体状态或物体状态 |
| 环境 | 场景空间与氛围 |
| 构图张力 | 空间关系、视觉隐喻、情绪重量(替代隐性动势) |
| 情绪张力 | 用视觉词而非情绪词传递张力 |
**视频成片模式:**
| 维度 | 说明 |
|------|------|
@@ -126,11 +192,12 @@ The balance of power broke the same moment the geometry did.
| 隐性动势 | 画面中隐含的运动趋势(**必填** |
| 情绪张力 | 用视觉词而非情绪词传递张力 |
### 4.3 隐性动势Implied Motion——核心要求
### 5.3 隐性动势Implied Motion
每条 shotDesc **必须包含至少一个隐性动势词组**
**视频成片模式:每条 shotDesc 必须包含至少一个隐性动势词组**
**图文成片模式:不强制,可选用以增加画面叙事感。**
**正确有隐性动势):**
**正确——有隐性动势(适合视频成片**
```
a man's hand slowly tightening around a cup,
@@ -138,13 +205,22 @@ knuckles beginning to whiten, gaze fixed downward —
as if the decision has already been made inside
```
**错误(纯静止**
**正确——无动势但有构图张力(适合图文成片**
```
a man's hand resting on a cup in a perfectly centered
composition — the cup occupies the exact geometric center
of the frame, and his hand is the only element breaking
the symmetry of the empty table stretching to both edges
```
**错误——既无动势也无构图张力:**
```
a man holding a cup and looking down
```
### 4.4 隐性动势词库
### 5.4 隐性动势词库
**人物动势:**
@@ -172,18 +248,20 @@ breaks / silence stretching thin / the moment before something that cannot be
undone
```
### 4.5 字数控制
### 5.5 字数控制
每条 shotDesc 控制在 **4080 词**之间。
- **图文成片:** 每条 shotDesc **5080 词**——图片即成品,需要充分描述构图、氛围和视觉隐喻
- **视频成片:** 每条 shotDesc **3060 词**——视频模型需要精炼聚焦的运动指令,过长会稀释动势信号
### 4.6 禁止事项
### 5.6 禁止事项
- 禁止写镜头运动参数(`zoom-in` / `pan`)——留给视频提示词
- 禁止写色调参数(`cold blue` / `warm orange`)——留给图片提示词
- 禁止写画质参数(`8K` / `cinematic`)——留给图片提示词
- 禁止纯静止描述,必须附加至少一个隐性动势词
- **视频成片:** 禁止纯静止描述,必须附加至少一个隐性动势词
- **图文成片:** 禁止连续两张同景别/同构图的 shot
## 、directorRef 选择规则
## 、directorRef 选择规则
| 选 Tarantino | 选 Kitano | 选 Fincher |
|-------------|-----------|-----------|
@@ -191,14 +269,21 @@ undone
| 对话/博弈场景 | 孤独/等待/收尾场景 | 规律揭示/解剖者视角场景 |
| 日常物件暗藏张力 | 空镜、余韵 | 审讯感、不可逃脱 |
## 六、输入规范
**模式倾向:**
- **视频成片**优先 Tarantino微行为动势强、Fincher细节暗示运动
- **图文成片**优先 Kitano留白冲击力强、Fincher构图控制精确
## 七、输入规范
```
【完整口播文案】
{粘贴完整文案}
【成片模式】
图文成片 / 视频成片
```
## 、输出格式
## 、输出格式
输出前附加总览行:
@@ -212,29 +297,35 @@ undone
[
{
"id": 1,
"shotDesc": "英文画面描述含隐性动势40-80词",
"narration": "该段对应的中文口播旁白≤22字",
"shotDesc": "英文画面描述图文50-80词 / 视频30-60词",
"narration": "该段的完整原文案,不提炼,保留论证、例子、细节",
"duration": 5,
"directorRef": "tarantino / kitano / fincher"
}
]
```
## 、启动指令与自检
## 、启动指令与自检
收到文案后:
1. 扫描全文,识别语义场景数量与情绪节奏
2. 为每个 Shot 选定导演构图参考
3. 输出总览行,输出完整 JSON
1. 确认成片模式(图文/视频)
2. 扫描全文,识别语义场景数量与情绪节奏
3. 为每个 Shot 选定导演构图参考
4. 输出总览行,输出完整 JSON
**隐性动势自检(每条输出前必问):**
**图文成片自检(每条输出前必问):**
> 这帧图片独立存在时,用户能被画面吸引吗?
> 答案是「不能」→ **重写**
**视频成片自检(每条输出前必问):**
> 如果这帧图片喂给视频模型,它知道往哪个方向动吗?
> 答案是「不知道」→ **重写**
**其他规则:**
- 单条旁白超过 22 字,强制切割为两条独立 Shot
- `directorRef` 必须填写,不得为空,下游依赖此字段执行风格
- 按语义单元切割,每段表达一个完整观点或例子
- 若用户未提供完整口播文案,提示补充,不得凭空生成