@oh-story/dsh 0.1.4 → 0.1.5
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 +56 -12
- package/lib/client.js +2692 -268
- package/lib/client.js.map +4 -4
- package/lib/drama/manifest.json +136 -101
- package/lib/drama/skills/short-drama/SKILL.md +61 -1
- package/lib/drama/skills/short-drama/references/contract-and-ownership.md +7 -4
- package/lib/drama/skills/short-drama/references/creator-documents.md +133 -8
- package/lib/drama/skills/short-drama/references/creator-workflow.md +38 -2
- package/lib/drama/skills/short-drama/references/knowhow-index.md +3 -0
- package/lib/drama/skills/short-drama/references/reference-roles.md +10 -7
- package/lib/drama/skills/short-drama/references/runtime-preflight.md +3 -0
- package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +1002 -0
- package/lib/drama/skills/short-drama/scripts/project_tool.py +485 -5
- package/lib/drama/skills/short-drama-assets/SKILL.md +13 -3
- package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +116 -0
- package/lib/drama/skills/short-drama-assets/references/identity-vs-variant.md +2 -1
- package/lib/drama/skills/short-drama-assets/references/prop-and-state.md +19 -0
- package/lib/drama/skills/short-drama-assets/references/stage-contract.md +2 -0
- package/lib/drama/skills/short-drama-assets/scripts/asset_check.py +1 -1
- package/lib/drama/skills/short-drama-image-prompts/SKILL.md +6 -2
- package/lib/drama/skills/short-drama-image-prompts/references/common-recipe.md +4 -3
- package/lib/drama/skills/short-drama-image-prompts/references/lookdev-frame.md +1 -1
- package/lib/drama/skills/short-drama-image-prompts/references/review-and-fixtures.md +1 -1
- package/lib/drama/skills/short-drama-image-prompts/references/stage-contract.md +3 -1
- package/lib/drama/skills/short-drama-image-prompts/scripts/image_prompt_check.py +8 -8
- package/lib/drama/skills/short-drama-image-prompts/scripts/selftest.py +4 -2
- package/lib/drama/skills/short-drama-produce/SKILL.md +46 -10
- package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +65 -8
- package/lib/drama/skills/short-drama-produce/references/providers/minimax-h3-video.md +85 -0
- package/lib/drama/skills/short-drama-produce/references/providers/seedance.md +27 -10
- package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +362 -3
- package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +627 -40
- package/lib/drama/skills/short-drama-produce/scripts/selftest.py +5 -4
- package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +12 -0
- package/lib/drama/skills/short-drama-review/scripts/review_check.py +1 -1
- package/lib/drama/skills/short-drama-storyboard/SKILL.md +76 -7
- package/lib/drama/skills/short-drama-storyboard/assets/shot-template.jsonl +1 -1
- package/lib/drama/skills/short-drama-storyboard/references/keyframe-craft.md +6 -2
- package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +19 -4
- package/lib/drama/skills/short-drama-storyboard/references/review-and-fixtures.md +5 -2
- package/lib/drama/skills/short-drama-storyboard/references/screenplay-to-keyframe-example.md +16 -0
- package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +8 -3
- package/lib/drama/skills/short-drama-storyboard/scripts/storyboard_check.py +1 -1
- package/lib/drama/skills/short-drama-video-prompts/SKILL.md +81 -13
- package/lib/drama/skills/short-drama-video-prompts/assets/motion-spec.jsonl.md +6 -1
- package/lib/drama/skills/short-drama-video-prompts/assets/video-prompts.md +17 -1
- package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +21 -1
- package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +154 -0
- package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +24 -6
- package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +11 -7
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +41 -0
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +66 -0
- package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +5 -2
- package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +115 -0
- package/lib/drama/skills/short-drama-video-prompts/scripts/container_check.py +1 -1
- package/lib/drama/skills/short-drama-video-prompts/scripts/music_spec_check.py +1 -1
- package/lib/drama/skills/short-drama-write/SKILL.md +3 -2
- package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +1 -1
- package/lib/drama/skills/short-drama-write/scripts/screenplay_index.py +2 -2
- package/lib/drama/skills/short-drama-write/scripts/voice_sheet_check.py +1 -1
- package/lib/index.js +865 -33
- package/lib/index.js.map +4 -4
- package/lib/novel-to-game/LICENSE +21 -0
- package/lib/novel-to-game/README.md +180 -0
- package/lib/novel-to-game/README_ZH.md +178 -0
- package/lib/novel-to-game/VERSION +1 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +217 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/.vercelignore +3 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +130 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/compound_new_guofeng.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/fate_coda.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/meng.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/pan.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/pinger.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/xuee.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/yue.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/inner_court_accord_five.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/inner_court_afterglow_five.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/inner_court_alliance.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/public_day10.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/public_day15.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/public_day5.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/title_new_guofeng.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/joint/pan_pinger.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/joint/pan_xuee.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/joint/yue_meng.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/joint/yue_pan.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/joint/yue_pinger.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/meng/explicit.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/meng/prelude.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/milestone/meng.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/milestone/pan.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/milestone/pinger.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/milestone/xuee.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/milestone/yue.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/pan/explicit.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/pan/prelude.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/pinger/explicit.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/pinger/prelude.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/xuee/explicit.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/xuee/prelude.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/yue/explicit.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/yue/prelude.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/heroine/meng/night.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/heroine/pan/night.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/heroine/pinger/night.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/heroine/xuee/night.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/heroine/yue/night.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/household/li_jiaoer.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/scene/gate_collector.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +1105 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +2539 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/index.html +18 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/assets.js +147 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/audio.js +332 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +7472 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +13077 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +3028 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +32 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +10 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/vercel.json +23 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/art/generated-art.json +161 -0
- package/lib/novel-to-game/examples/jin-ping-mei/example.json +12 -0
- package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +31 -0
- package/lib/novel-to-game/examples/jin-ping-mei/qa/playable-model.json +99 -0
- package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +41 -0
- package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +129 -0
- package/lib/novel-to-game/manifest.json +508 -0
- package/lib/novel-to-game/skills/game-art-direction/SKILL.md +73 -0
- package/lib/novel-to-game/skills/game-art-direction/agents/openai.yaml +4 -0
- package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +119 -0
- package/lib/novel-to-game/skills/game-build/SKILL.md +84 -0
- package/lib/novel-to-game/skills/game-build/agents/openai.yaml +4 -0
- package/lib/novel-to-game/skills/game-build/references/build-brief-contract.md +109 -0
- package/lib/novel-to-game/skills/game-build/references/generative-media-pipeline.md +56 -0
- package/lib/novel-to-game/skills/game-build/references/playable-model-contract.md +81 -0
- package/lib/novel-to-game/skills/game-build/references/tts-production-contract.md +37 -0
- package/lib/novel-to-game/skills/game-concept/SKILL.md +72 -0
- package/lib/novel-to-game/skills/game-concept/agents/openai.yaml +4 -0
- package/lib/novel-to-game/skills/game-concept/references/concept-method.md +94 -0
- package/lib/novel-to-game/skills/game-qa/SKILL.md +50 -0
- package/lib/novel-to-game/skills/game-qa/agents/openai.yaml +4 -0
- package/lib/novel-to-game/skills/game-qa/references/qa-contract.md +66 -0
- package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +45 -0
- package/lib/novel-to-game/skills/game-world-design/SKILL.md +63 -0
- package/lib/novel-to-game/skills/game-world-design/agents/openai.yaml +4 -0
- package/lib/novel-to-game/skills/game-world-design/references/dialogue-design-method.md +59 -0
- package/lib/novel-to-game/skills/game-world-design/references/game-writing-craft.md +53 -0
- package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +84 -0
- package/lib/novel-to-game/skills/game-world-design/references/numeric-design-method.md +56 -0
- package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +124 -0
- package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +77 -0
- package/lib/novel-to-game/skills/novel-game-analyze/agents/openai.yaml +4 -0
- package/lib/novel-to-game/skills/novel-game-analyze/references/gameability-protocol.md +65 -0
- package/lib/novel-to-game/skills/novel-to-game/SKILL.md +71 -0
- package/lib/novel-to-game/skills/novel-to-game/agents/openai.yaml +4 -0
- package/lib/novel-to-game/skills/novel-to-game/references/intake-benchmark-reference.md +42 -0
- package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +51 -0
- package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +65 -0
- package/lib/oh-story/manifest.json +415 -305
- package/lib/oh-story/roles/consistency-checker.md +1 -1
- package/lib/oh-story/roles/narrative-writer.md +32 -33
- package/lib/oh-story/roles/story-architect.md +16 -26
- package/lib/oh-story/skills/browser-cdp/SKILL.md +1 -1
- package/lib/oh-story/skills/story/SKILL.md +16 -9
- package/lib/oh-story/skills/story/VERSION +1 -1
- package/lib/oh-story/skills/story/references/author-memory.md +163 -0
- package/lib/oh-story/skills/story/scripts/author_memory_commit.py +871 -0
- package/lib/oh-story/skills/story-cover/SKILL.md +1 -1
- package/lib/oh-story/skills/story-deslop/SKILL.md +10 -5
- package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +2 -1
- package/lib/oh-story/skills/story-deslop/references/author-memory.md +163 -0
- package/lib/oh-story/skills/story-deslop/references/banned-words.md +6 -4
- package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +871 -0
- package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +64 -1
- package/lib/oh-story/skills/story-import/SKILL.md +19 -10
- package/lib/oh-story/skills/story-import/references/format-and-structure.md +9 -10
- package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +2 -2
- package/lib/oh-story/skills/story-import/references/structure-mapping-short.md +1 -1
- package/lib/oh-story/skills/story-import/references/tracking-transaction.md +14 -6
- package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +251 -0
- package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +98 -9
- package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +246 -0
- package/lib/oh-story/skills/story-long-analyze/SKILL.md +4 -4
- package/lib/oh-story/skills/story-long-scan/SKILL.md +1 -1
- package/lib/oh-story/skills/story-long-write/SKILL.md +35 -21
- package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +2 -1
- package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +7 -3
- package/lib/oh-story/skills/story-long-write/references/author-memory.md +163 -0
- package/lib/oh-story/skills/story-long-write/references/banned-words.md +6 -4
- package/lib/oh-story/skills/story-long-write/references/cross-book-recall.md +6 -6
- package/lib/oh-story/skills/story-long-write/references/genre-prose-cards.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/genre-readers.md +1 -1
- package/lib/oh-story/skills/{story-setup/references/agent-references/hooks-chapter.md → story-long-write/references/long-chapter-hooks.md} +5 -5
- package/lib/oh-story/skills/story-long-write/references/{quality-checklist.md → long-chapter-quality.md} +2 -1
- package/lib/oh-story/skills/story-long-write/references/long-format.md +42 -0
- package/lib/oh-story/skills/{story-setup/references/agent-references/genre-catalog.md → story-long-write/references/long-genre-catalog.md} +11 -97
- package/lib/oh-story/skills/{story-setup/references/agent-references/genre-core-mechanics.md → story-long-write/references/long-genre-mechanics.md} +1 -1
- package/lib/oh-story/skills/{story-short-write/references/reversal-toolkit.md → story-long-write/references/long-reversal.md} +18 -32
- package/lib/oh-story/skills/story-long-write/references/{hooks-suspense.md → long-suspense.md} +6 -6
- package/lib/oh-story/skills/story-long-write/references/opening-design.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +14 -6
- package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +32 -27
- package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +4 -4
- package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +14 -14
- package/lib/oh-story/skills/story-long-write/references/writing-craft.md +54 -54
- package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +871 -0
- package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +64 -1
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +251 -0
- package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +303 -0
- package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +98 -9
- package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +246 -0
- package/lib/oh-story/skills/story-review/SKILL.md +26 -17
- package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +2 -1
- package/lib/oh-story/skills/story-review/references/author-memory.md +163 -0
- package/lib/oh-story/skills/story-review/references/banned-words.md +6 -4
- package/lib/oh-story/skills/story-review/references/{quality-checklist.md → review-quality.md} +22 -21
- package/lib/oh-story/skills/story-review/references/tracking-transaction.md +14 -6
- package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +871 -0
- package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +64 -1
- package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +98 -9
- package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +246 -0
- package/lib/oh-story/skills/story-setup/SKILL.md +74 -33
- package/lib/oh-story/skills/story-setup/references/agent-references/agent-quality.md +72 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/agent-reference-profiles.md +55 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +2 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +6 -4
- package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +9 -10
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-readers.md +1 -1
- package/lib/oh-story/skills/{story-short-analyze/references/hooks-chapter.md → story-setup/references/agent-references/long-chapter-hooks.md} +5 -5
- package/lib/oh-story/skills/story-setup/references/agent-references/long-emotional-methods.md +209 -0
- package/lib/oh-story/skills/{story-long-write/references/genre-catalog.md → story-setup/references/agent-references/long-genre-catalog.md} +11 -97
- package/lib/oh-story/skills/{story-long-write/references/genre-core-mechanics.md → story-setup/references/agent-references/long-genre-mechanics.md} +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +40 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/{reversal-toolkit.md → long-reversal.md} +18 -32
- package/lib/oh-story/skills/{story-short-write/references/hooks-suspense.md → story-setup/references/agent-references/long-suspense.md} +6 -6
- package/lib/oh-story/skills/story-setup/references/agent-references/opening-design.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/{emotional-methods.md → short-emotional-methods.md} +4 -4
- package/lib/oh-story/skills/{story-long-write/references/genre-writing-formulas.md → story-setup/references/agent-references/short-genre-formulas.md} +32 -44
- package/lib/oh-story/skills/story-setup/references/agent-references/short-quality.md +39 -0
- package/lib/oh-story/skills/{story-long-write/references/reversal-toolkit.md → story-setup/references/agent-references/short-reversal.md} +29 -23
- package/lib/oh-story/skills/story-setup/references/agent-references/{hooks-suspense.md → short-suspense.md} +31 -31
- package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +55 -55
- package/lib/oh-story/skills/story-short-analyze/SKILL.md +28 -28
- package/lib/oh-story/skills/story-short-analyze/references/{character-basics.md → analysis-character-basics.md} +1 -1
- package/lib/oh-story/skills/story-short-analyze/references/{character-design-methods.md → analysis-character-design.md} +1 -1
- package/lib/oh-story/skills/story-short-analyze/references/{character-relations.md → analysis-character-relations.md} +1 -1
- package/lib/oh-story/skills/story-short-analyze/references/{hooks-paragraph.md → analysis-paragraph-hooks.md} +1 -1
- package/lib/oh-story/skills/story-short-analyze/references/{genre-readers.md → analysis-reader-profile.md} +2 -2
- package/lib/oh-story/skills/story-short-analyze/references/analysis-report-style.md +45 -0
- package/lib/oh-story/skills/story-short-analyze/references/analysis-short-genres.md +65 -0
- package/lib/oh-story/skills/story-short-analyze/references/analysis-short-hooks.md +77 -0
- package/lib/oh-story/skills/story-short-analyze/references/analysis-short-mechanics.md +82 -0
- package/lib/oh-story/skills/story-short-analyze/references/analysis-short-patterns.md +50 -0
- package/lib/oh-story/skills/story-short-analyze/references/analysis-short-suspense.md +98 -0
- package/lib/oh-story/skills/story-short-analyze/references/{genre-writing-techniques.md → analysis-writing-techniques.md} +21 -19
- package/lib/oh-story/skills/story-short-analyze/references/deconstruction-examples.md +1 -1
- package/lib/oh-story/skills/story-short-analyze/references/material-decomposition.md +21 -28
- package/lib/oh-story/skills/story-short-analyze/references/output-contract.md +1 -1
- package/lib/oh-story/skills/story-short-analyze/references/output-templates.md +17 -17
- package/lib/oh-story/skills/story-short-analyze/references/{quality-checklist.md → source-story-quality.md} +28 -49
- package/lib/oh-story/skills/story-short-analyze/references/zhihu-style.md +2 -2
- package/lib/oh-story/skills/story-short-scan/SKILL.md +1 -1
- package/lib/oh-story/skills/story-short-write/SKILL.md +78 -55
- package/lib/oh-story/skills/story-short-write/references/author-memory.md +163 -0
- package/lib/oh-story/skills/story-short-write/references/banned-words.md +6 -4
- package/lib/oh-story/skills/story-short-write/references/cross-book-recall.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/emotional-methods.md +4 -4
- package/lib/oh-story/skills/story-short-write/references/genre-styles//344/270/226/346/203/205/346/211/223/350/204/270.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/217/214/347/224/267/344/270/273.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/244/215/344/273/207/346/211/223/350/204/270.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/256/205/346/226/227/345/256/253/346/226/227.md +6 -6
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/200/273/350/243/201/350/261/252/351/227/250.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/202/254/347/226/221.md +4 -4
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/260/221/344/277/227/346/200/252/350/260/210.md +7 -7
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/262/231/351/233/225/350/204/221/346/264/236.md +5 -5
- package/lib/oh-story/skills/story-short-write/references/genre-styles//347/224/234/345/256/240.md +4 -4
- package/lib/oh-story/skills/story-short-write/references/genre-styles//350/277/275/345/246/273/347/201/253/350/221/254/345/234/272.md +3 -3
- package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +32 -44
- package/lib/oh-story/skills/story-short-write/references/genre-writing-techniques.md +20 -18
- package/lib/oh-story/skills/story-short-write/references/output-contract.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/short-craft.md +18 -18
- package/lib/oh-story/skills/story-short-write/references/short-deslop.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/short-format.md +38 -8
- package/lib/oh-story/skills/story-short-write/references/{quality-checklist.md → short-prose-quality.md} +22 -21
- package/lib/oh-story/skills/story-short-write/references/short-reversal.md +355 -0
- package/lib/oh-story/skills/{story-short-analyze/references/hooks-suspense.md → story-short-write/references/short-suspense.md} +31 -31
- package/lib/oh-story/skills/story-short-write/references/submission-craft.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +31 -22
- package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +871 -0
- package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +64 -1
- package/lib/oh-story/skills/story-short-write/scripts/check-delivery-contract.js +212 -0
- package/lib/oh-story/skills/story-short-write/scripts/check-phase2-contract.js +363 -0
- package/lib/types/client/drama-production-view.d.ts +34 -0
- package/lib/types/client/drama-production-view.d.ts.map +1 -0
- package/lib/types/client/drama-production.d.ts +92 -0
- package/lib/types/client/drama-production.d.ts.map +1 -0
- package/lib/types/client/file-activity.d.ts +4 -2
- package/lib/types/client/file-activity.d.ts.map +1 -1
- package/lib/types/client/index.d.ts +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/production-intents.d.ts +9 -0
- package/lib/types/client/production-intents.d.ts.map +1 -0
- package/lib/types/client/production-prompts.d.ts +9 -0
- package/lib/types/client/production-prompts.d.ts.map +1 -0
- package/lib/types/client/production-runtime.d.ts +58 -0
- package/lib/types/client/production-runtime.d.ts.map +1 -0
- package/lib/types/client/video-studio.d.ts +41 -0
- package/lib/types/client/video-studio.d.ts.map +1 -0
- package/lib/types/client/workbench-ui.d.ts +5 -0
- package/lib/types/client/workbench-ui.d.ts.map +1 -0
- package/lib/types/game-verification.d.ts +16 -0
- package/lib/types/game-verification.d.ts.map +1 -0
- package/lib/types/index.d.ts +3 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/production-intent.d.ts +21 -0
- package/lib/types/production-intent.d.ts.map +1 -0
- package/lib/types/production-tool.d.ts +5 -0
- package/lib/types/production-tool.d.ts.map +1 -0
- package/lib/types/role-tool.d.ts.map +1 -1
- package/lib/types/skill-provider.d.ts +7 -0
- package/lib/types/skill-provider.d.ts.map +1 -1
- package/lib/types/video-project.d.ts +42 -0
- package/lib/types/video-project.d.ts.map +1 -0
- package/lib/types/workspace-request-trust.d.ts +6 -0
- package/lib/types/workspace-request-trust.d.ts.map +1 -1
- package/lib/types/workspace-route.d.ts +20 -0
- package/lib/types/workspace-route.d.ts.map +1 -1
- package/lib/video-recap/CHANGELOG.md +282 -0
- package/lib/video-recap/LICENSE +21 -0
- package/lib/video-recap/README.en.md +257 -0
- package/lib/video-recap/README.md +255 -0
- package/lib/video-recap/manifest.json +684 -0
- package/lib/video-recap/skills/video-assemble/SKILL.md +97 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/LICENSE.duo-video +21 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/SOURCE.md +15 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_draft_meta_info.json +69 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_segment.json +84 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_video_material.json +98 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_draft.json +204 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_material_video.json +83 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_meta_material_value.json +23 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_project_info.json +133 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_segment.json +70 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_text_styles.json +30 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_yj_material_audio.json +41 -0
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_yj_material_text.json +109 -0
- package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +88 -0
- package/lib/video-recap/skills/video-assemble/scripts/assemble.py +345 -0
- package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +34 -0
- package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +305 -0
- package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +94 -0
- package/lib/video-recap/skills/video-assemble/scripts/audio_automation.py +205 -0
- package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +555 -0
- package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +261 -0
- package/lib/video-recap/skills/video-assemble/scripts/jianying_builders.py +767 -0
- package/lib/video-recap/skills/video-assemble/scripts/jianying_model.py +111 -0
- package/lib/video-recap/skills/video-assemble/scripts/jianying_optional.py +24 -0
- package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +109 -0
- package/lib/video-recap/skills/video-assemble/scripts/jianying_templates.py +37 -0
- package/lib/video-recap/skills/video-assemble/scripts/jianying_timeline_contract.py +191 -0
- package/lib/video-recap/skills/video-assemble/scripts/jianying_tracks.py +75 -0
- package/lib/video-recap/skills/video-assemble/scripts/jianying_writer.py +394 -0
- package/lib/video-recap/skills/video-assemble/scripts/lib.py +239 -0
- package/lib/video-recap/skills/video-assemble/scripts/media.py +243 -0
- package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +477 -0
- package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +46 -0
- package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +486 -0
- package/lib/video-recap/skills/video-assemble/scripts/subtitle_core.py +376 -0
- package/lib/video-recap/skills/video-assemble/scripts/subtitle_render.py +88 -0
- package/lib/video-recap/skills/video-assemble/scripts/timeline.py +248 -0
- package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +89 -0
- package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +512 -0
- package/lib/video-recap/skills/video-cut/SKILL.md +90 -0
- package/lib/video-recap/skills/video-cut/scripts/cut.py +67 -0
- package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +320 -0
- package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +545 -0
- package/lib/video-recap/skills/video-cut/scripts/cut_render.py +348 -0
- package/lib/video-recap/skills/video-cut/scripts/lib.py +77 -0
- package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +341 -0
- package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +249 -0
- package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +745 -0
- package/lib/video-recap/skills/video-recap/SKILL.md +216 -0
- package/lib/video-recap/skills/video-recap/references/config-playbook.md +61 -0
- package/lib/video-recap/skills/video-recap/references/creative-editing-playbook.md +225 -0
- package/lib/video-recap/skills/video-recap/references/data-schema.md +534 -0
- package/lib/video-recap/skills/video-recap/references/research-guide.md +74 -0
- package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +23 -0
- package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +251 -0
- package/lib/video-recap/skills/video-recap/scripts/doctor.py +483 -0
- package/lib/video-recap/skills/video-recap/scripts/final_qc.py +737 -0
- package/lib/video-recap/skills/video-recap/scripts/lib.py +242 -0
- package/lib/video-recap/skills/video-recap/scripts/materials.py +457 -0
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +95 -0
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_client.py +18 -0
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_contract.py +9 -0
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_evidence.py +371 -0
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_observations.py +201 -0
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_payload.py +227 -0
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_report.py +362 -0
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_runner.py +129 -0
- package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +338 -0
- package/lib/video-recap/skills/video-recap/scripts/recap.py +9 -0
- package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +140 -0
- package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +550 -0
- package/lib/video-recap/skills/video-recap/scripts/recap_review.py +77 -0
- package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +654 -0
- package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +335 -0
- package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +217 -0
- package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +795 -0
- package/lib/video-recap/skills/video-script/SKILL.md +248 -0
- package/lib/video-recap/skills/video-script/references/creative-editing-playbook.md +225 -0
- package/lib/video-recap/skills/video-script/references/research-guide.md +75 -0
- package/lib/video-recap/skills/video-script/scripts/agent_brief.py +399 -0
- package/lib/video-recap/skills/video-script/scripts/agent_text.py +410 -0
- package/lib/video-recap/skills/video-script/scripts/brief_context.py +403 -0
- package/lib/video-recap/skills/video-script/scripts/brief_inputs.py +332 -0
- package/lib/video-recap/skills/video-script/scripts/brief_timeline.py +442 -0
- package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +237 -0
- package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +492 -0
- package/lib/video-recap/skills/video-script/scripts/lib.py +327 -0
- package/lib/video-recap/skills/video-script/scripts/narration.py +12 -0
- package/lib/video-recap/skills/video-script/scripts/narration_lint.py +678 -0
- package/lib/video-recap/skills/video-script/scripts/review.py +42 -0
- package/lib/video-recap/skills/video-script/scripts/review_grounding.py +262 -0
- package/lib/video-recap/skills/video-script/scripts/review_response.py +761 -0
- package/lib/video-recap/skills/video-script/scripts/review_runner.py +200 -0
- package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +204 -0
- package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +199 -0
- package/lib/video-recap/skills/video-script/scripts/validate.py +164 -0
- package/lib/video-recap/skills/video-understanding/SKILL.md +75 -0
- package/lib/video-recap/skills/video-understanding/references/data-schema.md +299 -0
- package/lib/video-recap/skills/video-understanding/references/prompt-templates.md +37 -0
- package/lib/video-recap/skills/video-understanding/references/research-guide.md +74 -0
- package/lib/video-recap/skills/video-understanding/scripts/agent_brief.py +399 -0
- package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +410 -0
- package/lib/video-recap/skills/video-understanding/scripts/asr.py +260 -0
- package/lib/video-recap/skills/video-understanding/scripts/brief.py +12 -0
- package/lib/video-recap/skills/video-understanding/scripts/brief_context.py +403 -0
- package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +332 -0
- package/lib/video-recap/skills/video-understanding/scripts/brief_timeline.py +442 -0
- package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +647 -0
- package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +237 -0
- package/lib/video-recap/skills/video-understanding/scripts/detect.py +513 -0
- package/lib/video-recap/skills/video-understanding/scripts/extract.py +62 -0
- package/lib/video-recap/skills/video-understanding/scripts/lib.py +470 -0
- package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +678 -0
- package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +204 -0
- package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +507 -0
- package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +199 -0
- package/lib/video-recap/skills/video-understanding/scripts/understand.py +9 -0
- package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +216 -0
- package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +327 -0
- package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +367 -0
- package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +162 -0
- package/lib/video-recap/skills/video-understanding/scripts/vlm.py +705 -0
- package/lib/video-recap/skills/video-voiceover/SKILL.md +81 -0
- package/lib/video-recap/skills/video-voiceover/scripts/dub.py +637 -0
- package/lib/video-recap/skills/video-voiceover/scripts/fish_audio.py +109 -0
- package/lib/video-recap/skills/video-voiceover/scripts/lib.py +421 -0
- package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +113 -0
- package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +782 -0
- package/package.json +55 -40
- package/lib/oh-story/skills/story-deslop/scripts/check-outline-copy.js +0 -241
- package/lib/oh-story/skills/story-long-write/references/format-and-structure.md +0 -169
- package/lib/oh-story/skills/story-setup/references/agent-references/genre-writing-formulas.md +0 -444
- package/lib/oh-story/skills/story-setup/references/agent-references/quality-checklist.md +0 -247
- package/lib/oh-story/skills/story-short-analyze/references/anti-ai-writing.md +0 -582
- package/lib/oh-story/skills/story-short-analyze/references/banned-words.md +0 -147
- package/lib/oh-story/skills/story-short-analyze/references/genre-catalog.md +0 -490
- package/lib/oh-story/skills/story-short-analyze/references/genre-core-mechanics.md +0 -425
- package/lib/oh-story/skills/story-short-analyze/references/genre-writing-formulas.md +0 -453
- /package/lib/oh-story/skills/{story-long-write/references/hooks-chapter.md → story-setup/references/agent-references/short-chapter-hooks.md} +0 -0
- /package/lib/oh-story/skills/{story-long-write/references/hooks-paragraph.md → story-setup/references/agent-references/short-paragraph-hooks.md} +0 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video-script
|
|
3
|
+
description: >
|
|
4
|
+
对已完成分析的视频进行导演与剪辑策划,再写带时间戳的中文解说并校验。work_dir 已包含
|
|
5
|
+
agent_narration_brief.md 与 vlm_analysis.json 时使用。适用于故事方向、片段选择、画面/原声/旁白分工、
|
|
6
|
+
解说写作与复核。输入 work_dir 中的理解索引;输出 recap_story_plan.json、visual_audio_board.json、
|
|
7
|
+
可选 style_card.json、cut 模式需要的 clip_plan.json,以及通过校验的 narration.json。触发词:解说词、写解说、视频旁白、
|
|
8
|
+
narration script、写稿、解说文案、剪辑思路、导演思路。
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. 定位
|
|
12
|
+
|
|
13
|
+
本技能负责:创作方向、画面/声音计划、旁白写作与校验。Agent 不是 JSON 填写器,而要依次扮演:
|
|
14
|
+
|
|
15
|
+
1. 导演
|
|
16
|
+
2. 故事编辑
|
|
17
|
+
3. 画面剪辑师
|
|
18
|
+
4. 声音/旁白编辑
|
|
19
|
+
5. 第一次观看的观众
|
|
20
|
+
|
|
21
|
+
Agent 先记录简洁决定,再写时间线产物。`validate.py` 负责对理解索引做机械校验;full 模式还会把旁白对齐到安静窗口。
|
|
22
|
+
|
|
23
|
+
下面的 `scripts/...` 均相对于本技能目录。若执行器从仓库根目录启动,请给脚本路径加上本技能的绝对目录。本技能不从其他技能目录读取参考文件或辅助脚本;外部输入只来自显式路径与 `work_dir` 产物。
|
|
24
|
+
|
|
25
|
+
### 1.1 创作控制模式
|
|
26
|
+
|
|
27
|
+
先根据用户要求和 `work_dir` 判断本轮模式;它不是 `full|cut|dub` 渲染模式:
|
|
28
|
+
|
|
29
|
+
- **CREATE**:首次创作。比较至少两个真正可行的故事/剪辑假设后再选择。
|
|
30
|
+
- **DIRECTED**:用户已指定结构、镜头、台词或表达。忠实落实,不为满足“创作流程”虚构替代方案。
|
|
31
|
+
- **REVISION**:用户针对已有版本看片修改。最新反馈是当前事实来源;未点名部分默认冻结。
|
|
32
|
+
|
|
33
|
+
REVISION 先明确本轮修改项与冻结项,再编辑对应层:表达、口语节奏、字幕反馈更新 `style_card.json`;镜头、入出点、表演和声音分工更新 `visual_audio_board.json`;只有观众承诺、POV、主线或 beat 改变时才更新 `recap_story_plan.json`。被删除的镜头、原声或文案也要从相关计划中删除,不能保留过期锚点。不要把看片修改重新做成一次 CREATE。
|
|
34
|
+
|
|
35
|
+
## 2. 读取素材并确认状态
|
|
36
|
+
|
|
37
|
+
首先阅读:
|
|
38
|
+
|
|
39
|
+
- `work_dir/agent_narration_brief.md`:场景、时长、安静窗口与字数预算。
|
|
40
|
+
- `asr_writing_chunks.json`:长对白的写作分块。
|
|
41
|
+
- `timeline_fusion.json`:判断某段是否有对白或静音槽。
|
|
42
|
+
- `vlm_analysis.json` / `asr_result.json`:核对具体画面与原声证据。
|
|
43
|
+
- brief 顶部列出的 contact sheet:不要只依赖场景摘要;反应、走位、静止和台词前后的具体时刻常常更重要。
|
|
44
|
+
|
|
45
|
+
full 模式使用原片时间。cut 模式第一阶段只写 `clip_plan.json`;`edited_source.mp4` 产生后,第二阶段才按输出时间写 `narration.json`。
|
|
46
|
+
|
|
47
|
+
写任何创作产物前,直接读取 `work_dir` 判断当前阶段:
|
|
48
|
+
|
|
49
|
+
- `recap_run_manifest.json`:确认 `edit_mode`、源视频和本轮设置。
|
|
50
|
+
- full 模式:没有 `narration.json` 时进入写稿;存在时先复核再校验。
|
|
51
|
+
- cut 第一阶段:尚无 `clip_plan_validated.json` / `edited_source.mp4`,只写 `clip_plan.json`。
|
|
52
|
+
- cut 第二阶段:两者都存在,按 `clip_plan_validated.json.clips[]` 中的 `source_start/end` 与 `output_start/end` 核对映射,再写输出时间的旁白。
|
|
53
|
+
|
|
54
|
+
必须确认旁白没有跨越错误剪辑边界,也没有落进已删除区间。整个判断只依赖 `work_dir` 产物。
|
|
55
|
+
|
|
56
|
+
## 3. 制定创作方案
|
|
57
|
+
|
|
58
|
+
先阅读 `references/creative-editing-playbook.md`,再按创作控制模式写或更新工作产物:
|
|
59
|
+
|
|
60
|
+
1. **`recap_story_plan.json`**:导演意图、CREATE 中至少两个剪辑假设、选定的 POV / 主线,以及由“变化”定义的 beats。DIRECTED / REVISION 不强行新增假设。
|
|
61
|
+
2. **`visual_audio_board.json`**:每拍的画面任务、具体表演/反应、入点/出点、`audio_owner`、原声锚点与 `narration_job`。
|
|
62
|
+
3. **`style_card.json`(适用时)**:用户当前认可的声音、口语节奏、字幕阅读姿态和明确禁忌。收到表达或字幕反馈后更新原文件,而不是只改最终文案。
|
|
63
|
+
|
|
64
|
+
只记录决定、证据锚点、被放弃的备选方案和简短理由,不写冗长思维过程。
|
|
65
|
+
|
|
66
|
+
### 3.1 导演判断
|
|
67
|
+
|
|
68
|
+
锁定:
|
|
69
|
+
|
|
70
|
+
- 观众承诺
|
|
71
|
+
- POV
|
|
72
|
+
- 戏剧问题
|
|
73
|
+
- 起始与结束情绪
|
|
74
|
+
- 隐瞒与揭示
|
|
75
|
+
- 结尾余味
|
|
76
|
+
|
|
77
|
+
### 3.2 故事编辑
|
|
78
|
+
|
|
79
|
+
CREATE 比较两个真正可行的结构后选择一个;DIRECTED / REVISION 沿用用户指定或已确认的结构,除非最新反馈明确改变故事方向。每个 beat 至少改变一项:知识、权力、目标、关系、情绪或风险。若删除后因果、人物和情绪都没有损失,该 beat 通常不应保留。
|
|
80
|
+
|
|
81
|
+
### 3.3 画面剪辑
|
|
82
|
+
|
|
83
|
+
选择具体时刻,而不是只选择事件。比较:
|
|
84
|
+
|
|
85
|
+
- 说话者与倾听者
|
|
86
|
+
- 动作与反应
|
|
87
|
+
- 早进与晚进
|
|
88
|
+
- 早出与多停半秒
|
|
89
|
+
|
|
90
|
+
在不破坏理解的前提下晚进早出,同时保留不可替代的表演、停顿、失误、动作声和完整台词。
|
|
91
|
+
|
|
92
|
+
### 3.4 声音与旁白分工
|
|
93
|
+
|
|
94
|
+
先指定 `audio_owner`,再写字。旁白只允许承担以下 `narration_job`:
|
|
95
|
+
|
|
96
|
+
- `context`
|
|
97
|
+
- `causal_link`
|
|
98
|
+
- `foreshadow`
|
|
99
|
+
- `interpretation`
|
|
100
|
+
- `transition`
|
|
101
|
+
- `none`
|
|
102
|
+
|
|
103
|
+
画面、原声或沉默已经足够时使用 `none`,不要默认铺旁白。
|
|
104
|
+
|
|
105
|
+
### 3.5 cut 模式第一阶段
|
|
106
|
+
|
|
107
|
+
cut 模式先根据 `recap_story_plan.json` 与 `visual_audio_board.json` 写原片时间的 `clip_plan.json`,此时不要写 `narration.json`:
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"target_duration": "10m",
|
|
112
|
+
"clips": [
|
|
113
|
+
{
|
|
114
|
+
"start": 12.0,
|
|
115
|
+
"end": 38.0,
|
|
116
|
+
"reason": "b01 | hook | knowledge: unknown→threat | POV=主角 | 保留倾听反应 | 入点=问题已问出 | 出点=沉默落地"
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`reason` 统一使用:
|
|
123
|
+
|
|
124
|
+
```text
|
|
125
|
+
beat_id | function | change | POV | preferred moment | 入点 | 出点
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
片段顺序必须构成一条完整故事线,而不是无序高光。可使用 0–1 个 cold open,随后回到因果清楚的 setup → turn → escalation → payoff。片段长度服从具体时刻,不使用统一秒数模板;片尾必须保留完整台词或动作。对短时间内密集的 scene-change 候选,先区分原片切点与本次拼接点:原片无关短镜头整段删,相关短镜头扩展到完整动作/反应;本次拼接点优先移动边界、恢复同源连续运动或合并片段,尽量不制造人工闪切。
|
|
129
|
+
|
|
130
|
+
## 4. 撰写旁白
|
|
131
|
+
|
|
132
|
+
full 模式直接按原片时间写;cut 第二阶段先查看 `edited_source.mp4` 与剪后故事板,补充 `visual_audio_board.json` 的输出时间并重新确认 `audio_owner` / `narration_job`,再按输出时间写:
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
[
|
|
136
|
+
{
|
|
137
|
+
"start": 5.0,
|
|
138
|
+
"end": 12.0,
|
|
139
|
+
"narration": "解说文本。",
|
|
140
|
+
"pause_after_ms": 250,
|
|
141
|
+
"overlaps_speech": true,
|
|
142
|
+
"emotion": "紧张"
|
|
143
|
+
}
|
|
144
|
+
]
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
字段说明:
|
|
148
|
+
|
|
149
|
+
| 字段 | 含义 |
|
|
150
|
+
|------|------|
|
|
151
|
+
| `start` / `end` | full 模式为原片时间;cut 第二阶段为输出时间 |
|
|
152
|
+
| `narration` | 解说文本 |
|
|
153
|
+
| `pause_after_ms` | 段后停顿,默认 250ms |
|
|
154
|
+
| `overlaps_speech` | 是否与原对白重叠;连续铺底窗口通常为 `true`,真正静音槽才为 `false` |
|
|
155
|
+
| `emotion` | 整个解说块的 MiMo TTS 情绪/语气标签 |
|
|
156
|
+
|
|
157
|
+
### 4.1 写作规则
|
|
158
|
+
|
|
159
|
+
1. **先有 `narration_job`,后有句子**:没有明确任务就不写;旁白不是默认音轨。
|
|
160
|
+
2. **按连续思路写**:旁白拥有一个 beat 时,用一个或少量完整句子完成“前提 → 触发动作 → 变化/意义”,并在一次 TTS 中合成。句号服从口语思路和呼吸,不服从字幕换行;不要固定句数,也不要“一句一停”。
|
|
161
|
+
3. **7:3 不是配额**:只在素材判断不足时作为避免墙到墙旁白的粗略首稿参考。实际比例服从 `audio_owner`;强对白、动作声或沉默可以完整拥有一个 beat。
|
|
162
|
+
4. **视听接力**:旁白若引出原声,块尾要让观众想听;原声结束后的下一块要承接它造成的变化。
|
|
163
|
+
5. **按有效语速控量**:用 `字数 / brief 头部 speech budget` 估算窗口;装不下时删减或拆分叙事任务,不用加速堆字。
|
|
164
|
+
6. **不看图说话**:旁白只增加上下文、因果、预期、证据支持的解释或跨越。
|
|
165
|
+
7. **人物与证据优先**:优先使用已知角色名;关系、动机、潜台词和结果必须指向 visual / ASR / research / user context,且不能把背景资料伪装成当前画面事实。
|
|
166
|
+
8. **写给耳朵听**:使用具体名词和动词,句子完整、口语可听;避免字幕腔、半句、空泛拔高和破折号。TTS 文本先保证听感连续,字幕再按阅读宽度拆分,不能反过来把朗读稿切碎。
|
|
167
|
+
9. **避免模板化纠偏**:“不是 A,而是 B”只在确实存在一个观众可能相信、而素材又要纠正的判断时使用。它不是禁句,但不能靠先否定再肯定制造假洞察;优先直接写人物的动作、因果和后果。
|
|
168
|
+
|
|
169
|
+
### 4.2 解说结构
|
|
170
|
+
|
|
171
|
+
- **钩子**:提出正文会真实兑现的问题或利害,不用无关留存话术。
|
|
172
|
+
- **主线**:围绕选定 POV 与主线推进,不在每个场景重新开篇。
|
|
173
|
+
- **递进**:后续 beat 必须提高风险、改变关系或提供新信息。
|
|
174
|
+
- **悬念缺口**:只预告之后真的会回收的后果。
|
|
175
|
+
- **收尾**:回答或有意转化开头问题,留下明确余味。
|
|
176
|
+
- **衔接**:旁白块与相邻原声属于同一个 beat,前者铺垫、后者呈现、下一块承接。
|
|
177
|
+
|
|
178
|
+
### 4.3 原声留白字幕
|
|
179
|
+
|
|
180
|
+
可选写 `original_subtitles.json`,使用成片输出时间:
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
[{"start": 15.0, "end": 17.0, "text": "原声台词"}]
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
只写留白中实际听得到的台词,订正 ASR 错字与人名,每条尽量控制在一行;被旁白盖住或已经剪掉的句子不要写。省略时,合成阶段会使用保守的 ASR 映射兜底,并在成片中用 `「」` 区分原声对白与旁白。
|
|
187
|
+
|
|
188
|
+
## 5. 创作自审
|
|
189
|
+
|
|
190
|
+
在调用 LLM 评审前做以下**反事实检查**:
|
|
191
|
+
|
|
192
|
+
1. 删除每个 beat:若因果、人物、情绪或承诺没有损失,就删除。
|
|
193
|
+
2. 比较说话者/动作与倾听者/反应:保留更符合 POV 和情绪的时刻。
|
|
194
|
+
3. 静音旁白:画面与原声仍应承载可见行动、人物行为和关键情绪。
|
|
195
|
+
4. 只听声音:旁白应形成可听懂的主线,而不是画面字幕。
|
|
196
|
+
5. 把旁白换成原声或沉默:若场景自身更有力量,就让出声音所有权。
|
|
197
|
+
6. 检查开头问题是否真实,结尾是否回答或转化它。
|
|
198
|
+
7. 检查相邻短句能否合成一个连续思路;字幕分行不得成为 TTS 断句理由。
|
|
199
|
+
|
|
200
|
+
只记录并优先修复 1–3 个回报最高的问题;先改结构,再润色句子。
|
|
201
|
+
|
|
202
|
+
REVISION 还要逐项确认:用户点名的问题已经改变,未点名的冻结项没有意外变化,相关 `style_card.json` / `visual_audio_board.json` 中不存在旧镜头或旧表达。除非用户要求备选版本,不额外扩展新方向。
|
|
203
|
+
|
|
204
|
+
## 6. 评审与校验
|
|
205
|
+
|
|
206
|
+
### 6.1 建议型语义评审
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
python3 scripts/review.py --work-dir <work_dir>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
评审会自动识别 cut 模式,并在存在已校验剪辑计划时按输出时间线核对;`--timeline source` 可强制使用原片时间。打开 `narration_review.md`,逐项处理 `error`,尤其是 `category=hallucination`。
|
|
213
|
+
|
|
214
|
+
重复修改并评审,直到:
|
|
215
|
+
|
|
216
|
+
- `verdict` 为 `PASS` / `OK` 且没有 `error`;或
|
|
217
|
+
- 对仍保留的问题做明确 override。
|
|
218
|
+
|
|
219
|
+
覆盖决定追加到 `work_dir/narration_review_override.md`:
|
|
220
|
+
|
|
221
|
+
```markdown
|
|
222
|
+
### 覆盖记录 — <date>
|
|
223
|
+
- 问题:segment 4 / category=hallucination
|
|
224
|
+
- 评审意见:“他早已知情”缺少画面/对白依据
|
|
225
|
+
- 决定:KEEP — 该事实来自用户提供的当前集背景,而非未来剧情
|
|
226
|
+
- 签署:<agent/human>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
`review.py` 本身只写报告,默认调用策略为建议型、失败开放;若调用方显式开启严格评审,事实矛盾、残句、解析失败或评审不可用可在 TTS 前阻断。覆盖记录只用于审计,`review.py` / `validate.py` 不读取它。
|
|
230
|
+
|
|
231
|
+
### 6.2 确定性硬校验
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
python3 scripts/validate.py --work-dir <work_dir> --mode full
|
|
235
|
+
# cut 输出时间线由编排器使用 --mode cut_output
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
命令写出 `narration_lint.json`。full 模式还会根据安静窗口重写 `narration.json` 的时间。修复所有 error 后重复运行,直到校验干净,再继续 TTS 与合成。
|
|
239
|
+
|
|
240
|
+
片名或题材明确但缺少剧情上下文时,先按本技能的 `references/research-guide.md` 写 `background_research.json`。若理解素材偏薄,brief 中的数量只能当上限:宁可少写、写实,也不要为凑数复述画面。
|
|
241
|
+
|
|
242
|
+
## 7. 能力边界
|
|
243
|
+
|
|
244
|
+
- 不运行 ASR / VLM;只消费视频理解索引。
|
|
245
|
+
- 不合成 TTS,也不渲染视频。
|
|
246
|
+
- 不根据平台分析做优化;先建立内容意图与剪辑一致性。
|
|
247
|
+
- `review.py` 不改写 `narration.json`;是否采用严格门禁由调用方决定。
|
|
248
|
+
- `validate.py` 不改写文本含义,只检查或对齐时间与安静窗口。
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# 创作剪辑工作法
|
|
2
|
+
|
|
3
|
+
本参考只规定 Agent 的创作判断,不增加渲染模块。进入剪辑或写稿前,先完成这里的决策,再写 `clip_plan.json` 或 `narration.json`。
|
|
4
|
+
|
|
5
|
+
## 先判断创作控制模式
|
|
6
|
+
|
|
7
|
+
- **CREATE**:没有既定成片方向,可以比较故事/剪辑假设并选择。
|
|
8
|
+
- **DIRECTED**:用户已经指定结构、镜头、台词或表达,目标是准确落实而不是展示替代创意。
|
|
9
|
+
- **REVISION**:基于已有版本看片修改。最新反馈覆盖旧决定;本轮未点名内容默认冻结。
|
|
10
|
+
|
|
11
|
+
REVISION 先列本轮修改项与冻结项。表达、节奏、字幕意见写回 `style_card.json`,镜头与声音意见写回 `visual_audio_board.json`;只有故事主线改变才更新 `recap_story_plan.json`。删除内容时也删除过期的计划描述。完成后分别验证“该变的确实变了”和“不该变的没有漂移”。
|
|
12
|
+
|
|
13
|
+
## 决策优先级
|
|
14
|
+
|
|
15
|
+
硬约束先于审美:
|
|
16
|
+
|
|
17
|
+
1. **证据真实**:人物、关系、因果和结果必须由画面、对白、可靠背景或用户上下文支撑。
|
|
18
|
+
2. **声音可懂**:关键原声不能被截成半句,旁白不能把必须听见的对白完全盖住。
|
|
19
|
+
|
|
20
|
+
硬约束满足后,发生冲突时按以下顺序取舍:
|
|
21
|
+
|
|
22
|
+
1. 情绪与人物;
|
|
23
|
+
2. 故事推进;
|
|
24
|
+
3. 节奏;
|
|
25
|
+
4. 视线与画面连续;
|
|
26
|
+
5. 技术上的“绝对工整”。
|
|
27
|
+
|
|
28
|
+
不要为了连续而牺牲人物反应,也不要为了快而删掉真正改变观众感受的瞬间。
|
|
29
|
+
|
|
30
|
+
## 五次专业判断
|
|
31
|
+
|
|
32
|
+
### 1. 导演:先决定观众经历什么
|
|
33
|
+
|
|
34
|
+
先回答,而不是先写开场文案:
|
|
35
|
+
|
|
36
|
+
- 观众承诺:看完具体会理解、担心或感受到什么?
|
|
37
|
+
- POV:这条内容主要跟随谁的经历?谁不是主视角?
|
|
38
|
+
- 戏剧问题:观众一直想知道的那个问题是什么?
|
|
39
|
+
- 情绪路径:开头的情绪如何变成结尾的情绪?
|
|
40
|
+
- 隐瞒与揭示:什么信息暂时不说,何时揭示才最有力量?
|
|
41
|
+
- 结尾余味:答案落地后,观众最后应留下什么感受?
|
|
42
|
+
|
|
43
|
+
CREATE 至少提出两个可成立的剪辑假设,再选一个。比较的是叙事效果,不是措辞:例如“按主角认知逐步揭示”与“先展示后果再追问原因”。DIRECTED / REVISION 沿用用户指定或已确认的主线,不为满足模板重新发散。只记录当前选择与理由,不输出冗长思维过程。
|
|
44
|
+
|
|
45
|
+
### 2. 故事编辑:把素材组织成变化
|
|
46
|
+
|
|
47
|
+
beat 不是固定秒数、场景名或一句旁白;beat 是一次可感知的变化。每个保留 beat 至少改变一项:
|
|
48
|
+
|
|
49
|
+
- 观众知道了什么;
|
|
50
|
+
- 人物想要什么;
|
|
51
|
+
- 谁占上风;
|
|
52
|
+
- 关系如何移动;
|
|
53
|
+
- 情绪如何转向;
|
|
54
|
+
- 风险或代价如何升级。
|
|
55
|
+
|
|
56
|
+
如果移除一个 beat 后,因果、人物或情绪都没有损失,它通常不值得占用成片时间。钩子必须提出这条故事真正会兑现的问题,不能制造正文不回答的夸张承诺。
|
|
57
|
+
|
|
58
|
+
### 3. 画面剪辑:选择时刻,而不只选择事件
|
|
59
|
+
|
|
60
|
+
对每个 beat 做以下判断:
|
|
61
|
+
|
|
62
|
+
- **入点**:能否晚一点进入,跳过已经能推断的铺垫?
|
|
63
|
+
- **出点**:信息或情绪落地后,能否早一点离开?
|
|
64
|
+
- **表演**:说话者与倾听者谁更能承载此刻?动作与反应谁更重要?
|
|
65
|
+
- **不可替代瞬间**:停顿、迟疑、失误、眼神、动作声音中,哪一个让人物变得真实?
|
|
66
|
+
- **节奏**:这一拍需要冲过去,还是需要多停半秒让含义落地?
|
|
67
|
+
- **边界**:优先完整动作、完整台词和自然声音边界;不要机械地把每个片段切成同一长度。
|
|
68
|
+
|
|
69
|
+
进入 `clip_plan.json` 的不是“发生过的所有重要事件”,而是最能让观众经历这条主线的具体时刻。
|
|
70
|
+
|
|
71
|
+
目标不是绝对最短,而是**最短但完整**:晚进不能丢掉理解动作所需的前提,早出不能吃掉表演的回报。建立空间和事实的镜头通常可以短;关键对视、亲吻、受伤反应、决定落地或沉默可以多停一点,让观众先感受到再离开。
|
|
72
|
+
|
|
73
|
+
场景之间的 IN / OUT 也要有任务:
|
|
74
|
+
|
|
75
|
+
- 新人物、地点或情绪场景,先给画面一个可感知的建立时刻,再让旁白进入;旁白不必与画面同帧起跑。
|
|
76
|
+
- OUT 优先落在动作完成、反应落地、台词句末、沉默结束或干净硬切前。
|
|
77
|
+
- 不要在原片叠化、闪白或其他转场的中间再切一次。转场至少由画面变化、动作延续、声音接力或叙事跨越中的一项驱动。
|
|
78
|
+
|
|
79
|
+
scene-change score、逐帧亮度和接点 contact sheet 只用于诊断:检查每个接点前后约 0.5–1 秒,定位硬切、白闪或曝光叠化候选。修复优先收进稳定镜头、保留原片完整转场的一侧、扩展源素材,或用相邻有效镜头补足时长;不能为了视觉干净切断台词。最终必须真实播放接点,不能把检测分数当成观看结论。
|
|
80
|
+
|
|
81
|
+
对短时间频繁切镜头的段落,先用 ffmpeg scene filter 输出候选时间,例如:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
ffmpeg -i input.mp4 -vf "select='gt(scene,0.35)',showinfo" -an -f null -
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
阈值只用于召回候选,闪白、叠化和大幅运动都可能误报。把候选映射回 source 区间和成片拼接边界后再分类处理:
|
|
88
|
+
|
|
89
|
+
- **原片切点**:无关的短镜头按完整 source shot 删除;相关但停留过短、看起来像闪一下的镜头,向前/后扩展到完整动作、反应、台词或下一个干净切点。这里的“拉长”是多保留真实源素材,不默认用定格或慢放制造不存在的表演。
|
|
90
|
+
- **本次剪辑制造的切点**:优先移动 IN / OUT、恢复同一源镜头的连续运动、合并相邻片段,或换成有叙事任务的连接镜头;能消除就不保留。溶解、闪白和包装不能用来遮掩坏接点。
|
|
91
|
+
- **有意的原片蒙太奇**:只有当每个短镜头都提供新信息、动作或节奏回报,且正常播放仍清楚可读时才保留;否则按无关或过短镜头处理。
|
|
92
|
+
|
|
93
|
+
密集度不是单一固定秒数门槛。先找同一短窗内的连续候选,再以正常速度播放判断观众感受到的是有效节奏还是闪烁。
|
|
94
|
+
|
|
95
|
+
### 4. 声音与旁白:先分工,再写字
|
|
96
|
+
|
|
97
|
+
每个 beat 先指定一个主要 `audio_owner`:
|
|
98
|
+
|
|
99
|
+
- `original_dialogue`:原对白本身就是事件或表演;
|
|
100
|
+
- `action_sound`:动作声音承担冲击、因果或空间感;
|
|
101
|
+
- `ambience` / `music`:环境或音乐承担情绪;
|
|
102
|
+
- `silence`:沉默、停顿或呼吸是内容;
|
|
103
|
+
- `narration`:画面和原声无法独自交代必要的上下文、因果或预期。
|
|
104
|
+
|
|
105
|
+
只有当旁白有明确工作时才写。`narration_job` 只能从以下任务中选择:
|
|
106
|
+
|
|
107
|
+
- `context`:补充看不见但必要的背景;
|
|
108
|
+
- `causal_link`:连接被压缩掉的因果;
|
|
109
|
+
- `foreshadow`:建立稍后会兑现的预期;
|
|
110
|
+
- `interpretation`:基于证据指出人物选择、关系或代价;
|
|
111
|
+
- `transition`:跨越时间、地点或素材来源;
|
|
112
|
+
- `none`:画面、原声或沉默已经足够。
|
|
113
|
+
|
|
114
|
+
`7:3` 只可作为没有更好判断时的粗略首稿参考,不是质量目标或覆盖配额。强对白可以让一个 beat 完全没有旁白;信息密集的压缩段也可以由旁白主导。
|
|
115
|
+
|
|
116
|
+
旁白拥有一个 beat 时,先写成一个连续思路,常见推进是“前提 → 触发动作 → 变化/意义”。句子数量不是目标;一个完整长句或少量相连句都可以,关键是一次 TTS 能自然说完而不是一句一停。字幕可以为阅读拆成多个 cue,但不能反过来把朗读稿切成碎 utterance。
|
|
117
|
+
|
|
118
|
+
“不是 A,而是 B”只在素材确实需要纠正一个可能的旧判断时有价值。不要先虚构错误判断,再用肯定句制造洞察;能直接写动作、因果和后果时就直接写。
|
|
119
|
+
|
|
120
|
+
### 5. 观众复核:从第一次观看出发
|
|
121
|
+
|
|
122
|
+
完成草案后做三次反事实检查:
|
|
123
|
+
|
|
124
|
+
1. **静音旁白**:只看画面和原声,人物、变化和关键情绪是否仍可感知?
|
|
125
|
+
2. **只听声音**:旁白是否形成一条可听懂的主线,而不是字幕腔或画面复述?
|
|
126
|
+
3. **第一次观看**:开头承诺了什么、每一拍又打开了什么问题、结尾是否真正回答?
|
|
127
|
+
|
|
128
|
+
再逐 beat 追问:
|
|
129
|
+
|
|
130
|
+
- 删除它,什么会坏?什么都不坏就删。
|
|
131
|
+
- 换成反应镜头,情绪是否更强?
|
|
132
|
+
- 旁白改成原声或沉默,含义是否更好?
|
|
133
|
+
- 提前揭示或延后揭示,哪一个更符合 POV?
|
|
134
|
+
- 能否晚进、早出,而不损失理解?
|
|
135
|
+
|
|
136
|
+
只优先处理 1–3 个最高回报修改,避免用大量低价值润色掩盖结构问题。
|
|
137
|
+
|
|
138
|
+
准备交付时,把抽象的“第一次观看”落实成动作:正常速度完整播放实际最终文件;逐个播放接点前后;完整只听声音;再单独复看开头、核心情绪点和结尾。脚本、样帧与自动 QC 只能辅助定位,不能替代完整观看。
|
|
139
|
+
|
|
140
|
+
## Agent 创作产物
|
|
141
|
+
|
|
142
|
+
这些是简洁的决策记录,不是公开的完整思维过程。CLI 可以忽略它们,但后续 Agent 与建议型评审会使用它们保持创作一致。
|
|
143
|
+
|
|
144
|
+
### `recap_story_plan.json`
|
|
145
|
+
|
|
146
|
+
```json
|
|
147
|
+
{
|
|
148
|
+
"schema_version": 1,
|
|
149
|
+
"director_intent": {
|
|
150
|
+
"viewer_promise": "观众最终得到的具体体验",
|
|
151
|
+
"pov": "主要跟随谁,以及为什么",
|
|
152
|
+
"dramatic_question": "贯穿全片的问题",
|
|
153
|
+
"emotional_start": "起始情绪",
|
|
154
|
+
"emotional_end": "结束情绪",
|
|
155
|
+
"ending_aftertaste": "最后余味",
|
|
156
|
+
"withhold_reveal": "保留什么,何时揭示"
|
|
157
|
+
},
|
|
158
|
+
"hypotheses": [
|
|
159
|
+
{"id": "h1", "spine": "方案一主线", "opening": "如何进入", "ending": "如何落地", "risk": "主要风险"},
|
|
160
|
+
{"id": "h2", "spine": "方案二主线", "opening": "如何进入", "ending": "如何落地", "risk": "主要风险"}
|
|
161
|
+
],
|
|
162
|
+
"chosen_hypothesis": "h1",
|
|
163
|
+
"choice_reason": "为什么它更符合素材中的人物、故事和情绪",
|
|
164
|
+
"beats": [
|
|
165
|
+
{
|
|
166
|
+
"beat_id": "b01",
|
|
167
|
+
"source_id": "可选,多视频时填写",
|
|
168
|
+
"source_start": 12.0,
|
|
169
|
+
"source_end": 20.0,
|
|
170
|
+
"function": "hook|setup|turn|escalation|payoff",
|
|
171
|
+
"event": "可观察到的事件",
|
|
172
|
+
"change": "knowledge|power|emotion|goal: before -> after",
|
|
173
|
+
"audience_question_in": "进入前观众想知道什么",
|
|
174
|
+
"audience_question_out": "离开时答案或新问题是什么",
|
|
175
|
+
"character_focus": "此拍由谁承载",
|
|
176
|
+
"must_keep_moment": "不可替代的动作/表情/台词/声音",
|
|
177
|
+
"evidence": ["visual", "asr"]
|
|
178
|
+
}
|
|
179
|
+
]
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
上例是 CREATE 形态。DIRECTED / REVISION 可以只保留用户指定或当前采用的假设;不要复制一个虚假备选来凑数量。
|
|
184
|
+
|
|
185
|
+
### `visual_audio_board.json`
|
|
186
|
+
|
|
187
|
+
```json
|
|
188
|
+
{
|
|
189
|
+
"schema_version": 1,
|
|
190
|
+
"items": [
|
|
191
|
+
{
|
|
192
|
+
"beat_id": "b01",
|
|
193
|
+
"source_id": "可选,多视频时填写",
|
|
194
|
+
"source_start": 12.0,
|
|
195
|
+
"source_end": 20.0,
|
|
196
|
+
"output_start": null,
|
|
197
|
+
"output_end": null,
|
|
198
|
+
"picture_job": "orientation|evidence|performance|reaction|action|contrast",
|
|
199
|
+
"preferred_moment": "具体要保留的画面时刻",
|
|
200
|
+
"entry_reason": "为什么从这里进入",
|
|
201
|
+
"exit_reason": "为什么在这里离开",
|
|
202
|
+
"audio_owner": "original_dialogue|action_sound|ambience|music|silence|narration",
|
|
203
|
+
"original_audio_anchor": "要完整保留的对白/动作声/停顿",
|
|
204
|
+
"narration_job": "none|context|causal_link|foreshadow|interpretation|transition",
|
|
205
|
+
"handoff": "前后画面、原声与旁白如何接力"
|
|
206
|
+
}
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
cut 第一阶段先用原片时间写;`edited_source.mp4` 产生后,在第二阶段补上输出时间并重新确认 `audio_owner` / `narration_job`。
|
|
212
|
+
|
|
213
|
+
## 内容质量基线
|
|
214
|
+
|
|
215
|
+
进入 TTS 前,以下问题都必须能用具体 beat 回答;否则先改计划或脚本:
|
|
216
|
+
|
|
217
|
+
1. **承诺**:开头提出的真实问题,结尾是否兑现?
|
|
218
|
+
2. **主线**:是否有一个明确 POV 和一条主导因果/关系线?
|
|
219
|
+
3. **变化**:每个 beat 是否改变知识、权力、目标、关系、情绪或风险?
|
|
220
|
+
4. **人物**:是否保留了至少一个不能由剧情概述替代的表演/反应瞬间?
|
|
221
|
+
5. **视听分工**:每个 beat 是否明确由画面、原声、沉默或旁白中的谁主导?
|
|
222
|
+
6. **必要性**:旁白是否都在增加信息或期待,而不是复述像素?
|
|
223
|
+
7. **完整观看**:实际最终文件是否完整看过、逐接点看过并只听声音检查过?
|
|
224
|
+
|
|
225
|
+
这套基线与抖音、YouTube 或任何平台数据无关。先让内容本身成立,再讨论标题、封面、时长档位和发布优化。
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# 写稿前补充调研指南(可选)
|
|
2
|
+
|
|
3
|
+
开始写稿时先读取已有的 `work_dir/background_research.json`。若理解索引不足以确认作品名、角色关系、剧情前提或科普概念,可在写稿前做一次补充调研,并把可靠结果写回该文件。**新写入的资料不会自动重跑或改写已有 VLM / ASR 产物**;本技能只把它作为 `context-only` 写作与建议型评审背景,当前画面事实仍以时间线证据为准。调研不是必需步骤;没有检索工具、网络不可用或来源不明确时直接跳过。
|
|
4
|
+
|
|
5
|
+
## 工具选择
|
|
6
|
+
|
|
7
|
+
使用当前环境里可用的任意检索方式即可,例如:
|
|
8
|
+
|
|
9
|
+
- Codex / Claude 自带的联网搜索或网页浏览工具
|
|
10
|
+
- 用户已经配置好的浏览器自动化或页面读取工具
|
|
11
|
+
- 普通浏览器手动查找后把结果整理进 JSON
|
|
12
|
+
- 已知资料、用户给的剧情背景或项目内已有文档
|
|
13
|
+
|
|
14
|
+
## 通用流程
|
|
15
|
+
|
|
16
|
+
1. 从 `--context`、文件名或用户描述里提取可搜索关键词。
|
|
17
|
+
2. 搜索 1-3 个高价值问题,不要过度调研。
|
|
18
|
+
3. 只记录对解说有帮助的事实:人物关系、剧情前提、世界观、当前集上下文、术语解释。
|
|
19
|
+
4. 写入 `work_dir/background_research.json`。
|
|
20
|
+
5. 把调研结果与 `vlm_analysis.json` / `asr_result.json` 分开使用:前者补背景,后两者证明当前画面与对白。
|
|
21
|
+
6. 如果查不到可靠信息,跳过调研并回到当前创作阶段;若方案尚未完成,先写 `recap_story_plan.json` 与 `visual_audio_board.json`,再按当前 full / cut 阶段写 `narration.json` 或 `clip_plan.json`。
|
|
22
|
+
|
|
23
|
+
## 按视频类型搜索策略
|
|
24
|
+
|
|
25
|
+
### 短剧 / 电视剧
|
|
26
|
+
|
|
27
|
+
| 搜索关键词 | 目标字段 |
|
|
28
|
+
|-----------|---------|
|
|
29
|
+
| `{作品名} 剧情 介绍 人物` | synopsis, characters |
|
|
30
|
+
| `{作品名} 人物 关系` | characters |
|
|
31
|
+
| `{作品名} 第{N}集 剧情` | episode_context |
|
|
32
|
+
|
|
33
|
+
### 电影
|
|
34
|
+
|
|
35
|
+
| 搜索关键词 | 目标字段 |
|
|
36
|
+
|-----------|---------|
|
|
37
|
+
| `{电影名} 剧情 简介` | synopsis |
|
|
38
|
+
| `{电影名} 影评 解读` | cultural_notes |
|
|
39
|
+
|
|
40
|
+
### 纪录片 / 科普视频
|
|
41
|
+
|
|
42
|
+
| 搜索关键词 | 目标字段 |
|
|
43
|
+
|-----------|---------|
|
|
44
|
+
| `{主题} 背景 知识` | worldbuilding |
|
|
45
|
+
| `{核心概念} 解释` | synopsis |
|
|
46
|
+
| `{主题} 最新 进展` | cultural_notes |
|
|
47
|
+
|
|
48
|
+
## 写入格式
|
|
49
|
+
|
|
50
|
+
写入 `work_dir/background_research.json`,只填搜到的字段,未搜到的字段省略,不要写 `null` 或空字符串。
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"synopsis": "...",
|
|
55
|
+
"characters": {
|
|
56
|
+
"角色名": "简介或关系"
|
|
57
|
+
},
|
|
58
|
+
"worldbuilding": "...",
|
|
59
|
+
"episode_context": "...",
|
|
60
|
+
"cultural_notes": [
|
|
61
|
+
{"item": "...", "explanation": "..."}
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 错误处理
|
|
67
|
+
|
|
68
|
+
| 场景 | 处理 |
|
|
69
|
+
|------|------|
|
|
70
|
+
| 没有浏览器 / 搜索工具 | 跳过调研,回到当前创作阶段 |
|
|
71
|
+
| 搜索无结果 | 换一组关键词重试一次,仍无结果则回到当前创作阶段 |
|
|
72
|
+
| 结果互相矛盾 | 只使用用户提供的上下文或画面/ASR 可验证的信息 |
|
|
73
|
+
| 信息可能剧透后续 | 只用于理解人物关系,不在解说里剧透用户没要求的后续剧情 |
|
|
74
|
+
|
|
75
|
+
**原则**:背景资料只能补上下文,不能替代 `vlm_analysis.json` / `asr_result.json` 里的画面和对白证据,也不能假装已经被此前的视觉分析消费。
|