@oh-story/dsh 0.1.4 → 0.1.6
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 +2707 -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,534 @@
|
|
|
1
|
+
# 数据格式(中间 JSON)
|
|
2
|
+
|
|
3
|
+
所有中间文件均在 pipeline 工作目录(work_dir/)下。
|
|
4
|
+
|
|
5
|
+
## vlm_analysis.json
|
|
6
|
+
|
|
7
|
+
每场景的 VLM 分析结果,数组格式:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
[
|
|
11
|
+
{
|
|
12
|
+
"scene_id": 1,
|
|
13
|
+
"start": 5.0,
|
|
14
|
+
"end": 15.0,
|
|
15
|
+
"description": "男子闯入房间",
|
|
16
|
+
"depth_analysis": "角色情绪分析...",
|
|
17
|
+
"frame_facts": {
|
|
18
|
+
"5.0": ["男子闯入房间, 头发蓬乱表情紧张"],
|
|
19
|
+
"10.0": ["男子俯身盯着床上男孩, 男孩睁眼惊醒"]
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
| 字段 | 类型 | 说明 |
|
|
26
|
+
|------|------|------|
|
|
27
|
+
| `scene_id` | int | 场景编号 |
|
|
28
|
+
| `start` | float | 开始时间(秒) |
|
|
29
|
+
| `end` | float | 结束时间(秒) |
|
|
30
|
+
| `description` | string | 画面简述(≤80字) |
|
|
31
|
+
| `depth_analysis` | string | 深层分析(情绪/关系/潜台词) |
|
|
32
|
+
| `frame_facts` | object | 帧级事实,key 为时间戳字符串 |
|
|
33
|
+
|
|
34
|
+
## asr_result.json
|
|
35
|
+
|
|
36
|
+
语音转文字结果:
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
[
|
|
40
|
+
{"start": 0.0, "end": 3.5, "text": "What are you doing here?"}
|
|
41
|
+
]
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## asr_writing_chunks.json
|
|
45
|
+
|
|
46
|
+
由 CLI 在生成 `agent_narration_brief.md` 时自动写出。它把长 ASR 按句子边界拆成适合 Agent 消化的语义块;中文按字符计数,非 CJK 文本按词数计数,并尽量保留 scene 对齐。
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
[
|
|
50
|
+
{
|
|
51
|
+
"chunk_id": 0,
|
|
52
|
+
"start": 0.0,
|
|
53
|
+
"end": 28.5,
|
|
54
|
+
"scene_ids": [0, 1],
|
|
55
|
+
"char_count": 642,
|
|
56
|
+
"text": "第一段对白……",
|
|
57
|
+
"segments": [
|
|
58
|
+
{"start": 0.0, "end": 3.5, "text": "第一句。", "char_count": 4}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## silence_periods.json
|
|
65
|
+
|
|
66
|
+
静音窗口列表(适合放解说):
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
[
|
|
70
|
+
{"start": 2.0, "end": 8.5, "duration": 6.5, "has_speech": false}
|
|
71
|
+
]
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
`has_speech` 标记该窗口是否与检测到的 ASR 语音重叠;下游(pipeline / narration)只把 `has_speech=false` 的窗口当作可放解说的安静窗口。
|
|
75
|
+
|
|
76
|
+
## speech_boundary_anchors.json
|
|
77
|
+
|
|
78
|
+
原声句末安全切入点。脚本把 ASR 终止标点的估算时间吸附到短声学停顿;它与
|
|
79
|
+
`silence_periods.json` 分开,因为约 0.1–0.5 秒的停顿适合作为旁白入口,却不足以容纳整段旁白。
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"schema_version": 1,
|
|
84
|
+
"sentence_anchors": [
|
|
85
|
+
{
|
|
86
|
+
"time": 5.809,
|
|
87
|
+
"confidence": "high",
|
|
88
|
+
"text_tail": "带你重走詹姆斯的二十一年。",
|
|
89
|
+
"pause_start": 5.222,
|
|
90
|
+
"pause_end": 5.809
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
当 `overlaps_speech=true` 且旁白不是从 0 秒冷开场时,`narration` lint 要求 `start`
|
|
97
|
+
贴近 `high`/`medium` 锚点。否则在 TTS 前用 `interrupts_source_sentence` 阻断,并返回
|
|
98
|
+
`suggested_start` 与 `source_text_tail` 给 Agent 调整。常规块使用
|
|
99
|
+
`source_entry_policy: "sentence_boundary"`;原声语句完整性没有抢断 override。最后一个可靠
|
|
100
|
+
锚点之后又进入已声明的原声讲话区时,`suggested_start` 可为 `null`,Agent 必须移动、缩短或删除该旁白块。
|
|
101
|
+
|
|
102
|
+
剪辑模式第二阶段会另外生成 `speech_boundary_anchors_output.json`,把锚点、ASR 语音区间和
|
|
103
|
+
安静窗口映射到剪后 OUTPUT 时间轴,避免拿原片时间检查剪后旁白:
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"schema_version": 2,
|
|
108
|
+
"timeline": "cut_output",
|
|
109
|
+
"clip_plan_fingerprint": "md5-of-canonical-clip-plan",
|
|
110
|
+
"sentence_anchors": [{"time": 4.0, "pause_start": 3.8, "confidence": "high"}],
|
|
111
|
+
"speech_spans": [{"start": 0.0, "end": 3.8}],
|
|
112
|
+
"quiet_windows": [{"start": 3.8, "end": 4.1}]
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
`clip_plan_fingerprint` 必须与当前 `clip_plan_validated.json` 一致。缺失、过期或畸形的
|
|
117
|
+
output 证据一律 fail closed,不能回退到原片时钟或信任 Agent 写入的
|
|
118
|
+
`overlaps_speech=false`。多来源剪辑的每条映射记录还保留 `source_id` 和原片起止时间。
|
|
119
|
+
|
|
120
|
+
## timeline_fusion.json
|
|
121
|
+
|
|
122
|
+
由 CLI 在生成 brief 时自动写出。它把 VLM 场景、ASR 对白和静音窗口按时间轴 overlap 合并,减少写稿时手工推断“这一幕有没有对白/能不能插解说”的成本。
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
[
|
|
126
|
+
{
|
|
127
|
+
"scene_id": 0,
|
|
128
|
+
"time_range": [0.0, 10.0],
|
|
129
|
+
"visual_description": "两人在门口对峙",
|
|
130
|
+
"depth_analysis": "关系紧张",
|
|
131
|
+
"frame_facts": {"1.0": ["女子回头"]},
|
|
132
|
+
"dialogue_segments": [
|
|
133
|
+
{"start": 2.0, "end": 4.0, "overlap_seconds": 2.0, "text": "你到底是谁"}
|
|
134
|
+
],
|
|
135
|
+
"dialogue_overlap_seconds": 2.0,
|
|
136
|
+
"narration_slots": [
|
|
137
|
+
{"start": 5.0, "end": 7.0, "duration": 2.0, "char_budget": 5}
|
|
138
|
+
],
|
|
139
|
+
"recommended_mode": "ducked-bed"
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## narration.json
|
|
145
|
+
|
|
146
|
+
Agent 撰写的解说词。full 模式下使用原视频时间;**orchestrated cut 模式(`video-recap --edit-mode cut`)下,第二次暂停时已经先剪出 `edited_source.mp4`,因此 `narration.json` 必须直接使用剪后成片的 OUTPUT 时间轴(0..成片总时长),不会再生成或消费 `narration_mapped.json`。只有 legacy direct `video-cut` 单 pass 路径才会把原视频时间的 narration remap 成 `narration_mapped.json`:
|
|
147
|
+
|
|
148
|
+
```json
|
|
149
|
+
[
|
|
150
|
+
{"start": 2.5, "end": 7.0, "narration": "解说文本", "pause_after_ms": 250, "overlaps_speech": true}
|
|
151
|
+
]
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## narration_lint.json
|
|
155
|
+
|
|
156
|
+
`--step script` 或续跑验证 `narration.json` 时生成的预检结果。它检查写稿、时间安全和解说覆盖。`metrics` 为 full 模式下的诊断指标(cut 模式为空对象),不是要求命中某个旁白比例的创作配额;低覆盖 warning 应回到 `visual_audio_board.json` 检查是否为有意的原声/沉默选择。
|
|
157
|
+
|
|
158
|
+
```json
|
|
159
|
+
{
|
|
160
|
+
"ok": false,
|
|
161
|
+
"error_count": 1,
|
|
162
|
+
"warning_count": 1,
|
|
163
|
+
"metrics": {
|
|
164
|
+
"segment_count": 12,
|
|
165
|
+
"narration_coverage": 0.68,
|
|
166
|
+
"narration_seconds": 61.2,
|
|
167
|
+
"timeline_seconds": 90.0,
|
|
168
|
+
"avg_block_chars": 48,
|
|
169
|
+
"original_block_count": 4
|
|
170
|
+
},
|
|
171
|
+
"errors": [
|
|
172
|
+
{"level": "error", "index": 2, "code": "time_overlap", "message": "Segment overlaps the previous narration segment"}
|
|
173
|
+
],
|
|
174
|
+
"warnings": [
|
|
175
|
+
{"level": "warning", "index": 0, "code": "over_budget", "budget_chars": 28, "actual_chars": 42}
|
|
176
|
+
]
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
常见 code:`invalid_time`、`empty_narration`、`time_overlap`、`outside_clip_plan`、`over_budget`、`incomplete_sentence`、`slot_too_short`、`under_narrated`、`over_narrated`、`fragmented_beats`、`no_original_blocks`。
|
|
181
|
+
|
|
182
|
+
## recap_story_plan.json / visual_audio_board.json(Agent 创作工作产物)
|
|
183
|
+
|
|
184
|
+
这两个 JSON 是 skill 层的创作决策记录:前者保存导演意图、备选剪辑假设、POV/主线和 change-based beats;后者保存每拍的画面/表演选择、入点/出点、原声锚点、`audio_owner` 与 `narration_job`。完整字段与工作流见本技能的 `creative-editing-playbook.md`。
|
|
185
|
+
|
|
186
|
+
CLI 不以它们作为渲染硬门禁,也不新增解析服务;建议型解说评审在文件存在时读取它们,Agent 则用它们保证 cut、旁白和声音选择没有偏离同一个创作意图。
|
|
187
|
+
|
|
188
|
+
## style_card.json(Agent 撰写,可选/按 brief 要求)
|
|
189
|
+
|
|
190
|
+
`style_card.json` 是表达层契约:由 Agent 根据 `--style`、`--context`、素材证据、ASR 和用户偏好信号综合撰写。`--style` 是 freeform verbatim guidance(原样自由文本指导),不是枚举、preset、switch,也不是一组可穷举风格名;不要把它翻译成固定档位。它是当前版本的活动契约:用户对声音、节奏、字幕阅读或禁忌提出新反馈后,更新原文件并移除过期偏好,不要只改 `narration.json`。
|
|
191
|
+
|
|
192
|
+
这个文件记录声音、节奏、回收意图和证据支撑的表达判断;字段可以随项目增减,下游只把它当 JSON object 读取,不要求固定键名。它不负责标题、封面、首句承诺或卖点包装。
|
|
193
|
+
|
|
194
|
+
```json
|
|
195
|
+
{
|
|
196
|
+
"voice": "冷静但有压迫感,少讲大道理,多用人物动作和台词里的证据推进",
|
|
197
|
+
"pacing": "前 15 秒紧凑建立冲突,每个 beat 连续说完一个思路;中段留原声喘息,结尾回收开头疑问",
|
|
198
|
+
"payoff_intent": "让观众先看到误会,再看到人物选择的代价",
|
|
199
|
+
"subtitle_read_posture": "TTS 保持连续口语,字幕按阅读宽度拆 cue,不用字幕换行切碎朗读",
|
|
200
|
+
"evidence_intent": ["优先引用画面动作", "关键转折保留原声"]
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## packaging_plan.json(Agent 撰写,可选)
|
|
205
|
+
|
|
206
|
+
`packaging_plan.json` 是内容锁定后的可选包装层契约:标题、封面帧/视觉钩子、首句、观众承诺、卖点和发布包装信息。它帮助 review 判断“包装承诺”和正文前 15 秒是否对齐;不应反过来驱动故事取舍。
|
|
207
|
+
|
|
208
|
+
它不是文风策略,不覆盖 `style_card.json` 的声音、节奏或表达规则;如果包装需要某个承诺,正文仍要用素材证据兑现。
|
|
209
|
+
|
|
210
|
+
```json
|
|
211
|
+
{
|
|
212
|
+
"title": "一句能对外展示的标题",
|
|
213
|
+
"cover_frame": {"time": 12.4, "reason": "人物第一次正面做出关键选择"},
|
|
214
|
+
"first_line": "开场第一句解说",
|
|
215
|
+
"viewer_promise": "观众看完会明白的冲突/反转/信息增量",
|
|
216
|
+
"selling_points": ["强冲突", "原声高光"],
|
|
217
|
+
"packaging_notes": "发布侧备注,不写文风规则"
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## deslop_qc_requirements.json(工具/brief 生成的运行契约)
|
|
222
|
+
|
|
223
|
+
`deslop_qc_requirements.json` 是 tool/brief generated run contract:工具或 brief 生成本次运行的 QC 要求,供 `deslop_qc` 读取,不由 Agent 手写。字段为 `schema_version` 与 `style_card_required`。
|
|
224
|
+
|
|
225
|
+
`style_card_required` 默认 `false`(advisory):缺少 `style_card.json` 只是 warning,不阻断出片。将来的 opt-in 运行可把它设为 `true`,让 `style_card.json` 成为硬性要求——`deslop_qc` 只读这个字段判断缺少 `style_card.json` 是否是 blocker,不扫描 `agent_narration_brief.md` 的 prompt wording 来推断。如果 requirements 文件缺失或损坏,按 legacy/migration advisory 处理,不作为 hard failure。
|
|
226
|
+
|
|
227
|
+
该契约不改变 `--style`:`--style` 仍是 freeform verbatim guidance,不增加固定风格档位。它也不改变 `deslop_qc` 边界:仍然是 report-only,不是 AIGC detector,不自动改写。
|
|
228
|
+
|
|
229
|
+
最小示例:
|
|
230
|
+
|
|
231
|
+
```json
|
|
232
|
+
{
|
|
233
|
+
"schema_version": 1,
|
|
234
|
+
"style_card_required": false
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## deslop_qc.json(CLI 生成,报告型 QC)
|
|
239
|
+
|
|
240
|
+
`deslop_qc.json` 由本地 deterministic scanner 生成,Agent 不手写。它只是 report-only QC:不是 AIGC detector,不判断文本是不是 AI 写的,不会自动改写。修改仍由 Agent/人工根据报告回到 `narration.json`、`style_card.json` 或字幕源里处理。
|
|
241
|
+
|
|
242
|
+
报告分两层:
|
|
243
|
+
|
|
244
|
+
- `blockers`:客观阻断项,会并入 `narration_lint.json` 的 error,例如 requirements 要求但缺少/损坏 `style_card.json`、破折号、占位符泄漏。
|
|
245
|
+
- `advisories`:建议项,只提示可读性/口语化风险,例如模板化“不是……而是……”转折、套话密度、抽象总结词、解释链、比喻标记、过长段落;它们不自动阻断,也不自动改写。
|
|
246
|
+
|
|
247
|
+
```json
|
|
248
|
+
{
|
|
249
|
+
"ok": false,
|
|
250
|
+
"contract": "Local readability/QC report only: this is not an AIGC detector, does not claim AI-generation accuracy, and never rewrites text. Corrections remain human/agent rewrite work.",
|
|
251
|
+
"scanner": "deslop_qc.py",
|
|
252
|
+
"style_card_required": true,
|
|
253
|
+
"blocker_count": 1,
|
|
254
|
+
"advisory_count": 1,
|
|
255
|
+
"blockers": [
|
|
256
|
+
{"severity": "blocker", "code": "missing_style_card", "source": "style_card", "index": null, "message": "style_card.json is required by this expression/packaging run but is missing"}
|
|
257
|
+
],
|
|
258
|
+
"advisories": [
|
|
259
|
+
{"severity": "advisory", "code": "cliche_density", "source": "narration", "index": null, "message": "套话/高频抽象词偏密,建议换成具体行动、选择和后果"}
|
|
260
|
+
],
|
|
261
|
+
"metrics": {"segments_scanned": 12, "text_units": 860, "sentence_count": 38}
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## multi_source_manifest.json(多视频 cut)
|
|
266
|
+
|
|
267
|
+
多视频剪辑模式下,项目级 `work_dir/multi_source_manifest.json` 是编排、剪辑与合成阶段共用的来源契约。`source_id` 默认由源文件 SHA-256 派生为 `src_<fingerprint[:12]>`;同一项目里重复 fingerprint 的不同路径会追加短 path hash 后缀。
|
|
268
|
+
|
|
269
|
+
```json
|
|
270
|
+
{
|
|
271
|
+
"schema_version": 1,
|
|
272
|
+
"sources": [
|
|
273
|
+
{
|
|
274
|
+
"source_id": "src_0123456789ab",
|
|
275
|
+
"source_path": "/abs/episode1.mp4",
|
|
276
|
+
"source_name": "episode1.mp4",
|
|
277
|
+
"source_video_fingerprint": "0123456789abcdef...",
|
|
278
|
+
"source_work_dir": "sources/src_0123456789ab",
|
|
279
|
+
"material_id": "episode1-0123456789ab"
|
|
280
|
+
}
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
## clip_plan.json
|
|
286
|
+
|
|
287
|
+
cut 模式下 Agent 选择要保留的原片片段,数组或 `{ "clips": [...] }` 都可接受。默认片段不能重叠,避免同一原片时间映射到多个输出位置:
|
|
288
|
+
|
|
289
|
+
```json
|
|
290
|
+
{
|
|
291
|
+
"target_duration": "10m",
|
|
292
|
+
"clips": [
|
|
293
|
+
{"start": 12.0, "end": 38.0, "reason": "b01 | hook | knowledge: unknown→threat | POV=主角 | 保留倾听反应 | 入点=问题已问出 | 出点=沉默落地"}
|
|
294
|
+
]
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
| 字段 | 类型 | 说明 |
|
|
299
|
+
|------|------|------|
|
|
300
|
+
| `start` | float | 原视频片段开始秒数 |
|
|
301
|
+
| `end` | float | 原视频片段结束秒数 |
|
|
302
|
+
| `reason` | string | 选择该片段的剧情/信息原因 |
|
|
303
|
+
|
|
304
|
+
多视频 cut 的 `clip_plan.json` 必须给每个片段加 `source_id`;重叠检测按 `source_id` 分开计算,不同源视频的相同时间范围不互相冲突:
|
|
305
|
+
|
|
306
|
+
```json
|
|
307
|
+
{
|
|
308
|
+
"target_duration": "10m",
|
|
309
|
+
"clips": [
|
|
310
|
+
{"source_id": "src_0123456789ab", "start": 12.0, "end": 38.0, "reason": "b01 | setup | knowledge: unknown→clue | POV=主角 | 保留迟疑反应 | 入点=线索出现 | 出点=疑问成立"},
|
|
311
|
+
{"source_id": "src_fedcba987654", "start": 4.0, "end": 22.0, "reason": "b02 | payoff | power: suspect→hero | POV=主角 | 保留最终选择 | 入点=证据落下 | 出点=代价显现"}
|
|
312
|
+
]
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## clip_plan_validated.json
|
|
317
|
+
|
|
318
|
+
CLI 校验 `clip_plan.json` 后写出,额外包含输出时间轴:
|
|
319
|
+
|
|
320
|
+
```json
|
|
321
|
+
{
|
|
322
|
+
"clips": [
|
|
323
|
+
{
|
|
324
|
+
"clip_id": 0,
|
|
325
|
+
"source_start": 12.0,
|
|
326
|
+
"source_end": 38.0,
|
|
327
|
+
"output_start": 0.0,
|
|
328
|
+
"output_end": 26.0,
|
|
329
|
+
"duration": 26.0,
|
|
330
|
+
"reason": "b01 | hook | knowledge: unknown→threat | POV=主角 | 保留倾听反应 | 入点=问题已问出 | 出点=沉默落地"
|
|
331
|
+
}
|
|
332
|
+
],
|
|
333
|
+
"total_duration": 26.0,
|
|
334
|
+
"target_duration": 600.0
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
`qc.boundary_status.sentence_checks` 逐项记录每个片段 start/end 是 `safe`、`unchecked`
|
|
339
|
+
还是 `blocking`。理解阶段已有 ASR 讲话时间时,任何未落到源头/源尾、可靠句末/静音窗,且
|
|
340
|
+
不是同源无损连续连接的边界都会写入 `qc.blocking[].code=unsafe_clip_sentence_boundary`。
|
|
341
|
+
切镜吸附先执行,句末吸附最后执行,保证视觉边界不会覆盖声音安全边界。
|
|
342
|
+
|
|
343
|
+
多视频 validated clip 会额外保留来源字段,供 pass2 brief、timeline 和剪映导出追溯原素材:
|
|
344
|
+
|
|
345
|
+
```json
|
|
346
|
+
{
|
|
347
|
+
"clips": [
|
|
348
|
+
{
|
|
349
|
+
"clip_id": 0,
|
|
350
|
+
"source_id": "src_0123456789ab",
|
|
351
|
+
"source_path": "/abs/episode1.mp4",
|
|
352
|
+
"source_start": 12.0,
|
|
353
|
+
"source_end": 38.0,
|
|
354
|
+
"output_start": 0.0,
|
|
355
|
+
"output_end": 26.0,
|
|
356
|
+
"duration": 26.0,
|
|
357
|
+
"reason": "b01 | hook | knowledge: unknown→threat | POV=主角 | 保留倾听反应 | 入点=问题已问出 | 出点=沉默落地"
|
|
358
|
+
}
|
|
359
|
+
]
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
## material library(可选,grep 复用)
|
|
364
|
+
|
|
365
|
+
`--material-library-dir <dir> --save-materials` 会把每个源视频的已分析小文件复制到 `<dir>/materials/<material_id>/`,不复制原始媒体。`--use-materials` 会在 fingerprint 和 settings fingerprint 匹配时把这些 JSON/MD 产物恢复到当前 per-source `work_dir`。
|
|
366
|
+
|
|
367
|
+
```text
|
|
368
|
+
.video-materials/
|
|
369
|
+
materials_index.jsonl # 追加式 grep journal;旧行可保留为历史
|
|
370
|
+
materials/<material_id>/
|
|
371
|
+
material.json # 当前权威 metadata
|
|
372
|
+
material.md # grep 友好摘要
|
|
373
|
+
artifacts/scenes.json
|
|
374
|
+
artifacts/asr_result.json
|
|
375
|
+
artifacts/asr_clean.json # 启用 --consolidate-asr 时保留,恢复后 brief/review 优先使用
|
|
376
|
+
artifacts/vlm_analysis.json
|
|
377
|
+
artifacts/understanding_index.json
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
`materials_index.jsonl` 每次保存追加一行,字段包括 `schema_version`, `event`, `material_id`, `source_name`, `source_path`, `source_video_fingerprint`, `settings_fingerprint`, `summary`, `tags`, `material_dir`, `updated_at`。当前权威状态始终以 `materials/<material_id>/material.json` 为准。MVP 只承诺 `grep -R "关键词" <library>` 这类文件检索;没有 DB、embedding 或语义搜索。
|
|
381
|
+
|
|
382
|
+
保存时会对凭证形态(`tp-`/`sk-`/`gh*_`/`AKIA`/JWT 与 `KEY=VALUE` 赋值)和凭证命名的 JSON key 做脱敏,但这只是**尽力而为**的兜底,不是保证:陌生格式的密钥仍可能漏过。请从源头避免把密钥写进分析产物——key 从环境变量/`.env` 读取,不需要落进 scenes/ASR/VLM/summary 等 JSON。
|
|
383
|
+
|
|
384
|
+
## narration_mapped.json
|
|
385
|
+
|
|
386
|
+
仅 legacy direct `video-cut` 单 pass 路径会生成。orchestrated cut 模式不使用它:Agent 在 pass2 直接按剪后成片 OUTPUT 时间轴写 `narration.json`。当 legacy 路径启用时,`start/end` 已变成短视频输出时间,`source_start/source_end` 保留原视频时间:
|
|
387
|
+
|
|
388
|
+
```json
|
|
389
|
+
[
|
|
390
|
+
{
|
|
391
|
+
"start": 2.0,
|
|
392
|
+
"end": 7.0,
|
|
393
|
+
"source_start": 14.0,
|
|
394
|
+
"source_end": 19.0,
|
|
395
|
+
"source_clip_id": 0,
|
|
396
|
+
"narration": "解说文本"
|
|
397
|
+
}
|
|
398
|
+
]
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
## original_subtitles.json / user_subtitles.{json,srt,ass}(可选,原声留白字幕)
|
|
402
|
+
|
|
403
|
+
解说块之间的原声留白会把【原声台词】烧成字幕(assemble 阶段用 `「」` 包裹以区分解说)。来源优先级(高→低):
|
|
404
|
+
|
|
405
|
+
1. **`work_dir/user_subtitles.json`**(用户自带,最准)— 数组 `[{start,end,text}]` 默认按**成片 OUTPUT** 时间轴直接使用;也可写成 `{"timeline": "source"|"output", "lines": [...]}`,`source` 表示按**原片**时间轴给出,由 assemble 依 `clip_plan_validated.json` 映射到成片。
|
|
406
|
+
2. **`work_dir/user_subtitles.srt` / `.ass`**(用户自带)— 默认按**原片**时间轴解析后映射到成片。
|
|
407
|
+
3. **`work_dir/original_subtitles.json`**(Agent 校对,cut pass2 写)— OUTPUT 时间轴 `[{start,end,text}]`,订正 ASR 错字/人名、只写留白里真正出声的句子。
|
|
408
|
+
4. **ASR 兜底** — 无上述文件时,用 `asr_result.json` 按留白粗略映射(中点估时,可能偏多偏乱)。
|
|
409
|
+
|
|
410
|
+
来源 1–3 为「精确来源」:每条按句**区间裁剪**落到所覆盖的留白边界(跨边界会拆分),不走 ASR 兜底的中点估时;over-dense 行截断显示而非丢弃。
|
|
411
|
+
|
|
412
|
+
```json
|
|
413
|
+
[
|
|
414
|
+
{"start": 2.0, "end": 5.0, "text": "原声台词一句"}
|
|
415
|
+
]
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
## background_research.json
|
|
419
|
+
|
|
420
|
+
可选的背景调研结果(由 Agent 使用任意可用搜索/浏览方式整理):
|
|
421
|
+
|
|
422
|
+
```json
|
|
423
|
+
{
|
|
424
|
+
"synopsis": "剧情概要",
|
|
425
|
+
"characters": {"角色名": "角色简介"},
|
|
426
|
+
"worldbuilding": "世界观设定",
|
|
427
|
+
"episode_context": "集数上下文",
|
|
428
|
+
"character_details": {
|
|
429
|
+
"角色名": {
|
|
430
|
+
"aliases": ["别名/昵称"],
|
|
431
|
+
"role": "主角|配角|反派|次要角色",
|
|
432
|
+
"relationships": ["与XX是夫妻", "与YY是师徒"]
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
"plot_arcs": [
|
|
436
|
+
{"name": "线索名称", "description": "简要描述", "status": "进行中|已解决|伏笔"}
|
|
437
|
+
],
|
|
438
|
+
"cultural_notes": [
|
|
439
|
+
{"item": "文化梗/典故/时代背景", "explanation": "解释"}
|
|
440
|
+
]
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
> `character_details`、`plot_arcs`、`cultural_notes` 为(可选,新增)字段。仅含 `synopsis`、`characters`、`worldbuilding`、`episode_context` 四个原始字段的旧 JSON 仍然有效。
|
|
445
|
+
|
|
446
|
+
## narration_review.json
|
|
447
|
+
|
|
448
|
+
解说评审阶段输出 LLM-as-judge 结果。旧字段 `verdict/summary/findings` 仍然有效;新增一份 **advisory** 的内容效果 scorecard 与改稿清单。**scorecard 不改变 verdict、也不作硬门禁**——硬门禁仍是 `findings` 里的 error(事实矛盾/残句)经 `--require-narration-review` 严格模式拦截。`verdict` 词表为 `PASS|REVISE|FAIL`,`OK` 作为旧值的兼容别名。
|
|
449
|
+
|
|
450
|
+
```json
|
|
451
|
+
{
|
|
452
|
+
"verdict": "PASS|REVISE|FAIL|OK",
|
|
453
|
+
"summary": "总体判断",
|
|
454
|
+
"scorecard": {
|
|
455
|
+
"promise_match": 4, "hook_3s": 4, "first_15s_delivery": 4, "spine_clarity": 4,
|
|
456
|
+
"stakes_escalation": 4, "information_gain": 4, "spoken_language": 4, "sentence_brevity": 4,
|
|
457
|
+
"tts_pacing": 4, "grounding": 4, "original_audio_use": 4, "subtitle_readability": 4
|
|
458
|
+
},
|
|
459
|
+
"hook_candidates_review": [{"candidate": "首句", "type": "suspense", "score": 4, "keep": true}],
|
|
460
|
+
"retention_risk_points": [{"time": "00:28", "risk": "信息重复可能掉人", "fix": "删掉复述画面的句子"}],
|
|
461
|
+
"highest_return_edits": ["最值得先改的一件事"],
|
|
462
|
+
"information_gain_notes": [{"segment": 0, "label": "motive|...|visual_restatement", "note": "证据/改法"}],
|
|
463
|
+
"spoken_language_rewrites": [{"segment": 0, "original": "原句", "rewrite": "口语改写", "why": "为什么更适合听"}],
|
|
464
|
+
"grounding_assertions": [{"segment": 0, "assertion": "人物/关系/因果断言", "source": "visual|asr|research|user_context|unsupported", "risk": "谨慎说明"}],
|
|
465
|
+
"findings": [{"segment": 0, "severity": "warning", "category": "weak_hook", "issue": "问题", "fix": "改法"}]
|
|
466
|
+
}
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
> 若 `work_dir` 提供了 `packaging_plan.json` / `recap_story_plan.json` / `visual_audio_board.json`(可选、Agent 撰写),review 会把它们并入评估上下文;缺失时 review 仅基于解说与画面/对白证据评分,行为不受影响。
|
|
470
|
+
|
|
471
|
+
## tts_meta.json(partial 失败可见性)
|
|
472
|
+
|
|
473
|
+
`video-voiceover` 正常输出 `{segments, engine, narration}`。当显式允许 partial TTS(`--allow-partial-tts` / `ALLOW_PARTIAL_TTS=1`)让运行在部分段失败后继续时,失败段不会只埋在日志里,而会写入 `partial` 与 `failures[]`:
|
|
474
|
+
|
|
475
|
+
```json
|
|
476
|
+
{
|
|
477
|
+
"segments": [{"index": 0, "start": 0.0, "end": 1.0, "narration": "第一段。", "audio_path": "tts_segments/narr_000.wav"}],
|
|
478
|
+
"engine": "mimo-tts",
|
|
479
|
+
"narration": "narration.json",
|
|
480
|
+
"partial": true,
|
|
481
|
+
"failures": [{"index": 1, "start": 1.0, "end": 2.5, "text": "第二段。", "error": "network timeout"}]
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
> 正常(无失败)运行也会带 `"partial": false, "failures": []`。partial 成片只适合预览,不建议直接发布。
|
|
486
|
+
|
|
487
|
+
组装后,`assembly_manifest.json.audio_segments[]` 另外记录 `fit_status`、`truncated`、
|
|
488
|
+
`truncate_reason`、`placed_audio_duration`、`placed_audio_path`、`source_duck_end`、
|
|
489
|
+
`source_restore_at` 与 `source_handoff_status`。组装阶段从不按时间裁旁白尾音:放不下时用
|
|
490
|
+
`no_safe_fit` 阻断。`placed_audio_path` 是实际写入 canonical `narration.wav` 的完整逐段 PCM;
|
|
491
|
+
`timeline.json`/剪映必须引用它而不是更长的加速前文件。素材时长与序列化后的时间线段长不一致时,
|
|
492
|
+
`assembly_qc.json` 用 `timeline_audio_mismatch` 阻断。原声恢复在 `pause_start` 前保持压低,
|
|
493
|
+
只在实测停顿内渐强,并于 `source_restore_at` 完成,避免渐强提前泄露上一句尾音。
|
|
494
|
+
|
|
495
|
+
## dub_lint.json / dub_review.json
|
|
496
|
+
|
|
497
|
+
Dub 模式下,`dub_script.json` 在 voiceclone **之前**先经过 deterministic lint,把明显不可发布的脚本挡在昂贵的克隆 TTS 之前。空译文、相邻行重叠、时间越界、`room < 0.4s` 等 **error** 会 `verdict=FAIL` 并阻断 render;`fast_speech`、`trim_risk` 等是 warning,不阻断。
|
|
498
|
+
|
|
499
|
+
每行 voiceclone 原始 WAV 会按模型、合成提示、中文台词和参考音频 SHA-256 写入相邻的 `*.wav.meta.json`。指纹完全匹配且 WAV 可读取时,dub render 直接复用并在 `dub_manifest.json.lines[].tts_cache` 记录 `hit`;台词、参考音频、模型或提示变化都会自动失效并重新合成。
|
|
500
|
+
|
|
501
|
+
```json
|
|
502
|
+
{
|
|
503
|
+
"schema_version": 1,
|
|
504
|
+
"verdict": "PASS|FAIL",
|
|
505
|
+
"blocking": false,
|
|
506
|
+
"errors": [],
|
|
507
|
+
"issues": [{"severity": "warning", "code": "fast_speech", "line": 2, "message": "translation is dense (8.4 chars/s)", "start": 1.0, "end": 2.0}],
|
|
508
|
+
"summary": {"lines": 12, "errors": 0, "warnings": 1, "max_chars_per_second": 8.4, "trim_risk_lines": []}
|
|
509
|
+
}
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
`dub_review.json` 是脚本级 review scaffold(确定性派生自 lint,语义忠实/语气仍需 agent/人工判断):
|
|
513
|
+
|
|
514
|
+
```json
|
|
515
|
+
{
|
|
516
|
+
"schema_version": 1,
|
|
517
|
+
"verdict": "PASS|REVISE|FAIL",
|
|
518
|
+
"checks": {"faithful_to_source": "needs_agent_review", "spoken_chinese": "PASS", "speaker_tone": "needs_agent_review", "timing_fit": "PASS", "platform_fit": "needs_agent_review"},
|
|
519
|
+
"highest_return_edits": [],
|
|
520
|
+
"coverage": {"transcript_windows": 8, "script_lines": 12}
|
|
521
|
+
}
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
> CLI:`dub.py --stage lint|review`(无需 video)、`dub.py --print-schema` 打印以上全部 dub artifact 契约;`--stage render` 会在克隆前自动写 `dub_lint.json` / `dub_review.json`,lint 非 PASS 即中止。
|
|
525
|
+
> 最终 `dub_<name>.mp4` 显式输出 48 kHz AAC;不能沿用 `loudnorm` 内部的 96 kHz 分析采样率。
|
|
526
|
+
## shift-left QC artifacts
|
|
527
|
+
|
|
528
|
+
`preflight_qc.json`、`final_qc.json`、`golden_eval.json`、`mimo_qc.json` 共用最小 QC 契约;stage 仅允许 `pre_cut` / `post_cut` / `pre_tts` / `post_tts` / `pre_assemble` / `post_render` / `golden`,其中 `mimo_qc.json` 是 artifact 而不是 stage。详见 `shift-left-qc-schema.md`。
|
|
529
|
+
|
|
530
|
+
`recap.py` 可通过 `--mimo-qc pre-assemble|post-render|both`(默认 `off`)在组装前和/或成片后写 `mimo_qc.json`。每个 stage 最多一次 live request;相同素材/模型命中内容缓存,`--mimo-qc-refresh` 可刷新。`post_render` 最多临时抽取 6 张、最长边 768px 的 JPEG;base64 只进入请求,不写进 artifact。多 stage 报告聚合在 `metadata.stages`,状态为 `completed` / `cached` / `unavailable` / `failed`,任何状态都不阻断、也不自动修复。关闭功能会清理旧 `mimo_qc.json`,避免陈旧建议被误认为本轮结果。
|
|
531
|
+
|
|
532
|
+
QC 证据把 `source_asr` 与 `generated_subtitles` 分开:前者只用于源事实/原声时序,后者是本轮旁白派生字幕,不能反过来充当事实证据。多视频项目从 `multi_source_manifest.json` 指向的逐源 work dir 汇集 ASR;`cut_output` 解说评审同样按 `source_id` 映射逐源 VLM/ASR,避免项目根目录没有单一 ASR 文件时产生空证据。
|
|
533
|
+
|
|
534
|
+
渲染后,`recap.py` 先更新 `preflight_qc.json` 的 `post_render` stage,再运行可选 MiMo 提示,最后写 `final_qc.json` 和 `golden_eval.json`。`final_qc.json` 汇总最终 mp4、`assembly_manifest.json`、`assembly_qc.json`、`visual_qc.json`、`preflight_qc.json`、`mimo_qc.json` 的本地元数据;缺失/空成片、ffprobe 不可用或失败、以及 assembly/visual QC 的客观 blocker 会进入 deterministic blockers。MiMo 和其他 non-deterministic finding 永远不能成为 blocker;客观佐证必须由 deterministic producer 另发 finding。`golden_eval.json` 默认要求 `final_qc.json.ok=true`,也可用 golden fixture 做简单的时长、codec 和必需 artifact 断言。所有 QC metadata/evidence 写入前都经过 `qc_contract.redact_secrets`:secret-looking key/value 会被替换,URL userinfo/query/fragment 会被移除,仅保留必要 host/path 诊断信息。
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# 背景调研指南(可选)
|
|
2
|
+
|
|
3
|
+
Agent 在开始视频理解**之前**先做背景调研,确认作品名、角色关系、剧情背景或科普概念,写入 `work_dir/background_research.json`。理解阶段会把它并入 VLM 的画面分析上下文,让场景描述能直接叫出人物名字、带着剧情读画面,而不是把人都标成「黑衣男子」。**调研不是必需步骤**;没有浏览器工具、网络不可用或用户未提供明确片名时,直接跳过,不阻塞视频生成。
|
|
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. 如果查不到可靠信息,跳过调研并继续视频理解;不要在理解索引生成前提前写 `narration.json`。
|
|
21
|
+
|
|
22
|
+
## 按视频类型搜索策略
|
|
23
|
+
|
|
24
|
+
### 短剧 / 电视剧
|
|
25
|
+
|
|
26
|
+
| 搜索关键词 | 目标字段 |
|
|
27
|
+
|-----------|---------|
|
|
28
|
+
| `{作品名} 剧情 介绍 人物` | synopsis, characters |
|
|
29
|
+
| `{作品名} 人物 关系` | characters |
|
|
30
|
+
| `{作品名} 第{N}集 剧情` | episode_context |
|
|
31
|
+
|
|
32
|
+
### 电影
|
|
33
|
+
|
|
34
|
+
| 搜索关键词 | 目标字段 |
|
|
35
|
+
|-----------|---------|
|
|
36
|
+
| `{电影名} 剧情 简介` | synopsis |
|
|
37
|
+
| `{电影名} 影评 解读` | cultural_notes |
|
|
38
|
+
|
|
39
|
+
### 纪录片 / 科普视频
|
|
40
|
+
|
|
41
|
+
| 搜索关键词 | 目标字段 |
|
|
42
|
+
|-----------|---------|
|
|
43
|
+
| `{主题} 背景 知识` | worldbuilding |
|
|
44
|
+
| `{核心概念} 解释` | synopsis |
|
|
45
|
+
| `{主题} 最新 进展` | cultural_notes |
|
|
46
|
+
|
|
47
|
+
## 写入格式
|
|
48
|
+
|
|
49
|
+
写入 `work_dir/background_research.json`,只填搜到的字段,未搜到的字段省略,不要写 `null` 或空字符串。
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"synopsis": "...",
|
|
54
|
+
"characters": {
|
|
55
|
+
"角色名": "简介或关系"
|
|
56
|
+
},
|
|
57
|
+
"worldbuilding": "...",
|
|
58
|
+
"episode_context": "...",
|
|
59
|
+
"cultural_notes": [
|
|
60
|
+
{"item": "...", "explanation": "..."}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 错误处理
|
|
66
|
+
|
|
67
|
+
| 场景 | 处理 |
|
|
68
|
+
|------|------|
|
|
69
|
+
| 没有浏览器 / 搜索工具 | 跳过调研,继续视频理解 |
|
|
70
|
+
| 搜索无结果 | 换一组关键词重试一次,仍无结果则继续视频理解 |
|
|
71
|
+
| 结果互相矛盾 | 只使用用户提供的上下文或画面/ASR 可验证的信息 |
|
|
72
|
+
| 信息可能剧透后续 | 只用于理解人物关系,不在解说里剧透用户没要求的后续剧情 |
|
|
73
|
+
|
|
74
|
+
**原则**:背景资料只能补上下文,不能替代 `vlm_analysis.json` / `asr_result.json` 里的画面和对白证据。
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# 前置 QC 数据契约
|
|
2
|
+
|
|
3
|
+
`final_qc.json`、`golden_eval.json`、`mimo_qc.json` 与 `preflight_qc.json` 共用一套最小结构,由本技能的 `scripts/qc_contract.py` 实现。
|
|
4
|
+
|
|
5
|
+
## 字段契约
|
|
6
|
+
|
|
7
|
+
- `schema_version`:整数 `1`。
|
|
8
|
+
- `artifact`:只能是 `final_qc.json`、`golden_eval.json`、`mimo_qc.json` 或 `preflight_qc.json`。
|
|
9
|
+
- `stage`:只能是 `pre_cut`、`post_cut`、`pre_tts`、`post_tts`、`pre_assemble`、`post_render`、`golden`。
|
|
10
|
+
- 不得使用 `pre_voiceover`、`post_voiceover`、`pre_export`、`post_export`、`final`、`golden_eval` 或 `mimo_qc` 作为阶段值。
|
|
11
|
+
- `mimo_qc.json` 是产物名;MiMo finding 必须挂在 `post_tts`、`pre_assemble` 等真实阶段上。
|
|
12
|
+
- `findings[]`:每项必须包含 `finding_id`、`stage`、`severity`、`blocking`、`deterministic`、`confidence`、`rule_id`、`decision_reason`、`location`、`evidence`、`sample_policy`、`model_used`、`artifact_fingerprints` 与 `next_action`。
|
|
13
|
+
- `sample_policy`:至少包含 `type`;其值只能是 `all`、`deterministic`、`sampled`、`semantic` 或 `aesthetic`。
|
|
14
|
+
- `location.timecode` 与 `location.source_span` 必须存在;剪辑前阶段可以把任一字段设为 `null`。
|
|
15
|
+
- 为兼容与诊断,当前辅助函数还可能写出 `id`、`category`、`code`、`message`、`source` 与 `objective_corroboration`。
|
|
16
|
+
|
|
17
|
+
## 阻断语义
|
|
18
|
+
|
|
19
|
+
只有确定性的客观规则可以阻断,例如产物缺失或过期、时长或媒体流错误、字幕与 TTS 放置错误、数据结构无效。
|
|
20
|
+
|
|
21
|
+
MiMo 语义/审美 finding 以及其他所有非确定性 finding **始终只给建议,不能阻断**。若存在客观佐证,必须由确定性生产者单独写成确定性 finding;它不能把主观模型观察升级成 blocker。运行时不存在 allow-list 或规则表逃生口。
|
|
22
|
+
|
|
23
|
+
`qc_contract.py` 只负责数据结构:不调用 MiMo、不连接流水线,也不自动修复。独立的 `mimo_qc.py` 只有在显式开启时,才会在 `pre_assemble` 和/或 `post_render` 各发起一次实时请求;它保持 fail-open,且不落盘凭证或抽帧 base64。所有报告构建器都通过 `qc_contract.redact_secrets` 处理元数据与证据:脱敏疑似密钥的键值,并从 URL 移除 userinfo、query 与 fragment,同时保留有用的 host/path 上下文。
|