@oh-story/dsh 0.1.18 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -12
- package/lib/drama/manifest.json +77 -247
- package/lib/drama/skills/short-drama/SKILL.md +9 -1
- package/lib/drama/skills/short-drama/references/creator-documents.md +51 -23
- package/lib/drama/skills/short-drama/references/reference-roles.md +1 -1
- package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +442 -129
- package/lib/drama/skills/short-drama/scripts/project_tool.py +54 -1
- package/lib/drama/skills/short-drama-assets/SKILL.md +2 -6
- package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +9 -3
- package/lib/drama/skills/short-drama-assets/references/era-anchors.md +3 -3
- package/lib/drama/skills/short-drama-assets/references/location-and-view.md +4 -0
- package/lib/drama/skills/short-drama-develop/references/adaptation-craft.md +2 -2
- package/lib/drama/skills/short-drama-develop/references/episode-design.md +19 -4
- package/lib/drama/skills/short-drama-develop/references/genre-cards//347/263/273/347/273/237/346/265/201.md +1 -1
- package/lib/drama/skills/short-drama-edit/SKILL.md +1 -1
- package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +28 -6
- package/lib/drama/skills/short-drama-edit/scripts/selftest.py +1 -1
- package/lib/drama/skills/short-drama-image-prompts/SKILL.md +1 -5
- package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +2 -2
- package/lib/drama/skills/short-drama-produce/SKILL.md +2 -0
- package/lib/drama/skills/short-drama-review/SKILL.md +0 -4
- package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +1 -1
- package/lib/drama/skills/short-drama-storyboard/SKILL.md +9 -9
- package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +43 -13
- package/lib/drama/skills/short-drama-storyboard/references/keyframe-craft.md +5 -5
- package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +5 -5
- package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +27 -3
- package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +2 -1
- package/lib/drama/skills/short-drama-video-prompts/SKILL.md +6 -8
- package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +16 -1
- package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +23 -6
- package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +2 -2
- package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +8 -1
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +41 -2
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +1 -1
- package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +5 -1
- package/lib/drama/skills/short-drama-write/SKILL.md +7 -3
- package/lib/drama/skills/short-drama-write/references/screenplay-format.md +1 -1
- package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +94 -1
- package/lib/drama/skills/short-drama-write/scripts/screenplay_index.py +13 -4
- package/lib/drama/skills/short-drama-write/scripts/selftest.py +3 -77
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/novel-to-game/README.md +20 -34
- package/lib/novel-to-game/README_ZH.md +20 -34
- package/lib/novel-to-game/VERSION +1 -1
- package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +2 -6
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/audio.js +33 -39
- package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +2 -2
- package/lib/novel-to-game/manifest.json +46 -46
- package/lib/novel-to-game/skills/game-art-direction/SKILL.md +1 -1
- package/lib/novel-to-game/skills/game-build/references/baked-sprite-workflow.md +2 -3
- package/lib/novel-to-game/skills/game-build/references/blender-asset-workflow.md +6 -7
- package/lib/novel-to-game/skills/game-build/references/build-brief-contract.md +2 -2
- package/lib/novel-to-game/skills/game-build/references/generative-media-pipeline.md +1 -4
- package/lib/novel-to-game/skills/game-build/references/playable-model-contract.md +1 -3
- package/lib/novel-to-game/skills/game-build/references/tts-production-contract.md +1 -3
- package/lib/novel-to-game/skills/game-concept/SKILL.md +1 -1
- package/lib/novel-to-game/skills/game-qa/SKILL.md +3 -4
- package/lib/novel-to-game/skills/game-qa/references/qa-contract.md +1 -1
- package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +3 -2
- package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +13 -14
- package/lib/novel-to-game/skills/novel-game-analyze/references/gameability-protocol.md +1 -2
- package/lib/novel-to-game/skills/novel-to-game/SKILL.md +4 -4
- package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +2 -3
- package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +0 -8
- package/lib/oh-story/manifest.json +49 -49
- package/lib/oh-story/skills/story/SKILL.md +2 -2
- package/lib/oh-story/skills/story/VERSION +1 -1
- package/lib/oh-story/skills/story-deslop/SKILL.md +2 -2
- package/lib/oh-story/skills/story-import/SKILL.md +5 -5
- package/lib/oh-story/skills/story-import/references/deep-analysis.md +1 -1
- package/lib/oh-story/skills/story-import/references/import-report.md +1 -1
- package/lib/oh-story/skills/story-import/references/import-tracking.md +1 -1
- package/lib/oh-story/skills/story-import/references/outline-reverse.md +1 -1
- package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +6 -1
- package/lib/oh-story/skills/story-long-analyze/SKILL.md +2 -2
- package/lib/oh-story/skills/story-long-write/SKILL.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/agent-calls.md +3 -3
- package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +2 -2
- package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +6 -1
- package/lib/oh-story/skills/story-review/SKILL.md +8 -7
- package/lib/oh-story/skills/story-review/references/agent-prompts.md +7 -7
- package/lib/oh-story/skills/story-review/references/tracking-transaction.md +2 -2
- package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +6 -1
- package/lib/oh-story/skills/story-setup/SKILL.md +6 -6
- package/lib/oh-story/skills/story-short-write/SKILL.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/agent-calls.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/workflow-design.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +1 -1
- package/package.json +21 -21
- package/lib/drama/skills/short-drama-assets/assets/character-look.example.jsonl +0 -3
- package/lib/drama/skills/short-drama-assets/assets/continuity.example.jsonl +0 -4
- package/lib/drama/skills/short-drama-assets/assets/decisions.example.jsonl +0 -5
- package/lib/drama/skills/short-drama-assets/assets/location-view.example.jsonl +0 -3
- package/lib/drama/skills/short-drama-assets/assets/occurrences.example.jsonl +0 -5
- package/lib/drama/skills/short-drama-assets/assets/prop-state.example.jsonl +0 -3
- package/lib/drama/skills/short-drama-assets/examples/minimal/characters.jsonl +0 -2
- package/lib/drama/skills/short-drama-assets/examples/minimal/looks.jsonl +0 -2
- package/lib/drama/skills/short-drama-assets/scripts/asset_check.py +0 -267
- package/lib/drama/skills/short-drama-assets/scripts/selftest.py +0 -89
- package/lib/drama/skills/short-drama-image-prompts/examples/minimal-image-prompt-specs.jsonl +0 -2
- package/lib/drama/skills/short-drama-image-prompts/scripts/image_prompt_check.py +0 -443
- package/lib/drama/skills/short-drama-image-prompts/scripts/selftest.py +0 -95
- package/lib/drama/skills/short-drama-review/assets/finding-template.jsonl +0 -2
- package/lib/drama/skills/short-drama-review/assets/supersession-decision.example.json +0 -42
- package/lib/drama/skills/short-drama-review/assets/verdict-template.json +0 -32
- package/lib/drama/skills/short-drama-review/examples/minimal-findings.jsonl +0 -2
- package/lib/drama/skills/short-drama-review/examples/minimal-verdict.json +0 -34
- package/lib/drama/skills/short-drama-review/scripts/review_check.py +0 -325
- package/lib/drama/skills/short-drama-review/scripts/selftest.py +0 -87
- package/lib/drama/skills/short-drama-storyboard/assets/coverage-audition.example.jsonl +0 -2
- package/lib/drama/skills/short-drama-storyboard/assets/revision-lineage.fragment.json +0 -12
- package/lib/drama/skills/short-drama-storyboard/assets/scene-visual-plan.example.jsonl +0 -2
- package/lib/drama/skills/short-drama-storyboard/scripts/selftest.py +0 -191
- package/lib/drama/skills/short-drama-storyboard/scripts/storyboard_check.py +0 -824
- package/lib/drama/skills/short-drama-video-prompts/assets/coverage-scope.fragment.json +0 -21
- package/lib/drama/skills/short-drama-video-prompts/assets/motion-terminal.example.jsonl +0 -2
- package/lib/drama/skills/short-drama-video-prompts/assets/performance.fragment.json +0 -38
- package/lib/drama/skills/short-drama-video-prompts/examples/minimal-music-specs.jsonl +0 -2
- package/lib/drama/skills/short-drama-video-prompts/scripts/container_check.py +0 -329
- package/lib/drama/skills/short-drama-video-prompts/scripts/motion_timing_check.py +0 -451
- package/lib/drama/skills/short-drama-video-prompts/scripts/music_spec_check.py +0 -327
- package/lib/drama/skills/short-drama-video-prompts/scripts/selftest.py +0 -82
- package/lib/drama/skills/short-drama-write/scripts/voice_sheet_check.py +0 -416
|
@@ -119,7 +119,10 @@ PACING_POINTER = "/format/pacing"
|
|
|
119
119
|
# Everything outside /creator_authority/* that a decision may still bind. Both
|
|
120
120
|
# are read by the write stage to turn a screenplay into seconds, so leaving them
|
|
121
121
|
# out of set-authority left hand-editing short-drama.json as the only way in.
|
|
122
|
-
|
|
122
|
+
EPISODE_COUNT_POINTER = "/format/episode_count"
|
|
123
|
+
# The episode count is often settled only once the episode map exists, after
|
|
124
|
+
# init; without a pointer it could only be hand-edited into the manifest.
|
|
125
|
+
FORMAT_POINTERS = (EPISODE_LENGTH_POINTER, PACING_POINTER, EPISODE_COUNT_POINTER)
|
|
123
126
|
RHYTHM_PROFILE_TOKENS = [AUTHORITY_ROOT_TOKEN, "rhythm_profile"]
|
|
124
127
|
# The project rhythm profile: what develop proposes and the creator accepts, so
|
|
125
128
|
# that later stages can do arithmetic on accepted numbers. Only types and ranges
|
|
@@ -271,6 +274,9 @@ def project_video_model_profile(project: Mapping[str, Any]) -> dict[str, Any]:
|
|
|
271
274
|
"native_duration_seconds",
|
|
272
275
|
"supported_generation_modes",
|
|
273
276
|
"audio_generation",
|
|
277
|
+
# The creator's choice to pack adjacent short shots into one
|
|
278
|
+
# generation; it answers the shot-length note below once made.
|
|
279
|
+
"multi_shot_containers",
|
|
274
280
|
)
|
|
275
281
|
return {field: choices[field] for field in fields if field in choices}
|
|
276
282
|
|
|
@@ -365,6 +371,48 @@ def project_rhythm_profile(project: Mapping[str, Any]) -> tuple[dict[str, Any],
|
|
|
365
371
|
return {name: profile[name] for name in RHYTHM_PROFILE_FIELDS}, []
|
|
366
372
|
|
|
367
373
|
|
|
374
|
+
def profile_notes(project: Mapping[str, Any]) -> list[str]:
|
|
375
|
+
"""Arithmetic conflicts between accepted settings that no single one shows.
|
|
376
|
+
|
|
377
|
+
Each value passes on its own; together they promise something a later
|
|
378
|
+
stage cannot deliver, and that stage is the first to find out.
|
|
379
|
+
"""
|
|
380
|
+
notes: list[str] = []
|
|
381
|
+
rhythm, _ = project_rhythm_profile(project)
|
|
382
|
+
model = project_video_model_profile(project)
|
|
383
|
+
native = model.get("native_duration_seconds")
|
|
384
|
+
shortest = native.get("min") if isinstance(native, Mapping) else None
|
|
385
|
+
average = rhythm.get("target_avg_shot_seconds")
|
|
386
|
+
if (
|
|
387
|
+
isinstance(shortest, (int, float))
|
|
388
|
+
and isinstance(average, (int, float))
|
|
389
|
+
and average < shortest
|
|
390
|
+
and model.get("multi_shot_containers") is not True
|
|
391
|
+
):
|
|
392
|
+
notes.append(
|
|
393
|
+
f"rhythm_profile.target_avg_shot_seconds {average:g} is below the target "
|
|
394
|
+
f"model's native minimum of {shortest:g} seconds: most shots will need "
|
|
395
|
+
"multi-shot containers, or the average must rise"
|
|
396
|
+
)
|
|
397
|
+
block = project.get("format")
|
|
398
|
+
pacing = block.get("pacing") if isinstance(block, Mapping) else None
|
|
399
|
+
target = block.get("target_seconds_per_episode") if isinstance(block, Mapping) else None
|
|
400
|
+
speech = pacing.get("spoken_characters_per_second") if isinstance(pacing, Mapping) else None
|
|
401
|
+
action = pacing.get("seconds_per_action_paragraph") if isinstance(pacing, Mapping) else None
|
|
402
|
+
# The same rule the write stage's estimator applies: a positive speech rate
|
|
403
|
+
# and a non-negative action-paragraph duration.
|
|
404
|
+
usable = (
|
|
405
|
+
isinstance(speech, (int, float)) and not isinstance(speech, bool) and speech > 0
|
|
406
|
+
and isinstance(action, (int, float)) and not isinstance(action, bool) and action >= 0
|
|
407
|
+
)
|
|
408
|
+
if isinstance(target, (int, float)) and not usable:
|
|
409
|
+
notes.append(
|
|
410
|
+
"format.target_seconds_per_episode is set but format.pacing has no usable rates: "
|
|
411
|
+
"the write stage cannot turn a screenplay into seconds"
|
|
412
|
+
)
|
|
413
|
+
return notes
|
|
414
|
+
|
|
415
|
+
|
|
368
416
|
def initialize_project(
|
|
369
417
|
path: Path,
|
|
370
418
|
*,
|
|
@@ -1029,6 +1077,7 @@ def _build_status(
|
|
|
1029
1077
|
"format": project_format(project),
|
|
1030
1078
|
"rhythm_profile": rhythm_profile,
|
|
1031
1079
|
"rhythm_profile_problems": rhythm_problems,
|
|
1080
|
+
"profile_notes": profile_notes(project),
|
|
1032
1081
|
"project_root": project_root,
|
|
1033
1082
|
"last_action": state.get("last_action"),
|
|
1034
1083
|
"layout": dict(layout),
|
|
@@ -1655,6 +1704,10 @@ def set_creator_authority(
|
|
|
1655
1704
|
isinstance(value, (int, float)) and not isinstance(value, bool) and value > 0
|
|
1656
1705
|
):
|
|
1657
1706
|
raise ValueError("target_seconds_per_episode must be a positive number of seconds")
|
|
1707
|
+
if field == EPISODE_COUNT_POINTER and not (
|
|
1708
|
+
isinstance(value, int) and not isinstance(value, bool) and value > 0
|
|
1709
|
+
):
|
|
1710
|
+
raise ValueError("episode_count must be a positive integer")
|
|
1658
1711
|
project_path = root / PROJECT_FILE
|
|
1659
1712
|
project = json.loads(project_path.read_text(encoding="utf-8"))
|
|
1660
1713
|
if not isinstance(project, dict):
|
|
@@ -31,7 +31,7 @@ license: MIT
|
|
|
31
31
|
3. 对每项决定新建、复用、增加变体或标记未决;含混指代不猜。
|
|
32
32
|
4. 写最小可识别设定:统一使用 `识别锚点`、本集状态和变化原因;会持续限制后续动作的身体—物件—空间关系写进有生效范围的状态,不当成一次姿势略过。
|
|
33
33
|
5. 检查造型/伤势、持物/所有权、道具状态、地点时段/天气/光态与跨集结束状态。
|
|
34
|
-
6.
|
|
34
|
+
6. 给跨镜出现且观众看得出不一致的可见事实写一条连续性锁,其余保持识别锚点即可。此时还没有分镜,镜头范围写 `入画`,锁写在它所属的条目下(服装写在 `造型` 条目下),分镜写完后自动按「视觉依据」生效,见 [连续性锁](references/continuity-lock.md)。
|
|
35
35
|
7. 项目提示词语言不是中文时,给每个人物条目写一行 `画面代称:<正文里的拼写>`;正文从不点名它就写 `画面代称:无`。地点和道具按需。
|
|
36
36
|
8. 整集请求自动处理完整集,末端一次回报关键身份决定和未决指代。
|
|
37
37
|
|
|
@@ -70,8 +70,4 @@ license: MIT
|
|
|
70
70
|
|
|
71
71
|
所有明确出场都已复用、新建、变体化或标为真实未决;需要保持的视觉事实与状态变化已写入唯一
|
|
72
72
|
视觉设定文档,即完成。图片提示词、分镜、审查和生产不自动开始。
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
## 安装维护
|
|
76
|
-
|
|
77
|
-
只有安装、升级或排障时运行 `python3 scripts/selftest.py`。
|
|
73
|
+
写完本阶段文档后,可转 `$short-drama` 做局部机械核对(只核对已有文档);五份齐备后再做完整核对。内容质量仍由创作者审查。
|
|
@@ -84,7 +84,8 @@ sweater`),但不能改写锁面内部——少一个 `stand-collar`、多一
|
|
|
84
84
|
报成语法错误,不会被悄悄跳过——锁不能变成空转;
|
|
85
85
|
- `LOCK-...`:本集唯一稳定 ID,与 `IMG-...`、`REF-...`、`SHOT-...` 互不混用;
|
|
86
86
|
- `《中文名》`:给创作者读的名称,必须含中文;
|
|
87
|
-
-
|
|
87
|
+
- `镜头:`:`入画`、`全集`,或 `、` 分隔的 `SHOT-...` 列表;三者不能混写。`入画` 由检查器展开成「视觉依据」
|
|
88
|
+
列出本条目的所有镜头,所以锁要写在它所属的人物、造型、地点或道具条目下面;
|
|
88
89
|
- `图片提示词项:`:可选,`、` 分隔的 `IMG-...` 列表,整段省略即表示不约束图片提示词;
|
|
89
90
|
- `锁面:`:被逐字带走的那段字,写在行尾。
|
|
90
91
|
|
|
@@ -110,13 +111,18 @@ sweater`),但不能改写锁面内部——少一个 `stand-collar`、多一
|
|
|
110
111
|
- `锁面:high quality, detailed`——不是可辨识事实,锁住了也证明不了一致;
|
|
111
112
|
- 只把锁的 `镜头` 范围写到「文字已经对的那几镜」——范围要按这个事实**实际出现在哪几镜**来写,
|
|
112
113
|
按已经写对的地方来写,等于把校验器指向没有风险的位置;
|
|
113
|
-
- 把 `镜头:全集`
|
|
114
|
+
- 把 `镜头:全集` 用在只出现两镜的道具上——其余镜头会被迫写入与本镜无关的名词。用 `入画`。
|
|
115
|
+
- 把服装锁写在人物条目下并用 `入画`——手部特写、眼部大特写也列这个人物,会被迫写进看不见的衣服。
|
|
116
|
+
服装锁写在 `造型` 条目下,分镜只在衣服入画时列这个造型。
|
|
114
117
|
|
|
115
118
|
## 校验
|
|
116
119
|
|
|
117
120
|
```bash
|
|
118
|
-
python3 <core 技能目录>/scripts/creator_markdown_check.py 剧集/<EP> --project-root .
|
|
121
|
+
python3 <core 技能目录>/scripts/creator_markdown_check.py 剧集/<EP> --project-root . --partial
|
|
119
122
|
```
|
|
120
123
|
|
|
124
|
+
资产阶段只有剧本、视觉设定和图片提示词时,`--partial` 照样核对锁的语法和被点名的 `IMG-...` 正文;
|
|
125
|
+
镜头范围在分镜写完后自动生效,不需要回来改锁。
|
|
126
|
+
|
|
121
127
|
它只机械核对语法、范围可解析,以及锁面是否真的出现在被点名的正文里。该不该上这把锁、锁面写得
|
|
122
128
|
准不准,仍由创作者和审查判断。
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
## 合成例
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
原著:主角在城郊外卖站点跑单,用手机抢单、看直播带货,下班后在出租屋里刷热搜。
|
|
35
35
|
|
|
36
|
-
-
|
|
37
|
-
-
|
|
36
|
+
- 错:「九十年代的小饭馆门口,骑二八自行车,腰上别着 BP 机」——原著里没有一处支撑。
|
|
37
|
+
- 对:时代锚点写当下;站点条目写电动车充电桩、智能取餐柜、头盔架;手机写全面屏智能手机,装着骑手接单 App。
|
|
@@ -23,6 +23,10 @@ Location/View 分别记录空间身份和可复用视图,让参考图、分镜
|
|
|
23
23
|
“潮湿、压迫、怀旧”可以辅助气氛,却不能替代“北门通走廊、窗口面向河面、配电箱
|
|
24
24
|
在柜台后”这样的地理事实。也不能为了画面好看新增一扇后来影响追逐路线的门。
|
|
25
25
|
|
|
26
|
+
地点里的方位用锚点互相定位(“窗在书柜墙靠门的一端”“门正对办公桌”),或用场景自己的
|
|
27
|
+
方向(北门、东窗),不写裸的“左侧大窗”“门在左后角”:不说站在哪里看,左右就会在反打
|
|
28
|
+
镜头里对调,下游只能猜。只有 View 已经写明从哪里朝哪里看时,才在 View 里用画面左右。
|
|
29
|
+
|
|
26
30
|
## Location 边界
|
|
27
31
|
|
|
28
32
|
### 新 Location
|
|
@@ -91,8 +91,8 @@ development,避免交付包把输入材料带出边界。
|
|
|
91
91
|
场景合并还要保留戏剧作用、知情范围、关系位置和因果桥。“人更少”不能单独证明合并成功。
|
|
92
92
|
|
|
93
93
|
立场与性情指这个人对主角是帮、是压还是观望,为什么,以及他做事的方式。压力可以放大、外化:
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
原著里嘴硬心软、只是不信徒弟能成的老师傅,可以把不信当众说出来,成为第一个看走眼的人;改成处处
|
|
95
|
+
使绊子、暗中拆台的对手,就换了一个人。改人物立场或关系不是换载体:映射按实际处理登记,在
|
|
96
96
|
`lost_or_changed` 写明改了什么,`creator_acceptance.status` 保持 `pending`,把提议写进简报交创作者决定。
|
|
97
97
|
|
|
98
98
|
为候选人物、场景和信息记录它承担的功能:
|
|
@@ -258,7 +258,7 @@ C 让状态 D 改变,迫使人物放弃旧策略或付出更大代价;
|
|
|
258
258
|
冷开常见的三条否决理由,多半是把冷开做成了兑现本身:
|
|
259
259
|
|
|
260
260
|
- 「观众还不认识这些人,看不懂」:冷开取的是冲突最尖的那一下,要的是一眼读得懂的处境——一群人
|
|
261
|
-
|
|
261
|
+
堵在门口拍门、一张被火光照亮的脸,不需要知道谁是谁;
|
|
262
262
|
- 「会把后面的兑现提前花掉」:取揭晓前一秒时答案留在原位;取最后一拍时只放结果的一个画面,
|
|
263
263
|
不放来龙去脉,观众追的是「怎么走到这一步」;
|
|
264
264
|
- 「同一拍会在集中段再演一遍」:开场给片段,回到原位时给完整的一场,观众得到的是认出来的快感,
|
|
@@ -344,9 +344,9 @@ C 让状态 D 改变,迫使人物放弃旧策略或付出更大代价;
|
|
|
344
344
|
|
|
345
345
|
| 写成功能(不够) | 写成动作(够) |
|
|
346
346
|
| --- | --- |
|
|
347
|
-
| 他不再讲道理,用自己的信用担保 |
|
|
348
|
-
|
|
|
349
|
-
| 上级选择维持现状 |
|
|
347
|
+
| 他不再讲道理,用自己的信用担保 | 债主当着全村人催他还钱,有人跟着起哄;他不再求情,把自家祖屋的房契拍在桌上 |
|
|
348
|
+
| 裁决权从立场转移到证据本身 | 刚才嚷着要报警的村长俯下身,看清了房契上的名字 |
|
|
349
|
+
| 上级选择维持现状 | 车间主任把调岗申请推回来,说等这批货交了再谈 |
|
|
350
350
|
|
|
351
351
|
左栏的功能描述本身可以成立,结构校验也无法据此判断动作是否具体;这一缺口仍须由
|
|
352
352
|
`STY-24` 的语义审查指出。只交左栏会让剧本层重新发明行动,右栏则提供了可继续场景化的依据。
|
|
@@ -528,6 +528,21 @@ C 让状态 D 改变,迫使人物放弃旧策略或付出更大代价;
|
|
|
528
528
|
这些是起点,不是质量线。靠旁白推进的解说漫可以把 `vo_share_max` 调高;生活流、留白多的
|
|
529
529
|
作品可以放宽触点间隔和镜长。改哪一项、为什么,写进创作简报交创作者决定。
|
|
530
530
|
|
|
531
|
+
提出档案时还要对照两件已经定下或马上要定的事,否则冲突要到分镜阶段才第一次暴露:
|
|
532
|
+
|
|
533
|
+
- **目标视频模型的原生最短时长**。`target_avg_shot_seconds` 低于它(例如平均 2.5 秒对 Seedance 2.0
|
|
534
|
+
的最短 4 秒)时,多数镜头只能装进多镜容器一起生成,或者把平均镜长调高。两条路对剧本和分镜的
|
|
535
|
+
影响不同,在简报里写明选哪条,交创作者决定。
|
|
536
|
+
- **语速**。档案里的秒数(首钩、触点间隔、单集目标时长)要在写作阶段换算成秒,需要项目声明
|
|
537
|
+
`format.pacing`:每秒可发声字数和每段动作的秒数。和档案一起提出一组起点(按目标模型的实测语速,
|
|
538
|
+
例如 H3 约 4.1 字/秒),由创作者接受。没有声明时写作阶段只能报可数事实,算不出秒数。
|
|
539
|
+
|
|
540
|
+
`end_on_peak` 为 `true` 时,集尾停在峰值那一拍,峰值后不再缓一段。连载的下一集压力要落在
|
|
541
|
+
这一拍上:选峰值时,优先选能同时启动 `outgoing_pressure` 的一刻——新危机落下、对手出手、
|
|
542
|
+
没人知道的后果已经开始——而不是情绪已经收束的完成态。情绪高点与下一集的压力分属两拍时,
|
|
543
|
+
让它们同时发生(同一刻切到另一处正在发生的后果),不要删掉压力那一拍。`handoff_state`
|
|
544
|
+
写峰值那一刻的状态,不写峰值之后的余波。
|
|
545
|
+
|
|
531
546
|
**`craft_default · STY-26`**:按制作形态从上表起步提出项目节奏档案,交创作者接受或改写;
|
|
532
547
|
默认值只是起点,不是套件级门槛,未接受的档案不作为任何核对依据。
|
|
533
548
|
|
|
@@ -14,7 +14,7 @@ basis: 套件既有工艺文件与短剧写作经验归纳
|
|
|
14
14
|
|
|
15
15
|
## 压力来源与冲突发动机
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
压力主要来自对手,不来自系统的代价。对手的压迫要落成一件当众做过的事:在饭局上当众把菜单扔回去、在参赛名单上划掉主角的名字、放话「拿不到名次就别回来」。压迫越具体,打脸落下时的高度差越大。改编时对手优先取原著人物;原著此处没有时按 STY-30 登记新增并交创作者。系统任务的时限与失败后果是第二层压力,按契约披露,不要写成一条替代爽感的焦虑条款。发动机:对手按表面判断下注,主角手里有对手看不见的底牌,结果当众揭晓。
|
|
18
18
|
|
|
19
19
|
## 人物策略与信息权限
|
|
20
20
|
|
|
@@ -86,7 +86,7 @@ license: MIT
|
|
|
86
86
|
|
|
87
87
|
| 样式 | 各项的位置 |
|
|
88
88
|
|---|---|
|
|
89
|
-
| `卡片` |
|
|
89
|
+
| `卡片` | 每项一行:第一个词是名称,最后一个词是数值,中间的词是单位(`本月 订单 128|退货 3`) |
|
|
90
90
|
| `系统面板` | 第一项是状态行,逐字打出;其余是奖励行 |
|
|
91
91
|
| `任务面板` | 标题、目标(逐字打出);其后写成 `<数> / <数>` 的一项是进度,其余是奖励标签 |
|
|
92
92
|
| `角标` | 各项连成一行标签 |
|
|
@@ -214,7 +214,8 @@ SHOT_MATCH_SAMPLE = "fps=4,scale=64:-2"
|
|
|
214
214
|
STORYBOARD_DOCUMENT = "分镜.md"
|
|
215
215
|
SHOT_HEADING = re.compile(r"^##\s+(SHOT-[^\s·]+)")
|
|
216
216
|
SHOT_REFERENCE = re.compile(r"SHOT-[A-Za-z0-9-]+")
|
|
217
|
-
|
|
217
|
+
# The same scene-id shape the cross-document checker accepts, season prefix included.
|
|
218
|
+
SCENE_ID = re.compile(r"(?:[A-Za-z0-9]+-)+SC[0-9]+")
|
|
218
219
|
# verify reads the delivered film at this size in grey, one value per pixel.
|
|
219
220
|
FRAME_PROBE_SIZE = (90, 160)
|
|
220
221
|
# A frame is suspect when it differs from both neighbours by more than this
|
|
@@ -1533,11 +1534,32 @@ def render(
|
|
|
1533
1534
|
"".join(f"file '{segment.as_posix()}'\n" for segment in segments), encoding="utf-8"
|
|
1534
1535
|
)
|
|
1535
1536
|
joined = output_root / "成片-未混音.mp4"
|
|
1536
|
-
#
|
|
1537
|
-
#
|
|
1538
|
-
#
|
|
1539
|
-
|
|
1540
|
-
|
|
1537
|
+
# Pictures are stream-copied, but sound is not: every AAC segment opens
|
|
1538
|
+
# with an encoder-priming frame, and copying the segments end to end
|
|
1539
|
+
# left that frame as a ~32 ms dropout at each cut. The segments are
|
|
1540
|
+
# decoded to PCM, joined sample-exact, and encoded once.
|
|
1541
|
+
picture_track = Path(scratch) / "pictures.mp4"
|
|
1542
|
+
_run([ffmpeg, "-hide_banner", "-loglevel", "error", "-y",
|
|
1543
|
+
"-f", "concat", "-safe", "0", "-i", str(listing), "-map", "0:v",
|
|
1544
|
+
"-c", "copy", str(picture_track)])
|
|
1545
|
+
sound_listing = Path(scratch) / "sound.txt"
|
|
1546
|
+
pieces = []
|
|
1547
|
+
for index, (segment, length) in enumerate(zip(segments, spans)):
|
|
1548
|
+
piece = Path(scratch) / f"{index:04d}.wav"
|
|
1549
|
+
# A decoded AAC segment also runs into its last frame's padding;
|
|
1550
|
+
# cut (or pad) every piece to the length its picture holds.
|
|
1551
|
+
_run([ffmpeg, "-hide_banner", "-loglevel", "error", "-y", "-i", str(segment),
|
|
1552
|
+
"-map", "0:a", "-af", "apad", "-t", f"{length:.6f}",
|
|
1553
|
+
"-c:a", "pcm_s16le", str(piece)])
|
|
1554
|
+
pieces.append(piece)
|
|
1555
|
+
sound_listing.write_text(
|
|
1556
|
+
"".join(f"file '{piece.as_posix()}'\n" for piece in pieces), encoding="utf-8"
|
|
1557
|
+
)
|
|
1558
|
+
_run([ffmpeg, "-hide_banner", "-loglevel", "error", "-y",
|
|
1559
|
+
"-i", str(picture_track),
|
|
1560
|
+
"-f", "concat", "-safe", "0", "-i", str(sound_listing),
|
|
1561
|
+
"-map", "0:v", "-map", "1:a", "-c:v", "copy",
|
|
1562
|
+
"-c:a", "aac", "-b:a", "192k", str(joined)])
|
|
1541
1563
|
|
|
1542
1564
|
effects: list[Placed] = []
|
|
1543
1565
|
placed = (
|
|
@@ -224,7 +224,7 @@ def check_multi_subtitle() -> None:
|
|
|
224
224
|
root = Path(scratch)
|
|
225
225
|
episode = build(root, CUT_LIST)
|
|
226
226
|
(episode / "剧本.md").write_text(
|
|
227
|
-
SCREENPLAY + "\n
|
|
227
|
+
SCREENPLAY + "\n许棠:就是什么。\n许棠:就是少了点东西。\n许棠:少了什么。\n",
|
|
228
228
|
encoding="utf-8",
|
|
229
229
|
)
|
|
230
230
|
multi = CUT_LIST.replace(
|
|
@@ -71,8 +71,4 @@ license: MIT
|
|
|
71
71
|
每个点名对象都有明确用途、可复制正文、参考边界和禁止项,且相互不矛盾,即完成。本次请求同时
|
|
72
72
|
修改图片提示词与分镜时,当轮刷新受影响镜头的「图片提示词项」,不另建对账产物。实际生成必须
|
|
73
73
|
转 `$short-drama-produce`,展示精确任务并取得显式确认;本技能不调用外部服务。
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
## 安装维护
|
|
77
|
-
|
|
78
|
-
只有安装、升级或排障时运行 `python3 scripts/selftest.py`。
|
|
74
|
+
写完本阶段文档后,可转 `$short-drama` 做局部机械核对(只核对已有文档);五份齐备后再做完整核对。内容质量仍由创作者审查。
|
|
@@ -145,12 +145,12 @@
|
|
|
145
145
|
| 绰号 | 外号,须有同指证据 | 是(证据充分时) | 「城东那位」经文中点明即为某人 |
|
|
146
146
|
| 描述性称谓 | 按外形或角色描述 | **否** | 「红衣女子」「随从」 |
|
|
147
147
|
| 头衔职务 | 泛指某个职位的称呼 | **否** | 「护卫队长」「家主」 |
|
|
148
|
-
| 姓氏+头衔 | 带姓氏或名的称呼 | 是(证据充分时) |
|
|
148
|
+
| 姓氏+头衔 | 带姓氏或名的称呼 | 是(证据充分时) | 「李队」「陈记者」「王厂长」 |
|
|
149
149
|
|
|
150
150
|
绰号与姓氏+头衔的合并都需要可指出的同指证据:同位说明、括号别名、上下文明确指代、
|
|
151
151
|
文中改名。「读起来像同一个人」不是证据。
|
|
152
152
|
|
|
153
|
-
|
|
153
|
+
**姓氏+头衔单列一类,因为中文叙事里它常常是最主要的称呼方式**。「李队」「陈记者」
|
|
154
154
|
出现频次可能远高于全名,而它们带着姓氏,指向性与绰号相当——按「头衔职务」一律禁止合并,
|
|
155
155
|
一部书会留下十几条重复实体。真正不可合并的是**不带姓名的泛指**:「护卫队长」「家主」
|
|
156
156
|
可以先后由不同人担任,同一部书里换了人也看不出来。
|
|
@@ -102,6 +102,8 @@ python3 <本技能目录>/scripts/production_tool.py audit <project>
|
|
|
102
102
|
`reference_video + reference_image`。当前 creator-first 来源选择器只解析图片与角色参考音频,
|
|
103
103
|
尚不能声明续接视频,因此这条内置生产路径不能提交续接段。报告接口缺口并保留已选路线,
|
|
104
104
|
不省略来源选择器、不拿计划尾帧冒充真实输入,也不擅自改为独立文生视频。
|
|
105
|
+
`视频提示词.md` 里的 `GROUP-*` 多镜分组正文同样还不能作为来源:选择器只认 `MOTION-*`。创作者要提交分组时,
|
|
106
|
+
把分组正文复制到自己的生成工具;不要拿某个成员的 `MOTION-*` 代替整组提交。
|
|
105
107
|
- **tts**:从 `剧本.md` 读取原句与表演要求,声音参考由用户或现有媒体明确提供。不得在生产 job
|
|
106
108
|
中改词,也不为 TTS 新建第六份创作文档。表演要求来自这句台词的括注和上下文。外部执行端若把
|
|
107
109
|
prompt 解释为含表演指令的输入,可在台词前写一句语气说明(「憋屈地压低声音,咬着牙应一声:是。」);
|
|
@@ -178,7 +178,7 @@ H3 无非画内配乐时,`non_diegetic_music: N/A` 是有效的空形式。
|
|
|
178
178
|
- 每个镜头为什么独立存在,改变了什么注意、压力、信息或观看位置?
|
|
179
179
|
- 建立镜头、反应镜、插入镜头或重新解释前镜的镜头是否有职责,而不是凑数量?
|
|
180
180
|
- 关键帧是否只有一个可冻结时刻?每张关键帧是否声明了它冻结的是哪一端,并绑定该镜头
|
|
181
|
-
对应的边界字段(`SHT-17
|
|
181
|
+
对应的边界字段(`SHT-17`)?**尾帧是「终点」的投影,不是第二个终点权威**——
|
|
182
182
|
尾帧与镜头终点不一致时,缺陷记在尾帧上。首帧是否只写 start 事实、尾帧是否只写 end
|
|
183
183
|
事实,两张有没有互相借用?**关键帧数量不是检查项**:默认一张首帧,只在交付工作流真的
|
|
184
184
|
消费尾帧时才有第二张,缺尾帧本身不是缺陷。
|
|
@@ -52,11 +52,12 @@ license: MIT
|
|
|
52
52
|
先用已接受集长换成明确时间边界再分镜;例如 60 秒作品的“后半段首次出现”不得早于 30 秒。
|
|
53
53
|
3. 每镜写清唯一职责、来源、时长、景别/机位、运镜、起点、唯一主要动作、终点和声音;用
|
|
54
54
|
`起点 → 唯一动作 → 终点` 直接说明人物、双手与持物怎样完成本镜状态转换。三条依据留到第 6 步。
|
|
55
|
+
数一下这一镜要观众看清的事,按镜长判断每件有没有足够的时间被看清;放不下时先删、合并或拆镜,见 [短镜头的动作量](references/shot-craft.md#短镜头的动作量-sht-03):视频模型不会删掉多出来的动作,而是把它们压到看不清。
|
|
55
56
|
「运镜」按本镜目的逐镜选,写行为和理由,固定也写理由,见 [运镜逐镜选](references/shot-craft.md#运镜逐镜选-sht-04)。
|
|
56
57
|
有对白、VO 或 OS 时,先按原文和人物说话方式估算完整发声时间,再安排不能重叠的动作、停顿与
|
|
57
58
|
末尾反应;把估时依据简写在本镜「声音」里。具体做法见 [对白估时](references/shot-craft.md#对白估时)。
|
|
58
59
|
对白场先按 [对白覆盖默认](references/shot-craft.md#对白场怎么切-sht-29) 放切点;镜长不按剧本字数折算。
|
|
59
|
-
4.
|
|
60
|
+
4. 一场戏拍成多镜时,先在《分镜.md》开头写这场的「场景站位」:固定锚点、各人相对锚点与彼此的位置、轴线与 working side、哪一镜改变站位。再逐镜锁定朝向、位置、视线、持物、出入口和必要状态,与「场景站位」一致;起点、终点里的位置写锚点和人物关系,视线写看向谁或什么;冻结关键帧再把它翻成本镜机位下的前后景、朝向、中间隔着什么和画面左右,见 [站位先写锚点和关系](references/blocking-playbooks.md#站位先写锚点和关系)。上游已有会限制动作空间的持续关系时,把关系投影进本镜起点与终点。
|
|
60
61
|
5. 冻结关键帧只投影镜头起点;删除终点才出现的文字、动作、姿态或道具状态。
|
|
61
62
|
镜头的职责落在收尾那一下时,另写 `### 收尾关键帧提示词` 投影**终点**——同一格画面的
|
|
62
63
|
另一端,规则完全对称:删除起点才有、终点已经不在的东西。它是可选的,写法与取舍见
|
|
@@ -73,6 +74,7 @@ license: MIT
|
|
|
73
74
|
只有创作者明确表示不用图时,才写「无(创作者已明确选择文生视频)」。
|
|
74
75
|
|
|
75
76
|
三条依据读的是同一格画面,所以不能互相矛盾:关键帧里点名的人物或道具,一定出现在视觉依据里。
|
|
77
|
+
目标模型的参考槽位有上限(Seedance 2.0 全模态参考最多 9 张图)时,输入参考图按失去它的代价从高到低保留:起始帧、正在说话或做主要动作的人物、必须认得出的道具、地点、其余入画人物、定调图;放弃的那些写明,必要事实进关键帧正文。
|
|
76
78
|
7. 整集请求完成整集,末端一次报告覆盖、节奏和真实未决选择。
|
|
77
79
|
|
|
78
80
|
## 镜头要求
|
|
@@ -86,10 +88,12 @@ license: MIT
|
|
|
86
88
|
- 剧本里的每个场景都要有镜头承载。确实决定不拍某一场时,在《分镜.md》正文开头写一行
|
|
87
89
|
`- 未拍场次:<场景 ID>(理由:……)`,多项用 `;` 连接。省略理由必须留在成稿文档中,供下游区分有意省略与遗漏(SHT-01)。
|
|
88
90
|
- 已声明原生时长时,每镜照常有自己的唯一职责、起止边界和冻结关键帧,镜长先按叙事需要定。短于最短秒数
|
|
89
|
-
|
|
91
|
+
的镜头,向创作者提议把同场相邻的几镜装进一个多镜容器;创作者同意后由 `$short-drama` 在生产档案里写入 `multi_shot_containers: true`;目标方言要求时,容器的每一切
|
|
90
92
|
都要有已接受的关键帧图片,能否装、怎么装由 `$short-drama-video-prompts` 的方言决定。创作者没有声明
|
|
91
93
|
多镜容器、或方言不支持时,镜头落在最短秒数内,动作完成后保持终点。长于上限的动作按可见状态闭合点拆镜,
|
|
92
|
-
|
|
94
|
+
拆出的每镜仍各有唯一职责与可信交界。目标模型只收整数秒(如 Seedance 2.0 手动时长)时,单独生成的镜头写
|
|
95
|
+
整数秒;准备装进同一个多镜容器的短镜可以写半秒,但同一容器的成员加起来必须是整数秒,在分镜阶段就排好,
|
|
96
|
+
不留到视频提示词阶段分组时才发现凑不齐。
|
|
93
97
|
- 「唯一动作」写从本镜起点到终点的那条可见状态链;涉及交接、换手、放置或取回时,把接触者、
|
|
94
98
|
接触方式和物件落点写在同一链里,不能让合法终点之间靠镜外瞬移衔接。
|
|
95
99
|
- 切镜必须带来信息、权力、情绪、空间或节奏变化;同义重复镜头删掉。
|
|
@@ -97,7 +101,7 @@ license: MIT
|
|
|
97
101
|
写出该边界,不把“稍后”“交接后”等叙事顺序当成数值时间的替代。
|
|
98
102
|
- 同一动作不跨镜重复发生,峰值处声明过的[冲击重复](references/shot-craft.md#动作落实表)除外;终点应能成为下一镜可信起点。
|
|
99
103
|
- 关键信息的可读性优先于装饰性运镜,竖屏构图优先保证主体和反应可见。
|
|
100
|
-
-
|
|
104
|
+
- 复杂群戏先在「场景站位」里锁空间锚点、人物位置和轴线,再决定景别变化。
|
|
101
105
|
- 起终边界除了逐人姿态,还要写清本镜依赖的身体—物件—空间关系。关系在镜内不变时两端都保留;确需改变时,过程与终点必须有剧本依据。
|
|
102
106
|
- 冻结关键帧只写该瞬间能看见的内容;文字、手指、反射和遮挡要可生成。
|
|
103
107
|
- 近景类关键帧挂着地点板生成时,图片常被拉宽成中远景;正文写具体取景(画面切在哪、脸在画面哪里、机位距离),出图仍偏宽就这一镜不挂地点板,把背景写进正文。
|
|
@@ -176,8 +180,4 @@ license: MIT
|
|
|
176
180
|
还没有条目的可见物件,在末尾报告里逐项点名。本次请求同时修改
|
|
177
181
|
《图片提示词.md》与《分镜.md》时,当轮刷新受影响镜头的引用;不另建覆盖表。
|
|
178
182
|
视频提示词、生产和审查只有用户点名时开始。
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
## 安装维护
|
|
182
|
-
|
|
183
|
-
只有安装、升级或排障时运行 `python3 scripts/selftest.py`。
|
|
183
|
+
写完本阶段文档后,可转 `$short-drama` 做局部机械核对(只核对已有文档);五份齐备后再做完整核对。内容质量仍由创作者审查。
|
|
@@ -65,31 +65,61 @@
|
|
|
65
65
|
|
|
66
66
|
分镜阶段先核对已声明遮挡区,交付前再放到实际播放面复核,避免关键帧和视频完成后才发现关键信息被压住。
|
|
67
67
|
|
|
68
|
-
## 1b.
|
|
68
|
+
## 1b. 站位、轴线与正反打
|
|
69
|
+
|
|
70
|
+
### 站位先写锚点和关系
|
|
71
|
+
|
|
72
|
+
**`SHT-30 · craft_default`**:站位分两层写。
|
|
73
|
+
|
|
74
|
+
- **分镜的「场景站位」与每镜起点、终点**,用场景里不动的东西和人物之间的关系来写——坐在办公桌后、
|
|
75
|
+
背对窗、在门与桌之间、隔着桌子与赵经理相对、在她身后半步。“画面左侧”只在一个机位下成立,
|
|
76
|
+
反打、换景别就要重算;“在桌后、面对门”整场戏都成立,下一镜可以原样继承。
|
|
77
|
+
- **冻结关键帧和视频提示词**,把这些关系翻成本镜机位下看得见的样子:机位在哪、谁在前景谁在后景、
|
|
78
|
+
谁面对镜头谁背对镜头、两人之间隔着什么、各自在画面哪一侧。只写“隔着桌子相对”这类抽象关系,
|
|
79
|
+
模型不一定照做:同一个“走到桌前、隔桌与他相对”的意图,只写关系时 Seedance 2.0 九次都把人放到了
|
|
80
|
+
桌子同侧;写成“机位在桌前,她走进前景、背对镜头停在桌子这一边,桌子在她和他之间”后,三次都对。
|
|
81
|
+
简单的画面左右(“男人在画面左侧,她从右侧进门”)在同一组测试里全部被遵循,可以作为构图写进提示词。
|
|
82
|
+
图生视频时站位由起始帧决定,正文不必再重申。
|
|
83
|
+
|
|
84
|
+
视线写看向谁或什么(“看着赵经理”“盯着桌上的工牌”),不只写看向画面哪一侧:只写方向时,
|
|
85
|
+
下一镜和下游都不知道那边是谁。单人镜头里目标在画外时,写明看的是谁,同时保留画面方向
|
|
86
|
+
(“看向画外左侧门口的赵经理”):正反打靠两镜视线方向互补才接得上。
|
|
87
|
+
|
|
88
|
+
- ✅ 场景站位:`沈一舟坐在办公桌后,面对门;赵经理站在门口,与他隔着桌子相对`
|
|
89
|
+
- ✅ 关键帧:`机位在门口,赵经理背对镜头站在前景,办公桌在她和沈一舟之间,沈一舟坐在桌后看着她`
|
|
90
|
+
- ✅ `沈一舟看向画外左侧门口的赵经理`(单人镜头,目标在画外:写明是谁,并保留方向)
|
|
91
|
+
- ❌ 场景站位:`沈一舟站在画面左三分之一处,赵经理占画面右侧`(只说了一格的构图,换机位就失效)
|
|
92
|
+
- ❌ 关键帧:`赵经理与沈一舟隔桌相对`(没说机位和前后景,模型常把两人放到桌子同侧)
|
|
93
|
+
- ❌ `沈一舟看向画右`(看向谁?)
|
|
69
94
|
|
|
70
95
|
### 左右的唯一读法
|
|
71
96
|
|
|
72
97
|
**`structural_invariant`**:本套件所有产物里,**裸写的"左/右"一律指画面左右**(观众看到的
|
|
73
98
|
左右)。指人物自身的左右时必须带主体——"他的左手""她的右肩"。两种读法混用是正反打
|
|
74
|
-
|
|
99
|
+
最常见的失效来源,因为单看每一句都成立。场景里的固定方位不用裸写的左右,而用锚点互相定位
|
|
100
|
+
(“窗在书柜墙靠门的一端”),因为从不同机位看,同一扇窗会落在画面不同侧。
|
|
75
101
|
|
|
76
|
-
- ✅
|
|
102
|
+
- ✅ `构图:沈一舟在画面左,赵经理在画面右`(明说是画面方位,用于构图与轴线核对)
|
|
77
103
|
- ✅ `秘书把工牌递到他的右手边`(带主体,指人物右手)
|
|
78
104
|
- ❌ `秘书从右侧接近`(谁的右?下游只能猜)
|
|
79
105
|
|
|
80
|
-
###
|
|
106
|
+
### 场景站位
|
|
81
107
|
|
|
82
|
-
|
|
83
|
-
|
|
108
|
+
一场戏开拍前,在《分镜.md》开头为它写一段「场景站位」,后面每一镜从这里继承站位,
|
|
109
|
+
只在镜头里写本镜相对它的变化:
|
|
84
110
|
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
111
|
+
```markdown
|
|
112
|
+
## 场景站位 · EP003-SC002 · 财务室
|
|
113
|
+
- 固定锚点:办公桌在房间中央;保险柜靠背墙;百叶窗在一侧墙上,门在对面的侧墙
|
|
114
|
+
- 人物:赵经理坐在办公桌后,背靠保险柜;沈一舟站在桌前,与赵经理隔桌相对
|
|
115
|
+
- 轴线:赵经理 ↔ 沈一舟(隔桌连线);working side:百叶窗一侧
|
|
116
|
+
- 屏幕方向:机位在窗一侧时,赵经理在画面右,沈一舟在画面左
|
|
117
|
+
- 变化:SHOT-EP003-017 沈一舟走到窗边,背对赵经理
|
|
89
118
|
```
|
|
90
119
|
|
|
91
|
-
|
|
92
|
-
|
|
120
|
+
判据是:换一个人来拍这场戏的任何一镜,他只读这一段和本镜的起点,能不能把人和机位放对。
|
|
121
|
+
写成 `<working side>` 这类占位等于没写。逐镜核对时比较的是这一段,而不只是上一镜:只和
|
|
122
|
+
上一镜比,每次一点小偏差会一路累积下去。只有一镜的场次、或镜头里已经把站位写全时可以不写。
|
|
93
123
|
|
|
94
124
|
### 正反打的配对规则
|
|
95
125
|
|
|
@@ -191,7 +221,7 @@ working side:摄影机常驻红毯一侧
|
|
|
191
221
|
不能只因为“仍是同一城门”,就绑定门内朝外的视角。选择前逐项比较摄影机所在一侧、
|
|
192
222
|
可见锚点、朝向、时段、天气和光线;缺少合适视角时,向资产技能请求新版本。
|
|
193
223
|
|
|
194
|
-
|
|
224
|
+
每次切镜前后比较(站位先对照本场的「场景站位」,再对照上一镜):
|
|
195
225
|
|
|
196
226
|
- 位置、面向和目光。
|
|
197
227
|
- 左右手与持有道具。
|
|
@@ -90,12 +90,12 @@ instead of inventing a hidden candidate state.
|
|
|
90
90
|
|
|
91
91
|
## 尾帧:什么时候可以有,以及它换来什么代价(`SHT-17`)
|
|
92
92
|
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
默认每镜一张首帧,冻结「起点」。交付工作流需要首尾帧时,再补一张投影
|
|
94
|
+
「终点」的尾帧;两帧之间的运动仍按分镜边界和运动提示词实现。
|
|
95
95
|
|
|
96
96
|
**`structural_invariant`**:《分镜.md》的首帧与收尾关键帧分别指向同一镜头已接受的起点与终点。
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
**尾帧是「终点」的投影,
|
|
98
|
+
不是新的终点事实**——它与首帧对「起点」的关系完全一样:可以决定这一帧怎么构图、
|
|
99
99
|
用什么景别镜头、光怎么落,不能决定人在哪、手里有什么、看着谁。尾帧与镜头终点不一致时,
|
|
100
100
|
错的是尾帧。
|
|
101
101
|
|
|
@@ -112,7 +112,7 @@ instead of inventing a hidden candidate state.
|
|
|
112
112
|
任何东西保证它会发生,就该拆镜,或者让该动作落在其中一端。
|
|
113
113
|
- 两端差异越大,插值越自由,中间越不可控。首尾帧接续适合"状态改变清楚、路径无所谓"的
|
|
114
114
|
镜头(转身、递交完成、坐下),不适合"路径本身是戏"的镜头。
|
|
115
|
-
-
|
|
115
|
+
- 终点报告仍然对照镜头「终点」,不对照尾帧。尾帧只是它的投影,不能自证到达。
|
|
116
116
|
|
|
117
117
|
## Start-only drafting discipline
|
|
118
118
|
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
**分镜负责剪辑覆盖范围和可审查的起止边界**。
|
|
24
24
|
它说明本镜为何存在、观众能知道什么、从哪一状态到哪一状态;只有已接受的制作方案
|
|
25
|
-
|
|
25
|
+
需要时才补充时间段意图,完整动作措辞由视频提示词环节编写。「起点」可以是
|
|
26
26
|
静止关键帧,也可以是上游明确的运动中瞬间,不能把“静帧输入”误写成故事必须静止。
|
|
27
27
|
|
|
28
28
|
## 一、贯穿原则
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
已接受的项目方案,不是每镜必填。
|
|
36
36
|
4. **摄影行为有职责**(SHT-04):运镜或有意固定机位都应能说明它如何服务注意力、
|
|
37
37
|
压力、观众立场、揭示或节奏,而不是给每镜强加运镜。
|
|
38
|
-
5. **连续性靠已确认边界比较**:精确绑定 `Location/View
|
|
39
|
-
|
|
38
|
+
5. **连续性靠已确认边界比较**:精确绑定 `Location/View`、「起点」与
|
|
39
|
+
「终点」;下游只重复执行必需的局部状态,不逐镜复制整份状态表。
|
|
40
40
|
|
|
41
41
|
## 二、编号与文本分工
|
|
42
42
|
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
摄影意图:<固定/移动及其叙事职责>
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
-
|
|
86
|
+
- 起点逐字段写入已接受的「起点」,不把静态关键帧的媒介性质改成“人物必须静止”;
|
|
87
87
|
- 结束状态由分镜文件记录,下一镜通过引用比较,不靠复制长篇说明获得权威;
|
|
88
88
|
- 「唯一动作」是本镜的主状态链,不是限制镜内只能发生一个原子动作;它把必要步骤放在同一条
|
|
89
89
|
因果线上,确保上一个可见状态确实走到下一个可见状态。
|
|
@@ -228,7 +228,7 @@
|
|
|
228
228
|
|
|
229
229
|
1. 台词、行动、证据或沉默由什么可见/可听载体承担?有没有把以对白为主的合法镜头
|
|
230
230
|
误判成必须添加动作?
|
|
231
|
-
2.
|
|
231
|
+
2. 「起点」与「终点」是否逐字段可比较?运动中边界、停顿和静止都与上游内容相容吗?
|
|
232
232
|
3. 摄影选择或有意固定机位能回答它怎样服务注意力、观众立场、信息揭示、
|
|
233
233
|
空间或节奏吗?
|
|
234
234
|
4. 并行微动态有上游或环境依据吗?没有时是否避免为“画面活”而硬加?
|