@oh-story/dsh 0.1.8 → 0.1.10
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 +14 -14
- package/lib/client.js +237 -84
- package/lib/client.js.map +3 -3
- package/lib/drama/manifest.json +183 -77
- package/lib/drama/skills/short-drama/SKILL.md +5 -1
- package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +140 -9
- package/lib/drama/skills/short-drama/scripts/project_tool.py +11 -0
- package/lib/drama/skills/short-drama-assets/references/character-and-look.md +28 -0
- package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +8 -2
- package/lib/drama/skills/short-drama-assets/references/voice-direction.md +28 -0
- package/lib/drama/skills/short-drama-edit/SKILL.md +146 -0
- package/lib/drama/skills/short-drama-edit/agents/openai.yaml +4 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +60 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +15 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/remotion.config.ts +6 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +26 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +88 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +46 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/index.ts +4 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +32 -0
- package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +13 -0
- package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +43 -0
- package/lib/drama/skills/short-drama-edit/references/cut-craft.md +38 -0
- package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +29 -0
- package/lib/drama/skills/short-drama-edit/references/generated-footage.md +54 -0
- package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +60 -0
- package/lib/drama/skills/short-drama-edit/references/stage-contract.md +51 -0
- package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1156 -0
- package/lib/drama/skills/short-drama-edit/scripts/selftest.py +520 -0
- package/lib/drama/skills/short-drama-image-prompts/SKILL.md +2 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/image-prompts.md +5 -0
- package/lib/drama/skills/short-drama-image-prompts/assets/lookdev-prompts.md +3 -0
- package/lib/drama/skills/short-drama-image-prompts/references/common-recipe.md +11 -0
- package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +2 -2
- package/lib/drama/skills/short-drama-novel-analyze/references/chapter-extraction.md +4 -1
- package/lib/drama/skills/short-drama-produce/SKILL.md +29 -4
- package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +22 -0
- package/lib/drama/skills/short-drama-produce/references/providers/minimax-h3-video.md +13 -12
- package/lib/drama/skills/short-drama-produce/references/providers/minimax-speech.md +41 -0
- package/lib/drama/skills/short-drama-produce/references/providers/seedance.md +7 -0
- package/lib/drama/skills/short-drama-produce/scripts/fixture_adapter.py +18 -1
- package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +181 -2
- package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +199 -3
- package/lib/drama/skills/short-drama-review/SKILL.md +2 -0
- package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +7 -0
- package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +10 -0
- package/lib/drama/skills/short-drama-storyboard/SKILL.md +12 -1
- package/lib/drama/skills/short-drama-storyboard/assets/keyframe-prompts.md +4 -0
- package/lib/drama/skills/short-drama-storyboard/references/lighting-craft.md +39 -0
- package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +78 -2
- package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +2 -0
- package/lib/drama/skills/short-drama-video-prompts/SKILL.md +12 -5
- package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +17 -0
- package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +76 -7
- package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +5 -2
- package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +21 -0
- package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +6 -17
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +12 -3
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +61 -5
- package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +3 -3
- package/lib/drama/skills/short-drama-write/SKILL.md +11 -2
- package/lib/drama/skills/short-drama-write/references/screenplay-format.md +6 -0
- package/lib/drama/skills/short-drama-write/references/stage-contract.md +1 -0
- package/lib/index.js +290 -90
- package/lib/index.js.map +4 -4
- package/lib/novel-to-game/README.md +299 -59
- package/lib/novel-to-game/README_ZH.md +299 -56
- package/lib/novel-to-game/VERSION +1 -1
- package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +3 -1
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +11 -3
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +397 -8
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +0 -31
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +71 -73
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +78 -89
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +37 -14
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +5 -5
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +2 -1
- package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +11 -16
- package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +11 -11
- package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +23 -0
- package/lib/novel-to-game/manifest.json +77 -87
- package/lib/novel-to-game/skills/game-art-direction/SKILL.md +9 -35
- package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +27 -106
- package/lib/novel-to-game/skills/game-build/SKILL.md +17 -35
- package/lib/novel-to-game/skills/game-build/references/blender-asset-workflow.md +24 -0
- package/lib/novel-to-game/skills/game-build/references/build-brief-contract.md +45 -82
- package/lib/novel-to-game/skills/game-build/references/generative-media-pipeline.md +14 -45
- package/lib/novel-to-game/skills/game-build/references/playable-model-contract.md +30 -65
- package/lib/novel-to-game/skills/game-build/references/tts-production-contract.md +13 -27
- package/lib/novel-to-game/skills/game-concept/SKILL.md +16 -34
- package/lib/novel-to-game/skills/game-concept/references/concept-method.md +28 -75
- package/lib/novel-to-game/skills/game-qa/SKILL.md +9 -20
- package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +10 -6
- package/lib/novel-to-game/skills/game-world-design/SKILL.md +19 -32
- package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +23 -72
- package/lib/novel-to-game/skills/game-world-design/references/numeric-design-method.md +14 -48
- package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +36 -103
- package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +9 -18
- package/lib/novel-to-game/skills/novel-game-analyze/references/gameability-protocol.md +4 -4
- package/lib/novel-to-game/skills/novel-to-game/SKILL.md +10 -27
- package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +5 -6
- package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +6 -11
- package/lib/oh-story/manifest.json +419 -254
- package/lib/oh-story/roles/chapter-extractor.md +177 -237
- package/lib/oh-story/roles/character-designer.md +1 -1
- package/lib/oh-story/roles/consistency-checker.md +4 -4
- package/lib/oh-story/roles/narrative-writer.md +56 -243
- package/lib/oh-story/roles/story-architect.md +6 -6
- package/lib/oh-story/roles/story-explorer.md +11 -11
- package/lib/oh-story/skills/story/SKILL.md +13 -7
- package/lib/oh-story/skills/story/VERSION +1 -1
- package/lib/oh-story/skills/story/references/author-memory.md +61 -29
- package/lib/oh-story/skills/story/scripts/author_memory_commit.py +934 -170
- package/lib/oh-story/skills/story-cover/SKILL.md +10 -1
- package/lib/oh-story/skills/story-deslop/SKILL.md +54 -229
- package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +29 -56
- package/lib/oh-story/skills/story-deslop/references/author-memory.md +61 -29
- package/lib/oh-story/skills/story-deslop/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +154 -0
- package/lib/oh-story/skills/story-deslop/references/style-resolution.md +27 -0
- package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +934 -170
- package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-deslop/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-deslop/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-deslop/scripts/style-whitelist.js +39 -0
- package/lib/oh-story/skills/story-import/SKILL.md +78 -82
- package/lib/oh-story/skills/story-import/references/character-state-reverse.md +1 -1
- package/lib/oh-story/skills/story-import/references/format-and-structure.md +2 -2
- package/lib/oh-story/skills/story-import/references/state-tracking.md +4 -69
- package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +10 -8
- package/lib/oh-story/skills/story-import/references/tracking-initialization.md +31 -0
- package/lib/oh-story/skills/story-import/references/tracking-transaction.md +9 -34
- package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +197 -15
- package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +210 -2
- package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +3 -0
- package/lib/oh-story/skills/story-long-analyze/SKILL.md +91 -258
- package/lib/oh-story/skills/story-long-analyze/references/author-facing.md +245 -0
- package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +2 -2
- package/lib/oh-story/skills/story-long-analyze/references/inspiration-library.md +105 -0
- package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +113 -105
- package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +169 -125
- package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +172 -64
- package/lib/oh-story/skills/story-long-analyze/references/semantic-acceptance-fixtures.md +84 -0
- package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +42 -132
- package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +5 -5
- package/lib/oh-story/skills/story-long-analyze/scripts/build_chapter_index.py +466 -0
- package/lib/oh-story/skills/story-long-analyze/scripts/inspect_existing_assets.py +702 -0
- package/lib/oh-story/skills/story-long-analyze/scripts/inspiration_index.py +864 -0
- package/lib/oh-story/skills/story-long-analyze/scripts/manage_analysis_run.py +1106 -0
- package/lib/oh-story/skills/story-long-analyze/scripts/render_relation_chart.py +425 -0
- package/lib/oh-story/skills/story-long-scan/SKILL.md +4 -1
- package/lib/oh-story/skills/story-long-write/SKILL.md +52 -216
- package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +29 -56
- package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +72 -12
- package/lib/oh-story/skills/story-long-write/references/author-memory.md +61 -29
- package/lib/oh-story/skills/story-long-write/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +20 -0
- package/lib/oh-story/skills/story-long-write/references/cross-book-recall.md +26 -0
- package/lib/oh-story/skills/story-long-write/references/dialogue-mastery.md +10 -4
- package/lib/oh-story/skills/story-long-write/references/emotional-methods.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +6 -15
- package/lib/oh-story/skills/story-long-write/references/long-format.md +2 -0
- package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +2 -0
- package/lib/oh-story/skills/story-long-write/references/project-files.md +110 -0
- package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +12 -4
- package/lib/oh-story/skills/story-long-write/references/reference-index.md +86 -0
- package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/style-craft.md +9 -29
- package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/style-resolution.md +27 -0
- package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +31 -0
- package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +9 -34
- package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +88 -118
- package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +55 -119
- package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +15 -11
- package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +73 -54
- package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +22 -0
- package/lib/oh-story/skills/story-long-write/references/writing-craft.md +63 -4
- package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +934 -170
- package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +531 -0
- package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-long-write/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +197 -15
- package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +90 -23
- package/lib/oh-story/skills/story-long-write/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +285 -0
- package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +58 -0
- package/lib/oh-story/skills/story-long-write/scripts/style-whitelist.js +39 -0
- package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +210 -2
- package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +3 -0
- package/lib/oh-story/skills/story-review/SKILL.md +80 -87
- package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +29 -56
- package/lib/oh-story/skills/story-review/references/author-memory.md +61 -29
- package/lib/oh-story/skills/story-review/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-review/references/dialogue-mastery.md +10 -4
- package/lib/oh-story/skills/story-review/references/review-quality.md +6 -12
- package/lib/oh-story/skills/story-review/references/style-resolution.md +27 -0
- package/lib/oh-story/skills/story-review/references/tracking-initialization.md +31 -0
- package/lib/oh-story/skills/story-review/references/tracking-transaction.md +9 -34
- package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +934 -170
- package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-review/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-review/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-review/scripts/style-whitelist.js +39 -0
- package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +210 -2
- package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +3 -0
- package/lib/oh-story/skills/story-setup/SKILL.md +58 -43
- package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +29 -56
- package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +154 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/dialogue-mastery.md +10 -4
- package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +2 -2
- package/lib/oh-story/skills/story-setup/references/agent-references/long-emotional-methods.md +2 -2
- package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +1 -1
- package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -1
- 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/style-resolution.md +27 -0
- package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +63 -4
- package/lib/oh-story/skills/story-setup/references/diagnostics.md +38 -0
- package/lib/oh-story/skills/story-short-analyze/SKILL.md +22 -3
- package/lib/oh-story/skills/story-short-analyze/references/analysis-writing-techniques.md +1 -1
- package/lib/oh-story/skills/story-short-analyze/references/material-decomposition.md +5 -1
- package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +2 -2
- package/lib/oh-story/skills/story-short-scan/SKILL.md +5 -1
- package/lib/oh-story/skills/story-short-write/SKILL.md +15 -324
- package/lib/oh-story/skills/story-short-write/references/author-memory.md +61 -29
- package/lib/oh-story/skills/story-short-write/references/banned-words.md +3 -1
- package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +60 -0
- package/lib/oh-story/skills/story-short-write/references/dialogue-mastery.md +10 -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 +2 -2
- package/lib/oh-story/skills/story-short-write/references/genre-styles//345/217/214/347/224/267/344/270/273.md +1 -1
- 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 +3 -3
- 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 +5 -5
- package/lib/oh-story/skills/story-short-write/references/genre-styles//346/260/221/344/277/227/346/200/252/350/260/210.md +4 -4
- package/lib/oh-story/skills/story-short-write/references/genre-styles//347/224/234/345/256/240.md +5 -5
- 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 +1 -1
- package/lib/oh-story/skills/story-short-write/references/genre-writing-techniques.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/reference-index.md +55 -0
- package/lib/oh-story/skills/story-short-write/references/short-craft.md +12 -14
- package/lib/oh-story/skills/story-short-write/references/short-deslop.md +10 -10
- package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -1
- package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/style-resolution.md +27 -0
- package/lib/oh-story/skills/story-short-write/references/workflow-design.md +78 -0
- package/lib/oh-story/skills/story-short-write/references/workflow-draft.md +126 -0
- package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +32 -0
- package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +5 -5
- package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +934 -170
- package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +6 -1
- package/lib/oh-story/skills/story-short-write/scripts/check-degeneration.js +39 -20
- package/lib/oh-story/skills/story-short-write/scripts/check-delivery-contract.js +34 -5
- package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +90 -23
- package/lib/oh-story/skills/story-short-write/scripts/normalize-punctuation.js +10 -5
- package/lib/oh-story/skills/story-short-write/scripts/style-whitelist.js +39 -0
- package/lib/types/client/drama-production-view.d.ts.map +1 -1
- package/lib/types/client/file-activity.d.ts +19 -1
- package/lib/types/client/file-activity.d.ts.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/production-prompts.d.ts +7 -0
- package/lib/types/client/production-prompts.d.ts.map +1 -1
- package/lib/types/client/production-runtime.d.ts +33 -0
- package/lib/types/client/production-runtime.d.ts.map +1 -1
- package/lib/types/drama-adapters.d.ts +5 -3
- package/lib/types/drama-adapters.d.ts.map +1 -1
- package/lib/types/native-hooks.d.ts +52 -0
- package/lib/types/native-hooks.d.ts.map +1 -1
- package/lib/types/role-identity.d.ts +17 -0
- package/lib/types/role-identity.d.ts.map +1 -0
- package/lib/types/role-tool.d.ts.map +1 -1
- package/lib/types/skill-provider.d.ts.map +1 -1
- package/lib/video-recap/CHANGELOG.md +31 -1
- package/lib/video-recap/manifest.json +162 -162
- package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +4 -9
- package/lib/video-recap/skills/video-assemble/scripts/assemble.py +47 -60
- package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +77 -115
- package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +41 -40
- package/lib/video-recap/skills/video-assemble/scripts/audio_automation.py +22 -32
- package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +102 -192
- package/lib/video-recap/skills/video-assemble/scripts/jianying_builders.py +14 -35
- package/lib/video-recap/skills/video-assemble/scripts/jianying_model.py +14 -12
- package/lib/video-recap/skills/video-assemble/scripts/jianying_optional.py +8 -9
- package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +3 -14
- package/lib/video-recap/skills/video-assemble/scripts/jianying_timeline_contract.py +23 -12
- package/lib/video-recap/skills/video-assemble/scripts/jianying_tracks.py +1 -4
- package/lib/video-recap/skills/video-assemble/scripts/jianying_writer.py +24 -25
- package/lib/video-recap/skills/video-assemble/scripts/lib.py +31 -85
- package/lib/video-recap/skills/video-assemble/scripts/media.py +100 -144
- package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +101 -195
- package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +10 -21
- package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +90 -169
- package/lib/video-recap/skills/video-assemble/scripts/subtitle_core.py +69 -122
- package/lib/video-recap/skills/video-assemble/scripts/subtitle_render.py +10 -17
- package/lib/video-recap/skills/video-assemble/scripts/timeline.py +33 -48
- package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +14 -20
- package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +135 -213
- package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +49 -57
- package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +38 -74
- package/lib/video-recap/skills/video-cut/scripts/cut_render.py +46 -95
- package/lib/video-recap/skills/video-cut/scripts/lib.py +23 -25
- package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +70 -173
- package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +28 -53
- package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +162 -322
- package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +6 -7
- package/lib/video-recap/skills/video-recap/scripts/doctor.py +104 -124
- package/lib/video-recap/skills/video-recap/scripts/final_qc.py +255 -412
- package/lib/video-recap/skills/video-recap/scripts/lib.py +30 -52
- package/lib/video-recap/skills/video-recap/scripts/materials.py +97 -120
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_client.py +7 -12
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_evidence.py +46 -97
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_observations.py +18 -36
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_payload.py +29 -47
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_report.py +43 -76
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc_runner.py +2 -1
- package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +2 -1
- package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +2 -2
- package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +129 -145
- package/lib/video-recap/skills/video-recap/scripts/recap_review.py +27 -20
- package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +20 -31
- package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +31 -106
- package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +43 -113
- package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +196 -377
- package/lib/video-recap/skills/video-script/scripts/agent_brief.py +1 -1
- package/lib/video-recap/skills/video-script/scripts/agent_text.py +63 -172
- package/lib/video-recap/skills/video-script/scripts/brief_context.py +80 -135
- package/lib/video-recap/skills/video-script/scripts/brief_inputs.py +125 -167
- package/lib/video-recap/skills/video-script/scripts/brief_timeline.py +93 -208
- package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +20 -46
- package/lib/video-recap/skills/video-script/scripts/lib.py +30 -26
- package/lib/video-recap/skills/video-script/scripts/narration_lint.py +145 -140
- package/lib/video-recap/skills/video-script/scripts/review_response.py +12 -42
- package/lib/video-recap/skills/video-script/scripts/review_runner.py +0 -6
- package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +39 -100
- package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +33 -124
- package/lib/video-recap/skills/video-understanding/scripts/agent_brief.py +1 -1
- package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +63 -172
- package/lib/video-recap/skills/video-understanding/scripts/asr.py +1 -2
- package/lib/video-recap/skills/video-understanding/scripts/brief_context.py +80 -135
- package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +125 -167
- package/lib/video-recap/skills/video-understanding/scripts/brief_timeline.py +93 -208
- package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +1 -1
- package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +20 -46
- package/lib/video-recap/skills/video-understanding/scripts/lib.py +31 -26
- package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +145 -140
- package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +39 -100
- package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +33 -124
- package/lib/video-recap/skills/video-understanding/scripts/vlm.py +1 -4
- package/lib/video-recap/skills/video-voiceover/scripts/dub.py +7 -13
- package/lib/video-recap/skills/video-voiceover/scripts/fish_audio.py +12 -30
- package/lib/video-recap/skills/video-voiceover/scripts/lib.py +98 -131
- package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +17 -28
- package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +151 -240
- package/package.json +45 -45
- package/lib/novel-to-game/skills/game-world-design/references/dialogue-design-method.md +0 -59
- package/lib/novel-to-game/skills/game-world-design/references/game-writing-craft.md +0 -53
- package/lib/novel-to-game/skills/novel-to-game/references/intake-benchmark-reference.md +0 -42
- package/lib/oh-story/skills/story-long-write/references/state-tracking.md +0 -108
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import React, { useMemo } from "react";
|
|
2
|
+
import { AbsoluteFill, useCurrentFrame, useVideoConfig } from "remotion";
|
|
3
|
+
import { Cue, SubtitleProps } from "./schema";
|
|
4
|
+
import { assertFamilyResolves, waitForFonts } from "./font";
|
|
5
|
+
|
|
6
|
+
waitForFonts();
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A transparent subtitle layer, composited onto untouched picture.
|
|
10
|
+
*
|
|
11
|
+
* Everything here is expressed as a fraction of frame height, so the same
|
|
12
|
+
* numbers hold for 768×1344 and 1080×1920. That is the whole reason this file
|
|
13
|
+
* exists in pixels rather than in an ASS style: the subtitle renderer's own
|
|
14
|
+
* `PlayRes` scaling was applied twice once already, and type three times too
|
|
15
|
+
* large shipped in a sample film.
|
|
16
|
+
*/
|
|
17
|
+
export const Subtitles: React.FC<SubtitleProps> = ({
|
|
18
|
+
cues,
|
|
19
|
+
fontScale,
|
|
20
|
+
bottomScale,
|
|
21
|
+
fontFamily,
|
|
22
|
+
}) => {
|
|
23
|
+
const frame = useCurrentFrame();
|
|
24
|
+
const { fps, height, width } = useVideoConfig();
|
|
25
|
+
const now = frame / fps;
|
|
26
|
+
const active = cues.find((cue: Cue) => now >= cue.start && now < cue.end);
|
|
27
|
+
|
|
28
|
+
const fontSize = height * fontScale;
|
|
29
|
+
// A dark rim on every side keeps white type legible over a bright frame
|
|
30
|
+
// without a caption box, which is what vertical drama expects. It depends
|
|
31
|
+
// only on the frame size, so it is built once — and it stays above the early
|
|
32
|
+
// return, because a hook may not be skipped on the frames with no line.
|
|
33
|
+
const shadow = useMemo(() => {
|
|
34
|
+
const rim = Math.max(2, height * 0.0024);
|
|
35
|
+
return [
|
|
36
|
+
`0 0 ${rim * 3}px rgba(0,0,0,0.85)`,
|
|
37
|
+
`${rim}px ${rim}px 0 rgba(0,0,0,0.92)`,
|
|
38
|
+
`-${rim}px ${rim}px 0 rgba(0,0,0,0.92)`,
|
|
39
|
+
`${rim}px -${rim}px 0 rgba(0,0,0,0.92)`,
|
|
40
|
+
`-${rim}px -${rim}px 0 rgba(0,0,0,0.92)`,
|
|
41
|
+
].join(", ");
|
|
42
|
+
}, [height]);
|
|
43
|
+
|
|
44
|
+
// Checked against a line about to be filmed, so a missing font stops the
|
|
45
|
+
// render on the first subtitle frame rather than after the whole pass.
|
|
46
|
+
assertFamilyResolves(fontFamily, active?.text ?? "");
|
|
47
|
+
if (!active) return null;
|
|
48
|
+
|
|
49
|
+
// A short lift on entry reads as the line arriving with the delivery. It is
|
|
50
|
+
// over well before the first syllable ends, so it never delays reading.
|
|
51
|
+
const age = now - active.start;
|
|
52
|
+
const lift = Math.min(1, age / 0.12);
|
|
53
|
+
const eased = 1 - Math.pow(1 - lift, 3);
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<AbsoluteFill
|
|
57
|
+
style={{
|
|
58
|
+
justifyContent: "flex-end",
|
|
59
|
+
alignItems: "center",
|
|
60
|
+
paddingBottom: height * bottomScale,
|
|
61
|
+
paddingLeft: width * 0.06,
|
|
62
|
+
paddingRight: width * 0.06,
|
|
63
|
+
}}
|
|
64
|
+
>
|
|
65
|
+
<div
|
|
66
|
+
style={{
|
|
67
|
+
fontFamily,
|
|
68
|
+
fontSize,
|
|
69
|
+
fontWeight: 700,
|
|
70
|
+
color: "#ffffff",
|
|
71
|
+
textAlign: "center",
|
|
72
|
+
lineHeight: 1.28,
|
|
73
|
+
letterSpacing: fontSize * 0.02,
|
|
74
|
+
textShadow: shadow,
|
|
75
|
+
opacity: eased,
|
|
76
|
+
transform: `translateY(${(1 - eased) * fontSize * 0.25}px)`,
|
|
77
|
+
// A long line wraps rather than running off the frame — the failure
|
|
78
|
+
// that made the first shipped version unreadable.
|
|
79
|
+
maxWidth: "100%",
|
|
80
|
+
wordBreak: "break-word",
|
|
81
|
+
whiteSpace: "pre-wrap",
|
|
82
|
+
}}
|
|
83
|
+
>
|
|
84
|
+
{active.text}
|
|
85
|
+
</div>
|
|
86
|
+
</AbsoluteFill>
|
|
87
|
+
);
|
|
88
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { continueRender, delayRender } from "remotion";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Remotion captures a frame as soon as React has painted, so a font still being
|
|
5
|
+
* fetched is simply absent from it. Nothing downstream reports that: the film
|
|
6
|
+
* measures correct and reads wrong.
|
|
7
|
+
*/
|
|
8
|
+
export const waitForFonts = (): void => {
|
|
9
|
+
const handle = delayRender("等待字体就绪");
|
|
10
|
+
document.fonts.ready.then(
|
|
11
|
+
() => continueRender(handle),
|
|
12
|
+
() => continueRender(handle),
|
|
13
|
+
);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* `document.fonts.ready` promises that loading finished, not that the requested
|
|
18
|
+
* family exists — a missing face raises nothing, the browser substitutes, and
|
|
19
|
+
* the film ships in the wrong typeface. Measuring is the only reliable test:
|
|
20
|
+
* identical widths against a family that cannot exist mean nothing resolved.
|
|
21
|
+
*/
|
|
22
|
+
let familyChecked = "";
|
|
23
|
+
|
|
24
|
+
export const assertFamilyResolves = (fontFamily: string, sample: string): void => {
|
|
25
|
+
// Runs on every frame, so measure once per family.
|
|
26
|
+
if (!sample || familyChecked === fontFamily) return;
|
|
27
|
+
const canvas = document.createElement("canvas");
|
|
28
|
+
const context = canvas.getContext("2d");
|
|
29
|
+
if (!context) return;
|
|
30
|
+
|
|
31
|
+
const measure = (family: string): number => {
|
|
32
|
+
context.font = `700 64px ${family}`;
|
|
33
|
+
return context.measureText(sample).width;
|
|
34
|
+
};
|
|
35
|
+
// A name no font can carry, so it always lands on the browser's last resort.
|
|
36
|
+
const fallbackOnly = measure('"__no_such_family__"');
|
|
37
|
+
const requested = measure(`${fontFamily}, "__no_such_family__"`);
|
|
38
|
+
if (requested === fallbackOnly) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
`字幕字体 ${fontFamily} 在渲染环境里一个都没装上,` +
|
|
41
|
+
"画面会落到浏览器的兜底字体。装一款其中的字体," +
|
|
42
|
+
"或给 render 传一个本机确实有的字体族。",
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
familyChecked = fontFamily;
|
|
46
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type Cue = {
|
|
2
|
+
/** Output-time seconds, measured from the rendered segments. */
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
/** The line as written in 剧本.md. Never a transcription. */
|
|
6
|
+
text: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type SubtitleProps = {
|
|
10
|
+
cues: Cue[];
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
fps: number;
|
|
14
|
+
durationInSeconds: number;
|
|
15
|
+
/** Type size as a fraction of frame height, so one number survives any delivery. */
|
|
16
|
+
fontScale: number;
|
|
17
|
+
/** Distance from the bottom edge, also a fraction of frame height. */
|
|
18
|
+
bottomScale: number;
|
|
19
|
+
fontFamily: string;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const defaultProps: SubtitleProps = {
|
|
23
|
+
cues: [],
|
|
24
|
+
width: 1080,
|
|
25
|
+
height: 1920,
|
|
26
|
+
fps: 24,
|
|
27
|
+
durationInSeconds: 1,
|
|
28
|
+
fontScale: 0.034,
|
|
29
|
+
bottomScale: 0.055,
|
|
30
|
+
fontFamily:
|
|
31
|
+
'"PingFang SC", "Noto Sans CJK SC", "Source Han Sans SC", "Microsoft YaHei", sans-serif',
|
|
32
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# EP001 剪辑单
|
|
2
|
+
|
|
3
|
+
- 成片目标时长:25.00 秒
|
|
4
|
+
- 画幅与帧率:9:16 · 1080×1920 · 24fps
|
|
5
|
+
- 交付响度:-16 LUFS
|
|
6
|
+
- 字幕:硬字幕,台词逐字取自《剧本.md》,底部安全区内,避开画内屏幕文字
|
|
7
|
+
- 未采用镜头:MOTION-EP001-009(理由:质量不可用——全段人物身份漂移,可用带不足 0.5 秒);MOTION-EP001-018(理由:文件缺失——尚未生产)
|
|
8
|
+
|
|
9
|
+
## CUT-EP001-001 · 手指停在按钮上
|
|
10
|
+
|
|
11
|
+
- 来源:MOTION-EP001-010 · 制作成果/videos/SHOT-EP001-010.mp4
|
|
12
|
+
- 入点:0.60
|
|
13
|
+
- 出点:3.60
|
|
14
|
+
- 时长:3.00
|
|
15
|
+
- 取舍:入点=手指已经悬在按钮上方、开始下压;出点=按钮按下、界面开始响应,再往后 0.4 秒手指位置回弹
|
|
16
|
+
- 声音:保留原声(室内底噪与一次点击声)
|
|
17
|
+
- 字幕:无
|
|
18
|
+
|
|
19
|
+
## CUT-EP001-002 · 弹窗展开
|
|
20
|
+
|
|
21
|
+
- 来源:MOTION-EP001-011 · 制作成果/videos/SHOT-EP001-011.mp4
|
|
22
|
+
- 入点:0.90
|
|
23
|
+
- 出点:3.40
|
|
24
|
+
- 时长:2.50
|
|
25
|
+
- 取舍:入点=弹窗动画已经展开过半,起势的静止两帧删掉;出点=弹窗完全展开且文字可读的最后一帧,之后画面开始整体提亮
|
|
26
|
+
- 声音:保留原声;回听确认与上一段衔接
|
|
27
|
+
- 字幕:无
|
|
28
|
+
|
|
29
|
+
## CUT-EP001-003 · 他念出那句话
|
|
30
|
+
|
|
31
|
+
- 来源:MOTION-EP001-017 · 制作成果/videos/SHOT-EP001-017.mp4
|
|
32
|
+
- 入点:2.00
|
|
33
|
+
- 出点:7.00
|
|
34
|
+
- 时长:5.00
|
|
35
|
+
- 取舍:入点=按发声区间前推 0.3 秒余量,开头 1.5 秒的凝视与上一段蓄势重复,整段去掉;出点=句尾收音之后 0.4 秒,人物姿态尚未回弹
|
|
36
|
+
- 声音:保留原声
|
|
37
|
+
- 字幕:这条路我自己走
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
说明:本文件是格式样例,`制作成果/videos/...` 是示意路径。真实项目里每个「来源」的路径都必须
|
|
42
|
+
指向当前可读的文件,`check` 会逐条核对。「未采用镜头」的两条理由分别示范了必须区分的两类——
|
|
43
|
+
文件缺失回生产,质量不可用回上游改提示词。
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# 入出点与镜序
|
|
2
|
+
|
|
3
|
+
## 入出点
|
|
4
|
+
|
|
5
|
+
在素材可用区间内,按信息、表演与节奏选入出点。
|
|
6
|
+
动作镜可以从动作已经开始的位置进入;反应、等待、揭示前停顿可以保留静止。
|
|
7
|
+
出点要让观众读到本镜的结果,并避开后续漂移或无意重复。
|
|
8
|
+
|
|
9
|
+
对白先确定实际发声区间,保留完整的字音与需要的停顿。
|
|
10
|
+
画面切换可以发生在一句台词中间,前提是音轨连续、说话人和叙事关系清楚。
|
|
11
|
+
不要为了换画面把原台词改成两句。内置 render 只做同步切段;分离画面和声音的剪法
|
|
12
|
+
需要先用外部剪辑工具完成,记录所用素材、声音区间和处理方式。
|
|
13
|
+
|
|
14
|
+
## 镜序与相邻关系
|
|
15
|
+
|
|
16
|
+
默认沿用分镜镜序。调整时检查动作因果、视线、空间关系、信息揭示和声音衔接。
|
|
17
|
+
相近景别与机位之间的切换容易暴露跳动,可比较改变角度、插入反应或有意跳切的效果。
|
|
18
|
+
是否保留由观众需要看到的信息决定,不把景别、机位和运动方向的组合设为禁令。
|
|
19
|
+
|
|
20
|
+
重复信息没有新增作用时可删;如果第二次增加反应、对照或重新解释,可以保留。
|
|
21
|
+
拆取两段素材也可以,但要确认动作、台词和情绪仍连贯。
|
|
22
|
+
|
|
23
|
+
## 切点与转场
|
|
24
|
+
|
|
25
|
+
动接动、声音桥和切到不同主体都可帮助衔接,按本场叙事选择。
|
|
26
|
+
若相邻镜头有生成漂移,先判断能否通过取舍或接镜校正解决;叠化等转场不能替代缺失的内容。
|
|
27
|
+
|
|
28
|
+
剧本的 `[转场]` 可能交代时空变化,也可能明确指定声音或画面效果,先读具体要求。
|
|
29
|
+
可通过新镜头中的环境信息、声音桥、黑场或其他已接受效果实现。
|
|
30
|
+
内置 render 只做硬切;需要声音桥或画面转场时使用外部工具,并记录处理参数。
|
|
31
|
+
|
|
32
|
+
## 时长与完成
|
|
33
|
+
|
|
34
|
+
删短某段后,只有其他段落确实需要更多表演或阅读时间才延长,不机械补齐总秒数。
|
|
35
|
+
目标时长若是创作参考,报告实际时长与差异;若是用户明确的交付限制,则继续调整或指出
|
|
36
|
+
缺少哪些素材才能满足,不能把它自行降为参考值。
|
|
37
|
+
|
|
38
|
+
下一轮修改应针对成片里可见或可听的问题,优先修复影响理解、连续性和交付要求的部分。
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# 交付与验收
|
|
2
|
+
|
|
3
|
+
检查实际交付文件,并区分实测结果、人工判断和未测项。
|
|
4
|
+
|
|
5
|
+
| 项 | 怎么核对 |
|
|
6
|
+
|---|---|
|
|
7
|
+
| 时长与切点 | 对照实际渲染区间、帧边界和用户时长要求 |
|
|
8
|
+
| 内容覆盖 | 对照分镜和视频提示词,必要内容有承载,未采用镜头有原因 |
|
|
9
|
+
| 台词 | 在成片上回听,必要时转写辅助,逐句对照剧本 |
|
|
10
|
+
| 边界帧 | 查看剪辑点前后,检查意外黑白帧、画面断裂和漂移 |
|
|
11
|
+
| 声音 | 回听接缝、对白清晰度与已声明静默;测量整片响度 |
|
|
12
|
+
| 字幕 | 检查逐字内容、发声时间、字号、折行和画内文字避让 |
|
|
13
|
+
| 画内文字 | 按剧本与视觉设定的文字政策检查载体、可读性和指定文字 |
|
|
14
|
+
| 画幅与帧率 | 探测输出文件,对照交付规格 |
|
|
15
|
+
| 接镜色彩 | 在同场景、同光态下比较可比区域,确认校正没有过冲 |
|
|
16
|
+
|
|
17
|
+
`verify` 只提供部分技术测量,不能替代回听与画面检查。
|
|
18
|
+
分段色彩观测按当前剪辑单读取中间分段,报告平均亮度和蓝减红像素值;它不代表成片局部区域的
|
|
19
|
+
接镜残差,也不要求各场景接近同一均值。改动剪辑单后先重新渲染,再测量并查看实际切点。
|
|
20
|
+
发现有意黑场、静默或光态变化时按创作意图判断,不因数值异常直接判错。
|
|
21
|
+
|
|
22
|
+
## 交付
|
|
23
|
+
|
|
24
|
+
给出成片、剪辑单、可继续编辑的中间文件,以及外部混音或字幕工程(如使用)。
|
|
25
|
+
说明是否满足用户要求、仍有哪些内容缺口和取舍;测不了的必要项目写明原因。
|
|
26
|
+
|
|
27
|
+
需要补素材、改台词或改分镜时,指出对应镜头与发生时间并交给负责阶段。
|
|
28
|
+
渲染成功只证明工具完成执行,成片的内容判断需要观看和回听;正式审查由
|
|
29
|
+
`$short-drama-review` 或创作者进行。
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# 生成素材的可用区间
|
|
2
|
+
|
|
3
|
+
## 先检查素材
|
|
4
|
+
|
|
5
|
+
逐段播放素材,记录实际时长、可用区间,以及不能使用的部分及原因。
|
|
6
|
+
重点检查起始等待、动作回弹、身份或道具漂移、异常提亮、重复表演和口型错位。
|
|
7
|
+
静止、暗部和停顿是否可用,取决于它们是否符合镜头职责。
|
|
8
|
+
|
|
9
|
+
需要比较画面变化时,可每 0.25–0.5 秒抽帧;在疑似缺陷附近加密到逐帧查看。
|
|
10
|
+
亮度测量可以辅助发现缓慢漂移,身份、动作和局部细节仍需看画面。
|
|
11
|
+
|
|
12
|
+
可用区间短于计划时长时:
|
|
13
|
+
|
|
14
|
+
- 已完整承载信息和表演,可以缩短。
|
|
15
|
+
- 其他素材能够承接缺失信息,可以换镜或调整镜序。
|
|
16
|
+
- 必要动作、台词或反应仍缺失,列出缺口并请求补素材。
|
|
17
|
+
|
|
18
|
+
不要只为避开画面缺陷而丢掉故事所需的信息。若画面不可用而对白完整,可评估保留声音、
|
|
19
|
+
另配画面的剪法;外部混音与画面处理须记录在剪辑单中。
|
|
20
|
+
|
|
21
|
+
## 把缺陷反馈给上游
|
|
22
|
+
|
|
23
|
+
描述缺陷发生的时间和画面,再给出希望保留的状态,例如「结尾高光过曝,需保持桌面纹理可辨」。
|
|
24
|
+
正面描述通常更容易说明目标;确有必要的排除条件可以保留,不按否定词数量判错。
|
|
25
|
+
重出后比较同一处是否改善,不把某次生成结果当作所有模型的规律。
|
|
26
|
+
|
|
27
|
+
## 接镜与色彩一致性
|
|
28
|
+
|
|
29
|
+
先按同一场景、同一光态分组,再选择可比较的脸、衣物或中性表面作基准。
|
|
30
|
+
全画面平均 RGB 会受景别、服装面积和背景影响,只用于筛查,不能单独决定校正量。
|
|
31
|
+
夜景、日景和有意的冷暖对比不需要拉到全片同一均值。
|
|
32
|
+
|
|
33
|
+
相邻镜头有可见的曝光或白平衡偏差时,在对应 CUT 写:
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
- 画面:亮度 +0.06;色温 -6
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- `亮度`:加法偏移,工具支持 −0.25…+0.25。
|
|
40
|
+
- `饱和`:倍数,工具支持 0…2。
|
|
41
|
+
- `色温`:工具的冷暖校正量,支持 −30…+30,正数提红压蓝;不是开尔文值。
|
|
42
|
+
|
|
43
|
+
这些范围是内置工具的处理范围,不是画面质量标准。需要更大或更精细的校正时使用调色工具。
|
|
44
|
+
先试小幅校正,再看渲染结果和相同区域的测量;不要用固定系数把整片均值差直接换算成校正量。
|
|
45
|
+
人物身份漂移、错误光源或缺失动作应交回上游。
|
|
46
|
+
|
|
47
|
+
生成阶段仍应保持已接受的光线和色调;已有素材只差可校正的曝光或白平衡时,优先评估后期修正。
|
|
48
|
+
|
|
49
|
+
## 颗粒
|
|
50
|
+
|
|
51
|
+
项目需要时,在交付规格写 `- 颗粒:6`;不写或写「无」就不加。
|
|
52
|
+
内置工具支持 0–20 的动态噪点强度,在拼接后对整片统一应用。
|
|
53
|
+
这是一种可选质感处理,不保证产生胶片效果,也不能修复身份、动作和光线错误。
|
|
54
|
+
需要按场景区别处理时,使用外部调色工具并记录决定。
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# 声音、字幕与音乐
|
|
2
|
+
|
|
3
|
+
## 声音接缝
|
|
4
|
+
|
|
5
|
+
在相邻镜头拼接后回听底噪、混响、环境声和音乐是否突然变化。
|
|
6
|
+
可按需要采用音轨交叉淡入、连续环境底、对白与画面分离或补充音乐。
|
|
7
|
+
保留有叙事作用的静默、音效和相对响度。
|
|
8
|
+
|
|
9
|
+
**内置工具范围**:`edit_tool.py render` 保留素材原声并可做整片响度标准化;
|
|
10
|
+
CUT 的 `声音` 行是剪辑说明,工具不解析它,不执行静音、交叉淡入、配乐进入或 ducking。
|
|
11
|
+
需要这些处理时用 ffmpeg 或剪辑软件另行完成,记录命令或工程及实际输出;完成后再验收。
|
|
12
|
+
不能把写下声音方案或 render 成功当成已经混音。
|
|
13
|
+
|
|
14
|
+
## 响度
|
|
15
|
+
|
|
16
|
+
两遍测量不保证归一化后恰好达到目标。线性增益会超过峰值或动态范围目标时,
|
|
17
|
+
`loudnorm` 会退回动态处理;短片和稀疏音效仍需测量编码后的实际 LUFS 与真峰。
|
|
18
|
+
内置归一化输出使用 48 kHz,避免动态处理的内部升采样直接决定 AAC 采样率。
|
|
19
|
+
不达标时按声音设计通过外部工具处理瞬态、限幅或混音,再核对成片;不要把目标值当实测值。
|
|
20
|
+
|
|
21
|
+
## 台词与时间
|
|
22
|
+
|
|
23
|
+
先在源素材上定位发声区间,再在成片上逐句回听,核对留下的台词完整、可辨。
|
|
24
|
+
转写可以辅助查漏和定位,最终文字按剧本核对,识别有出入时回听确认。
|
|
25
|
+
|
|
26
|
+
重出素材会改变发声位置,应重测相关字幕时间并更新剪辑单。
|
|
27
|
+
`check` 会提示素材比剪辑单新;这个时间戳检查不能证明字幕已经重新对齐。
|
|
28
|
+
|
|
29
|
+
## 字幕
|
|
30
|
+
|
|
31
|
+
竖屏短剧默认硬字幕,服从用户的字幕选择。
|
|
32
|
+
字幕文字逐字取自《剧本.md》,标点可按字幕惯例调整。转写仅辅助定位,不覆盖原文。
|
|
33
|
+
|
|
34
|
+
- 一句过长时可拆成多个先后显示的字幕条。
|
|
35
|
+
- 一镜有多句时使用 `字幕 1`、`字幕 2` 等编号,每句给出时间。
|
|
36
|
+
- 字幕时间相对本 CUT 的入点,不相对源素材起点;落在该段使用区间内。
|
|
37
|
+
- 累计成片位置使用渲染后各段的实际时长,避免帧边界取整产生漂移。
|
|
38
|
+
- 抽帧检查字号、折行、安全区和画内文字遮挡。
|
|
39
|
+
|
|
40
|
+
内置 ffmpeg 路线用实际画幅作为 ASS PlayRes,字号按该画幅像素计算。
|
|
41
|
+
它采用全片统一样式,CUT 的字幕行不支持位置指令;需要逐镜避让或更复杂排版时,
|
|
42
|
+
用外部字幕编辑器或修改 Remotion 字幕层,并对输出抽帧检查。
|
|
43
|
+
|
|
44
|
+
### 渲染路线
|
|
45
|
+
|
|
46
|
+
| 路线 | 适用范围 | 开销 |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| `ffmpeg`(默认) | 统一的白字黑描边样式 | 需要带 libass 的 ffmpeg |
|
|
49
|
+
| `remotion` | 需要修改 CSS、字重、折行或入场动画 | Node 依赖,逐帧浏览器渲染;并发默认 2 |
|
|
50
|
+
|
|
51
|
+
Remotion 安装与样式调整见 [字幕叠层](../assets/remotion/README.md)。
|
|
52
|
+
两条路线都要在实际成片上检查字幕。
|
|
53
|
+
|
|
54
|
+
## 响度与时间线音乐
|
|
55
|
+
|
|
56
|
+
在剪辑单写交付响度;混音完成后对整片标准化并测量输出。
|
|
57
|
+
同时回听对白与环境的相对关系,整片响度达标不代表各句都清楚。
|
|
58
|
+
|
|
59
|
+
时间线音乐按已接受意图选择进入、退出、循环与对白压低区间。
|
|
60
|
+
素材不足时回生产阶段补齐;具体混音通过外部工具执行,并在剪辑单留下可复现记录。
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# 剪辑阶段契约
|
|
2
|
+
|
|
3
|
+
本阶段只拥有 `剧集/<EP>/剪辑单.md` 中的 `CUT-...` 项、交付规格章节,以及渲染到
|
|
4
|
+
`剧集/<EP>/制作成果/成片/` 的成片与中间文件。它继承镜序、镜头职责、台词原文和已生产的素材
|
|
5
|
+
字节,不回写剧本、视觉设定、分镜或视频提示词。
|
|
6
|
+
|
|
7
|
+
剪辑单记录素材取舍、时间与后期处理。可以缩短、重排或省略素材,但不回写上游的台词、
|
|
8
|
+
镜头职责和状态;确需改变故事内容时交由上游修订。
|
|
9
|
+
|
|
10
|
+
## 本阶段规则
|
|
11
|
+
|
|
12
|
+
### `EDT`
|
|
13
|
+
|
|
14
|
+
| ID | Class | Knowledge |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| EDT-01 | structural_invariant | Every `CUT-...` binds one existing `MOTION-...` and one currently readable media file; a cut with no material source cannot exist. |
|
|
17
|
+
| EDT-02 | structural_invariant | 入点, 出点 and 时长 are self-consistent (`出点 - 入点 == 时长`), non-negative, and the 出点 does not exceed the source file's measured duration. |
|
|
18
|
+
| EDT-03 | structural_invariant | Editing selects and orders existing frames. It never rewrites dialogue, shot purpose, start/end state, or any upstream declared duration; a needed semantic change is reported to the owning document instead. |
|
|
19
|
+
| EDT-04 | reviewed_invariant | Dialogue retained in the film remains audibly complete. Picture may cut during a line if the sound remains continuous and the narrative is clear. Separate picture and audio editing requires an external tool; the built-in renderer trims them together. |
|
|
20
|
+
| EDT-05 | structural_invariant | When subtitles are requested, every retained spoken line has a cue derived verbatim from the screenplay; punctuation may follow subtitle convention. Transcription locates speech but does not replace the source text. |
|
|
21
|
+
| EDT-06 | structural_invariant | Two cuts drawn from the same source file do not overlap in source time. Deliberate repetition is declared as repetition and states why the second appearance still earns its place. |
|
|
22
|
+
| EDT-07 | reviewed_invariant | Each cut's in-point and out-point land inside that material's usable band, and 取舍 names what is visible at each boundary rather than citing an abstract need for pace. |
|
|
23
|
+
| EDT-08 | craft_default | Check adjacent cuts for unintended visual jumps and duplicated information. Similar framing, deliberate repetition and jump cuts are valid when they serve the accepted narrative. |
|
|
24
|
+
| EDT-09 | craft_default | Do not mechanically redistribute trimmed time. Extend another beat only when its performance or readability benefits, and preserve explicit delivery-duration requirements. |
|
|
25
|
+
| EDT-10 | reviewed_invariant | Listen to joins for unintended changes in ambience or music. Use an appropriate documented audio treatment when needed; the built-in renderer does not execute prose mixing instructions. |
|
|
26
|
+
| EDT-11 | reviewed_invariant | Record unused shots with a reason: missing material, unusable quality, or an intentional narrative omission. |
|
|
27
|
+
| EDT-12 | craft_default | The delivered film is loudness-normalized to one declared target, and burned subtitles are the default for vertical short drama. |
|
|
28
|
+
| EDT-13 | craft_default | Distinguish a reference target from a required delivery duration. Report the gap and satisfy a fixed requirement or identify the material needed to do so. |
|
|
29
|
+
| EDT-14 | taste_option | Cut rhythm, whether a beat is held or clipped, and whether a moment repeats are creator choices; the suite records them and does not treat any of them as defects. |
|
|
30
|
+
| EDT-15 | structural_invariant | Rendering, duration match and file existence are technical outcomes. None of them may be reported as a statement about whether the film is good; quality goes to review or to the creator. |
|
|
31
|
+
| EDT-16 | reviewed_invariant | Compare shots within the same scene and lighting state using comparable image regions. Record corrections, then inspect the output. Whole-frame averages alone do not establish a mismatch; intentional lighting changes are valid. |
|
|
32
|
+
| EDT-17 | structural_invariant | After material is regenerated, re-measure the spoken spans and update its subtitle windows before rendering. The material-mtime warning is a prompt to check, not proof of alignment. |
|
|
33
|
+
| EDT-18 | taste_option | Optional grain is declared once in the delivery spec and applied dynamically after assembly by the built-in renderer. Its supported range is a tool limit, not a quality standard; other treatments may use external grading tools. |
|
|
34
|
+
|
|
35
|
+
规则分级由高到低:`structural_invariant`(结构缺陷,阻断)、
|
|
36
|
+
`reviewed_invariant`(需证据判断)、`craft_default`(常用做法,可覆盖)、
|
|
37
|
+
`taste_option`(创作者选择,不作缺陷)。创作者已接受的事实优先于本表。
|
|
38
|
+
|
|
39
|
+
## 与上游阶段的分工
|
|
40
|
+
|
|
41
|
+
| 问题 | 归属 |
|
|
42
|
+
|---|---|
|
|
43
|
+
| 这句台词该怎么说 | `剧本.md` |
|
|
44
|
+
| 这一镜承担什么、起终状态是什么 | `分镜.md` |
|
|
45
|
+
| 这一镜怎么动、生成时说什么 | `视频提示词.md` |
|
|
46
|
+
| 这一段素材怎么来的、花了多少钱 | 生产运行记录 |
|
|
47
|
+
| **这一段素材哪几帧进成片** | **`剪辑单.md`** |
|
|
48
|
+
| 成片好不好看 | 审查,或创作者本人 |
|
|
49
|
+
|
|
50
|
+
生成结果与上游声明不符时,剪辑记录事实并取舍,同时把不符点名报告;不在剪辑单里修改上游声明
|
|
51
|
+
来让它们看起来一致。
|