venice-video-harness 2.4.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/CHANGELOG.md +28 -0
- package/LICENSE +21 -0
- package/README.md +598 -0
- package/dist/assembly/manifest-builder.d.ts +8 -0
- package/dist/assembly/manifest-builder.d.ts.map +1 -0
- package/dist/assembly/manifest-builder.js +196 -0
- package/dist/assembly/manifest-builder.js.map +1 -0
- package/dist/assembly/remotion-scaffold.d.ts +14 -0
- package/dist/assembly/remotion-scaffold.d.ts.map +1 -0
- package/dist/assembly/remotion-scaffold.js +292 -0
- package/dist/assembly/remotion-scaffold.js.map +1 -0
- package/dist/assembly/types.d.ts +67 -0
- package/dist/assembly/types.d.ts.map +1 -0
- package/dist/assembly/types.js +5 -0
- package/dist/assembly/types.js.map +1 -0
- package/dist/characters/describer.d.ts +32 -0
- package/dist/characters/describer.d.ts.map +1 -0
- package/dist/characters/describer.js +309 -0
- package/dist/characters/describer.js.map +1 -0
- package/dist/characters/extractor.d.ts +27 -0
- package/dist/characters/extractor.d.ts.map +1 -0
- package/dist/characters/extractor.js +274 -0
- package/dist/characters/extractor.js.map +1 -0
- package/dist/characters/reference-manager.d.ts +95 -0
- package/dist/characters/reference-manager.d.ts.map +1 -0
- package/dist/characters/reference-manager.js +346 -0
- package/dist/characters/reference-manager.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +310 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +66 -0
- package/dist/config.js.map +1 -0
- package/dist/editing/aligner.d.ts +44 -0
- package/dist/editing/aligner.d.ts.map +1 -0
- package/dist/editing/aligner.js +201 -0
- package/dist/editing/aligner.js.map +1 -0
- package/dist/editing/edl.d.ts +45 -0
- package/dist/editing/edl.d.ts.map +1 -0
- package/dist/editing/edl.js +133 -0
- package/dist/editing/edl.js.map +1 -0
- package/dist/editing/overlays.d.ts +97 -0
- package/dist/editing/overlays.d.ts.map +1 -0
- package/dist/editing/overlays.js +41 -0
- package/dist/editing/overlays.js.map +1 -0
- package/dist/editing/packer.d.ts +52 -0
- package/dist/editing/packer.d.ts.map +1 -0
- package/dist/editing/packer.js +170 -0
- package/dist/editing/packer.js.map +1 -0
- package/dist/editing/providers/whisper-cpp.d.ts +32 -0
- package/dist/editing/providers/whisper-cpp.d.ts.map +1 -0
- package/dist/editing/providers/whisper-cpp.js +239 -0
- package/dist/editing/providers/whisper-cpp.js.map +1 -0
- package/dist/editing/render.d.ts +36 -0
- package/dist/editing/render.d.ts.map +1 -0
- package/dist/editing/render.js +227 -0
- package/dist/editing/render.js.map +1 -0
- package/dist/editing/self-eval.d.ts +48 -0
- package/dist/editing/self-eval.d.ts.map +1 -0
- package/dist/editing/self-eval.js +293 -0
- package/dist/editing/self-eval.js.map +1 -0
- package/dist/editing/silence.d.ts +76 -0
- package/dist/editing/silence.d.ts.map +1 -0
- package/dist/editing/silence.js +189 -0
- package/dist/editing/silence.js.map +1 -0
- package/dist/editing/types.d.ts +178 -0
- package/dist/editing/types.d.ts.map +1 -0
- package/dist/editing/types.js +13 -0
- package/dist/editing/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +12 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +78 -0
- package/dist/interactive.js.map +1 -0
- package/dist/mini-drama/assembler.d.ts +61 -0
- package/dist/mini-drama/assembler.d.ts.map +1 -0
- package/dist/mini-drama/assembler.js +466 -0
- package/dist/mini-drama/assembler.js.map +1 -0
- package/dist/mini-drama/audio-mix.d.ts +65 -0
- package/dist/mini-drama/audio-mix.d.ts.map +1 -0
- package/dist/mini-drama/audio-mix.js +118 -0
- package/dist/mini-drama/audio-mix.js.map +1 -0
- package/dist/mini-drama/cli.d.ts +3 -0
- package/dist/mini-drama/cli.d.ts.map +1 -0
- package/dist/mini-drama/cli.js +2869 -0
- package/dist/mini-drama/cli.js.map +1 -0
- package/dist/mini-drama/fcpxml-export.d.ts +2 -0
- package/dist/mini-drama/fcpxml-export.d.ts.map +1 -0
- package/dist/mini-drama/fcpxml-export.js +5 -0
- package/dist/mini-drama/fcpxml-export.js.map +1 -0
- package/dist/mini-drama/generation-planner.d.ts +24 -0
- package/dist/mini-drama/generation-planner.d.ts.map +1 -0
- package/dist/mini-drama/generation-planner.js +304 -0
- package/dist/mini-drama/generation-planner.js.map +1 -0
- package/dist/mini-drama/location-generator.d.ts +23 -0
- package/dist/mini-drama/location-generator.d.ts.map +1 -0
- package/dist/mini-drama/location-generator.js +144 -0
- package/dist/mini-drama/location-generator.js.map +1 -0
- package/dist/mini-drama/music-cues.d.ts +96 -0
- package/dist/mini-drama/music-cues.d.ts.map +1 -0
- package/dist/mini-drama/music-cues.js +332 -0
- package/dist/mini-drama/music-cues.js.map +1 -0
- package/dist/mini-drama/panel-fixer.d.ts +12 -0
- package/dist/mini-drama/panel-fixer.d.ts.map +1 -0
- package/dist/mini-drama/panel-fixer.js +319 -0
- package/dist/mini-drama/panel-fixer.js.map +1 -0
- package/dist/mini-drama/prompt-builder.d.ts +149 -0
- package/dist/mini-drama/prompt-builder.d.ts.map +1 -0
- package/dist/mini-drama/prompt-builder.js +722 -0
- package/dist/mini-drama/prompt-builder.js.map +1 -0
- package/dist/mini-drama/reference-slots.d.ts +31 -0
- package/dist/mini-drama/reference-slots.d.ts.map +1 -0
- package/dist/mini-drama/reference-slots.js +161 -0
- package/dist/mini-drama/reference-slots.js.map +1 -0
- package/dist/mini-drama/shot-paths.d.ts +77 -0
- package/dist/mini-drama/shot-paths.d.ts.map +1 -0
- package/dist/mini-drama/shot-paths.js +101 -0
- package/dist/mini-drama/shot-paths.js.map +1 -0
- package/dist/mini-drama/storyboard-reference-generator.d.ts +47 -0
- package/dist/mini-drama/storyboard-reference-generator.d.ts.map +1 -0
- package/dist/mini-drama/storyboard-reference-generator.js +293 -0
- package/dist/mini-drama/storyboard-reference-generator.js.map +1 -0
- package/dist/mini-drama/subtitle-generator.d.ts +12 -0
- package/dist/mini-drama/subtitle-generator.d.ts.map +1 -0
- package/dist/mini-drama/subtitle-generator.js +139 -0
- package/dist/mini-drama/subtitle-generator.js.map +1 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts +3 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.js +150 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.js.map +1 -0
- package/dist/mini-drama/timeline-export/fcpxml.d.ts +11 -0
- package/dist/mini-drama/timeline-export/fcpxml.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/fcpxml.js +140 -0
- package/dist/mini-drama/timeline-export/fcpxml.js.map +1 -0
- package/dist/mini-drama/timeline-export/index.d.ts +13 -0
- package/dist/mini-drama/timeline-export/index.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/index.js +26 -0
- package/dist/mini-drama/timeline-export/index.js.map +1 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts +3 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.js +211 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.js.map +1 -0
- package/dist/mini-drama/timeline-export/probe.d.ts +53 -0
- package/dist/mini-drama/timeline-export/probe.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/probe.js +89 -0
- package/dist/mini-drama/timeline-export/probe.js.map +1 -0
- package/dist/mini-drama/timeline-export/types.d.ts +57 -0
- package/dist/mini-drama/timeline-export/types.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/types.js +14 -0
- package/dist/mini-drama/timeline-export/types.js.map +1 -0
- package/dist/mini-drama/video-generator.d.ts +22 -0
- package/dist/mini-drama/video-generator.d.ts.map +1 -0
- package/dist/mini-drama/video-generator.js +1305 -0
- package/dist/mini-drama/video-generator.js.map +1 -0
- package/dist/mini-drama/voice-reference.d.ts +42 -0
- package/dist/mini-drama/voice-reference.d.ts.map +1 -0
- package/dist/mini-drama/voice-reference.js +170 -0
- package/dist/mini-drama/voice-reference.js.map +1 -0
- package/dist/output/html-renderer.d.ts +2 -0
- package/dist/output/html-renderer.d.ts.map +1 -0
- package/dist/output/html-renderer.js +37 -0
- package/dist/output/html-renderer.js.map +1 -0
- package/dist/parsers/fountain-parser.d.ts +34 -0
- package/dist/parsers/fountain-parser.d.ts.map +1 -0
- package/dist/parsers/fountain-parser.js +71 -0
- package/dist/parsers/fountain-parser.js.map +1 -0
- package/dist/parsers/pdf-parser.d.ts +24 -0
- package/dist/parsers/pdf-parser.d.ts.map +1 -0
- package/dist/parsers/pdf-parser.js +237 -0
- package/dist/parsers/pdf-parser.js.map +1 -0
- package/dist/parsers/scene-extractor.d.ts +41 -0
- package/dist/parsers/scene-extractor.d.ts.map +1 -0
- package/dist/parsers/scene-extractor.js +400 -0
- package/dist/parsers/scene-extractor.js.map +1 -0
- package/dist/series/manager.d.ts +64 -0
- package/dist/series/manager.d.ts.map +1 -0
- package/dist/series/manager.js +282 -0
- package/dist/series/manager.js.map +1 -0
- package/dist/series/types.d.ts +641 -0
- package/dist/series/types.d.ts.map +1 -0
- package/dist/series/types.js +304 -0
- package/dist/series/types.js.map +1 -0
- package/dist/storyboard/assembler.d.ts +134 -0
- package/dist/storyboard/assembler.d.ts.map +1 -0
- package/dist/storyboard/assembler.js +319 -0
- package/dist/storyboard/assembler.js.map +1 -0
- package/dist/storyboard/prompt-builder.d.ts +113 -0
- package/dist/storyboard/prompt-builder.d.ts.map +1 -0
- package/dist/storyboard/prompt-builder.js +578 -0
- package/dist/storyboard/prompt-builder.js.map +1 -0
- package/dist/storyboard/shot-planner.d.ts +34 -0
- package/dist/storyboard/shot-planner.d.ts.map +1 -0
- package/dist/storyboard/shot-planner.js +446 -0
- package/dist/storyboard/shot-planner.js.map +1 -0
- package/dist/user-config.d.ts +15 -0
- package/dist/user-config.d.ts.map +1 -0
- package/dist/user-config.js +103 -0
- package/dist/user-config.js.map +1 -0
- package/dist/venice/audio-preflight.d.ts +80 -0
- package/dist/venice/audio-preflight.d.ts.map +1 -0
- package/dist/venice/audio-preflight.js +142 -0
- package/dist/venice/audio-preflight.js.map +1 -0
- package/dist/venice/audio.d.ts +88 -0
- package/dist/venice/audio.d.ts.map +1 -0
- package/dist/venice/audio.js +234 -0
- package/dist/venice/audio.js.map +1 -0
- package/dist/venice/client.d.ts +86 -0
- package/dist/venice/client.d.ts.map +1 -0
- package/dist/venice/client.js +375 -0
- package/dist/venice/client.js.map +1 -0
- package/dist/venice/edit.d.ts +57 -0
- package/dist/venice/edit.d.ts.map +1 -0
- package/dist/venice/edit.js +100 -0
- package/dist/venice/edit.js.map +1 -0
- package/dist/venice/generate.d.ts +47 -0
- package/dist/venice/generate.d.ts.map +1 -0
- package/dist/venice/generate.js +150 -0
- package/dist/venice/generate.js.map +1 -0
- package/dist/venice/image-bytes.d.ts +26 -0
- package/dist/venice/image-bytes.d.ts.map +1 -0
- package/dist/venice/image-bytes.js +101 -0
- package/dist/venice/image-bytes.js.map +1 -0
- package/dist/venice/models.d.ts +143 -0
- package/dist/venice/models.d.ts.map +1 -0
- package/dist/venice/models.js +984 -0
- package/dist/venice/models.js.map +1 -0
- package/dist/venice/multi-edit.d.ts +40 -0
- package/dist/venice/multi-edit.d.ts.map +1 -0
- package/dist/venice/multi-edit.js +97 -0
- package/dist/venice/multi-edit.js.map +1 -0
- package/dist/venice/provenance.d.ts +66 -0
- package/dist/venice/provenance.d.ts.map +1 -0
- package/dist/venice/provenance.js +151 -0
- package/dist/venice/provenance.js.map +1 -0
- package/dist/venice/recipe.d.ts +69 -0
- package/dist/venice/recipe.d.ts.map +1 -0
- package/dist/venice/recipe.js +103 -0
- package/dist/venice/recipe.js.map +1 -0
- package/dist/venice/rejection.d.ts +63 -0
- package/dist/venice/rejection.d.ts.map +1 -0
- package/dist/venice/rejection.js +111 -0
- package/dist/venice/rejection.js.map +1 -0
- package/dist/venice/seedance-preflight.d.ts +38 -0
- package/dist/venice/seedance-preflight.d.ts.map +1 -0
- package/dist/venice/seedance-preflight.js +29 -0
- package/dist/venice/seedance-preflight.js.map +1 -0
- package/dist/venice/types.d.ts +212 -0
- package/dist/venice/types.d.ts.map +1 -0
- package/dist/venice/types.js +9 -0
- package/dist/venice/types.js.map +1 -0
- package/dist/venice/video.d.ts +77 -0
- package/dist/venice/video.d.ts.map +1 -0
- package/dist/venice/video.js +163 -0
- package/dist/venice/video.js.map +1 -0
- package/dist/venice/voices.d.ts +40 -0
- package/dist/venice/voices.d.ts.map +1 -0
- package/dist/venice/voices.js +194 -0
- package/dist/venice/voices.js.map +1 -0
- package/package.json +79 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { resolve, basename, extname } from 'node:path';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { parseFountain } from './parsers/fountain-parser.js';
|
|
7
|
+
import { parsePdfToTokens } from './parsers/pdf-parser.js';
|
|
8
|
+
import { extractScenes, extractAllCharacters } from './parsers/scene-extractor.js';
|
|
9
|
+
import { extractCharacterProfiles } from './characters/extractor.js';
|
|
10
|
+
import { buildCharacterDescriptions } from './characters/describer.js';
|
|
11
|
+
import { ReferenceManager } from './characters/reference-manager.js';
|
|
12
|
+
import { planShots } from './storyboard/shot-planner.js';
|
|
13
|
+
import { buildPrompt, buildVideoPrompt } from './storyboard/prompt-builder.js';
|
|
14
|
+
import { StoryboardAssembler } from './storyboard/assembler.js';
|
|
15
|
+
import { saveStoryboardHtml } from './output/html-renderer.js';
|
|
16
|
+
import { VeniceClient } from './venice/client.js';
|
|
17
|
+
import { createProject, saveProject, loadProject, getVeniceApiKey, createDefaultAesthetic, } from './config.js';
|
|
18
|
+
import { buildManifest } from './assembly/manifest-builder.js';
|
|
19
|
+
import { scaffoldRemotionProject } from './assembly/remotion-scaffold.js';
|
|
20
|
+
const OUTPUT_BASE = resolve('output');
|
|
21
|
+
const program = new Command();
|
|
22
|
+
program
|
|
23
|
+
.name('storyboard')
|
|
24
|
+
.description('Screenplay-to-Storyboard generator using Venice AI')
|
|
25
|
+
.version('0.1.0');
|
|
26
|
+
// ── ingest-screenplay ──────────────────────────────────────────────
|
|
27
|
+
program
|
|
28
|
+
.command('ingest')
|
|
29
|
+
.description('Parse a screenplay file and extract scenes + characters')
|
|
30
|
+
.argument('<path>', 'Path to .fountain or .pdf screenplay file')
|
|
31
|
+
.option('-n, --name <name>', 'Project name (defaults to filename)')
|
|
32
|
+
.action(async (filePath, opts) => {
|
|
33
|
+
const absPath = resolve(filePath);
|
|
34
|
+
if (!existsSync(absPath)) {
|
|
35
|
+
console.error(`File not found: ${absPath}`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
const ext = extname(absPath).toLowerCase();
|
|
39
|
+
const projectName = opts.name || basename(absPath, ext);
|
|
40
|
+
console.log(`Ingesting screenplay: ${absPath}`);
|
|
41
|
+
// Parse based on file type
|
|
42
|
+
let parsed;
|
|
43
|
+
if (ext === '.fountain') {
|
|
44
|
+
parsed = await parseFountain(absPath);
|
|
45
|
+
}
|
|
46
|
+
else if (ext === '.pdf') {
|
|
47
|
+
parsed = await parsePdfToTokens(absPath);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
console.error(`Unsupported file type: ${ext}. Use .fountain or .pdf`);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
console.log(`Title: ${parsed.title || 'Untitled'}`);
|
|
54
|
+
console.log(`Tokens parsed: ${parsed.tokens.length}`);
|
|
55
|
+
// Extract scenes
|
|
56
|
+
const scenes = extractScenes(parsed);
|
|
57
|
+
console.log(`Scenes extracted: ${scenes.length}`);
|
|
58
|
+
// Extract characters
|
|
59
|
+
const allCharacters = extractAllCharacters(scenes);
|
|
60
|
+
console.log(`Characters found: ${allCharacters.length}`);
|
|
61
|
+
allCharacters.forEach(c => console.log(` - ${c}`));
|
|
62
|
+
// Extract character profiles
|
|
63
|
+
const profiles = extractCharacterProfiles(scenes);
|
|
64
|
+
const descriptions = buildCharacterDescriptions(profiles);
|
|
65
|
+
// Create project state
|
|
66
|
+
const project = createProject(projectName, absPath, OUTPUT_BASE);
|
|
67
|
+
project.scenes = scenes;
|
|
68
|
+
project.characters = descriptions;
|
|
69
|
+
await saveProject(project);
|
|
70
|
+
console.log(`\nProject saved to: ${project.outputDir}`);
|
|
71
|
+
console.log(`Run 'storyboard lock-characters --project ${project.outputDir}' to generate character references.`);
|
|
72
|
+
});
|
|
73
|
+
// ── lock-characters ────────────────────────────────────────────────
|
|
74
|
+
program
|
|
75
|
+
.command('lock-characters')
|
|
76
|
+
.description('Generate reference images for character consistency')
|
|
77
|
+
.requiredOption('-p, --project <dir>', 'Project output directory')
|
|
78
|
+
.option('-c, --character <name>', 'Lock a specific character (default: all)')
|
|
79
|
+
.action(async (opts) => {
|
|
80
|
+
const project = await loadProject(resolve(opts.project));
|
|
81
|
+
if (!project) {
|
|
82
|
+
console.error('Project not found. Run ingest first.');
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
const apiKey = await getVeniceApiKey();
|
|
86
|
+
const client = new VeniceClient(apiKey);
|
|
87
|
+
const refManager = new ReferenceManager(project.outputDir);
|
|
88
|
+
const toProcess = opts.character
|
|
89
|
+
? project.characters.filter(c => c.name === opts.character?.toUpperCase())
|
|
90
|
+
: project.characters;
|
|
91
|
+
if (toProcess.length === 0) {
|
|
92
|
+
console.error('No matching characters found.');
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
console.log(`Generating reference images for ${toProcess.length} character(s)...`);
|
|
96
|
+
for (const desc of toProcess) {
|
|
97
|
+
// Skip characters that are already locked on disk.
|
|
98
|
+
const existing = await refManager.loadReferences(desc.name);
|
|
99
|
+
if (existing) {
|
|
100
|
+
console.log(`\nSkipping ${desc.name} (already locked, seed: ${existing.seed})`);
|
|
101
|
+
if (!project.characterLocks.find(l => l.name === desc.name)) {
|
|
102
|
+
project.characterLocks.push(existing);
|
|
103
|
+
}
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
console.log(`\nGenerating references for ${desc.name}...`);
|
|
107
|
+
console.log(` Description: ${desc.shortDescription}`);
|
|
108
|
+
const lock = await refManager.generateReferences(client, desc, project.aesthetic);
|
|
109
|
+
project.characterLocks.push(lock);
|
|
110
|
+
await refManager.saveReferences(lock);
|
|
111
|
+
console.log(` Locked: ${desc.name} (seed: ${lock.seed})`);
|
|
112
|
+
}
|
|
113
|
+
await saveProject(project);
|
|
114
|
+
console.log(`\nCharacter locks saved. Run 'storyboard set-aesthetic --project ${project.outputDir}' next.`);
|
|
115
|
+
});
|
|
116
|
+
// ── set-aesthetic ──────────────────────────────────────────────────
|
|
117
|
+
program
|
|
118
|
+
.command('set-aesthetic')
|
|
119
|
+
.description('Set the visual style for the storyboard')
|
|
120
|
+
.requiredOption('-p, --project <dir>', 'Project output directory')
|
|
121
|
+
.option('--style <style>', 'Visual style', 'Cinematic photography')
|
|
122
|
+
.option('--palette <palette>', 'Color palette', 'warm natural palette')
|
|
123
|
+
.option('--lighting <lighting>', 'Lighting style', 'natural lighting with subtle film grain')
|
|
124
|
+
.option('--lens <lens>', 'Lens characteristics', 'anamorphic lens characteristics, shallow depth of field')
|
|
125
|
+
.option('--film <film>', 'Film stock', '35mm Kodak Vision3 500T')
|
|
126
|
+
.action(async (opts) => {
|
|
127
|
+
const project = await loadProject(resolve(opts.project));
|
|
128
|
+
if (!project) {
|
|
129
|
+
console.error('Project not found.');
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
const aesthetic = {
|
|
133
|
+
style: opts.style,
|
|
134
|
+
palette: opts.palette,
|
|
135
|
+
lighting: opts.lighting,
|
|
136
|
+
lensCharacteristics: opts.lens,
|
|
137
|
+
filmStock: opts.film,
|
|
138
|
+
};
|
|
139
|
+
project.aesthetic = aesthetic;
|
|
140
|
+
await saveProject(project);
|
|
141
|
+
console.log('Aesthetic profile set:');
|
|
142
|
+
Object.entries(aesthetic).forEach(([k, v]) => console.log(` ${k}: ${v}`));
|
|
143
|
+
console.log(`\nRun 'storyboard generate-scene --project ${project.outputDir} --scene 1' to test.`);
|
|
144
|
+
});
|
|
145
|
+
// ── generate-scene ─────────────────────────────────────────────────
|
|
146
|
+
program
|
|
147
|
+
.command('generate-scene')
|
|
148
|
+
.description('Generate storyboard for a single scene')
|
|
149
|
+
.requiredOption('-p, --project <dir>', 'Project output directory')
|
|
150
|
+
.requiredOption('-s, --scene <number>', 'Scene number', parseInt)
|
|
151
|
+
.action(async (opts) => {
|
|
152
|
+
const project = await loadProject(resolve(opts.project));
|
|
153
|
+
if (!project) {
|
|
154
|
+
console.error('Project not found.');
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
const scene = project.scenes.find(s => s.number === opts.scene);
|
|
158
|
+
if (!scene) {
|
|
159
|
+
console.error(`Scene ${opts.scene} not found. Available: ${project.scenes.map(s => s.number).join(', ')}`);
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
const aesthetic = project.aesthetic || createDefaultAesthetic();
|
|
163
|
+
const apiKey = await getVeniceApiKey();
|
|
164
|
+
const client = new VeniceClient(apiKey);
|
|
165
|
+
console.log(`\nGenerating storyboard for Scene ${scene.number}: ${scene.heading}`);
|
|
166
|
+
console.log(`Characters: ${scene.characters.join(', ')}`);
|
|
167
|
+
// Plan shots
|
|
168
|
+
const shots = planShots(scene);
|
|
169
|
+
console.log(`Planned ${shots.length} shots`);
|
|
170
|
+
// Build character maps
|
|
171
|
+
const descMap = new Map(project.characters.map(c => [c.name, c]));
|
|
172
|
+
// Load full character locks from disk (with reference images)
|
|
173
|
+
const refManager = new ReferenceManager(project.outputDir);
|
|
174
|
+
const lockMap = new Map();
|
|
175
|
+
for (const cl of project.characterLocks) {
|
|
176
|
+
const full = await refManager.loadReferences(cl.name);
|
|
177
|
+
if (full) {
|
|
178
|
+
lockMap.set(cl.name, full);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Build prompts (image + video)
|
|
182
|
+
const promptResults = shots.map(shot => buildPrompt(shot, scene, aesthetic, descMap, lockMap));
|
|
183
|
+
const videoPrompts = shots.map(shot => buildVideoPrompt(shot, scene, aesthetic));
|
|
184
|
+
// Generate images (with video prompt metadata)
|
|
185
|
+
const assembler = new StoryboardAssembler(project.outputDir);
|
|
186
|
+
const panels = await assembler.generateScene(scene.number, scene, shots, promptResults, client, videoPrompts);
|
|
187
|
+
console.log(`Generated ${panels.length} panels for Scene ${scene.number}`);
|
|
188
|
+
// Compile and save HTML (use full locks with reference images)
|
|
189
|
+
const storyboard = await assembler.compileStoryboard(project.name, new Map([[scene.number, panels]]), [scene], Array.from(lockMap.values()), aesthetic);
|
|
190
|
+
const htmlPath = await saveStoryboardHtml(storyboard, resolve(project.outputDir, `scene-${scene.number}-storyboard.html`));
|
|
191
|
+
console.log(`Storyboard HTML saved to: ${htmlPath}`);
|
|
192
|
+
project.completedScenes.push(scene.number);
|
|
193
|
+
await saveProject(project);
|
|
194
|
+
});
|
|
195
|
+
// ── generate-all ───────────────────────────────────────────────────
|
|
196
|
+
program
|
|
197
|
+
.command('generate-all')
|
|
198
|
+
.description('Generate storyboard for all scenes')
|
|
199
|
+
.requiredOption('-p, --project <dir>', 'Project output directory')
|
|
200
|
+
.option('--skip-completed', 'Skip already completed scenes', false)
|
|
201
|
+
.action(async (opts) => {
|
|
202
|
+
const project = await loadProject(resolve(opts.project));
|
|
203
|
+
if (!project) {
|
|
204
|
+
console.error('Project not found.');
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
const aesthetic = project.aesthetic || createDefaultAesthetic();
|
|
208
|
+
const apiKey = await getVeniceApiKey();
|
|
209
|
+
const client = new VeniceClient(apiKey);
|
|
210
|
+
const assembler = new StoryboardAssembler(project.outputDir);
|
|
211
|
+
const descMap = new Map(project.characters.map(c => [c.name, c]));
|
|
212
|
+
// Load full character locks from disk (with reference images)
|
|
213
|
+
const refManager = new ReferenceManager(project.outputDir);
|
|
214
|
+
const lockMap = new Map();
|
|
215
|
+
for (const cl of project.characterLocks) {
|
|
216
|
+
const full = await refManager.loadReferences(cl.name);
|
|
217
|
+
if (full) {
|
|
218
|
+
lockMap.set(cl.name, full);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
console.log(`Loaded ${lockMap.size} character locks with reference images`);
|
|
222
|
+
const scenesToProcess = opts.skipCompleted
|
|
223
|
+
? project.scenes.filter(s => !project.completedScenes.includes(s.number))
|
|
224
|
+
: project.scenes;
|
|
225
|
+
console.log(`Generating storyboard for ${scenesToProcess.length} scenes...`);
|
|
226
|
+
const allPanels = new Map();
|
|
227
|
+
for (const scene of scenesToProcess) {
|
|
228
|
+
console.log(`\n── Scene ${scene.number}: ${scene.heading} ──`);
|
|
229
|
+
const shots = planShots(scene);
|
|
230
|
+
console.log(` ${shots.length} shots planned`);
|
|
231
|
+
const promptResults = shots.map(shot => buildPrompt(shot, scene, aesthetic, descMap, lockMap));
|
|
232
|
+
const videoPrompts = shots.map(shot => buildVideoPrompt(shot, scene, aesthetic));
|
|
233
|
+
const panels = await assembler.generateScene(scene.number, scene, shots, promptResults, client, videoPrompts);
|
|
234
|
+
allPanels.set(scene.number, panels);
|
|
235
|
+
project.completedScenes.push(scene.number);
|
|
236
|
+
console.log(` ${panels.length} panels generated`);
|
|
237
|
+
}
|
|
238
|
+
// Compile full storyboard (use full locks with reference images)
|
|
239
|
+
const storyboard = await assembler.compileStoryboard(project.name, allPanels, project.scenes, Array.from(lockMap.values()), aesthetic);
|
|
240
|
+
const htmlPath = await saveStoryboardHtml(storyboard, resolve(project.outputDir, 'storyboard-full.html'));
|
|
241
|
+
console.log(`\nFull storyboard saved to: ${htmlPath}`);
|
|
242
|
+
await saveProject(project);
|
|
243
|
+
});
|
|
244
|
+
// ── assemble ──────────────────────────────────────────────────────
|
|
245
|
+
program
|
|
246
|
+
.command('assemble')
|
|
247
|
+
.description('Build a Remotion project from generated video clips and render the final film')
|
|
248
|
+
.requiredOption('-p, --project <dir>', 'Project output directory')
|
|
249
|
+
.option('--scaffold-only', 'Only scaffold the Remotion project, skip rendering', false)
|
|
250
|
+
.option('--render-scene <number>', 'Render a single scene instead of the full film', parseInt)
|
|
251
|
+
.action(async (opts) => {
|
|
252
|
+
const project = await loadProject(resolve(opts.project));
|
|
253
|
+
if (!project) {
|
|
254
|
+
console.error('Project not found. Run ingest first.');
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
// Step 1: Build manifest from MP4s + video.json + ffprobe
|
|
258
|
+
console.log('Building shot manifest...');
|
|
259
|
+
const manifest = await buildManifest(project);
|
|
260
|
+
if (manifest.totalShots === 0) {
|
|
261
|
+
console.error('No video clips found. Generate videos first.');
|
|
262
|
+
process.exit(1);
|
|
263
|
+
}
|
|
264
|
+
// Step 2: Scaffold the Remotion project
|
|
265
|
+
const { remotionDir, manifestPath, publicDir } = await scaffoldRemotionProject(project.outputDir, manifest);
|
|
266
|
+
// Step 3: Install dependencies
|
|
267
|
+
console.log('\nInstalling Remotion dependencies...');
|
|
268
|
+
const { execSync } = await import('node:child_process');
|
|
269
|
+
try {
|
|
270
|
+
execSync('npm install', {
|
|
271
|
+
cwd: remotionDir,
|
|
272
|
+
stdio: 'inherit',
|
|
273
|
+
timeout: 120000,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
console.error('Failed to install dependencies. You can install manually:');
|
|
278
|
+
console.error(` cd ${remotionDir} && npm install`);
|
|
279
|
+
process.exit(1);
|
|
280
|
+
}
|
|
281
|
+
if (opts.scaffoldOnly) {
|
|
282
|
+
console.log(`\nRemotion project scaffolded at: ${remotionDir}`);
|
|
283
|
+
console.log(`Preview: cd ${remotionDir} && npx remotion preview src/index.ts --public-dir="${publicDir}"`);
|
|
284
|
+
console.log(`Render: cd ${remotionDir} && npx remotion render src/index.ts Film --codec=h264 --crf=18 --public-dir="${publicDir}"`);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
// Step 4: Render
|
|
288
|
+
const compositionId = opts.renderScene
|
|
289
|
+
? `Scene${opts.renderScene}`
|
|
290
|
+
: 'Film';
|
|
291
|
+
const outputFile = opts.renderScene
|
|
292
|
+
? resolve(project.outputDir, `scene-${opts.renderScene}-assembled.mp4`)
|
|
293
|
+
: resolve(project.outputDir, `${project.name}-final.mp4`);
|
|
294
|
+
console.log(`\nRendering ${compositionId} to ${outputFile}...`);
|
|
295
|
+
try {
|
|
296
|
+
execSync(`npx remotion render src/index.ts ${compositionId} "${outputFile}" --codec=h264 --crf=18 --public-dir="${publicDir}"`, {
|
|
297
|
+
cwd: remotionDir,
|
|
298
|
+
stdio: 'inherit',
|
|
299
|
+
timeout: 600000, // 10 min max
|
|
300
|
+
});
|
|
301
|
+
console.log(`\nRendered: ${outputFile}`);
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
console.error('Render failed. You can retry manually:');
|
|
305
|
+
console.error(` cd ${remotionDir} && npx remotion render src/index.ts ${compositionId} "${outputFile}" --codec=h264 --crf=18 --public-dir="${publicDir}"`);
|
|
306
|
+
process.exit(1);
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
program.parse();
|
|
310
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Scene } from './parsers/scene-extractor.js';
|
|
2
|
+
import type { CharacterDescription } from './characters/describer.js';
|
|
3
|
+
import type { CharacterLock } from './characters/reference-manager.js';
|
|
4
|
+
import type { AestheticProfile } from './storyboard/prompt-builder.js';
|
|
5
|
+
export interface ProjectState {
|
|
6
|
+
name: string;
|
|
7
|
+
screenplayPath: string;
|
|
8
|
+
outputDir: string;
|
|
9
|
+
scenes: Scene[];
|
|
10
|
+
characters: CharacterDescription[];
|
|
11
|
+
characterLocks: CharacterLock[];
|
|
12
|
+
aesthetic: AestheticProfile | null;
|
|
13
|
+
completedScenes: number[];
|
|
14
|
+
createdAt: string;
|
|
15
|
+
updatedAt: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function createDefaultAesthetic(): AestheticProfile;
|
|
18
|
+
export declare function createProject(name: string, screenplayPath: string, outputBase: string): ProjectState;
|
|
19
|
+
export declare function saveProject(state: ProjectState): Promise<void>;
|
|
20
|
+
export declare function loadProject(outputDir: string): Promise<ProjectState | null>;
|
|
21
|
+
export declare function getVeniceApiKey(): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGvE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAepG;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBpE;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAKjF;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAOvD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { hydrateEnvironmentFromUserConfig } from './user-config.js';
|
|
5
|
+
const DEFAULT_AESTHETIC = {
|
|
6
|
+
style: 'Cinematic photography',
|
|
7
|
+
palette: 'warm natural palette',
|
|
8
|
+
lighting: 'natural lighting with subtle film grain',
|
|
9
|
+
lensCharacteristics: 'anamorphic lens characteristics, shallow depth of field',
|
|
10
|
+
filmStock: '35mm Kodak Vision3 500T',
|
|
11
|
+
};
|
|
12
|
+
export function createDefaultAesthetic() {
|
|
13
|
+
return { ...DEFAULT_AESTHETIC };
|
|
14
|
+
}
|
|
15
|
+
export function createProject(name, screenplayPath, outputBase) {
|
|
16
|
+
const outputDir = join(outputBase, name.replace(/[^a-zA-Z0-9_-]/g, '_'));
|
|
17
|
+
const now = new Date().toISOString();
|
|
18
|
+
return {
|
|
19
|
+
name,
|
|
20
|
+
screenplayPath,
|
|
21
|
+
outputDir,
|
|
22
|
+
scenes: [],
|
|
23
|
+
characters: [],
|
|
24
|
+
characterLocks: [],
|
|
25
|
+
aesthetic: null,
|
|
26
|
+
completedScenes: [],
|
|
27
|
+
createdAt: now,
|
|
28
|
+
updatedAt: now,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export async function saveProject(state) {
|
|
32
|
+
if (!existsSync(state.outputDir)) {
|
|
33
|
+
await mkdir(state.outputDir, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
state.updatedAt = new Date().toISOString();
|
|
36
|
+
// Save state without base64 image data (those are stored as files)
|
|
37
|
+
const serializable = {
|
|
38
|
+
...state,
|
|
39
|
+
characterLocks: state.characterLocks.map(lock => ({
|
|
40
|
+
...lock,
|
|
41
|
+
referenceImages: {
|
|
42
|
+
front: '[saved to disk]',
|
|
43
|
+
threeQuarter: '[saved to disk]',
|
|
44
|
+
profile: '[saved to disk]',
|
|
45
|
+
fullBody: '[saved to disk]',
|
|
46
|
+
},
|
|
47
|
+
})),
|
|
48
|
+
};
|
|
49
|
+
await writeFile(join(state.outputDir, 'project.json'), JSON.stringify(serializable, null, 2));
|
|
50
|
+
}
|
|
51
|
+
export async function loadProject(outputDir) {
|
|
52
|
+
const projectFile = join(outputDir, 'project.json');
|
|
53
|
+
if (!existsSync(projectFile))
|
|
54
|
+
return null;
|
|
55
|
+
const data = await readFile(projectFile, 'utf-8');
|
|
56
|
+
return JSON.parse(data);
|
|
57
|
+
}
|
|
58
|
+
export async function getVeniceApiKey() {
|
|
59
|
+
await hydrateEnvironmentFromUserConfig();
|
|
60
|
+
const key = process.env.VENICE_API_KEY;
|
|
61
|
+
if (!key) {
|
|
62
|
+
throw new Error('Venice API key is required. Run `venice-video setup` or set VENICE_API_KEY.');
|
|
63
|
+
}
|
|
64
|
+
return key;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKrC,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAC;AAepE,MAAM,iBAAiB,GAAqB;IAC1C,KAAK,EAAE,uBAAuB;IAC9B,OAAO,EAAE,sBAAsB;IAC/B,QAAQ,EAAE,yCAAyC;IACnD,mBAAmB,EAAE,yDAAyD;IAC9E,SAAS,EAAE,yBAAyB;CACrC,CAAC;AAEF,MAAM,UAAU,sBAAsB;IACpC,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,cAAsB,EAAE,UAAkB;IACpF,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,IAAI;QACJ,cAAc;QACd,SAAS;QACT,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE;QACd,cAAc,EAAE,EAAE;QAClB,SAAS,EAAE,IAAI;QACf,eAAe,EAAE,EAAE;QACnB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAmB;IACnD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,mEAAmE;IACnE,MAAM,YAAY,GAAG;QACnB,GAAG,KAAK;QACR,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChD,GAAG,IAAI;YACP,eAAe,EAAE;gBACf,KAAK,EAAE,iBAAiB;gBACxB,YAAY,EAAE,iBAAiB;gBAC/B,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,iBAAiB;aAC5B;SACF,CAAC,CAAC;KACJ,CAAC;IACF,MAAM,SAAS,CACb,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,EACrC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CACtC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,gCAAgC,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACvC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ground-truth script alignment for Venice-generated content.
|
|
3
|
+
*
|
|
4
|
+
* When we already know the exact spoken text (from `ShotScript.vo` or a
|
|
5
|
+
* TTS script), we can produce more accurate word timings than pure ASR by
|
|
6
|
+
* mapping the script's canonical words onto whisper.cpp's detected word
|
|
7
|
+
* timings via longest-common-subsequence alignment.
|
|
8
|
+
*
|
|
9
|
+
* The output is still a `WordTiming[]`, but the `word` field is the
|
|
10
|
+
* script's canonical word (with correct capitalization / punctuation)
|
|
11
|
+
* rather than whisper's best guess. Unmatched script words are linearly
|
|
12
|
+
* interpolated between their neighbors.
|
|
13
|
+
*
|
|
14
|
+
* This matters in practice because TTS voices often produce subtle
|
|
15
|
+
* mispronunciations or swallowed words that whisper transcribes as
|
|
16
|
+
* homophones ("their" vs "there", "a" vs "uh"). For editing purposes
|
|
17
|
+
* we want the script's words — that's what the captions, shot manifest,
|
|
18
|
+
* and VO_TEXT array refer to.
|
|
19
|
+
*/
|
|
20
|
+
import type { WordTiming } from './types.js';
|
|
21
|
+
export interface AlignOptions {
|
|
22
|
+
/**
|
|
23
|
+
* How to treat script words that whisper didn't emit at all. With
|
|
24
|
+
* `interpolate` (default), unmatched words are given proportional
|
|
25
|
+
* timings between their aligned neighbors. With `drop`, they're
|
|
26
|
+
* omitted entirely (useful for truncation detection).
|
|
27
|
+
*/
|
|
28
|
+
onMissing?: 'interpolate' | 'drop';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Align a ground-truth script against whisper word timings.
|
|
32
|
+
*/
|
|
33
|
+
export declare function alignScriptToWords(script: string, asrWords: WordTiming[], options?: AlignOptions): WordTiming[];
|
|
34
|
+
/**
|
|
35
|
+
* Detect VO truncation: returns the portion of the script (if any) that
|
|
36
|
+
* could not be aligned to ASR words because the audio ended before it.
|
|
37
|
+
* Useful as a VO-truncation check (AGENTS.md anti-pattern, rule 26).
|
|
38
|
+
*/
|
|
39
|
+
export declare function detectTruncation(script: string, asrWords: WordTiming[]): {
|
|
40
|
+
truncated: boolean;
|
|
41
|
+
lostWords: string[];
|
|
42
|
+
lastAlignedSec: number;
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=aligner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aligner.d.ts","sourceRoot":"","sources":["../../src/editing/aligner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;CACpC;AA2DD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,YAAiB,GACzB,UAAU,EAAE,CAiGd;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,UAAU,EAAE,GACrB;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAwBrE"}
|