akari-video 0.1.0
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/LICENSE +21 -0
- package/README.md +81 -0
- package/bin/akari.mjs +14 -0
- package/package.json +42 -0
- package/src/cli.mjs +140 -0
- package/src/messages.mjs +100 -0
- package/src/path-lookup.mjs +47 -0
- package/src/project-state.mjs +25 -0
- package/src/repo-assets.mjs +59 -0
- package/src/task-labels.mjs +30 -0
- package/src/update-check.mjs +189 -0
- package/vendor/packages/project-scaffold/package.json +11 -0
- package/vendor/packages/project-scaffold/src/index.mjs +523 -0
- package/vendor/packages/project-scaffold/test/create-project.test.mjs +81 -0
- package/vendor/packages/project-scaffold/test/skill-adapter-link.test.mjs +204 -0
- package/vendor/packages/schemas/analysis.schema.json +475 -0
- package/vendor/packages/schemas/asset-meta.schema.json +225 -0
- package/vendor/packages/schemas/avatar-rendition.schema.json +65 -0
- package/vendor/packages/schemas/avatar.schema.json +178 -0
- package/vendor/packages/schemas/bin/validate-asset.mjs +597 -0
- package/vendor/packages/schemas/bin/validate-avatar.mjs +486 -0
- package/vendor/packages/schemas/bin/validate-captions.mjs +316 -0
- package/vendor/packages/schemas/bin/validate-connections.mjs +295 -0
- package/vendor/packages/schemas/bin/validate-edit.mjs +766 -0
- package/vendor/packages/schemas/bin/validate-intake.mjs +185 -0
- package/vendor/packages/schemas/bin/validate-interpretation.mjs +515 -0
- package/vendor/packages/schemas/bin/validate-plan-comments.mjs +170 -0
- package/vendor/packages/schemas/bin/validate-plan.mjs +365 -0
- package/vendor/packages/schemas/bin/validate-recipe.mjs +267 -0
- package/vendor/packages/schemas/bin/validate-research-plan.mjs +510 -0
- package/vendor/packages/schemas/bin/validate-review.mjs +427 -0
- package/vendor/packages/schemas/captions.schema.json +141 -0
- package/vendor/packages/schemas/connections.schema.json +153 -0
- package/vendor/packages/schemas/edit.schema.json +437 -0
- package/vendor/packages/schemas/examples/analysis-person-matte-valid/analysis.json +18 -0
- package/vendor/packages/schemas/examples/captions-text-style-background-mode-invalid/captions.json +18 -0
- package/vendor/packages/schemas/examples/captions-text-style-color-non-hex-invalid/captions.json +14 -0
- package/vendor/packages/schemas/examples/captions-text-style-default-only-valid/captions.json +27 -0
- package/vendor/packages/schemas/examples/captions-text-style-omitted-valid/captions.json +11 -0
- package/vendor/packages/schemas/examples/captions-text-style-opacity-out-of-range-invalid/captions.json +8 -0
- package/vendor/packages/schemas/examples/captions-text-style-record-override-valid/captions.json +27 -0
- package/vendor/packages/schemas/examples/captions-text-style-size-non-positive-invalid/captions.json +14 -0
- package/vendor/packages/schemas/examples/captions-text-style-zone-invalid/captions.json +16 -0
- package/vendor/packages/schemas/examples/connections-v0-invalid-auth/connections.json +32 -0
- package/vendor/packages/schemas/examples/connections-v0-memory-valid/connections.json +42 -0
- package/vendor/packages/schemas/examples/edit-beats-duplicate-id/edit.json +11 -0
- package/vendor/packages/schemas/examples/edit-beats-invalid-id/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-beats-missing-kind/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-beats-strength-out-of-range/edit.json +11 -0
- package/vendor/packages/schemas/examples/edit-beats-v0-src-present/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-beats-v0-valid/edit.json +29 -0
- package/vendor/packages/schemas/examples/edit-beats-v1-src-missing-reference/edit.json +14 -0
- package/vendor/packages/schemas/examples/edit-beats-v1-valid/edit.json +37 -0
- package/vendor/packages/schemas/examples/edit-bgm-ducking-invalid/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-bgm-fade-invalid/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-bgm-fade-valid/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-bgm-in-invalid/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-bgm-in-valid/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-bgm-missing-path/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-bgm-null-valid/edit.json +11 -0
- package/vendor/packages/schemas/examples/edit-bgm-sfx-gain-out-of-range/edit.json +11 -0
- package/vendor/packages/schemas/examples/edit-bgm-sfx-valid/edit.json +23 -0
- package/vendor/packages/schemas/examples/edit-chroma-key-invalid/edit.json +7 -0
- package/vendor/packages/schemas/examples/edit-cuts-at-negative-invalid/edit.json +7 -0
- package/vendor/packages/schemas/examples/edit-cuts-at-track-valid/edit.json +20 -0
- package/vendor/packages/schemas/examples/edit-cuts-opacity-out-of-range-invalid/edit.json +16 -0
- package/vendor/packages/schemas/examples/edit-cuts-track-invalid/edit.json +7 -0
- package/vendor/packages/schemas/examples/edit-cuts-transform-full-valid/edit.json +17 -0
- package/vendor/packages/schemas/examples/edit-cuts-transform-omitted-valid/edit.json +9 -0
- package/vendor/packages/schemas/examples/edit-cuts-transform-partial-valid/edit.json +16 -0
- package/vendor/packages/schemas/examples/edit-cuts-transform-rotate-invalid/edit.json +16 -0
- package/vendor/packages/schemas/examples/edit-cuts-transform-scale-invalid/edit.json +16 -0
- package/vendor/packages/schemas/examples/edit-cuts-transform-unknown-key-invalid/edit.json +16 -0
- package/vendor/packages/schemas/examples/edit-direction-intensity-negative/edit.json +8 -0
- package/vendor/packages/schemas/examples/edit-direction-intensity-not-integer/edit.json +8 -0
- package/vendor/packages/schemas/examples/edit-direction-intensity-out-of-range/edit.json +8 -0
- package/vendor/packages/schemas/examples/edit-direction-missing-preset/edit.json +8 -0
- package/vendor/packages/schemas/examples/edit-direction-overrides-array/edit.json +8 -0
- package/vendor/packages/schemas/examples/edit-direction-preset-only/edit.json +8 -0
- package/vendor/packages/schemas/examples/edit-direction-valid/edit.json +8 -0
- package/vendor/packages/schemas/examples/edit-emphasis-words-empty-word/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-emphasis-words-invalid-id/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-emphasis-words-missing-emotion/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-emphasis-words-range-invalid/edit.json +11 -0
- package/vendor/packages/schemas/examples/edit-emphasis-words-v0-src-present/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-emphasis-words-v0-valid/edit.json +32 -0
- package/vendor/packages/schemas/examples/edit-emphasis-words-v1-valid/edit.json +39 -0
- package/vendor/packages/schemas/examples/edit-layers-invalid-bad-blend/edit.json +17 -0
- package/vendor/packages/schemas/examples/edit-layers-invalid-chroma-key-on-baked/edit.json +17 -0
- package/vendor/packages/schemas/examples/edit-layers-invalid-duplicate-id/edit.json +11 -0
- package/vendor/packages/schemas/examples/edit-layers-track-invalid/edit.json +8 -0
- package/vendor/packages/schemas/examples/edit-layers-valid/edit.json +31 -0
- package/vendor/packages/schemas/examples/edit-look-invalid/edit.json +7 -0
- package/vendor/packages/schemas/examples/edit-master-invalid/edit.json +8 -0
- package/vendor/packages/schemas/examples/edit-narration-gain-out-of-range/edit.json +18 -0
- package/vendor/packages/schemas/examples/edit-narration-invalid-id/edit.json +17 -0
- package/vendor/packages/schemas/examples/edit-narration-missing-provenance/edit.json +16 -0
- package/vendor/packages/schemas/examples/edit-narration-valid/edit.json +36 -0
- package/vendor/packages/schemas/examples/edit-narration-voicevox-missing-credit/edit.json +20 -0
- package/vendor/packages/schemas/examples/edit-render-basics-valid/edit.json +22 -0
- package/vendor/packages/schemas/examples/edit-sfx-in-invalid/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-sfx-in-out-valid/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-sfx-out-invalid/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-sfx-out-type-invalid/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-sfx-t-invalid/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-sfx-track-invalid/edit.json +8 -0
- package/vendor/packages/schemas/examples/edit-speed-invalid/edit.json +7 -0
- package/vendor/packages/schemas/examples/edit-timeline-declared-valid/edit.json +14 -0
- package/vendor/packages/schemas/examples/edit-timeline-duplicate-id-invalid/edit.json +13 -0
- package/vendor/packages/schemas/examples/edit-timeline-interleaved-valid/edit.json +22 -0
- package/vendor/packages/schemas/examples/edit-timeline-omitted-valid/edit.json +7 -0
- package/vendor/packages/schemas/examples/edit-timeline-ref-invalid/edit.json +13 -0
- package/vendor/packages/schemas/examples/edit-tracks-section-invalid/edit.json +8 -0
- package/vendor/packages/schemas/examples/edit-tracks-section-valid/edit.json +13 -0
- package/vendor/packages/schemas/examples/edit-transition-invalid/edit.json +10 -0
- package/vendor/packages/schemas/examples/edit-v0-sample/edit.json +27 -0
- package/vendor/packages/schemas/examples/edit-v0-sample/overlays/cap-a.html +17 -0
- package/vendor/packages/schemas/examples/edit-v0-sample/overlays/cap-b.html +17 -0
- package/vendor/packages/schemas/examples/edit-v1-bgm-sfx-valid/edit.json +13 -0
- package/vendor/packages/schemas/examples/edit-v1-sample/edit.json +14 -0
- package/vendor/packages/schemas/examples/plan-comments-v0-sample/plan-comments.json +19 -0
- package/vendor/packages/schemas/examples/plan-v0-sample/plan.json +39 -0
- package/vendor/packages/schemas/examples/recipe-v0-sample/product-demo-quick-cuts.json +23 -0
- package/vendor/packages/schemas/examples/review-v1-sample/review.json +11 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/AVATAR.md +159 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/avatar.json +22 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-bustup/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-bustup/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-bustup/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-bustup/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-bustup/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-fullbody/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-fullbody/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-fullbody/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-fullbody/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-fullbody/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/AVATAR.md +30 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/avatar.json +22 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-bustup/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-bustup/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-bustup/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-bustup/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-bustup/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-fullbody/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-fullbody/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-fullbody/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-fullbody/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-fullbody/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/AVATAR.md +30 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/avatar.json +22 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-bustup/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-bustup/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-bustup/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-bustup/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-bustup/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-fullbody/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-fullbody/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-fullbody/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-fullbody/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-fullbody/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/AVATAR.md +30 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/avatar.json +22 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-bustup/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-bustup/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-bustup/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-bustup/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-fullbody/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-fullbody/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-fullbody/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-fullbody/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-fullbody/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/AVATAR.md +30 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/avatar.json +21 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-bustup/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-bustup/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-bustup/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-bustup/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-bustup/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-fullbody/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-fullbody/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-fullbody/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-fullbody/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-fullbody/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-no-avatar-json/AVATAR.md +30 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/AVATAR.md +30 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/avatar.json +22 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-bustup/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-bustup/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-bustup/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-bustup/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-bustup/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-fullbody/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-fullbody/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-fullbody/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-fullbody/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-fullbody/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/AVATAR.md +30 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/avatar.json +22 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-bustup/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-bustup/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-bustup/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-bustup/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-bustup/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-fullbody/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-fullbody/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-fullbody/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-fullbody/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-fullbody/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/AVATAR.md +30 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/avatar.json +22 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-bustup/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-bustup/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-bustup/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-bustup/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-bustup/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-fullbody/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-fullbody/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-fullbody/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-fullbody/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-fullbody/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/AVATAR.md +30 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/avatar.json +22 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-bustup/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-bustup/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-bustup/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-bustup/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-bustup/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-fullbody/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-fullbody/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-fullbody/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-fullbody/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-fullbody/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/AVATAR.md +30 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/avatar.json +23 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-bustup/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-bustup/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-bustup/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-bustup/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-bustup/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-fullbody/happy.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-fullbody/neutral-half.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-fullbody/neutral-open.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-fullbody/neutral.png +0 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-fullbody/rendition.json +18 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-voice-only/AVATAR.md +28 -0
- package/vendor/packages/schemas/fixtures/avatar/valid-voice-only/avatar.json +19 -0
- package/vendor/packages/schemas/fixtures/intake/invalid-duplicate-task/intake.json +8 -0
- package/vendor/packages/schemas/fixtures/intake/invalid-missing-submitted-at/intake.json +8 -0
- package/vendor/packages/schemas/fixtures/intake/invalid-target-exclusive/intake.json +8 -0
- package/vendor/packages/schemas/fixtures/intake/invalid-unknown-task/intake.json +8 -0
- package/vendor/packages/schemas/fixtures/intake/valid-draft/intake.json +8 -0
- package/vendor/packages/schemas/fixtures/intake/valid-submitted/intake.json +8 -0
- package/vendor/packages/schemas/fixtures/plan/invalid-bad-confidence-enum/plan.json +15 -0
- package/vendor/packages/schemas/fixtures/plan/invalid-constraint-bad-applies-to/plan.json +18 -0
- package/vendor/packages/schemas/fixtures/plan/invalid-dangling-media-path/plan.json +15 -0
- package/vendor/packages/schemas/fixtures/plan/invalid-duplicate-slot-id/plan.json +25 -0
- package/vendor/packages/schemas/fixtures/plan/invalid-missing-required-field/plan.json +14 -0
- package/vendor/packages/schemas/fixtures/plan/unsupported-version/plan.json +4 -0
- package/vendor/packages/schemas/fixtures/plan/valid/plan.json +40 -0
- package/vendor/packages/schemas/fixtures/plan/valid/scaffold/beat-01.png +1 -0
- package/vendor/packages/schemas/fixtures/plan/valid/scaffold/beat-01.wav +1 -0
- package/vendor/packages/schemas/fixtures/plan/valid/scaffold/broll.mp4 +1 -0
- package/vendor/packages/schemas/fixtures/plan/warns-confidence-gap/plan.json +28 -0
- package/vendor/packages/schemas/fixtures/plan-comments/invalid-bad-pass/plan-comments.json +6 -0
- package/vendor/packages/schemas/fixtures/plan-comments/invalid-bad-target-id-for-index-kind/plan-comments.json +13 -0
- package/vendor/packages/schemas/fixtures/plan-comments/invalid-bad-target-kind/plan-comments.json +13 -0
- package/vendor/packages/schemas/fixtures/plan-comments/invalid-comments-not-array/plan-comments.json +6 -0
- package/vendor/packages/schemas/fixtures/plan-comments/invalid-missing-comment-field/plan-comments.json +12 -0
- package/vendor/packages/schemas/fixtures/plan-comments/invalid-missing-version/plan-comments.json +5 -0
- package/vendor/packages/schemas/fixtures/plan-comments/unsupported-version/plan-comments.json +6 -0
- package/vendor/packages/schemas/fixtures/plan-comments/valid/plan-comments.json +19 -0
- package/vendor/packages/schemas/fixtures/plan-comments/valid-unknown-fields/plan-comments.json +15 -0
- package/vendor/packages/schemas/fixtures/recipe/invalid-bad-aspect/recipe.json +13 -0
- package/vendor/packages/schemas/fixtures/recipe/invalid-bad-confirmed-by/recipe.json +13 -0
- package/vendor/packages/schemas/fixtures/recipe/invalid-bad-name-casing/recipe.json +13 -0
- package/vendor/packages/schemas/fixtures/recipe/invalid-bad-workflow/recipe.json +13 -0
- package/vendor/packages/schemas/fixtures/recipe/invalid-duplicate-overlay-kind/recipe.json +13 -0
- package/vendor/packages/schemas/fixtures/recipe/invalid-empty-confirmed/recipe.json +9 -0
- package/vendor/packages/schemas/fixtures/recipe/invalid-empty-narration/recipe.json +13 -0
- package/vendor/packages/schemas/fixtures/recipe/invalid-missing-version/recipe.json +12 -0
- package/vendor/packages/schemas/fixtures/recipe/invalid-provenance-mismatch/recipe.json +15 -0
- package/vendor/packages/schemas/fixtures/recipe/invalid-source-project-path/recipe.json +13 -0
- package/vendor/packages/schemas/fixtures/recipe/unsupported-version/recipe.json +13 -0
- package/vendor/packages/schemas/fixtures/recipe/valid/recipe.json +15 -0
- package/vendor/packages/schemas/fixtures/recipe/valid-unknown-fields/recipe.json +16 -0
- package/vendor/packages/schemas/fixtures/review/invalid-malformed-canvas-target/review.json +6 -0
- package/vendor/packages/schemas/fixtures/review/invalid-malformed-doc-target/review.json +6 -0
- package/vendor/packages/schemas/fixtures/review/invalid-malformed-image-target/review.json +6 -0
- package/vendor/packages/schemas/fixtures/review/invalid-strokes-bad-space/review.json +6 -0
- package/vendor/packages/schemas/fixtures/review/invalid-strokes-canvas-rect-with-frame/review.json +6 -0
- package/vendor/packages/schemas/fixtures/review/invalid-strokes-image-rect-with-frame/review.json +6 -0
- package/vendor/packages/schemas/fixtures/review/invalid-video-null-sourcet/review.json +6 -0
- package/vendor/packages/schemas/fixtures/review/valid/review.json +8 -0
- package/vendor/packages/schemas/fixtures/review/valid-canvas-target/review.json +7 -0
- package/vendor/packages/schemas/fixtures/review/valid-input-session/review.json +6 -0
- package/vendor/packages/schemas/fixtures/review/valid-strokes/review.json +8 -0
- package/vendor/packages/schemas/intake.schema.json +117 -0
- package/vendor/packages/schemas/interpretation.schema.json +419 -0
- package/vendor/packages/schemas/package.json +18 -0
- package/vendor/packages/schemas/plan-comments.schema.json +52 -0
- package/vendor/packages/schemas/plan.schema.json +129 -0
- package/vendor/packages/schemas/recipe.schema.json +106 -0
- package/vendor/packages/schemas/research-plan.schema.json +230 -0
- package/vendor/packages/schemas/review.schema.json +227 -0
- package/vendor/packages/schemas/test/fixtures/asset/invalid-matched-by/audio/whoosh-transition/meta.json +31 -0
- package/vendor/packages/schemas/test/fixtures/asset/valid-catalog/audio/whoosh-transition/meta.json +31 -0
- package/vendor/packages/schemas/test/fixtures/asset/valid-library/telop/lower-third-clean/fragment.html +139 -0
- package/vendor/packages/schemas/test/fixtures/asset/valid-library/telop/lower-third-clean/meta.json +32 -0
- package/vendor/packages/schemas/test/fixtures/asset/valid-library/telop/lower-third-clean/preview.png +0 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-analyses-missing-ref/interpretation.json +131 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-analyses-ref-mismatch/interpretation.json +132 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-arc-empty-refs/interpretation.json +126 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-context-missing-interview/interpretation.json +126 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-context-null-intake/interpretation.json +133 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-dangling-arc-ref/interpretation.json +132 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-duplicate-asset-ref/interpretation.json +132 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-flag-bad-type/interpretation.json +132 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-flag-missing-evidence/interpretation.json +131 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-missing-required-field/interpretation.json +131 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-open-question-answer-present-when-open/interpretation.json +133 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-open-question-answered-without-answer/interpretation.json +131 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-relations-dangling-target/interpretation.json +132 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-relations-self-reference/interpretation.json +132 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-section-end-before-start/interpretation.json +132 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-section-mismatched-start-end/interpretation.json +131 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/invalid-unknown-root-field/interpretation.json +133 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/unsupported-version/interpretation.json +132 -0
- package/vendor/packages/schemas/test/fixtures/interpretation/valid/interpretation.json +132 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/invalid-bad-category-enum/research-plan.json +128 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/invalid-dangling-chapter-ref/research-plan.json +128 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/invalid-dangling-shot-list-ref/research-plan.json +128 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/invalid-decided-at-mismatch/research-plan.json +128 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/invalid-duplicate-candidate-id/research-plan.json +128 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/invalid-japan-sns-notes-empty/research-plan.json +128 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/invalid-missing-required-field/research-plan.json +127 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/invalid-selected-missing-candidate/research-plan.json +128 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/invalid-structure-confirmed-mismatch/research-plan.json +128 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/unsupported-version/research-plan.json +128 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/valid/research-plan.json +79 -0
- package/vendor/packages/schemas/test/fixtures/research-plan/warns-empty-sources/research-plan.json +120 -0
- package/vendor/packages/schemas/test/validate-asset.test.mjs +38 -0
- package/vendor/packages/schemas/test/validate-avatar.test.mjs +109 -0
- package/vendor/packages/schemas/test/validate-captions.test.mjs +59 -0
- package/vendor/packages/schemas/test/validate-connections.test.mjs +31 -0
- package/vendor/packages/schemas/test/validate-edit.test.mjs +490 -0
- package/vendor/packages/schemas/test/validate-intake.test.mjs +66 -0
- package/vendor/packages/schemas/test/validate-interpretation.test.mjs +167 -0
- package/vendor/packages/schemas/test/validate-plan-comments.test.mjs +70 -0
- package/vendor/packages/schemas/test/validate-plan.test.mjs +67 -0
- package/vendor/packages/schemas/test/validate-recipe.test.mjs +107 -0
- package/vendor/packages/schemas/test/validate-research-plan.test.mjs +98 -0
- package/vendor/packages/schemas/test/validate-review.test.mjs +102 -0
- package/vendor/skills/.gitkeep +0 -0
- package/vendor/skills/address-review/SKILL.md +84 -0
- package/vendor/skills/address-review/bin/core/review-store.mjs +210 -0
- package/vendor/skills/address-review/bin/list.mjs +198 -0
- package/vendor/skills/address-review/bin/respond.mjs +89 -0
- package/vendor/skills/address-review/dev-fixtures/fixture-project/captions.json +22 -0
- package/vendor/skills/address-review/dev-fixtures/fixture-project/edit.json +12 -0
- package/vendor/skills/address-review/dev-fixtures/fixture-project/review.json +100 -0
- package/vendor/skills/address-review/test/review-store.test.mjs +201 -0
- package/vendor/skills/analyze-footage/SKILL.md +35 -0
- package/vendor/skills/analyze-footage/analysis-json.md +185 -0
- package/vendor/skills/analyze-footage/bin/person-matte/person-matte-helper.swift +343 -0
- package/vendor/skills/analyze-footage/bin/person-matte/person-matte.mjs +415 -0
- package/vendor/skills/analyze-footage/bin/speechanalyzer-helper.swift +138 -0
- package/vendor/skills/analyze-footage/bin/transcribe-cloud.mjs +486 -0
- package/vendor/skills/analyze-footage/bin/transcribe-sa.mjs +189 -0
- package/vendor/skills/analyze-footage/events-and-hooks.md +93 -0
- package/vendor/skills/analyze-footage/keyframes-and-review.md +130 -0
- package/vendor/skills/analyze-footage/media-and-transcript.md +219 -0
- package/vendor/skills/analyze-footage/person-matte.md +121 -0
- package/vendor/skills/analyze-footage/references/akari-data-contract.md +18 -0
- package/vendor/skills/analyze-footage/references/asset.meta.example.json +23 -0
- package/vendor/skills/analyze-footage/test/fixtures/scribe-punctuation-inflation.json +17 -0
- package/vendor/skills/analyze-footage/test/normalize-scribe.test.mjs +76 -0
- package/vendor/skills/analyze-footage/workflow.md +95 -0
- package/vendor/skills/analyze-project/SKILL.md +58 -0
- package/vendor/skills/analyze-project/collect.md +51 -0
- package/vendor/skills/analyze-project/decision-record.md +55 -0
- package/vendor/skills/analyze-project/interpretation.md +128 -0
- package/vendor/skills/analyze-project/interview.md +66 -0
- package/vendor/skills/analyze-project/references/interpretation-shape.md +42 -0
- package/vendor/skills/analyze-project/references/open-questions-examples.md +35 -0
- package/vendor/skills/analyze-project/validate-and-render.md +66 -0
- package/vendor/skills/bake-3d/SKILL.md +78 -0
- package/vendor/skills/compile-review-session/SKILL.md +78 -0
- package/vendor/skills/compile-review-session/bin/compile-review-session.mjs +799 -0
- package/vendor/skills/compile-review-session/bin/core/canvas-compiler.mjs +105 -0
- package/vendor/skills/compile-review-session/bin/core/compiler.mjs +221 -0
- package/vendor/skills/compile-review-session/bin/core/review-store.mjs +74 -0
- package/vendor/skills/compile-review-session/bin/core/time-mapping.mjs +370 -0
- package/vendor/skills/compile-review-session/bin/core/transcription.mjs +721 -0
- package/vendor/skills/compile-review-session/compilation-rules.md +98 -0
- package/vendor/skills/compile-review-session/dev-fixtures/README.md +24 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0001/audio.wav +0 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0001/edit.snapshot.json +12 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0001/events.jsonl +2 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0001/session.json +11 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0002/audio.wav +0 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0002/edit.snapshot.json +12 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0002/events.jsonl +5 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0002/session.json +11 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0003/audio.wav +0 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0003/edit.snapshot.json +12 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0003/events.jsonl +19 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0003/session.json +11 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0004/audio.wav +0 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0004/edit.snapshot.json +12 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0004/events.jsonl +2 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0004/session.json +11 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0005/session.json +1 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0006/audio.wav +0 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0006/events.jsonl +2 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0006/session.json +11 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0007/audio.wav +0 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0007/edit.snapshot.json +13 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0007/events.jsonl +9 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0007/session.json +11 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0008/audio.wav +0 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0008/edit.snapshot.json +12 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0008/events.jsonl +2 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0008/session.json +11 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0008/transcript.json +9 -0
- package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review.json +7 -0
- package/vendor/skills/compile-review-session/test/canvas-compiler.test.mjs +283 -0
- package/vendor/skills/compile-review-session/test/compiler.test.mjs +458 -0
- package/vendor/skills/create-project/SKILL.md +46 -0
- package/vendor/skills/create-project/bin/create-project.mjs +88 -0
- package/vendor/skills/edit-lint/SKILL.md +73 -0
- package/vendor/skills/edit-plan/SKILL.md +64 -0
- package/vendor/skills/edit-plan/approvals-and-generation.md +106 -0
- package/vendor/skills/edit-plan/avatar-resolution.md +241 -0
- package/vendor/skills/edit-plan/beat-sync.md +545 -0
- package/vendor/skills/edit-plan/beats.md +197 -0
- package/vendor/skills/edit-plan/emphasis-detection.md +366 -0
- package/vendor/skills/edit-plan/execution.md +157 -0
- package/vendor/skills/edit-plan/expression-selection.md +290 -0
- package/vendor/skills/edit-plan/plan-json.md +52 -0
- package/vendor/skills/edit-plan/recipe.md +74 -0
- package/vendor/skills/edit-plan/references/asset.decisions.example.json +12 -0
- package/vendor/skills/edit-plan/references/event.example.json +7 -0
- package/vendor/skills/edit-plan/report-guide.md +192 -0
- package/vendor/skills/edit-plan/workflow.md +108 -0
- package/vendor/skills/generate-narration/SKILL.md +40 -0
- package/vendor/skills/generate-narration/assets/reading-script-v1.md +18 -0
- package/vendor/skills/generate-narration/avatar-voice.md +54 -0
- package/vendor/skills/generate-narration/bin/generate-narration.mjs +572 -0
- package/vendor/skills/generate-narration/engines.md +78 -0
- package/vendor/skills/generate-narration/reading-text.md +36 -0
- package/vendor/skills/generate-narration/voice-profile-setup.md +77 -0
- package/vendor/skills/harvest-asset/SKILL.md +132 -0
- package/vendor/skills/manage-connections/SKILL.md +75 -0
- package/vendor/skills/manage-connections/bin/doctor.mjs +341 -0
- package/vendor/skills/overlay-authoring/3d.md +143 -0
- package/vendor/skills/overlay-authoring/SKILL.md +30 -0
- package/vendor/skills/overlay-authoring/motion.md +58 -0
- package/vendor/skills/overlay-authoring/table.md +41 -0
- package/vendor/skills/overlay-authoring/telop.md +69 -0
- package/vendor/skills/overlay-authoring/text-behind-person.md +224 -0
- package/vendor/skills/overlay-authoring/thumbnail.md +126 -0
- package/vendor/skills/render-cut/SKILL.md +66 -0
- package/vendor/skills/research-plan/SKILL.md +75 -0
- package/vendor/skills/research-plan/competitor.md +50 -0
- package/vendor/skills/research-plan/ideate.md +56 -0
- package/vendor/skills/research-plan/shotlist.md +46 -0
- package/vendor/skills/research-plan/storyboard.md +48 -0
- package/vendor/skills/research-plan/trends.md +33 -0
- package/vendor/skills/setup-audio-library/SKILL.md +93 -0
- package/vendor/skills/setup-audio-library/candidate-list.md +72 -0
- package/vendor/skills/setup-audio-library/drop-folder.md +72 -0
- package/vendor/skills/setup-audio-library/gallery.md +43 -0
- package/vendor/skills/setup-library/SKILL.md +33 -0
- package/vendor/skills/setup-library/fetch-and-validate.md +102 -0
- package/vendor/skills/setup-library/starter-pack.md +55 -0
- package/vendor/skills/setup-library/tools-check.md +83 -0
- package/vendor/skills/verify/SKILL.md +137 -0
- package/vendor/templates/project-default/.akari/cache/.gitkeep +0 -0
- package/vendor/templates/project-default/.akari/connections.json +233 -0
- package/vendor/templates/project-default/.akari/diffs/.gitkeep +1 -0
- package/vendor/templates/project-default/.akari/events/.gitkeep +1 -0
- package/vendor/templates/project-default/.akari/reports/.gitkeep +0 -0
- package/vendor/templates/project-default/.akari/sidecars/.gitkeep +1 -0
- package/vendor/templates/project-default/.akari/work/.gitkeep +0 -0
- package/vendor/templates/project-default/.akari/workflow.json +48 -0
- package/vendor/templates/project-default/.claude/settings.json +15 -0
- package/vendor/templates/project-default/.claude/skills/README.md +26 -0
- package/vendor/templates/project-default/AGENTS.md +49 -0
- package/vendor/templates/project-default/CLAUDE.md +35 -0
- package/vendor/templates/project-default/assets/.gitkeep +1 -0
- package/vendor/templates/project-default/exports/.gitkeep +1 -0
- package/vendor/templates/project-default/planning/.gitkeep +1 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Three.js + glTF authoring
|
|
2
|
+
|
|
3
|
+
## 経路の振り分け(まずここを判定)
|
|
4
|
+
|
|
5
|
+
本スキルの対象は**映像の上に重なるオーバーレイ 3D**(経路 A)だけ。3D シーンを動かして
|
|
6
|
+
**映像素材(クリップ)そのもの**を作る用途(経路 B)はオーバーレイでやらない —
|
|
7
|
+
Blender ヘッドレスで焼き込む。契約: `docs/contract-2026-07-14-3d-bake-recipe.md`。
|
|
8
|
+
判定基準: タイムラインにクリップとして置くなら B、映像の上に重ねるなら A。
|
|
9
|
+
|
|
10
|
+
## 現在の実装ゲート
|
|
11
|
+
|
|
12
|
+
live preview v0 は、fragment 内の非実行 JSON 宣言を信頼済みランタイムが読み、
|
|
13
|
+
ローカル `.glb` の静的シーンと内蔵 animation clip を描画できる。fragment の任意
|
|
14
|
+
JavaScript は実行しない。モデルは edit.json 相対パスから preview 専用 localhost
|
|
15
|
+
asset URL へ変換され、Three.js core と GLTFLoader は pinned IIFE として同梱される。
|
|
16
|
+
|
|
17
|
+
export(render-cut)は同じ Three.js runtime を puppeteer-core 経路で動かし、ローカル
|
|
18
|
+
`.glb` を自己完結 data URI として埋め込んで 3D overlay を焼き込む。
|
|
19
|
+
|
|
20
|
+
根拠: `packages/overlay-runtime/src/overlay-runtime.js`、
|
|
21
|
+
`packages/overlay-runtime/src/three-runtime.js`、[WHATWG HTML — scripting](https://html.spec.whatwg.org/dev/scripting.html)
|
|
22
|
+
|
|
23
|
+
## 宣言型 fragment スキーマ(preview v0)
|
|
24
|
+
|
|
25
|
+
fragment は単一ルートとし、透明 canvas、任意の静的 fallback、非実行の
|
|
26
|
+
`<script type="application/json" data-akari-3d-scene>` を 1 個だけ置く。
|
|
27
|
+
|
|
28
|
+
```html
|
|
29
|
+
<div class="product-spin">
|
|
30
|
+
<canvas class="product-spin__canvas"></canvas>
|
|
31
|
+
<div data-akari-3d-fallback>3D を読み込み中</div>
|
|
32
|
+
<script type="application/json" data-akari-3d-scene>
|
|
33
|
+
{
|
|
34
|
+
"model": "assets/models/product.glb",
|
|
35
|
+
"camera": {
|
|
36
|
+
"position": [0, 1.2, 3],
|
|
37
|
+
"fov": 45,
|
|
38
|
+
"near": 0.1,
|
|
39
|
+
"far": 100,
|
|
40
|
+
"lookAt": [0, 0.5, 0]
|
|
41
|
+
},
|
|
42
|
+
"environment": {
|
|
43
|
+
"intensity": 1.0,
|
|
44
|
+
"exposure": 1.0
|
|
45
|
+
},
|
|
46
|
+
"lights": [
|
|
47
|
+
{ "type": "ambient", "color": "#ffffff", "intensity": 0.35 },
|
|
48
|
+
{
|
|
49
|
+
"type": "directional",
|
|
50
|
+
"color": "#ffffff",
|
|
51
|
+
"position": [2, 3, 2],
|
|
52
|
+
"lookAt": [0, 0.5, 0],
|
|
53
|
+
"intensity": 1.2
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"materialOverrides": {
|
|
57
|
+
"ScreenMaterial": { "texture": "assets/screens/app-01.png" }
|
|
58
|
+
},
|
|
59
|
+
"animationClip": "Idle"
|
|
60
|
+
}
|
|
61
|
+
</script>
|
|
62
|
+
</div>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- top-level key は `model` / `camera` / `environment` / `lights` / `animationClip` / `materialOverrides` だけ。
|
|
66
|
+
- `model` は edit.json のあるディレクトリからの相対 `.glb` パス。URL や CDN を書かない。
|
|
67
|
+
- camera は perspective camera。`position` / `lookAt` は `[x, y, z]`、`fov` / `near` / `far` は数値。
|
|
68
|
+
- `environment` は手続き生成 IBL の knob。`intensity` は金属など PBR マテリアルへの環境光強度、
|
|
69
|
+
`exposure` は ACES Filmic tone mapping の露出で、どちらも 0 以上の数値を指定する。省略時は
|
|
70
|
+
`intensity` は `0.5`、`exposure` は `1.0`。外部 HDR 画像の URL は受け付けない。まず既定値で
|
|
71
|
+
確認し、白飛びを抑えるなら `exposure`、映り込み自体の強弱を変えるなら `intensity` を小幅に調整する。
|
|
72
|
+
IBL 自体(既定値での環境マップ・トーンマッピング)は preview / export とも常に有効 — `environment`
|
|
73
|
+
キーは既定値からの微調整用の任意 knob。
|
|
74
|
+
⚠️ **既知の制限**: `environment` キーを明示宣言すると、現行の preview 側パス解決
|
|
75
|
+
(`akari-preview-open-handler.ts` の 3D シーン許可キー一覧が未対応)が拒否し model パスが
|
|
76
|
+
空になって preview 側の読み込みが失敗する(export は影響を受けない・別経路のため)。
|
|
77
|
+
fix 待ちの間は `environment` キーを省略し既定値のまま使うこと。
|
|
78
|
+
- light type は `ambient` または `directional`。directional は `position` と `lookAt` を宣言できる。
|
|
79
|
+
- `animationClip` は glTF 内蔵 clip の正確な名前。省略時は静的シーンを描画する。
|
|
80
|
+
- `materialOverrides` は `{ "<material 名>": { "texture": "<画像の相対パス>" } }` の形で、名前が一致するマテリアルの `emissiveMap` を差し替える。画像は edit.json のあるディレクトリからの相対 PNG / JPEG / WebP 等を指定し、URL や CDN を書かない。該当するマテリアル名がモデル内にない場合は警告して無視される。
|
|
81
|
+
- canvas は CSS で表示寸法を必ず与える。fallback に `data-akari-3d-fallback` を付けると load 完了時だけ隠れる。fallback は自由にスタイルしてよく、`display` を宣言しても load 完了時にランタイムが確実に隠す。
|
|
82
|
+
|
|
83
|
+
## 原則
|
|
84
|
+
|
|
85
|
+
- 3D は Three.js、交換形式は glTF 系に限定する。preview v0 は外部 buffer を持たない自己完結 `.glb` と、`materialOverrides` で指定したローカル画像を受け付ける。Draco/KTX2 は未対応。
|
|
86
|
+
- Three.js 本体、addon、decoder、model、texture はローカルへ固定し、CDN import を使わない。export Chrome は background network を無効化する。
|
|
87
|
+
- fragment は上記の宣言型スキーマに限定する。任意 script、event handler、`new Function()` 等を使わない。
|
|
88
|
+
- 単一ルート内へ透明 canvas と静的 fallback を置く。canvas は透明合成を有効にし、背景を不透明に塗りつぶさない。
|
|
89
|
+
- asset は visible な期間だけ load / render / decode され、区間外と unmount で geometry、material、texture、renderer が解放される。
|
|
90
|
+
- camera、light、model pose、material、screen source を CSS 変数または素材 metadata の knob として宣言する。固定すべき model topology まで knob にしない。
|
|
91
|
+
|
|
92
|
+
## ライセンス済み glb
|
|
93
|
+
|
|
94
|
+
1. 配布元、asset ID / version、author、取得日、license、商用可否、改変可否、帰属表示を確認する。
|
|
95
|
+
2. glTF 形式であることを利用許諾と取り違えない。license 不明の model は使わない。
|
|
96
|
+
3. library からリンクせず、採用する project へ `.glb` と必要 texture / decoder をコピーする。
|
|
97
|
+
4. project 側 provenance に元 library、version、license、attribution を残す。
|
|
98
|
+
5. 相対 URL で読み込み、load error 時に空 canvas のまま成功扱いしない。
|
|
99
|
+
|
|
100
|
+
素材ライブラリ利用時のコピー規律は `docs/contract-2026-07-13-asset-library.md` に従う。
|
|
101
|
+
|
|
102
|
+
## 決定的な 3D アニメーション
|
|
103
|
+
|
|
104
|
+
- preview v0 は overlay の local timeline 秒を `AnimationMixer.setTime(localSeconds)` に渡し、その状態だけを render する。
|
|
105
|
+
- `THREE.Clock` や `mixer.update(delta)` で時間を積算しない。カメラ、shader time、particle も同じ local timeline から求める。
|
|
106
|
+
- rAF は算出済みの時刻を描画するためだけに使い、rAF delta を状態へ足さない。
|
|
107
|
+
- glTF clip がない動きも、local time の関数として pose を求める。再生・停止・逆シークで同じ結果になることを確認する。
|
|
108
|
+
|
|
109
|
+
公式: [Three.js AnimationMixer.setTime](https://threejs.org/docs/pages/AnimationMixer.html#setTime)
|
|
110
|
+
|
|
111
|
+
## VideoTexture
|
|
112
|
+
|
|
113
|
+
- `VideoTexture` の source は HTMLVideoElement とし、**編集用 720p プロキシ**を与える。原本を preview 用 texture へ接続しない。
|
|
114
|
+
- `source.proxy` の自動生成は現時点で未実装である。proxy がなければ先に生成し、ないまま原本へ黙って fallback しない。
|
|
115
|
+
- `<video>.currentTime` を overlay local timeline へ同期してから texture を更新する。autoplay / loop の wall-clock 再生へ任せない。
|
|
116
|
+
- 現行 preview / export は `<video>.currentTime` を同期しないため、動画 texture は **未対応** とする。
|
|
117
|
+
- source の寸法・format を変える場合は既存 texture を dispose し、作り直す。
|
|
118
|
+
|
|
119
|
+
公式: [Three.js VideoTexture](https://threejs.org/docs/pages/VideoTexture.html)
|
|
120
|
+
|
|
121
|
+
## パフォーマンス
|
|
122
|
+
|
|
123
|
+
- 4K 上の post-process blur、`filter: blur()`、`backdrop-filter`、過剰な shadow を使わない。
|
|
124
|
+
- 毎フレームの object / material / texture 生成、shader compile、model reload を避ける。
|
|
125
|
+
- preview v0 と export の renderer pixel ratio は `1` 固定。同一 scene の見え方を対象出力 profile で実測する。
|
|
126
|
+
- `renderer.info` で draw calls、triangles、textures を計測する。固定の polygon / draw-call 上限は一次根拠がないため発明せず、対象 Mac と出力 profile で **要検証** とする。
|
|
127
|
+
|
|
128
|
+
公式:
|
|
129
|
+
|
|
130
|
+
- [Three.js GLTFLoader](https://threejs.org/docs/pages/GLTFLoader.html)
|
|
131
|
+
- [Three.js — How to dispose of objects](https://threejs.org/manual/en/how-to-dispose-of-objects.html)
|
|
132
|
+
|
|
133
|
+
## よくある間違い
|
|
134
|
+
|
|
135
|
+
- CDN の Three.js、decoder、texture に依存する。
|
|
136
|
+
- Draco / KTX2 圧縮モデルを v0 へ渡す(decoder と worker は未対応)。
|
|
137
|
+
- license 不明の `.glb` を「ネットで見つけた素材」として同梱する。
|
|
138
|
+
- JSON 宣言の代わりに fragment 内の `<script>` を実行させようとする。
|
|
139
|
+
- export だけを見て WYSIWYG 対応済みと報告する。
|
|
140
|
+
- proxy がないため原本を `VideoTexture` へ流す。
|
|
141
|
+
- `Clock.getDelta()` / `mixer.update(delta)` でアニメーションする。
|
|
142
|
+
- 非表示後も render loop と video decode を動かす。
|
|
143
|
+
- dispose せず、素材切替のたびに GPU resource を残す。
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: overlay-authoring
|
|
3
|
+
description: AKARI Video のオーバーレイ HTML、字幕、表・グラフ、Three.js 3D、モーショングラフィックス、サムネイル、人物の後ろに文字を置く表現を設計・生成・レビューするときに発動する authoring ルーター。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# FORBIDDEN 級ハードルール
|
|
7
|
+
|
|
8
|
+
> **Language**: Respond in the user's language — 対話・質問・承認確認・レポートはユーザーの使用言語に合わせる(例: 英語で話しかけられたら英語で応答する)。
|
|
9
|
+
|
|
10
|
+
次のいずれかに違反する動画オーバーレイを作成・採用しない。詳細リーフより常に優先する。
|
|
11
|
+
|
|
12
|
+
1. **調整値を直書きしない。** 位置、拡縮、文字サイズ、色、余白、内容など、人が調整しうる値を CSS 変数として公開する。`--x`、`--y`、`--scale`、`--font-size`、`--color` などを使い、`edit.json.overlays[].vars` から継承できるよう `var(--name, fallback)` で参照する。断片ルートで同名変数を再定義して上書きを遮らない。
|
|
13
|
+
2. **時刻を別の仕組みに持たせない。** タイミングは `data-start` / `data-duration` とする。AKARI Video v0 では `edit.json.overlays[].start/duration` が SSOT で、ランタイムが外側コンテナの data 属性へ反映する。断片内の独立した時刻源を作らない。
|
|
14
|
+
3. **layout を毎フレーム動かさない。** アニメーションは `transform` / `opacity` 中心にする。4K 映像上の `filter: blur()` と `backdrop-filter` は禁止する。
|
|
15
|
+
4. **wall-clock で絵を決めない。** `Date.now()`、`performance.now()` の経過差、`setTimeout`、`setInterval`、rAF の delta 積算、未 seed の乱数に表示状態を依存させない。シーク時に WAAPI の `currentTime` を設定すれば同じ時刻の絵が再現される決定的設計にする。
|
|
16
|
+
5. **3D の別方式を持ち込まない。** 3D は Three.js + glTF とし、動画テクスチャは `VideoTexture` に編集用プロキシを与える。原本をプレビュー用テクスチャへ直結しない。
|
|
17
|
+
6. **トップレベルを複数にしない。** HTML 断片のルート要素は必ず 1 つにする。AKARI の外側コンテナによる translate / scale / rotate が常に効く構造を保つ。
|
|
18
|
+
|
|
19
|
+
# リーフ目次
|
|
20
|
+
|
|
21
|
+
必要な判断領域だけを読む。
|
|
22
|
+
|
|
23
|
+
- 字幕・テロップの日本語組版、可読性、配置: [telop.md](telop.md)
|
|
24
|
+
- 表・グラフの HTML/CSS 構成とアニメーション: [table.md](table.md)
|
|
25
|
+
- Three.js + glTF、動画テクスチャ、3D 性能: [3d.md](3d.md)
|
|
26
|
+
- 決定的モーション、イージング、compositor 制約: [motion.md](motion.md)
|
|
27
|
+
- サムネイルの型、デザイン語彙、生成経路、HTML スクショ: [thumbnail.md](thumbnail.md)
|
|
28
|
+
- 人物切り抜き、HEVC alpha、text-behind-person: [text-behind-person.md](text-behind-person.md)
|
|
29
|
+
|
|
30
|
+
静止サムネイル用 HTML シートは動画オーバーレイではないため timing data 属性を不要とする。ただし、CSS 変数化、単一ルート、ローカル資産、決定的なスクリーンショットという考え方は維持する。
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# モーショングラフィックス設計
|
|
2
|
+
|
|
3
|
+
## 原則
|
|
4
|
+
|
|
5
|
+
表示状態を `localTime = max(0, timelineTime - start)` と公開変数から求める純粋な設計にする。同じ localTime へシークしたとき、再生経路に関係なく同じ絵を返す。
|
|
6
|
+
|
|
7
|
+
- 主経路は CSS animation または WAAPI とする。ランタイムは descendant animation を pause し、`currentTime = localTime * 1000` に設定する。
|
|
8
|
+
- transition は「状態を変更した瞬間」に依存するため、主タイムラインの演出には使わない。
|
|
9
|
+
- animation event の発火回数や順序へ副作用を持たせない。シークはイベント区間を飛び越えうる。
|
|
10
|
+
- particle や反復要素は先に DOM を確定し、index と固定 seed から値を作る。再生中に未 seed の乱数で作り直さない。
|
|
11
|
+
- 外側コンテナの transform は AKARI の幾何操作用、断片内の子 transform は演出用として分離する。
|
|
12
|
+
|
|
13
|
+
## イージング語彙
|
|
14
|
+
|
|
15
|
+
| 意図 | CSS 語彙 | 使い方 |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| 等速・進捗・連続回転 | `linear` | 速度変化そのものに意味がない動き |
|
|
18
|
+
| 入場・減速して止まる | `ease-out` | 画面外から定位置へ入る要素 |
|
|
19
|
+
| 退場・加速して去る | `ease-in` | 定位置から画面外へ出る要素 |
|
|
20
|
+
| 姿勢 A と B の往復 | `ease-in-out` | カード反転、視線移動、穏やかな遷移 |
|
|
21
|
+
| 離散切替 | `steps()` | カウンタの桁、LED、コマ送り風表現 |
|
|
22
|
+
|
|
23
|
+
独自 `cubic-bezier()` は named easing で意図を表せない場合だけ使い、CSS 変数化して理由を残す。標準キーワードの定義は [W3C CSS Easing Functions Level 2](https://www.w3.org/TR/css-easing-2/) を参照する。
|
|
24
|
+
|
|
25
|
+
## compositor 合成の制約
|
|
26
|
+
|
|
27
|
+
- 毎フレーム変えるのは原則 `transform` と `opacity` に限る。
|
|
28
|
+
- `top`、`left`、`width`、`height`、margin、padding、grid track、DOM 挿抜をアニメーションしない。
|
|
29
|
+
- 4K 映像上の `filter: blur()` と `backdrop-filter` を使わない。ぼかしが不可欠なら事前処理した画像を使う。
|
|
30
|
+
- static な背景、border、shadow は必要最小限にする。重い paint が疑われる場合は実際の出力解像度で計測し、根拠のない性能閾値を発明しない。
|
|
31
|
+
- `will-change` を全要素へ常設しない。対象と有効期間を限定する。
|
|
32
|
+
|
|
33
|
+
## 決定性チェック
|
|
34
|
+
|
|
35
|
+
次を含む場合は不合格にする。
|
|
36
|
+
|
|
37
|
+
- `Date.now()` / wall-clock 差分
|
|
38
|
+
- `performance.now()` の積算
|
|
39
|
+
- `setTimeout` / `setInterval` で進む状態
|
|
40
|
+
- rAF の delta を足し続ける状態
|
|
41
|
+
- 未 seed の `Math.random()`
|
|
42
|
+
- `AnimationMixer.update(delta)` のような経路依存の積算
|
|
43
|
+
|
|
44
|
+
rAF は、外部タイムラインから既に決めた状態を再描画する用途に限る。ただし現行 fragment には汎用 JS seek hook がないため、カスタム JS 描画は **要検証** とする。WAAPI の時刻制御は [W3C Web Animations](https://www.w3.org/TR/web-animations-1/) を参照する。
|
|
45
|
+
|
|
46
|
+
## 静的 fallback
|
|
47
|
+
|
|
48
|
+
`scripts/render-overlays.mjs` の static Chrome fallback は CSS / WAAPI animation を無効化する。入場途中にしか内容が存在しない構成にせず、代表静止状態でも意味が通るようにする。書き出し時は採用された renderer method を確認する。
|
|
49
|
+
|
|
50
|
+
## よくある間違い
|
|
51
|
+
|
|
52
|
+
- CSS transition を開始してから録画時間が進む前提にする。
|
|
53
|
+
- `requestAnimationFrame` のフレーム差を足して位置を決める。
|
|
54
|
+
- bounce 感を出すために意味のない custom easing を乱立する。
|
|
55
|
+
- outer transform と inner motion を同じ要素で競合させる。
|
|
56
|
+
- `filter: blur()` を入退場へ使う。
|
|
57
|
+
- static fallback では文字も結論も見えない。
|
|
58
|
+
- 一般名の `@keyframes fade-in` を使い、別断片と衝突する。
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 表・グラフ設計
|
|
2
|
+
|
|
3
|
+
## 原則
|
|
4
|
+
|
|
5
|
+
- 正確な値の照合・比較が主目的なら semantic な `<table>` を使う。傾向、順位、構成比を一目で示すなら DOM のラベルと値に CSS Grid / Flex を組み合わせる。
|
|
6
|
+
- データを HTML テキストとして残す。canvas のピクセルだけに値やラベルを閉じ込めない。
|
|
7
|
+
- 表示する値、順序、単位、丸めは authoring 前に確定する。同じ画面で並べる値は同じ基準と単位にそろえる。
|
|
8
|
+
- 色だけで系列を区別せず、ラベル、形、位置も併用する。軸、凡例、基準線を装飾より先に読める状態にする。
|
|
9
|
+
- `--accent-*`、`--label-color`、`--value-color`、`--row-gap`、`--bar-scale` などを CSS 変数で公開する。
|
|
10
|
+
- セレクタと `@keyframes` 名を断片固有のルート配下へ閉じる。
|
|
11
|
+
|
|
12
|
+
## HTML/CSS の構成
|
|
13
|
+
|
|
14
|
+
- 表は `<caption>`、`<thead>`、`<tbody>`、`<th scope>` を使い、見た目のためだけに div 表へ崩さない。
|
|
15
|
+
- 棒グラフは「ラベル」「静的な数値」「track」「fill」を DOM に持つ。値を定義域から **0〜1** に正規化し、fill を `transform: scaleX(var(--ratio))` または `scaleY()` で表す。
|
|
16
|
+
- 数字の桁が動く場合は `font-variant-numeric: tabular-nums` を使う。wall-clock の count-up ではなく、最終値を静的に置いて reveal する。
|
|
17
|
+
- 円弧や連続曲線が本当に必要な場合も、値を読める DOM の要約を残す。外部 chart library を安易に追加しない。
|
|
18
|
+
- 行数、文字サイズ、余白の一律閾値はリポ契約にない。収まらない場合は縮小せず、画面を分割する。具体値は出力プロファイルで **要検証** とする。
|
|
19
|
+
|
|
20
|
+
## アニメーション
|
|
21
|
+
|
|
22
|
+
- 棒は `transform-origin` を基点側へ置き、scale で伸ばす。`width` / `height` を毎フレーム変えない。
|
|
23
|
+
- 行やカードは translate + opacity で段階表示する。DOM の挿入・削除でレイアウトを揺らさない。
|
|
24
|
+
- 並べ替えは最終順を先に DOM へ置き、必要なら子要素の transform で見せる。再生中に table row を入れ替えない。
|
|
25
|
+
- CSS animation / WAAPI を使い、可視区間 `start <= t < start + duration` のローカル時刻に決定的に対応させる。
|
|
26
|
+
- 静的 Chrome fallback では animation が無効になる。静止状態だけでも値、単位、結論が伝わる構図にする。
|
|
27
|
+
|
|
28
|
+
## よくある間違い
|
|
29
|
+
|
|
30
|
+
- 精密な比較を 3D 円グラフや装飾だけで表す。
|
|
31
|
+
- canvas/chart library を導入し、live preview で script が動くと仮定する。
|
|
32
|
+
- 棒の `width`、行の `top`、grid track をアニメーションする。
|
|
33
|
+
- `setInterval` で数値を加算する。
|
|
34
|
+
- 系列色だけで意味を区別する。
|
|
35
|
+
- 情報量が多いまま任意の「最大行数」を発明する、または文字を極端に縮める。
|
|
36
|
+
- グローバルな `table` セレクタや一般名の `@keyframes grow` を使い、他断片と衝突する。
|
|
37
|
+
|
|
38
|
+
## 根拠
|
|
39
|
+
|
|
40
|
+
- 時刻、単一ルート、CSS 変数、compositor の契約: `CLAUDE.md` と `docs/contract-2026-07-13-m1-m4.md`
|
|
41
|
+
- 静的 fallback の制約: `scripts/render-overlays.mjs`
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# 字幕・テロップ設計
|
|
2
|
+
|
|
3
|
+
字幕は発話を読み取らせる反復 UI、テロップは要点や感情を強調する画面要素として分けて設計する。両者を同じ密度・同じ強さにしない。
|
|
4
|
+
|
|
5
|
+
## 原則
|
|
6
|
+
|
|
7
|
+
- `lang="ja"` を付け、日本語グリフを持つローカルフォントとフォールバックを指定する。書き出し環境に存在しないフォントへ暗黙依存しない。
|
|
8
|
+
- 意味のまとまりで改行する。助詞、句読点、括弧の片側だけを行頭・行末へ孤立させず、必要なら HTML に明示改行を置く。事前に行分割を確定した字幕断片は、行内の再折返しを CSS で禁止し(`white-space: nowrap`)、生成時の改行を唯一の改行にする。
|
|
9
|
+
- 全角・半角、英数字、記号の扱いを作品内で統一する。縦組みは横組みの CSS を回転しただけで済ませない。
|
|
10
|
+
- 字幕は映像内テキストや顔を避け、通常は下側、衝突時は上側または左右へ移す。テロップは視線誘導の対象へ寄せるが、被写体を覆うことを「強調」と取り違えない。
|
|
11
|
+
- 静的な不透明・半透明の地、縁取り、影のいずれかで背景から分離する。`filter: blur()` / `backdrop-filter` に頼らない。
|
|
12
|
+
- `--font-size`、`--line-height`、`--color`、`--background`、`--max-width`、`--safe-*` を調整点として公開する。既定値は `var(--name, fallback)` に置き、外側の `vars` を遮らない。
|
|
13
|
+
- セレクタと `@keyframes` 名を素材固有の接頭辞で閉じる。
|
|
14
|
+
|
|
15
|
+
## 可読サイズと文字量の目安
|
|
16
|
+
|
|
17
|
+
焼き込みテロップに全プラットフォーム共通の公式最小 px 値はない。したがって、根拠のない `px` 下限をハードルールにせず、`--font-size` を出力高に応じて決め、最終解像度と想定する最小端末で実読する。未実機の値は **要検証** と記す。
|
|
18
|
+
|
|
19
|
+
日本語字幕の構造チェックには、Netflix の日本語 Timed Text 仕様を適用条件付きで使える。同仕様は横字幕を **全角 13 文字/行まで**、**2 行まで**とし、半角文字を 0.5 文字として数える。これは Netflix 納品仕様であり、AKARI Video や他プラットフォームへ無条件に一般化しない。長い場合は文字を縮める前に要約・分割する。
|
|
20
|
+
|
|
21
|
+
AKARI Video の字幕既定は 1 行 20 全角字・句読点優先分割(オーナー裁定)。Netflix 13 字は納品仕様であり AKARI の既定ではない。
|
|
22
|
+
|
|
23
|
+
出典: [Netflix Japanese Timed Text Style Guide](https://partnerhelp.netflixstudios.com/hc/en-us/articles/215767517-Japanese-Timed-Text-Style-Guide)
|
|
24
|
+
|
|
25
|
+
## 配置セーフゾーン
|
|
26
|
+
|
|
27
|
+
固定値を使う前に配信先、広告かオーガニックか、画角、CTA、字幕欄、LTR/RTL を確定する。同名プラットフォームでも条件が違えば数値を流用しない。
|
|
28
|
+
|
|
29
|
+
| 適用条件 | 公式数値 | 運用 |
|
|
30
|
+
|---|---:|---|
|
|
31
|
+
| YouTube 縦型**動画広告**、1080×1920 | 上 288px、右 192px、下 672px、左 48px を避ける | 重要文字・ロゴを残りの safe area 内へ置く。オーガニック Shorts の値として使わない |
|
|
32
|
+
| Instagram / Facebook **Reels 広告**、9:16 | 下 35% を空ける | 下側に重要文字・ロゴを置かず、Meta の safe-zone checker でも確認する |
|
|
33
|
+
| TikTok Auction In-Feed 広告 | 固定座標なし | 画角、caption 長、追加 format、LTR/RTL に対応する公式 ZIP と Preview を使う。値は **要検証** |
|
|
34
|
+
|
|
35
|
+
YouTube の safe zone も全端末保証ではない。オーガニック投稿や表にない配信先は、固定座標を書かず **要検証** とし、公開直前のプラットフォーム preview で確認する。
|
|
36
|
+
|
|
37
|
+
出典:
|
|
38
|
+
|
|
39
|
+
- [Google Ads Help — About video ad specs](https://support.google.com/google-ads/answer/13547298?hl=en)
|
|
40
|
+
- [Google — Universal Video Ad Safe Zones](https://services.google.com/fh/files/misc/universalsafezones-youtube.pdf)
|
|
41
|
+
- [Meta — The Reels ads guide](https://d3m889aznlr23d.cloudfront.net/img/events/458925814/assets/e042d2be.reels_ads_guide1.pdf)
|
|
42
|
+
- [TikTok Ads Manager — TikTok Auction In-Feed Ads](https://ads.tiktok.com/help/article/tiktok-auction-in-feed-ads)
|
|
43
|
+
|
|
44
|
+
## コーナーキャプション(TV 風の隅ラベル)
|
|
45
|
+
|
|
46
|
+
放送の左上・右上に常駐する番組名/コーナー名ラベル。番組タイトル + 現在の章タイトルを出し、章立てに追従させる定型。**素材ライブラリに入れず、この定型から都度生成してよい**(プロジェクト固有のテキスト差し替えが本体で、再利用価値は構造にしかないため)。
|
|
47
|
+
|
|
48
|
+
- **HTML/CSS で作る。画像生成にしない**: 章ごとのテキスト差し替えが必要で、画像だと章数分の生成と文字品質リスク(画像生成の日本語誤字)を抱える。HTML なら 1 断片 + 章ごとのオーバーレイエントリで済み、プレビューと書き出しが同一ソースを通る
|
|
49
|
+
- **章追従の実装**: 同じ断片を章数分コピーし、章タイトルのテキストと `data-start` / `data-duration` を章の区間に合わせる(1 章 = 1 オーバーレイエントリ)。テキストは**断片 DOM に直接置く**(CSS 変数でのテキスト保持は禁止。変更は html パッチ / contenteditable 経由)
|
|
50
|
+
- **構造の目安**: ルート 1 つ + プレート(番組名の行 + 章名の行、または 1 行連結)。位置は外側コンテナの transform(ランタイム所有)で決め、断片は見た目だけを持つ
|
|
51
|
+
- **常駐物の抑制**: 常時表示なので主張を抑える。小さめの `--font-size`、半透明の地、画面の隅で被写体・字幕・映像内 UI と重ねない。字幕(下側)と同時表示が前提なので、下側には置かない
|
|
52
|
+
- knobs の例: `--plate-bg`、`--accent`、`--font-size`、`--radius`。既定値は `var(--name, fallback)` で公開する
|
|
53
|
+
- 章替わりの出入りは短い opacity / translate のみ。保持中は動かさない(アニメーション節の原則どおり)
|
|
54
|
+
|
|
55
|
+
## アニメーション
|
|
56
|
+
|
|
57
|
+
- 字幕の出入りは短い opacity / translate を使い、保持中は動かさない。
|
|
58
|
+
- 1 文字ずつの出現は可読速度とシーク再現性を損ねやすい。必要な演出だけに限定し、文字 DOM は先に確定しておく。
|
|
59
|
+
- CSS animation / WAAPI を使い、ランタイムが `currentTime = (t - start) * 1000` を設定できる形にする。
|
|
60
|
+
- 位置移動の transform は断片内の子要素へ付け、AKARI が所有する外側コンテナの幾何 transform と分離する。
|
|
61
|
+
|
|
62
|
+
## よくある間違い
|
|
63
|
+
|
|
64
|
+
- 文字が多いまま font-size だけを下げる。
|
|
65
|
+
- 日本語を画像生成モデルに描かせ、誤字や崩れを納品する。
|
|
66
|
+
- 字幕と強調テロップを常時同時表示して、どちらも読めなくする。
|
|
67
|
+
- 白文字だけを明るい映像へ直置きする。
|
|
68
|
+
- 非公式テンプレートの safe zone 数値を、別の placement やオーガニック投稿へ転用する。
|
|
69
|
+
- 断片ルートで `--font-size` などを再定義し、`edit.json.vars` の上書きを効かなくする。
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# Text behind person
|
|
2
|
+
|
|
3
|
+
native 映像の上へ文字を置き、その上へアルファ付き人物動画を重ねる。視覚上の順序は必ず `base video < text < cutout video` にする。
|
|
4
|
+
|
|
5
|
+
## 現在の制約を先に判定する
|
|
6
|
+
|
|
7
|
+
edit.json v1 の `<video>` 時刻同期は未実装である。現行 preview / export は CSS / WAAPI animation の `currentTime` だけを同期し、fragment 内 `<video>.currentTime` は操作しない。`data-akari-sync` を付けても現時点では効果がない。
|
|
8
|
+
|
|
9
|
+
したがって、動く人物の text-behind-person を決定的・WYSIWYG・本番対応済みと報告しない。選択肢は次のいずれかにする。
|
|
10
|
+
|
|
11
|
+
- 静止した人物 alpha PNG / matte で表現する。
|
|
12
|
+
- 外部で text-behind-person を precompose して映像素材にする。
|
|
13
|
+
- v1 runtime の video sync 実装を待ち、preview と export の双方で検証する。
|
|
14
|
+
|
|
15
|
+
根拠: `docs/notes-2026-07-13-edit-json-v1.md` §4、`ui/overlay-runtime.js`、`scripts/render-overlays.mjs`
|
|
16
|
+
|
|
17
|
+
## マット参照規約
|
|
18
|
+
|
|
19
|
+
人物マット(アルファ付き人物動画)を断片から参照する書き方を規約として固定する。データ契約の正本は
|
|
20
|
+
[docs/contract-2026-07-23-analysis-person-matte.md](../../docs/contract-2026-07-23-analysis-person-matte.md)、
|
|
21
|
+
生成手順は [skills/analyze-footage/person-matte.md](../analyze-footage/person-matte.md) にある。
|
|
22
|
+
本節はその**消費側**(断片の書き方)だけを定める。
|
|
23
|
+
|
|
24
|
+
### 1. 供給元と複製規律
|
|
25
|
+
|
|
26
|
+
マットの供給元は `analysis.json` の `tracks.person_matte`(契約 §2)が正である。断片を書く
|
|
27
|
+
エージェントは authoring 時に次を行う。
|
|
28
|
+
|
|
29
|
+
1. `person_matte.path` を **analysis.json の所在ディレクトリ基準**で解決する(契約 §2 フィールド表)。
|
|
30
|
+
`null` や解決不能なら人物マット無しとして通常のテロップ構成に倒す(契約 §5 の劣化規約)。
|
|
31
|
+
2. 解決した実体を**プロジェクト内へ複製**する。置き場は `assets/matte/<素材名>-person-matte.webm`
|
|
32
|
+
を既定とする。
|
|
33
|
+
3. 断片からは複製先を **edit.json 相対(プロジェクト相対)パス**で参照する。
|
|
34
|
+
|
|
35
|
+
analysis 側のパスへ直リンクしない。マットは素材ディレクトリ側に置かれうるため、直リンクした
|
|
36
|
+
プロジェクトは移動・配布・再現でリンクが切れる(プロジェクト自己完結の原則)。プレビューの
|
|
37
|
+
asset 解決(3D 宣言の `resolveAsset`・`akari-preview-open-handler.ts`)も先頭 `/` と URL スキームを
|
|
38
|
+
拒否しており、絶対パスや `file:` URL を書く流儀そのものが通らない。
|
|
39
|
+
|
|
40
|
+
**複製はバイト単位のコピーで行い、再エンコードしない。** ffmpeg のデコーダに通すとアルファが
|
|
41
|
+
無言で落ちる(契約 §3)。切り出し(`--ss` 相当)も禁止 — 時刻 0 の一致が壊れる(契約 §4)。
|
|
42
|
+
|
|
43
|
+
### 2. 断片内の参照は `data-akari-matte-src`
|
|
44
|
+
|
|
45
|
+
**`<video>` の `src` を断片の HTML に直書きしない。** 外側コンテナ(ランタイムが作る
|
|
46
|
+
`.akari-overlay-container` / `#overlay-stage` 直下の div)へ注入される
|
|
47
|
+
**`data-akari-matte-src` 属性**を規約とし、断片はその属性の有無だけを見る。
|
|
48
|
+
|
|
49
|
+
タイミングの `data-start` / `data-duration`(ハードルール 2)と同じ「**ランタイムが所有する
|
|
50
|
+
data 属性**」の流儀である。理由も同じで、実 URL は経路ごとに違うものになる:
|
|
51
|
+
|
|
52
|
+
| 経路 | 実際に必要な URL |
|
|
53
|
+
|---|---|
|
|
54
|
+
| プレビュー | `http://127.0.0.1:<port>/asset/<id>`(`createAssetStream` の払い出し。3D の `.glb` と同経路) |
|
|
55
|
+
| 書き出し(render-cut) | オーバーレイシートは `<projectRoot>/.akari/render-tmp/<run>/overlay-sheet.html` に置かれる。プロジェクト相対パスをそのまま書くと 3 階層ずれて解決できない |
|
|
56
|
+
|
|
57
|
+
断片が知ってよいのはプロジェクト相対パスまでで、経路ごとの実 URL 化は外側の責務である。
|
|
58
|
+
|
|
59
|
+
属性が無いときは**マット層を出さない**。祖先属性ゲート付きセレクタで宣言する
|
|
60
|
+
(`data-akari-active` と同じ手法。`packages/overlay-runtime/src/overlay-runtime.js` 参照):
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<div class="tbp-root">
|
|
64
|
+
<style>
|
|
65
|
+
.tbp-root { position: absolute; inset: 0; isolation: isolate; }
|
|
66
|
+
.tbp-root__text {
|
|
67
|
+
position: absolute; z-index: 1;
|
|
68
|
+
left: var(--text-x, 8%); top: var(--text-y, 42%);
|
|
69
|
+
font-size: var(--font-size, 96px); color: var(--color, #fff);
|
|
70
|
+
}
|
|
71
|
+
/* マット層は既定で出さない。外側コンテナに属性が注入されたときだけ出す。 */
|
|
72
|
+
.tbp-root__matte { display: none; }
|
|
73
|
+
[data-akari-matte-src] .tbp-root__matte {
|
|
74
|
+
display: block;
|
|
75
|
+
position: absolute; inset: 0; z-index: 2;
|
|
76
|
+
width: 100%; height: 100%;
|
|
77
|
+
object-fit: var(--matte-fit, cover);
|
|
78
|
+
object-position: var(--matte-position, 50% 50%);
|
|
79
|
+
pointer-events: none;
|
|
80
|
+
}
|
|
81
|
+
</style>
|
|
82
|
+
<div class="tbp-root__text">正確な日本語テキスト</div>
|
|
83
|
+
<video class="tbp-root__matte" muted playsinline preload="auto"></video>
|
|
84
|
+
</div>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**劣化は「文字が前に出るだけ」**にする。属性が無い・マットが読めない・再生できない、いずれでも
|
|
88
|
+
テキストと素材映像は出続ける。人物マットは演出の入力であり、映像本体の成否を左右しない(契約 §5)。
|
|
89
|
+
|
|
90
|
+
### 3. 標準 3 層構造(z)
|
|
91
|
+
|
|
92
|
+
| 層 | 実体 | 断片に含めるか |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| 下 | 素材映像(プレビューの `#preview-video` / 書き出しの合成土台) | **含めない** |
|
|
95
|
+
| 中 | テキスト(`z-index: 1`) | 含める |
|
|
96
|
+
| 上 | マット `<video>`(`z-index: 2`・`inset: 0`・`muted`・`playsinline`・`pointer-events: none`) | 含める |
|
|
97
|
+
|
|
98
|
+
- 断片ルートに `isolation: isolate` を置き、この 2 層の重なりをルート内へ閉じる(単一ルート =
|
|
99
|
+
ハードルール 6)。
|
|
100
|
+
- テキストの `z-index` をマットより必ず小さくする。逆にすると通常のテロップに戻る。
|
|
101
|
+
- マット `<video>` の `object-fit` / `object-position` を素材映像側の crop 契約に合わせる。ずれると
|
|
102
|
+
人物の輪郭が背後の素材とずれる。
|
|
103
|
+
- 調整値(テキスト位置・文字サイズ・色・マットの fit / position)は CSS 変数で公開する
|
|
104
|
+
(ハードルール 1)。断片ルートで同名変数を再定義して外側からの上書きを遮らない。
|
|
105
|
+
|
|
106
|
+
### 4. 形式は VP9 alpha WebM が第一、HEVC alpha は fallback
|
|
107
|
+
|
|
108
|
+
- **第一候補(既定)**: VP9 alpha WebM(`.webm` / `alpha_mode=1` / straight alpha)。契約 §3 の確定事項。
|
|
109
|
+
容量が HEVC alpha MOV の 1/4.8 で、**GPU デコードに依存しない**。書き出し経路のヘッドレス Chrome は
|
|
110
|
+
`--disable-gpu` で起動する(`packages/render-cut/src/rasterize.mjs`)ため、HEVC を既定にすると
|
|
111
|
+
経路ごと落ちる。
|
|
112
|
+
- **fallback(第 2 形式)**: HEVC alpha MOV。Apple 系ツールへの受け渡しが要るときだけの互換形式で、
|
|
113
|
+
`analysis.json` に載せる既定ではない。本リーフの「Apple Vision → HEVC with alpha」「Robust Video
|
|
114
|
+
Matting → HEVC with alpha」は、この第 2 形式を自前で作るときの手順である。
|
|
115
|
+
- 断片側は形式を判別しない。`data-akari-matte-src` が指すものを再生するだけにする。形式の選択は
|
|
116
|
+
供給側(`analysis.json`)の責務であり、断片に `<source type="...">` の分岐を書かない。
|
|
117
|
+
|
|
118
|
+
### 5. poster フォールバック(プレビュー制約への保険)
|
|
119
|
+
|
|
120
|
+
プレビューの webview は `default-src 'none'; media-src <stream origin>; img-src <stream origin> blob: data:`
|
|
121
|
+
という CSP 下にある(`akari-preview-open-handler.ts`)。`data:` の**画像**は許されるが、`media` は
|
|
122
|
+
払い出されたストリームオリジンに限られる。マットを asset stream へ載せる解決経路は現時点で未実装
|
|
123
|
+
であり、断片を単体で開いた場合も含めて**プレビューでマット `<video>` が再生されない場面がある**。
|
|
124
|
+
|
|
125
|
+
そこで **`poster` にデータ URI の静止マット 1 枚**を置くことを任意フォールバックとして規約化する。
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<video class="tbp-root__matte" muted playsinline preload="auto"
|
|
129
|
+
poster="data:image/png;base64,iVBORw0KGgo…"></video>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
- 代表フレーム(そのオーバーレイ区間の中央あたり)をアルファ付き PNG で **1 枚だけ**入れる。マット
|
|
133
|
+
生成の既定解像度は 512x384(`balanced`・person-matte.md の実測表)であり、poster もその解像度で足りる。
|
|
134
|
+
data URI は断片 HTML に丸ごと載るため、桁が大きくなるなら PNG 側の解像度を落とす。
|
|
135
|
+
- CSP で `media` が落ちても poster は描画されるため、**人物とテキストの前後関係**(この演出の要)は
|
|
136
|
+
プレビューで確認できる。
|
|
137
|
+
- **poster は静止画である。動きはレンダで確認する。** poster が出ていることを「マットが動いている」
|
|
138
|
+
ことの確認と読み替えない。poster だけを最終成果物の代替にしない。
|
|
139
|
+
|
|
140
|
+
### 6. 決定性
|
|
141
|
+
|
|
142
|
+
- マット動画の時刻は素材(`analysis.source`)の source 秒と **1:1** で対応する(契約 §4)。
|
|
143
|
+
マット側にオフセットを持たせない。
|
|
144
|
+
- **断片内で独自の時刻源を作らない**(ハードルール 2 / 4 の再確認)。`autoplay` / `loop` /
|
|
145
|
+
`setTimeout` / rAF の delta 積算でマットを進めない。`<video>` の時刻を進めるのはランタイムであり、
|
|
146
|
+
断片は宣言するだけにする。
|
|
147
|
+
- 現状の実測: 書き出し経路は全 `<video>` に**コンポジション秒をそのまま**代入する
|
|
148
|
+
(`rasterize.mjs` の `__akariSeek`)。`cuts[]` を介した source 秒への射影は行わない。素材の途中区間を
|
|
149
|
+
使うカットではマットが合わない。プレビューは `<video>.currentTime` を触らない。したがって
|
|
150
|
+
**動く人物のマットは今も本番品質ではない**(冒頭「現在の制約を先に判定する」と同じ結論)。静止マット
|
|
151
|
+
(poster / 単一フレーム)は現時点でも決定的に成立する。
|
|
152
|
+
|
|
153
|
+
## Apple Vision → HEVC with alpha
|
|
154
|
+
|
|
155
|
+
以下 2 節は**第 2 形式(HEVC alpha MOV)を自前で作る**ときの手順である。既定の生成経路は
|
|
156
|
+
`analysis.json` の `tracks.person_matte`(VP9 alpha WebM)であり、手順は
|
|
157
|
+
[skills/analyze-footage/person-matte.md](../analyze-footage/person-matte.md) にある。
|
|
158
|
+
|
|
159
|
+
1. source を presentation order で decode し、各 frame の PTS と orientation を保持する。
|
|
160
|
+
2. 同じ `VNSequenceRequestHandler` へ frame を順番に渡し、`VNGeneratePersonSegmentationRequest` で person mask を得る。offline 品質では `.accurate` を候補にできるが、速度と輪郭品質を実素材で検証する。
|
|
161
|
+
3. camera 固有の orientation を hardcode せず、入力 orientation を反映して mask を source extent へ合わせる。
|
|
162
|
+
4. mask を alpha として RGB と合成し、alpha-bearing pixel buffer を作る。方式に迷う場合は Apple 推奨の premultiplied alpha を使う。
|
|
163
|
+
5. `AVAssetWriterInput` または `VTCompressionSession` を `AVVideoCodecType.hevcWithAlpha` で構成し、元 PTS の順に append して `.mov` を出す。alpha quality は公式に 0.0〜1.0 の範囲だが、固定値は発明せず **要検証** とする。
|
|
164
|
+
6. 出力 track の `.containsAlphaChannel`、duration、fps、frame count、orientation を確認し、checkerboard 上で髪、指、motion blur、半透明境界を実見する。
|
|
165
|
+
7. 新シェル(Chromium ベースの Electron)の preview と、export に使う Chrome 系レンダラーの両方で当該 asset を実機再生する。codec 名だけで互換性を保証しない。(旧 Tauri 版は WKWebView 前提だったが、新シェルは Chromium 系に統一)
|
|
166
|
+
|
|
167
|
+
公式:
|
|
168
|
+
|
|
169
|
+
- [Apple Vision — VNGeneratePersonSegmentationRequest](https://developer.apple.com/documentation/vision/vngeneratepersonsegmentationrequest)
|
|
170
|
+
- [Apple Vision — VNSequenceRequestHandler](https://developer.apple.com/documentation/vision/vnsequencerequesthandler)
|
|
171
|
+
- [Apple — Applying Matte Effects to People in Images and Video](https://developer.apple.com/documentation/vision/applying-matte-effects-to-people-in-images-and-video)
|
|
172
|
+
- [Apple — HEVC Video with Alpha](https://developer.apple.com/videos/play/wwdc2019/506/)
|
|
173
|
+
- [Apple — AVVideoCodecType.hevcWithAlpha](https://developer.apple.com/documentation/avfoundation/avvideocodectype/hevcwithalpha)
|
|
174
|
+
- [Apple — AVMediaCharacteristic.containsAlphaChannel](https://developer.apple.com/documentation/avfoundation/avmediacharacteristic/containsalphachannel)
|
|
175
|
+
|
|
176
|
+
## Robust Video Matting → HEVC with alpha
|
|
177
|
+
|
|
178
|
+
1. RVM の license を先に確認する。公式 repository は GPL-3.0 であるため、コードや model を MIT の本リポへ同梱・転写しない。外部の「手」として使う場合も version、license、取得元を provenance に残す。
|
|
179
|
+
2. frame 順を保ち、RVM の recurrent state を次 frame へ渡して foreground (`fgr`) と alpha (`pha`) を得る。各 frame を独立並列処理しない。
|
|
180
|
+
3. 公式 converter の `output_foreground` / `output_alpha` は別出力であり、HEVC alpha 直出力ではないと理解する。
|
|
181
|
+
4. premultiplied を使う場合は `RGB = fgr * pha`、`A = pha` として alpha-bearing frame を作り、元 fps / PTS と照合する。
|
|
182
|
+
5. Apple Vision 経路と同じ AVFoundation HEVC-alpha encoder へ渡し、同じ検証を行う。
|
|
183
|
+
|
|
184
|
+
公式: [Robust Video Matting repository](https://github.com/PeterL1n/RobustVideoMatting)、[RVM inference guide](https://github.com/PeterL1n/RobustVideoMatting/blob/master/documentation/inference.md)
|
|
185
|
+
|
|
186
|
+
## DOM の z 順
|
|
187
|
+
|
|
188
|
+
単一ルートの中に同じ座標系で text と cutout video を置く。以下は最小骨格であり、`src` の与え方・
|
|
189
|
+
既定で隠す指定・poster フォールバックまで含めた正の書き方は上の「マット参照規約」にある。
|
|
190
|
+
|
|
191
|
+
```html
|
|
192
|
+
<div class="tbp-root">
|
|
193
|
+
<style>
|
|
194
|
+
.tbp-root { position: absolute; inset: 0; isolation: isolate; }
|
|
195
|
+
.tbp-root__text { position: absolute; z-index: 1; }
|
|
196
|
+
.tbp-root__matte { position: absolute; inset: 0; z-index: 2; pointer-events: none; }
|
|
197
|
+
</style>
|
|
198
|
+
<div class="tbp-root__text">正確な日本語テキスト</div>
|
|
199
|
+
<video class="tbp-root__matte" muted playsinline preload="auto"></video>
|
|
200
|
+
</div>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
- text の z-index を cutout video より小さくする。
|
|
204
|
+
- `<video>` の `object-fit` / `object-position` を base video と同じ crop 契約に合わせる。
|
|
205
|
+
- `--text-x`、`--text-y`、`--font-size`、`--matte-fit`、`--matte-position` などを knob にする。
|
|
206
|
+
- alpha video を autoplay / loop 任せにしない。将来は `data-akari-sync` 付き video の currentTime を overlay local timeline へ設定する runtime 契約が必要になる。
|
|
207
|
+
- relative video URL の live preview 解決も現状未整備なので **要検証** とする。
|
|
208
|
+
|
|
209
|
+
## よくある間違い
|
|
210
|
+
|
|
211
|
+
- `data-akari-sync` が既に実装済みだと書く。
|
|
212
|
+
- マット `<video>` の `src` を断片へ直書きする(プレビューでも書き出しでも解決できない)。
|
|
213
|
+
- `analysis.json` 側のマットへ直リンクし、プロジェクトの自己完結を壊す。
|
|
214
|
+
- マットをプロジェクトへ複製するときに ffmpeg で再エンコードし、アルファを無言で落とす。
|
|
215
|
+
- `data-akari-matte-src` が無いときにマット層を出したまま黒や空の矩形を人物の上に残す。
|
|
216
|
+
- poster が出ていることを「マットが動いている」ことの確認と読み替える。
|
|
217
|
+
- alpha video を autoplay し、映像本体と偶然合うことを期待する。
|
|
218
|
+
- text を人物 layer より前へ置き、通常のテロップに戻してしまう。
|
|
219
|
+
- base と cutout で crop / orientation / fps / PTS が違う。
|
|
220
|
+
- Vision sample の camera orientation を全動画へ hardcode する。
|
|
221
|
+
- RVM の recurrent state を捨てて frame を独立処理する。
|
|
222
|
+
- RVM の foreground / alpha 出力を HEVC-alpha 完成品と思い込む。
|
|
223
|
+
- GPL-3.0 の RVM コードや model を本リポへコピーする。
|
|
224
|
+
- 新シェルの preview(Chromium/Electron)で見えたため、export 用のヘッドレス Chrome 系レンダラーでも同じに動くと未検証で断言する。(旧 Tauri 版は Safari / WKWebView 前提だったが、新シェルは Chromium 系に統一)
|