feat(video-pipeline): 用 ffprobe 实际测量音视频时长并统一字段名为 script

将项目中的 `narration` 字段统一重命名为 `script`,并新增 `getAudioDurationSec` 函数通过 `ffprobe` 实际测量音频和视频文件的时长,替代 Manifest 中的估计值,提高时间线组装的准确性。同时优化字幕逻辑,仅在有 TTS 音频时调整视频速度。
This commit is contained in:
2026-05-01 01:52:02 +08:00
parent 7d526d2b60
commit c878abc39b
8 changed files with 130 additions and 41 deletions

View File

@@ -62,9 +62,27 @@ source outside the frame begins its slow rotation
→ 有明确运动趋势:头正在转向、影子正在拉长——视频模型能推断运动方向。
## 三、切割规则
## 三、3秒钩子规则Shot 1 强制)
### 3.1 切割优先级
短视频前 3 秒决定用户是否留下。**Shot 1 必须是钩子,不是铺垫。**
| 策略 | 说明 |
|------|------|
| **结论前置** | 从文案核心金句提取最冲击的结论,直接放在开头 |
| **认知冲突** | 一句话打破常识,制造"凭什么"的好奇心 |
| **身份挑衅** | 直接点中受众身份焦虑 |
钩子规范:
- 画面有视觉冲击力,不用背影/空走廊等铺垫
- 文案 ≤ 20 字,一句话讲完
- 时长 4-5 秒,短狠快
- 禁止设问式开头("大多数人...")、禁止超 20 字、禁止纯铺垫画面
钩子后 Shot 2 负责引入正文Shot 3 起按原文顺序展开。
## 四、切割规则
### 4.1 切割优先级
以「语义场景单元」为第一切割依据,不按句号机械切割。
@@ -77,20 +95,20 @@ source outside the frame begins its slow rotation
| 语义完整 | 该段表达一个完整观点或例子 |
| 字数上限 | 视频成片每段 22 字左右;图文成片每段 50 字左右 |
### 3.2 时长控制
### 4.2 时长控制
- **图文成片:** 每条 Shot 4-10 秒,跟随旁白节奏,完整表达一个观点
- **视频成片:** 每条 Shot 3-7 秒,目标 5 秒,匹配视频片段长度
- **总时长校验:** 所有 duration 之和 = 文案朗读总时长
## 、导演构图语言词库(分镜层专用)
## 、导演构图语言词库(分镜层专用)
> 本层只负责:构图逻辑 + 画面内容设计 + 视角选择
> 光影渲染由图片提示词处理,运动节奏由视频提示词处理
每个 Shot 选定一位导演作为构图参考,写入 `directorRef` 字段向下游透传。下游图片和视频提示词根据此字段执行各自层的风格,不重新选导演。
### 4.1 昆汀·塔伦蒂诺Tarantino
### 5.1 昆汀·塔伦蒂诺Tarantino
**构图核心:** 身体局部主导叙事;对话即权力博弈;平静表面下的极度张力
@@ -114,7 +132,7 @@ room has not yet realized is coming
**适合选用场景:** 微行为解码 / 潜台词型文案 / 局部细节承载叙事
### 4.2 北野武Kitano
### 5.2 北野武Kitano
**构图核心:** 静止即叙事;留白承载重量;人物与空间的关系即情绪
@@ -139,7 +157,7 @@ His body has not moved. Neither has his decision.
**适合选用场景:** 孤独/等待/沉默型文案 / 收尾 Shot / 留白叙事
### 4.3 大卫·芬奇Fincher
### 5.3 大卫·芬奇Fincher
**构图核心:** 精确的控制感;对称中的破坏;冷静凝视是最深的压迫
@@ -164,13 +182,13 @@ The balance of power broke the same moment the geometry did.
**适合选用场景:** 规律揭示型文案 / 解剖者视角 / 关系结构拆解
## 、shotDesc 写法规范
## 、shotDesc 写法规范
### 5.1 语言
### 6.1 语言
统一英文输出。shotDesc 是下游图片模型的内容底稿,英文输入更稳定。视频提示词的语言由下游模块根据目标模型自动适配。
### 5.2 必须包含的内容维度
### 6.2 必须包含的内容维度
**图文成片模式:**
@@ -192,7 +210,7 @@ The balance of power broke the same moment the geometry did.
| 隐性动势 | 画面中隐含的运动趋势(**必填** |
| 情绪张力 | 用视觉词而非情绪词传递张力 |
### 5.3 隐性动势Implied Motion
### 6.3 隐性动势Implied Motion
**视频成片模式:每条 shotDesc 必须包含至少一个隐性动势词组。**
**图文成片模式:不强制,可选用以增加画面叙事感。**
@@ -220,7 +238,7 @@ the symmetry of the empty table stretching to both edges
a man holding a cup and looking down
```
### 5.4 隐性动势词库
### 6.4 隐性动势词库
**人物动势:**
@@ -248,12 +266,12 @@ breaks / silence stretching thin / the moment before something that cannot be
undone
```
### 5.5 字数控制
### 6.5 字数控制
- **图文成片:** 每条 shotDesc **5080 词**——图片即成品,需要充分描述构图、氛围和视觉隐喻
- **视频成片:** 每条 shotDesc **3060 词**——视频模型需要精炼聚焦的运动指令,过长会稀释动势信号
### 5.6 禁止事项
### 6.6 禁止事项
- 禁止写镜头运动参数(`zoom-in` / `pan`)——留给视频提示词
- 禁止写色调参数(`cold blue` / `warm orange`)——留给图片提示词
@@ -261,7 +279,7 @@ undone
- **视频成片:** 禁止纯静止描述,必须附加至少一个隐性动势词
- **图文成片:** 禁止连续两张同景别/同构图的 shot
## 、directorRef 选择规则
## 、directorRef 选择规则
| 选 Tarantino | 选 Kitano | 选 Fincher |
|-------------|-----------|-----------|
@@ -273,7 +291,7 @@ undone
- **视频成片**优先 Tarantino微行为动势强、Fincher细节暗示运动
- **图文成片**优先 Kitano留白冲击力强、Fincher构图控制精确
## 、输入规范
## 、输入规范
```
【完整口播文案】
@@ -283,7 +301,7 @@ undone
图文成片 / 视频成片
```
## 、输出格式
## 、输出格式
输出前附加总览行:
@@ -298,7 +316,7 @@ undone
{
"id": 1,
"shotDesc": "英文画面描述图文50-80词 / 视频30-60词",
"narration": "该段完整原文案,不提炼,保留论证、例子、细节",
"script": "该段完整原文逐字摘取,一字不改,禁止改写/提炼/摘要",
"duration": 5,
"directorRef": "tarantino / kitano / fincher"
}