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,93 @@
|
|
|
1
|
+
# イベント判定とフック採点
|
|
2
|
+
|
|
3
|
+
## 原則
|
|
4
|
+
|
|
5
|
+
event は「検出できそうな箇所」ではなく、後工程がカット・章立て・冒頭構成を判断するための証拠である。時刻は source 秒、区間 event は `end > start` とする。不確かな候補は無理に追加せず、空配列を許容する。
|
|
6
|
+
|
|
7
|
+
## 5 種 event の判定
|
|
8
|
+
|
|
9
|
+
| type | 記録する条件 | 境界の決め方 | 記録しない例 |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| `filler` | 言いよどみ、意味を足さない反復、言い直しなど、除去しても発話意図を保てる区間 | transcript の実発話境界と音声を根拠に `start` / `end` | 意味のある間、強調の反復、文字起こし誤りだけを根拠にした推測 |
|
|
12
|
+
| `trouble` | 音声途切れ、映像停止、操作失敗、収録ミス、明示された撮り直しなど | 問題が始まり正常へ戻る source 区間 | 無音や transcript gap だけで断定した障害、単なる話題の難しさ |
|
|
13
|
+
| `chapter` | 話題、目的、手順、画面状態が新しいまとまりへ切り替わる地点 | 切り替わりを最もよく表す source 時刻 `t` | 一文ごとの細分化、見た目だけの瞬間的なカット |
|
|
14
|
+
| `highlight` | 決定事項、結論、数値・実績、強い主張、引用性の高い一言など、編集判断の根拠になる重要発言 | 該当発言を含む transcript segment の実発話境界に合わせた `start` / `end` | 話題の要約でしかない区間、発言の裏付けがない画面上の変化、単に長い説明 |
|
|
15
|
+
| `hook` | 単独で提示でき、視聴継続の理由になる短い区間 | 理解に必要な最小の開始から、価値またはオチが成立する終了まで | 文脈依存が強い断片、誇張しないと成立しない場面 |
|
|
16
|
+
|
|
17
|
+
`trouble.note` は「何が起きたか」と根拠を具体的に書く。`chapter.title` は transcript の内容に沿った短い名詞句または行動句にし、存在しない発言を引用しない。`filler` と `hook` に Schema 外の `note` を足さない。
|
|
18
|
+
|
|
19
|
+
backend が whisper.cpp 由来の transcript は正規化でフィラーが脱落するため、filler 検出の再現率が低い。SpeechAnalyzer / Scribe 由来の transcript がある場合はそちらを優先して filler を判定し、whisper.cpp のみの場合は再現率の限界を完了報告に明記する。
|
|
20
|
+
|
|
21
|
+
## highlight(重要発言)の判定
|
|
22
|
+
|
|
23
|
+
契約根拠: [M5 契約の追記(2026-07-14)](../../docs/contract-2026-07-13-m5-analysis-report.md)。hook がショート切り出し向けの「見せ場」であるのに対し、highlight は**編集判断全般の根拠になる重要発言**の汎用枠である。同一区間が両方に該当する場合は両方登録してよい(目的が異なる)。
|
|
24
|
+
|
|
25
|
+
- `quote` は transcript の**実発言に忠実**に書く。要約・言い換え・創作をしない。整形は句読点の補いまでとする
|
|
26
|
+
- `reason` は「なぜ重要か」を根拠カテゴリ付きで書く(例: 「リリース日を明言(決定事項)」「導入効果を数値で提示(数値・実績)」)
|
|
27
|
+
- `importance`(任意、1〜5 整数): 3 = 編集で残す根拠になる / 4 = テロップ・チャプター見出し候補になる / 5 = サムネ文言・ショートの核になり得る。1〜2 は登録しない方がよい(インフレ防止)
|
|
28
|
+
- 件数の目安: 60 分級の素材で 5〜15 件(**要検証の運用初期値**)。全発言の書き写しにしない
|
|
29
|
+
- transcript が空の素材では作らない(`quote` 必須のため)。視覚のみの重要場面は `chapter` / `hook` で扱う
|
|
30
|
+
- 確定した highlight の時刻は transcript 駆動キーフレーム抽出の入力になる([keyframes-and-review.md](keyframes-and-review.md) 参照)
|
|
31
|
+
|
|
32
|
+
## hook の 5 軸評価表
|
|
33
|
+
|
|
34
|
+
1〜5 は `analysis.json` v0 が要求する整数尺度である。以下のアンカーは運用初期ルーブリックであり、プラットフォーム公式指標ではないため **要検証**。2 と 4 も含め、最も近い記述を 1 つ選ぶ。
|
|
35
|
+
|
|
36
|
+
| 軸 | 1 | 2 | 3 | 4 | 5 |
|
|
37
|
+
|---|---|---|---|---|---|
|
|
38
|
+
| `hook` フック強度 | 導入だけで関心の入口がない | 軽い関心はあるが続きを促す問いが弱い | 問題、問い、意外性のいずれかが明確 | 結果、対立、強い便益を早く提示する | 一瞬で理解できる驚きや高い賭け金があり、続きが不可欠 |
|
|
39
|
+
| `self_contained` 自己完結性 | 前後文脈なしでは意味不明 | 指示語や前提が多く補足が必要 | 短い前置きがあれば要点を理解できる | ほぼ単独で状況と価値が伝わる | 単独で状況・主張・到達点が明瞭 |
|
|
40
|
+
| `emotion` 感情強度 | 感情変化が確認できない | 小さな反応だけがある | 喜び、驚き、焦り等が明確 | 強い自然な反応が区間を牽引する | 素材中の感情ピークで、映像・声・内容が一致する |
|
|
41
|
+
| `density` 価値密度 | 待ちや重複が大半 | 有用部分より前置きが長い | 全体を通して一定の情報または変化がある | ほぼ各瞬間が理解や期待を進める | 無駄がなく高密度だが、理解可能性も保つ |
|
|
42
|
+
| `punch` オチ・決め | 到達点がない | 弱い結論だけがある | 明確な結論、結果、学びがある | 記憶に残る結果または言い切りがある | 鮮明な反転、実証、決め台詞で再視聴価値がある |
|
|
43
|
+
|
|
44
|
+
声量だけで emotion を上げず、情報量だけで density を上げない。各軸を独立して採点する。
|
|
45
|
+
|
|
46
|
+
## 候補登録の初期閾値
|
|
47
|
+
|
|
48
|
+
v0 契約は採用閾値を運用調整対象としている。このスキルでは初期選別として次を同時に満たす区間を hook 候補へ登録する。
|
|
49
|
+
|
|
50
|
+
- `hook >= 3`
|
|
51
|
+
- `self_contained >= 3`
|
|
52
|
+
- 5 軸合計 `>= 16 / 25`
|
|
53
|
+
|
|
54
|
+
この数値はプラットフォーム公式値ではなく **要検証の運用初期値** である。素材ジャンルや配信先に合わせて変更した場合は、元の値、変更後の値、理由を報告する。閾値未満でも人間へ提示すべき強い根拠がある場合は、黙って基準を曲げず、例外採用したことを報告する。
|
|
55
|
+
|
|
56
|
+
候補同士は合計点で比較し、同点なら `hook`、`self_contained`、`density` の順で比較する。この順位規則も要検証の運用ルールであり、絶対的な品質評価ではない。
|
|
57
|
+
|
|
58
|
+
尺度の契約根拠: [M5 analysis.json v0 契約](../../docs/contract-2026-07-13-m5-analysis-report.md)
|
|
59
|
+
|
|
60
|
+
## 見せ場抽出の供給責務
|
|
61
|
+
|
|
62
|
+
ここで作る event(`hook` / `chapter` / `highlight`)と hook の 5 軸スコアは、後工程
|
|
63
|
+
([edit-plan の beats.md](../edit-plan/beats.md))が `edit.json` の見せ場マーカー `beats[]`
|
|
64
|
+
([データ契約](../../docs/contract-2026-07-22-edit-json-v1-beats.md))を導出するときの**供給源**である。
|
|
65
|
+
抽出手順そのものは上の節から変えないが、供給側の品質条件として次の 2 点を満たす。
|
|
66
|
+
|
|
67
|
+
- **score の無い highlight を出さない**。`importance` を省いた highlight は後工程で強度を
|
|
68
|
+
決められず、既定値へ丸められる。編集判断の根拠として登録する以上、1〜5 のどれに当たるかを
|
|
69
|
+
判断して書く(判断できないほど弱い候補は、そもそも登録しない)。
|
|
70
|
+
- **event の `t` は必ず source 秒**。区間 event の `start` / `end` も同じく未カット素材の
|
|
71
|
+
source 秒である。beats は source 秒アンカーで永続化されるため、ここに timeline 秒が
|
|
72
|
+
混ざると後工程では検出できない誤りになる。
|
|
73
|
+
|
|
74
|
+
## event 整合性
|
|
75
|
+
|
|
76
|
+
- event を source 時刻順に並べる。同時刻では `trouble`、`filler`、`chapter`、`highlight`、`hook` の順に固定してよい。
|
|
77
|
+
- filler と trouble の同一区間を重複登録しない。主因に合う一方を選ぶ。
|
|
78
|
+
- highlight と hook の重複は許す(目的が異なる)。highlight と filler の重複は矛盾なので登録前に見直す。
|
|
79
|
+
- hook が trouble と重なる場合は、トラブル自体が価値ある内容でない限り候補から外す。
|
|
80
|
+
- chapter は素材冒頭にも置けるが、機械的に必須にはしない。
|
|
81
|
+
- transcript が空の場合、発話に依存する filler と highlight は作らない。視覚的に確認できる trouble、chapter、hook だけを根拠付きで判定する。
|
|
82
|
+
|
|
83
|
+
## よくある間違い
|
|
84
|
+
|
|
85
|
+
- 口癖を一律に filler とし、話者らしさや意味まで削る。
|
|
86
|
+
- ASR の空白を音声トラブルと断定する。
|
|
87
|
+
- chapter を一定時間ごとに機械生成する。
|
|
88
|
+
- hook の総合印象を 5 軸すべてへ同じ点で写す。
|
|
89
|
+
- 低い自己完結性を強い感情だけで相殺する。
|
|
90
|
+
- 採用閾値をプラットフォーム公式の成功基準として説明する。
|
|
91
|
+
- highlight の `quote` に要約や言い換えを書く(実発言に忠実でなければ引用ではない)。
|
|
92
|
+
- 話題ごとに機械的に highlight を置き、importance 1〜2 の羅列でインフレさせる。
|
|
93
|
+
- hook 相当の派手さがないという理由で、決定事項・数値発言を highlight に登録しない。
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# キーフレーム抽出と視認
|
|
2
|
+
|
|
3
|
+
## 原則
|
|
4
|
+
|
|
5
|
+
抽出は 3 系統を併用する。scene 検出は映像の変化点を拾い、interval 抽出は変化の少ない長尺区間の見落としを防ぎ、transcript 駆動抽出は重要発言の瞬間に画を対応付ける。いずれか一方で代用しない。抽出結果は候補であり、Read で視認した画像だけを最終 `keyframes` に入れる。採用した keyframe には抽出系統を `origin`(`scene` / `interval` / `transcript`)として記録する。
|
|
6
|
+
|
|
7
|
+
## 1. シーン変化候補を抽出する
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
mkdir -p "$OUT_DIR/work/scene"
|
|
11
|
+
ffmpeg -hide_banner -nostdin -i "$OUT_DIR/proxy.mp4" \
|
|
12
|
+
-vf "select='gt(scene\,0.4)',showinfo" -fps_mode vfr \
|
|
13
|
+
"$OUT_DIR/work/scene/scene-%06d.jpg" \
|
|
14
|
+
2>"$OUT_DIR/work/scene.log"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
FFmpeg 公式は scene score の比較例として `0.3`〜`0.5` を妥当な選択肢とし、`0.4` の例を示している。このスキルは `0.4` を初期値にするが、素材ごとの編集適合性は要検証である。候補が過多・過少なら範囲内で調整し、値と理由を報告する。
|
|
18
|
+
|
|
19
|
+
### 0 候補時の終了コード判定
|
|
20
|
+
|
|
21
|
+
閾値 0.4 に達する変化点が 1 つもない素材(無音・静止に近い映像など)では、`select` フィルタが 0 フレームを選択し、後段の mjpeg 画像エンコーダが 0 フレームで初期化できずに ffmpeg が **非ゼロ終了(実測: exit code 234)** し、`work/scene/` に画像が 1 枚も生成されない。これは「0 候補」の正常系であり、コマンド自体は破綻していない。
|
|
22
|
+
|
|
23
|
+
ただし exit code 234 は、フィルタ式の構文ミスなど **コマンドが実際に破綻している場合にも同じ値になる**ため、終了コードの数値だけでは区別できない。`work/scene.log` の中身で判定する。
|
|
24
|
+
|
|
25
|
+
1. ログに `Stream mapping:` の行があるかを確認する。**ない場合**は入力デコードまたはフィルタグラフの構築自体が失敗しているため「コマンド破綻」として扱い、直前の `Error opening input`・`Error while parsing expression`・`Error initializing filters` 等の行を根拠に原因を報告し、候補統合へは進まず先にコマンドを直す。
|
|
26
|
+
2. `Stream mapping:` が**ある**場合、続けて `No filtered frames for output stream, trying to initialize anyway.` の行を探す。この行がある場合に限り「0 候補」と確定してよい。同時に `Error while opening encoder - maybe incorrect parameters such as bit_rate, rate, width or height.`(mjpeg エンコーダ宛て)と `Nothing was written into output file, because at least one of its streams received no packets.` も現れるのが通常の随伴症状であり、追加の異常ではない。
|
|
27
|
+
3. `Stream mapping:` はあるが `No filtered frames for output stream` が**ない**場合は、原因不明のコマンド破綻として扱い、ログ全文を報告して停止する。
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
if ! grep -q '^Stream mapping:' "$OUT_DIR/work/scene.log"; then
|
|
31
|
+
echo "破綻: 入力デコード/フィルタグラフ構築が失敗" >&2
|
|
32
|
+
elif grep -q 'No filtered frames for output stream' "$OUT_DIR/work/scene.log"; then
|
|
33
|
+
echo "0 候補: scene 検出は成立、閾値 0.4 に達する変化点なし"
|
|
34
|
+
else
|
|
35
|
+
echo "破綻: 原因不明、ログ全文を報告" >&2
|
|
36
|
+
fi
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
「0 候補」と確定した場合は scene 候補を空のまま、interval 候補だけで次節の統合へ進む。「破綻」と判定した場合は候補統合に進まず、入力パスやフィルタ式などコマンド側を先に修正する。
|
|
40
|
+
|
|
41
|
+
実測記録(FFmpeg 8.1.1、2026-07-14): 無音・単色で変化のない静止動画に `select='gt(scene\,0.4)'` を適用すると exit code 234 で `work/scene/` が空になり、上記 1〜3 のログ内容が再現する。対照実験として `select` 式の構文を意図的に壊した場合も exit code は同じ 234 だが、`Stream mapping:` より前でエラーが発生し `No filtered frames for output stream` は現れない。存在しない入力ファイルを指定した場合は exit code 254 で `Stream mapping:` にすら到達しない。exit code の数値だけを見て「破綻」と誤判定しないこと、逆に非ゼロ終了を無条件で「候補なし」と決めつけないことの両方に注意する。
|
|
42
|
+
|
|
43
|
+
## 2. 一定間隔候補を抽出する
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
mkdir -p "$OUT_DIR/work/interval"
|
|
47
|
+
ffmpeg -hide_banner -nostdin -i "$OUT_DIR/proxy.mp4" \
|
|
48
|
+
-vf "select='isnan(prev_selected_t)+gte(t-prev_selected_t\,10)',showinfo" -fps_mode vfr \
|
|
49
|
+
"$OUT_DIR/work/interval/interval-%06d.jpg" \
|
|
50
|
+
2>"$OUT_DIR/work/interval.log"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
10 秒は FFmpeg 公式ドキュメントにある一定間隔選択の構文例を採用した運用初期値であり、編集上の最適値ではないため要検証とする。画面変化や発話密度に対して粗すぎる場合は間隔を短くし、候補が冗長なら長くして、変更を報告する。
|
|
54
|
+
|
|
55
|
+
素材長に応じた間隔の目安(**要検証の運用初期値**。視認可能な候補総数を 30〜60 枚程度に収める意図):
|
|
56
|
+
|
|
57
|
+
| 素材長 | interval 目安 |
|
|
58
|
+
|---|---|
|
|
59
|
+
| 〜10 分 | 10 秒 |
|
|
60
|
+
| 10〜30 分 | 30〜60 秒 |
|
|
61
|
+
| 30 分〜 | 120 秒 |
|
|
62
|
+
|
|
63
|
+
実測記録(2026-07-14): 62 分素材に 10 秒間隔を適用すると 374 候補になり視認が非現実的だったため、120 秒(32 候補)へ調整した。transcript 駆動抽出(次節)が重要発言を直接拾うため、interval は「映像側の取りこぼし保険」として粗めでよい。
|
|
64
|
+
|
|
65
|
+
一次資料: [FFmpeg Filters Documentation — select examples](https://ffmpeg.org/ffmpeg-filters.html#select_002c-aselect)
|
|
66
|
+
|
|
67
|
+
## 3. transcript 駆動候補を抽出する
|
|
68
|
+
|
|
69
|
+
[events-and-hooks.md](events-and-hooks.md) の手順で transcript から下書きした `highlight` 候補(および hook 候補)の時刻から、フレームを 1 枚ずつ抽出する。transcript が空の素材ではこの系統をスキップし、完了報告に明記する。
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
mkdir -p "$OUT_DIR/work/transcript"
|
|
73
|
+
# highlight 候補ごとに、代表時刻 T(初期値: (start + end) / 2)で 1 枚
|
|
74
|
+
ffmpeg -hide_banner -nostdin -ss "$T" -i "$OUT_DIR/proxy.mp4" \
|
|
75
|
+
-frames:v 1 "$OUT_DIR/work/transcript/tr-000001-t$T.jpg"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- 代表時刻の初期値は発言区間の中央とする。視認して発言内容と画が対応しない場合(画面切り替えの狭間、話者が映っていない等)は、同じ区間内で `start` / `end` 側へずらして再抽出してよい。区間外から取らない
|
|
79
|
+
- 抽出元の highlight / hook 候補との対応(どの event のための画か)を `work/` 内の対応表に控える。視認後の note 記入と `origin: "transcript"` の記録に使う
|
|
80
|
+
|
|
81
|
+
## 4. source 時刻を回収して統合する
|
|
82
|
+
|
|
83
|
+
各ログの `showinfo` 行にある `pts_time` を、同じ実行で出力された画像の連番順に対応付ける。連番そのものを秒にしない。scale だけのプロキシは source 時刻を維持するが、原本とプロキシの duration・開始時刻も照合する。transcript 駆動候補は `-ss` に与えた時刻をそのまま使う。
|
|
84
|
+
|
|
85
|
+
scene、interval、transcript の 3 系統の候補を source 時刻順に統合する。統合時に「最終連番 → 元候補ファイル名(系統込み)」の対応表を `work/mapping.txt` 等に書き残す(note との対応ずれを後から追跡できるようにする)。同一時刻または視覚的に同一の隣接画像は、Read で比較して情報量の高い方だけを残す。ただし transcript 駆動候補は重要発言の証拠なので、見た目が近くても安易に落とさず、落とす場合は対応する event との紐付けを残した方を優先する。最終画像は次のように安定した名前で `keyframes/` へ置く。
|
|
86
|
+
|
|
87
|
+
```text
|
|
88
|
+
keyframes/kf-0001-t12.000.jpg
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
ファイル名の時刻は検索補助であり、`keyframes[].t` の数値を正とする。小数 3 桁は命名上の初期精度であり、フレーム精度を保証する閾値ではない。採用した各 keyframe には、どの系統から来たかを `origin`(`scene` / `interval` / `transcript`)として記録する。
|
|
92
|
+
|
|
93
|
+
## 5. Read で視認する
|
|
94
|
+
|
|
95
|
+
最終採用前に各候補画像を Read で開く。長尺素材ではバッチに分けてよいが、未視認画像へ `note` を書かない。**note は必ず重複除外が確定した後の最終ファイル一覧に対して書く**(除外前の候補順で先読みして書くと、除外された枠の分だけ後続の note が前倒しでずれる連鎖事故が起きる。実測: 62 分素材で 5 件連鎖 + 入れ替わり 2 件)。**note は画像を Read した直後にその場で書き、`work/mapping.txt` の対応(連番・時刻・系統)と照合してから次の画像へ進む**。各 note は、画像だけから確認できる次の情報を日本語で簡潔に記す。
|
|
96
|
+
|
|
97
|
+
- 人物・画面・資料などの主対象
|
|
98
|
+
- UI、スライド、タイトル、エラー表示などの状態
|
|
99
|
+
- 直前候補から生じた見た目上の変化
|
|
100
|
+
- 後工程の根拠になる構図、顔の有無、文字の可読性
|
|
101
|
+
|
|
102
|
+
「重要そう」「盛り上がっている」だけで終えず、そう判断できる可視事実を書く。音声内容や人物の意図をフレームだけから推測しない。
|
|
103
|
+
|
|
104
|
+
取り違えリスクが高い箇所には追加の確認を掛ける。
|
|
105
|
+
|
|
106
|
+
- **準重複クラスタ**(同一シーンで時刻差が数秒未満の候補が並ぶ区間、直前直後で候補除外が起きた区間)は隣接フレームとの note 取り違えが起きやすい。書いた直後にその区間だけ note と画像を再突合する。
|
|
107
|
+
- ボタンラベル・件数などの**小さい UI 文字列**を note に引用する場合は、該当領域を拡大して読み取ってから書く(誤読・数値取り違えの実例あり)。
|
|
108
|
+
- 全 note 記入後、`note[i]` と `path[i]` の画像を機械的な順走査でもう一周突合する self-review を行ってから確定する。
|
|
109
|
+
|
|
110
|
+
Read が画像を開けない場合は note を捏造しない。`keyframes: []` に劣化するか、別の読み取り可能な画像形式へローカル変換して再試行し、未実施の視認工程を報告する。視認なしで分析完了とはしない。
|
|
111
|
+
|
|
112
|
+
## 6. 人物情報へ反映する
|
|
113
|
+
|
|
114
|
+
顔トラックを作る場合は、視認またはローカル検出で確認した時刻だけを記録する。box は `[x, y, width, height]` をフレーム幅・高さで正規化した値とし、各値を 0〜1、かつ `x + width <= 1`、`y + height <= 1` にする。話者と顔の対応を確認できなければ `tracks.faces: []` とし、見た目だけで speaker を断定しない。
|
|
115
|
+
|
|
116
|
+
人物マットはこの工程で自動生成しない。既に生成済みで、対象 source と時刻対応を確認できる場合だけ `tracks.person_matte` に値を書き、それ以外は `null` とする。人物演出を使うと決めた素材で新たに生成する場合だけ、[person-matte.md](person-matte.md) の任意工程を実行する。
|
|
117
|
+
|
|
118
|
+
## よくある間違い
|
|
119
|
+
|
|
120
|
+
- scene 候補だけで、静止画面が続く重要区間を見落とす。
|
|
121
|
+
- interval 候補だけで、短いエラー画面や切り替わりを見落とす。
|
|
122
|
+
- transcript 駆動候補を作らず、重要発言の瞬間の画を interval の偶然に頼る。
|
|
123
|
+
- `scene-000012.jpg` を 12 秒地点だと解釈する。
|
|
124
|
+
- Read せずにファイル名や transcript から画像 note を作る。
|
|
125
|
+
- 複数画像の note をまとめて後から書き、隣接候補と note を入れ替える。
|
|
126
|
+
- transcript 駆動候補の代表時刻が画面切り替えの狭間に落ちたまま、区間内での再抽出をしない。
|
|
127
|
+
- 同じ絵を大量に keyframes へ残し、レポートの根拠を薄める。
|
|
128
|
+
- 顔 box の右端・下端が正規化座標 1 を越える。
|
|
129
|
+
- scene 検出の exit code 234 を見ただけで「候補ゼロ」と即断し、ログ本文(`Stream mapping:` / `No filtered frames for output stream`)を確認しない。
|
|
130
|
+
- 逆に非ゼロ終了を一律「コマンド破綻」として原因調査せず止める。
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# プロキシ生成と文字起こし
|
|
2
|
+
|
|
3
|
+
## 目次
|
|
4
|
+
|
|
5
|
+
- [720p プロキシ](#720p-プロキシ)
|
|
6
|
+
- [文字起こしバックエンドを選ぶ(3 層)](#文字起こしバックエンドを選ぶ3-層)
|
|
7
|
+
- [provenance(backend の記録)](#provenancebackend-の記録)
|
|
8
|
+
- [文字起こし不能時の劣化](#文字起こし不能時の劣化)
|
|
9
|
+
|
|
10
|
+
## 原則
|
|
11
|
+
|
|
12
|
+
映像の時刻対応を変えずに軽量化し、発話は取得できた証拠だけを保存する。既定はローカルとし、登録済みクラウドは決定カードで人間が明示承認した場合だけ使う。ツール不足を推測で埋めない。
|
|
13
|
+
|
|
14
|
+
## 720p プロキシ
|
|
15
|
+
|
|
16
|
+
原本の縦横比を保ち、1280×720 の枠内へ収める。次の scale 構文は FFmpeg 公式ドキュメントの例に基づく。
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
ffmpeg -hide_banner -nostdin -y -i "$SOURCE" \
|
|
20
|
+
-map 0:v:0 -map '0:a?' \
|
|
21
|
+
-vf "scale=1280:720:force_original_aspect_ratio=decrease:force_divisible_by=2:reset_sar=1" \
|
|
22
|
+
-c:v libx264 -pix_fmt yuv420p -c:a aac -movflags +faststart \
|
|
23
|
+
"$OUT_DIR/proxy.mp4"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
720p は AKARI Video のプロキシ契約値である。生成後に `ffprobe` で width、height、duration、映像・音声ストリームを確認し、幅 1280 以下かつ高さ 720 以下、duration が原本と対応していることを確かめる。縦動画を引き伸ばしたり、プロキシ生成時に trim したりしない。
|
|
27
|
+
|
|
28
|
+
一次資料: [FFmpeg Filters Documentation — scale](https://ffmpeg.org/ffmpeg-filters.html#scale)
|
|
29
|
+
|
|
30
|
+
## 文字起こしバックエンドを選ぶ(3 層)
|
|
31
|
+
|
|
32
|
+
既定は層 1、利用できなければ層 2 へ進む。層 3 は層 1/2 の結果とは独立したオプトイン候補であり、接続条件を満たしても人間の明示承認なしには使わない。
|
|
33
|
+
|
|
34
|
+
### 層 1: macOS SpeechAnalyzer(Mac 既定)
|
|
35
|
+
|
|
36
|
+
- 使用条件は `sw_vers -productVersion` のメジャーが 26 以上で、`swiftc` を呼び出せること。`node bin/transcribe-sa.mjs --check` で判定し、`available:false` ならその `reason` を報告して層 2 へ進む。
|
|
37
|
+
- ヘルパーは [bin/speechanalyzer-helper.swift](bin/speechanalyzer-helper.swift) に置く。非公開の内部記録で 3 方式比較の実測検証を済ませたソースを取り込んだものである。初回使用時に `swiftc -O` で自動ビルドし、バイナリはコミットしない([.gitignore](.gitignore) 参照)。ネットワークから新しいツールを導入せず、既存の Command Line Tools だけを使う。
|
|
38
|
+
- `node bin/transcribe-sa.mjs --input <mono 16kHz wav などデコード可能な音声>` で実行する。層 2 の「音声を入力形式へ変換する」で作る `whisper-input.wav` を共用してよい。
|
|
39
|
+
- ヘルパーが `kAFAssistantErrorDomain Code=1101` などで失敗したら自動リトライせず、層 2 へフォールバックして理由を完了報告に書く。
|
|
40
|
+
|
|
41
|
+
### 層 2: whisper.cpp(共通フォールバック)
|
|
42
|
+
|
|
43
|
+
#### whisper.cpp の実行ファイルを探す
|
|
44
|
+
|
|
45
|
+
ネットワークから自動導入せず、次の順で読み取り・実行可能なものを探す。
|
|
46
|
+
|
|
47
|
+
1. `WHISPER_CPP_BIN` で明示されたパス
|
|
48
|
+
2. `PATH` 上の `whisper-cli`(Homebrew の `whisper-cpp` フォーミュラを導入した開発機では `/opt/homebrew/bin/whisper-cli` が `Cellar/whisper-cpp/<version>/bin/whisper-cli` へのシンボリックリンクとしてここに乗り、この順位で見つかる。2026-07-14 時点で実在・動作確認済み)
|
|
49
|
+
3. リポジトリ内または隣接する whisper.cpp checkout の `build/bin/whisper-cli`
|
|
50
|
+
|
|
51
|
+
候補を見つけたら `-h` を実行し、`-m`、`-f`、`-l auto`、`-oj`、`-ojf`、`-of` を受け付ける版か確認する(`whisper-cpp 1.8.4` の `-h` 出力で全オプションの存在を確認済み)。名前が一般的すぎる `main` を由来確認なしで使わない。
|
|
52
|
+
|
|
53
|
+
#### モデルを探す
|
|
54
|
+
|
|
55
|
+
次の順に `ggml-*.bin` を探索する。
|
|
56
|
+
|
|
57
|
+
1. `WHISPER_CPP_MODEL` で明示された読み取り可能なファイル
|
|
58
|
+
2. リポジトリ内の `models/`、`whisper.cpp/models/`
|
|
59
|
+
3. `$HOME/.cache/whisper.cpp/`
|
|
60
|
+
4. `$HOME/Library/Caches/whisper.cpp/`
|
|
61
|
+
5. Homebrew の `whisper-cpp` が導入済みなら、その share ディレクトリ
|
|
62
|
+
6. VoiceInk(`com.prakashjoshipax.VoiceInk`)が保存した whisper.cpp モデル: `$HOME/Library/Application Support/com.prakashjoshipax.VoiceInk/WhisperModels/`
|
|
63
|
+
|
|
64
|
+
6 は姉妹スキル `whisper-transcribe` が既定で再利用するモデル置き場と同じである。1〜5 のいずれかで見つかればそちらを優先し、6 はそれらが全て空のときだけ評価する。1〜5 が典型的な開発機ではどれも存在せず `transcript: []` へ不要に劣化していたため、この開発機で実際にモデルが手に入る場所を探索順の最後に加えた。実在確認: 2026-07-14 時点でこのパスに `ggml-large-v3-turbo-q5_0.bin`(約 574 MB)が存在することを確認済み。
|
|
65
|
+
|
|
66
|
+
存在するルートだけを対象に、例えば zsh では次のように列挙する。
|
|
67
|
+
|
|
68
|
+
```zsh
|
|
69
|
+
MODEL_ROOTS=(
|
|
70
|
+
"$REPO_ROOT/models"
|
|
71
|
+
"$REPO_ROOT/whisper.cpp/models"
|
|
72
|
+
"$HOME/.cache/whisper.cpp"
|
|
73
|
+
"$HOME/Library/Caches/whisper.cpp"
|
|
74
|
+
)
|
|
75
|
+
if command -v brew >/dev/null && BREW_PREFIX="$(brew --prefix whisper-cpp 2>/dev/null)"; then
|
|
76
|
+
MODEL_ROOTS+=("$BREW_PREFIX/share/whisper-cpp")
|
|
77
|
+
fi
|
|
78
|
+
MODEL_ROOTS+=("$HOME/Library/Application Support/com.prakashjoshipax.VoiceInk/WhisperModels")
|
|
79
|
+
|
|
80
|
+
for model_root in "${MODEL_ROOTS[@]}"; do
|
|
81
|
+
[[ -d "$model_root" ]] || continue
|
|
82
|
+
find "$model_root" -type f -name 'ggml-*.bin' -not -name 'for-tests-*' -print
|
|
83
|
+
done
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
探索範囲をファイルシステム全体へ無制限に広げない。whisper.cpp の `for-tests-*` はテスト専用なので、広い探索で見えても本番文字起こしに使わない。複数候補がある場合は、明示指定を最優先し、次に上記の探索順で見つかったローカルの多言語モデルを使い、選択理由を報告する。英語専用の `*.en.bin` は、素材が英語だと確認できた場合だけ使う。
|
|
87
|
+
|
|
88
|
+
#### 音声を入力形式へ変換する
|
|
89
|
+
|
|
90
|
+
音声ストリームがある場合だけ、プロキシから mono 16 kHz PCM WAV を作る。
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
ffmpeg -hide_banner -nostdin -y -i "$OUT_DIR/proxy.mp4" \
|
|
94
|
+
-map 0:a:0 -ar 16000 -ac 1 -c:a pcm_s16le \
|
|
95
|
+
"$OUT_DIR/whisper-input.wav"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
16 kHz PCM への変換手順と CLI オプションは whisper.cpp 公式資料に基づく。
|
|
99
|
+
|
|
100
|
+
一次資料: [whisper.cpp CLI README](https://github.com/ggml-org/whisper.cpp/blob/master/examples/cli/README.md)
|
|
101
|
+
|
|
102
|
+
#### ローカル文字起こしを実行する
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
"$WHISPER_BIN" \
|
|
106
|
+
-m "$WHISPER_MODEL" \
|
|
107
|
+
-f "$OUT_DIR/whisper-input.wav" \
|
|
108
|
+
-l auto -oj -ojf \
|
|
109
|
+
-of "$OUT_DIR/whisper.raw"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`-of` は拡張子を含まない出力 prefix であり、生成された JSON の実在パスを確認する。API キーを使うクラウド文字起こしへ勝手に切り替えない。
|
|
113
|
+
|
|
114
|
+
#### whisper JSON を正規化する
|
|
115
|
+
|
|
116
|
+
raw JSON をそのまま `analysis.json` に貼らない。公式 CLI 実装では segment と token の `offsets.from/to` はミリ秒整数、`timestamps.from/to` は表示用文字列である。数値時刻は `offsets` を 1000 で割って source 秒へ変換する。
|
|
117
|
+
|
|
118
|
+
一次資料: [whisper.cpp CLI source](https://github.com/ggml-org/whisper.cpp/blob/master/examples/cli/cli.cpp)
|
|
119
|
+
|
|
120
|
+
正規化ルール:
|
|
121
|
+
|
|
122
|
+
- segment を必須の `{ start, end, text }` と、根拠がある場合だけ任意の `speaker`、`words` に正規化する。
|
|
123
|
+
- `start` と `end` は `offsets.from / 1000`、`offsets.to / 1000` とし、`end > start` を確認する。
|
|
124
|
+
- 通常実行には話者分離がないため `speaker` を省略する。実際に話者分離を実行して対応を確認できた場合だけ非空 ID を入れる。
|
|
125
|
+
- `words` は次項の手順で**原則組み立てる**(word 単位のカット精度、字幕の文字追従表示、タイムスタンプを保った字幕修正など下流機能の基盤になるため)。信頼できる単語時刻をどうしても作れない segment に限り `words` を省略し、省略した segment 数と理由を完了報告に書く。
|
|
126
|
+
- transcript を source 時刻の昇順に並べ、原本 duration 外へはみ出さないことを確認する。
|
|
127
|
+
- `tracks.speakers` は話者分離を実際に行い、各 ID の区間を確認できた場合だけ作る。通常実行では空配列にする。
|
|
128
|
+
|
|
129
|
+
1000 による換算は whisper.cpp のミリ秒出力を秒契約へ変える単位換算であり、編集上の閾値ではない。
|
|
130
|
+
|
|
131
|
+
#### words(単語タイムスタンプ)を組み立てる
|
|
132
|
+
|
|
133
|
+
full JSON の `tokens[]` は BPE 単位であり、日本語ではマルチバイト文字が token 境界で分断されて、**token 単体の `text` が不正なバイト列になる**ことがある(実測: 62 分の日本語実素材で該当。strict UTF-8 の `json.load` がファイル全体で失敗する)。raw JSON をバイト単位で読み、次の手順で word を復元する。
|
|
134
|
+
|
|
135
|
+
1. segment 内の token を順に走査し、制御 token(`[_BEG_]` など `[` 始まり)と空文字を除く。
|
|
136
|
+
2. 連続する token の `text` バイト列を連結し、**有効な UTF-8 になった時点で 1 word として確定**する。`start` は先頭 token の `offsets.from / 1000`、`end` は末尾 token の `offsets.to / 1000`。
|
|
137
|
+
3. 末尾に不正バイトの端数が残った場合は直前の word に吸収し、それでも復元できないバイトは捨てて完了報告に書く。`U+FFFD`(置換文字)を `words[].text` に残さない。
|
|
138
|
+
4. word の時刻が親 segment の区間からはみ出す場合は segment 区間へクランプする。クランプで `end > start` を保てない word は捨てる。
|
|
139
|
+
|
|
140
|
+
日本語では「word」は形態素単位ではなく token 連結由来のかたまりになるが、字幕追従・カット精度の用途にはこの粒度で足りる。粒度の細かさより時刻の正確さを優先する。segment 単位の `text` しか使わない場合でも、raw JSON の読み込み自体が strict UTF-8 で失敗しうる点は同じなので、バイト単位読み(または `errors='replace'` での読み捨て)を最初から使う。
|
|
141
|
+
|
|
142
|
+
### 層 3: クラウド(オプトイン・決定カード)
|
|
143
|
+
|
|
144
|
+
- 層 1/2 のローカル結果とは独立に、`.akari/connections.json` の `elevenlabs`(ElevenLabs Scribe = 品質枠)または `groq`(Groq whisper = 速度枠)が `doctor.status === "ok"` で、credentials.env に対応キーが設定済みのときだけ決定カードを**提案してよい**。未設定または非 ok の provider は選択肢自体を出さない。既定はあくまでローカルである。
|
|
145
|
+
- `node bin/transcribe-cloud.mjs --decision-card --project-root <.akari を持つプロジェクトルート> --duration <source 秒>` で決定カードを得る。速度(RTF・待ち時間見積)× 品質(所見)× 費用(概算)の 3 軸を SpeechAnalyzer の基準値とクラウド候補で提示する。実測値は internal 契約 §2 の表を引用する。
|
|
146
|
+
- 人間の明示承認を得るまで音声を送信しない。
|
|
147
|
+
- 送信前に音声を mono 32〜64k へ抽出する。Groq は 32k、Scribe は 64k を既定にする。
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
ffmpeg -hide_banner -nostdin -y -i "$OUT_DIR/proxy.mp4" \
|
|
151
|
+
-map 0:a:0 -ac 1 -c:a aac -b:a "${BITRATE}k" \
|
|
152
|
+
"$OUT_DIR/cloud-input.m4a"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
- 承認後だけ実送信する。
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
node bin/transcribe-cloud.mjs --send --provider scribe|groq \
|
|
159
|
+
--input "$OUT_DIR/cloud-input.m4a" --duration <source秒> \
|
|
160
|
+
--project-root <...> --approved
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
- 単発送信を既定とする。プロバイダの上限(Groq 25MB・Scribe 10 時間相当)を超える場合だけ、無音検出を優先した境界で分割し**逐次**送信する(**並列同時送信は実装しない**。`grep -n "Promise.all\|allSettled\|worker_threads" bin/transcribe-cloud.mjs` で不在を確認できる)。各分割区間の word/segment 時刻は分割開始オフセットを加算してから 1 本の transcript へ縫合する。
|
|
164
|
+
|
|
165
|
+
#### Scribe words の正規化(句読点への無音吸着を吸わない)
|
|
166
|
+
|
|
167
|
+
Scribe(`scribe_v1`)は句読点を独立トークンとして返し、**文末の無音をその句読点トークンの `end` へ吸着させる**ことがある(v4.1 実測: 「。」トークン単体が 2〜4 秒に及ぶ例 — 「ね。」2822.84→2826.84 = 4.0s、「です。」相当 3728.939→3731.399 = 2.46s)。この `end` を末尾語へそのまま持ち込むと、実発話が終わったあとの無音区間まで `caption.end` が膨張し、下流で「隙間の原則」(実発話が終われば字幕も終わる。[edit-plan の execution.md](../edit-plan/execution.md) 参照)を破る。そのため `bin/transcribe-cloud.mjs` の `normalizeScribe` は**句読点のみのトークンを直前語のテキストへ結合し、直前語の `end` は据え置く**(句読点トークン自身の `end` を採用しない)。ゼロ幅・非ゼロ幅(無音吸着)どちらの句読点トークンも同じ規則で吸収する。この挙動は [test/normalize-scribe.test.mjs](test/normalize-scribe.test.mjs)(膨張ケースの fixture)で固定してある。
|
|
168
|
+
|
|
169
|
+
## provenance(backend の記録)
|
|
170
|
+
|
|
171
|
+
- 使用した backend(`speechanalyzer` / `whisper-cpp` / `scribe` / `groq`)は **analysis.json には書かない**。`packages/schemas/analysis.schema.json` の `transcriptSegment` は `additionalProperties: false` で `backend` を許可しておらず、このタスクの境界(`packages/**` は編集禁止)ではスキーマを変更できない。既存の「劣化理由は Schema 外のフィールドとして JSON に足さず、完了報告に書く」規約と同じ扱いとし、使用した backend と選定理由を完了報告に明記する([workflow.md](workflow.md) の完了報告項目を参照)。
|
|
172
|
+
- filler イベント検出は whisper.cpp 由来 transcript ではフィラーが正規化で脱落するため、SpeechAnalyzer / Scribe 由来 transcript がある場合はそちらを優先する([events-and-hooks.md](events-and-hooks.md) 参照)。
|
|
173
|
+
|
|
174
|
+
## 文字起こし不能時の劣化
|
|
175
|
+
|
|
176
|
+
音声ストリームがない場合、または層 1/2 が失敗し、層 3 も非該当・未承認・失敗となって 3 層すべてから有効な結果を得られない場合は、`transcript: []` として視覚分析を続ける。ほかの根拠で確認済み話者 track がなければ `tracks.speakers: []` とする。次の原因を確認し、該当するものを報告する。
|
|
177
|
+
|
|
178
|
+
- 音声ストリームがない。
|
|
179
|
+
- SpeechAnalyzer の利用条件を満たさない、ビルドできない、またはヘルパーが失敗した。
|
|
180
|
+
- `whisper-cli` がない、実行できない、または必要なオプションに非対応である。
|
|
181
|
+
- 読み取り可能な適合モデルがない。
|
|
182
|
+
- 音声変換または推論が失敗し、有効な時刻付き結果を回収できない。
|
|
183
|
+
- 推論自体は成功したが、出力がハルシネーション(非発話区間への定型文出力等)と判定でき、実発話の記録として採用できない(判定基準は次項)。
|
|
184
|
+
- 登録済みで doctor ok のクラウド provider がない、明示承認がない、または承認後の送信が失敗した。
|
|
185
|
+
|
|
186
|
+
### ハルシネーション疑いの判定基準
|
|
187
|
+
|
|
188
|
+
whisper.cpp は無音・環境音のみの区間に対しても、学習データ由来の短い定型英語フレーズ("Thank you." "Thanks for watching." "Bye." 等)を確信度高く出力することがある。これは実行時エラーを起こさないため、上の 4 条件だけでは検出できない。次のいずれかに強く合致する segment は採用しない。
|
|
189
|
+
|
|
190
|
+
- **音声エネルギー突合**: 該当区間の音声にエネルギーがあるかを ffmpeg の `volumedetect` で確認し、無音〜背景ノイズレベルの区間に発話が記録されていないか照合する。
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
ffmpeg -hide_banner -nostdin -i "$OUT_DIR/whisper-input.wav" -af volumedetect -f null - 2>&1 \
|
|
194
|
+
| grep -E "mean_volume|max_volume"
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
- **短い定型文の反復**: 内容が変化しないまま同一・類似の短い定型文が複数 segment にわたって繰り返され、transcript 全体の文脈と噛み合わない。
|
|
198
|
+
- **視認済みキーフレームとの矛盾**: [keyframes-and-review.md](keyframes-and-review.md) で視認した keyframe に人物・発話の兆候(口の動き、字幕、マイク等)がないのに、断定的な発言内容が記録されている。
|
|
199
|
+
|
|
200
|
+
いずれかに合致する segment は transcript から除外する。全 segment が該当するなら `transcript: []` に確定する。一部 segment だけが該当する場合は、除外した segment を除いた残りで transcript を組み立て、除外理由を完了報告に書く。判断に迷うグレーな segment は黙って残さず、根拠とともに完了報告へ書いて人間の確認を仰ぐ。
|
|
201
|
+
|
|
202
|
+
実測記録: testsrc 60 秒 + 440Hz 正弦波音声(実発話なし)の素材を whisper.cpp(`ggml-large-v3-turbo-q5_0.bin`)で文字起こしした際に "Thank you." が出力され、音声エネルギー突合(正弦波トーンのみで発話兆候なし)と視認済みキーフレーム(テストパターンのみで人物・字幕なし)の両方と矛盾することを確認して不採用にした事例がある。
|
|
203
|
+
|
|
204
|
+
完了報告には `transcript_unavailable` と具体的理由、探索した実行ファイル・モデルの場所を書く。空配列を「発話なし」と断定せず、「文字起こし未取得」と明記する。ハルシネーション判定で除外した場合も、除外した segment の内容・時刻・根拠を完了報告に書く。
|
|
205
|
+
|
|
206
|
+
## よくある間違い
|
|
207
|
+
|
|
208
|
+
- モデルを見つけるために無断ダウンロードする。
|
|
209
|
+
- 日本語素材へ英語専用モデルを使い、壊れた文字列を確定する。
|
|
210
|
+
- `timestamps` の表示文字列を浮動小数として雑にパースする。
|
|
211
|
+
- ミリ秒を秒として保存し、全 event 時刻を 1000 倍ずらす。
|
|
212
|
+
- token の確率や内部 ID を Schema 外のフィールドとして残す。
|
|
213
|
+
- token 1 個 = 1 word とみなし、分断されたマルチバイト文字を `U+FFFD` のまま `words` に残す。
|
|
214
|
+
- 作れるのに `words` を省略し、word 精度のカット・字幕追従など下流機能の基盤を欠落させる。
|
|
215
|
+
- whisper.cpp がないのに transcript を要約から捏造する。
|
|
216
|
+
- ハルシネーション疑いの定型文を音声・視認と突合せず transcript として確定する。
|
|
217
|
+
- クラウド決定カードの明示承認前に音声を送信する。
|
|
218
|
+
- 分割送信を並列(`Promise.all` 等)で実装し、無料枠のレート制限へ配慮しない(契約 §3 で明示的に不採用と裁定済み)。
|
|
219
|
+
- Scribe の句読点トークンの `end`(文末無音を吸着した膨張値)を末尾語の `end` にして、無音区間まで字幕を伸ばす。
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# 人物マットを作る(任意工程)
|
|
2
|
+
|
|
3
|
+
## 目次
|
|
4
|
+
|
|
5
|
+
- [実行するかを先に決める](#実行するかを先に決める)
|
|
6
|
+
- [道具を確認する](#道具を確認する)
|
|
7
|
+
- [生成する](#生成する)
|
|
8
|
+
- [analysis.json へ書く](#analysisjson-へ書く)
|
|
9
|
+
- [劣化](#劣化)
|
|
10
|
+
|
|
11
|
+
## 原則
|
|
12
|
+
|
|
13
|
+
人物マットは**人物演出(text-behind-person など)を使うと決めた素材でだけ**作る。既定の分析
|
|
14
|
+
フローはマットを作らず `tracks.person_matte` に `null` を書く。データ契約は
|
|
15
|
+
[docs/contract-2026-07-23-analysis-person-matte.md](../../docs/contract-2026-07-23-analysis-person-matte.md) が正本である。
|
|
16
|
+
|
|
17
|
+
## 実行するかを先に決める
|
|
18
|
+
|
|
19
|
+
全素材で常時実行しない。実測コスト(8 秒 / 1280x720 / 24fps / `balanced`・負荷のあるマシン):
|
|
20
|
+
|
|
21
|
+
| 工程 | 実時間比 | 備考 |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| Vision セグメンテーション | 約 1.7 倍 | 58 ms/frame。マットは 512x384 固定 |
|
|
24
|
+
| VP9 alpha エンコード | 残り全部 | **壁時計時間の支配項** |
|
|
25
|
+
| 合計 | **約 7.7 倍**(8 秒 → 62 秒) | 10 分素材なら 1 時間強の目安 |
|
|
26
|
+
|
|
27
|
+
次のすべてに当てはまるときだけ実行する。
|
|
28
|
+
|
|
29
|
+
- その素材に人物が映っており、人物を切り抜く演出を使うと決まっている。
|
|
30
|
+
- 素材の尺と上の実時間比から見積もった処理時間を許容できる。
|
|
31
|
+
- 単に「顔が映っている」だけではない(顔トラック `tracks.faces` はマット無しで作れる)。
|
|
32
|
+
|
|
33
|
+
品質の選び方:
|
|
34
|
+
|
|
35
|
+
| quality | 用途 | 実測 |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| `fast` | 当たり付け・「この素材で切り抜けるか」の事前判定のみ | マット 256x192。輪郭が階段状で**本番不可** |
|
|
38
|
+
| `balanced`(既定) | **本番**(text-behind-person / 切り抜き) | マット 512x384・58 ms/frame・実用輪郭 |
|
|
39
|
+
| `accurate` | 寄りカット・最終仕上げ | マット 2016x1512・135 ms/frame・peak 638 MB |
|
|
40
|
+
|
|
41
|
+
`fast` の出力を本番の成果物として `analysis.json` に載せない。
|
|
42
|
+
|
|
43
|
+
## 道具を確認する
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
node bin/person-matte/person-matte.mjs --check
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`{"available":true}` 以外なら `reason` を報告し、マットを作らずに `null` のまま進む。macOS、
|
|
50
|
+
`swiftc`、`ffmpeg`/`ffprobe`、ffmpeg の `libvpx-vp9` エンコーダのいずれかが欠けていれば作れない。
|
|
51
|
+
ネットワークからツールを導入しない。Swift ヘルパーは初回実行時に `swiftc -O` で自動ビルドされ、
|
|
52
|
+
バイナリはコミットしない([.gitignore](.gitignore) 参照)。
|
|
53
|
+
|
|
54
|
+
## 生成する
|
|
55
|
+
|
|
56
|
+
出力は analysis.json と同じディレクトリの `matte/person-matte.webm` に置く。
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
node bin/person-matte/person-matte.mjs \
|
|
60
|
+
--input "$SOURCE" \
|
|
61
|
+
--out "$OUT_DIR/matte/person-matte.webm"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
オプション(既定のままで良ければ渡さない):
|
|
65
|
+
|
|
66
|
+
- `--quality fast|balanced|accurate`(既定 `balanced`)
|
|
67
|
+
- `--fps <n>`(既定 24)。マット動画の fps。元素材と一致しなくてよい
|
|
68
|
+
- `--decode-width <n>`(既定 1280)。Vision のマット解像度は quality だけで決まり入力解像度に
|
|
69
|
+
依存しないため、通常は変更しない。素材が 1280 幅未満なら拡大せずその幅を使う
|
|
70
|
+
|
|
71
|
+
`--input` には**原本**を渡す。プロキシ(`proxy.mp4`)を渡してもよいが、その場合マットの RGB は
|
|
72
|
+
720p の絵になる。原本と時刻対応が崩れた素材を入力にしない。
|
|
73
|
+
|
|
74
|
+
成功時は 1 行の JSON が返る。`ok`、`frames`、`bytes`、`elapsed_seconds`、`vision_ms_per_frame`、
|
|
75
|
+
`alpha_transparent_ratio`(完全透明画素の割合)、`probe`(ffprobe の実測)を含む。
|
|
76
|
+
ヘルパーは書き出した WebM が `codec_name = vp9` かつ `alpha_mode = 1` であることを確認してから
|
|
77
|
+
成功を返すので、`ok: true` はアルファが落ちていないことを含意する。
|
|
78
|
+
|
|
79
|
+
`ok: false` なら `reason` を報告し、マットを諦めて `null` のまま分析を続ける。**マットが作れない
|
|
80
|
+
ことを理由に分析全体を失敗扱いにしない。**
|
|
81
|
+
|
|
82
|
+
## analysis.json へ書く
|
|
83
|
+
|
|
84
|
+
返ってきた JSON の `person_matte` をそのまま使えるが、**`path` は analysis.json のディレクトリ
|
|
85
|
+
基準の相対パスへ書き換える**(ヘルパーは呼び出し時の絶対パスを返す)。区切りは `/` を使う。
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
"person_matte": {
|
|
89
|
+
"path": "matte/person-matte.webm",
|
|
90
|
+
"fps": 24,
|
|
91
|
+
"quality": "balanced",
|
|
92
|
+
"generated_at": "2026-07-23T01:33:30.069Z",
|
|
93
|
+
"tool": "vision-person-segmentation"
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`path` と `fps` が必須、`quality` / `generated_at` / `tool` は任意である。
|
|
98
|
+
確定前に [analysis-json.md](analysis-json.md#schema-では表せない意味制約) の意味制約も検査する。
|
|
99
|
+
|
|
100
|
+
- マット動画の時刻 0 が素材の時刻 0 と一致する(区間を切り出したマットを載せない)。
|
|
101
|
+
- `fps` が実際に書き出したマット動画の fps と一致する。
|
|
102
|
+
- `path` を analysis.json の位置から解決でき、実ファイルが存在する。
|
|
103
|
+
|
|
104
|
+
## 劣化
|
|
105
|
+
|
|
106
|
+
道具が無い、生成に失敗した、または品質が実用に達しない場合は `tracks.person_matte` を `null` に
|
|
107
|
+
して分析を確定し、理由を完了報告に書く。未生成を空文字や欠落したパスで表さない。
|
|
108
|
+
|
|
109
|
+
細い毛束を 1 本単位で分離することは Vision ではできない(セグメンテーションであってマット化では
|
|
110
|
+
ない)。逆光・毛先の抜けが要求水準になる素材では、マットが取れても品質不足として `null` を選ぶ
|
|
111
|
+
判断があり得る。その判断も完了報告に書く。
|
|
112
|
+
|
|
113
|
+
## よくある間違い
|
|
114
|
+
|
|
115
|
+
- 人物演出を使うと決まっていない素材にも一律で実行し、分析時間を何倍にもする。
|
|
116
|
+
- `fast` の出力を本番の切り抜きとして確定する。
|
|
117
|
+
- 出来上がったマット動画を ffmpeg で再エンコード・再変換する(アルファが無言で落ちる)。
|
|
118
|
+
- マットを素材の途中区間から切り出し、時刻 0 の一致を壊す。
|
|
119
|
+
- `--fps` を変えたのに `analysis.json` の `fps` を書き換え忘れる。
|
|
120
|
+
- ヘルパーが返した絶対パスをそのまま `path` に書く。
|
|
121
|
+
- マットが作れなかったことを理由に `analysis.json` 自体を出さない。
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# `.akari` data contract v1
|
|
2
|
+
|
|
3
|
+
`workflow.json` declares canonical role paths, localized labels, normal-mode hidden entries, sidecar suffixes,
|
|
4
|
+
and gate event types. Asset metadata lives at `sidecars/<asset-relative-path>.meta.json`; for example,
|
|
5
|
+
`assets/interview.mp4` uses `sidecars/assets/interview.mp4.meta.json`.
|
|
6
|
+
Full per-asset analysis output lives at `sidecars/<asset-relative-path>.analysis/analysis.json`; for example,
|
|
7
|
+
`assets/interview.mp4` uses `sidecars/assets/interview.mp4.analysis/analysis.json`.
|
|
8
|
+
|
|
9
|
+
An asset meta object has `version: 1`, `asset` (project-relative string), optional `thumbnail` (path or URI),
|
|
10
|
+
optional non-negative `durationSeconds`, optional positive integer `width` and `height`, optional
|
|
11
|
+
`transcript` (`available` boolean and optional `path`), optional `analysis` (`status` and `summary` strings),
|
|
12
|
+
and optional inline `decisions` (`id`, `summary`, `status`). Missing inspection fields mean "未分析".
|
|
13
|
+
|
|
14
|
+
An optional `<asset>.decisions.json` has `version: 1`, `asset`, and a `decisions` array. Each decision contains
|
|
15
|
+
`id`, `summary`, `status` (`proposed`, `approved`, or `rejected`), and ISO-8601 `updatedAt`.
|
|
16
|
+
|
|
17
|
+
Each immutable event has `version: 1`, unique `id`, `type`, and ISO-8601 `occurredAt`. Gate event types are
|
|
18
|
+
declared by `workflow.json`; other event types such as `video-added` do not create a workflow snapshot.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"asset": "assets/interview.mp4",
|
|
4
|
+
"thumbnail": "thumbnails/interview.jpg",
|
|
5
|
+
"durationSeconds": 92.4,
|
|
6
|
+
"width": 1920,
|
|
7
|
+
"height": 1080,
|
|
8
|
+
"transcript": {
|
|
9
|
+
"available": true,
|
|
10
|
+
"path": "planning/interview.transcript.json"
|
|
11
|
+
},
|
|
12
|
+
"analysis": {
|
|
13
|
+
"status": "complete",
|
|
14
|
+
"summary": "製品紹介と導入効果を説明するインタビュー。"
|
|
15
|
+
},
|
|
16
|
+
"decisions": [
|
|
17
|
+
{
|
|
18
|
+
"id": "opening-hook",
|
|
19
|
+
"summary": "冒頭の結論を先に見せる",
|
|
20
|
+
"status": "approved"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|