demo-reel 0.6.0 → 0.7.3
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/.claude-plugin/commands/demo-script.md +1 -1
- package/README.md +45 -28
- package/bin/demo-reel.mjs +8 -35
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -129
- package/dist/index.js.map +1 -1
- package/dist/piper.d.ts +7 -0
- package/dist/piper.d.ts.map +1 -0
- package/dist/piper.js +145 -0
- package/dist/piper.js.map +1 -0
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +41 -1
- package/dist/runner.js.map +1 -1
- package/dist/schemas.d.ts +9 -41
- package/dist/schemas.d.ts.map +1 -1
- package/dist/script/tts.d.ts.map +1 -1
- package/dist/script/tts.js +28 -23
- package/dist/script/tts.js.map +1 -1
- package/dist/script/types.d.ts +9 -57
- package/dist/script/types.d.ts.map +1 -1
- package/dist/voice-config.d.ts +6 -44
- package/dist/voice-config.d.ts.map +1 -1
- package/dist/voice-config.js +3 -18
- package/dist/voice-config.js.map +1 -1
- package/package.json +13 -15
- package/src/index.ts +16 -151
- package/src/piper.ts +169 -0
- package/src/runner.ts +68 -1
- package/src/script/tts.ts +34 -27
- package/src/voice-config.ts +3 -22
- package/templates/demo-reel.config.ts +0 -90
- package/templates/scenario.demo.ts +0 -68
|
@@ -157,7 +157,7 @@ One command does everything (compile, voice, record, subtitles, cleanup):
|
|
|
157
157
|
pnpm demo-reel <name> --verbose
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
-
This compiles the .demo.ts, generates voiceover (if voice config + narration present),
|
|
160
|
+
This compiles the .demo.ts, generates voiceover (if voice config + narration present), records the video, and outputs video + subtitles + metadata.
|
|
161
161
|
|
|
162
162
|
For local debugging with a visible browser:
|
|
163
163
|
|
package/README.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Demo Reel
|
|
2
2
|
|
|
3
3
|

|
|
4
|
+

|
|
4
5
|
|
|
5
|
-
Create professional demo videos from web apps. Code your demos in TypeScript,
|
|
6
|
+
Create professional demo videos from web apps. Code your demos in TypeScript, with automatic voiceover and subtitles.
|
|
6
7
|
|
|
7
8
|
## Quick Start
|
|
8
9
|
|
|
@@ -11,7 +12,7 @@ pnpm add -D demo-reel
|
|
|
11
12
|
```
|
|
12
13
|
|
|
13
14
|
```typescript
|
|
14
|
-
// demos/
|
|
15
|
+
// demos/my-feature.demo.ts
|
|
15
16
|
import { generate } from "demo-reel";
|
|
16
17
|
|
|
17
18
|
await generate(
|
|
@@ -26,8 +27,8 @@ await generate(
|
|
|
26
27
|
outputFormat: "mp4",
|
|
27
28
|
|
|
28
29
|
voice: {
|
|
29
|
-
provider: "
|
|
30
|
-
voice: "
|
|
30
|
+
provider: "piper", // "piper" (local/free) | "openai" | "elevenlabs"
|
|
31
|
+
voice: "en_US-amy-medium", // auto-downloaded on first use
|
|
31
32
|
},
|
|
32
33
|
|
|
33
34
|
auth: {
|
|
@@ -98,7 +99,7 @@ await generate(
|
|
|
98
99
|
```
|
|
99
100
|
|
|
100
101
|
```bash
|
|
101
|
-
|
|
102
|
+
pnpm build && pnpm demo-reel demos/my-feature
|
|
102
103
|
```
|
|
103
104
|
|
|
104
105
|
Output: `output/signup.mp4` + `.srt` + `.vtt` + `.meta.json`
|
|
@@ -106,13 +107,14 @@ Output: `output/signup.mp4` + `.srt` + `.vtt` + `.meta.json`
|
|
|
106
107
|
## How It Works
|
|
107
108
|
|
|
108
109
|
1. **You write a `.demo.ts`** — TypeScript config with steps, scenes, and narration
|
|
109
|
-
2. **`generate()` handles everything** — compiles config, generates voiceover
|
|
110
|
-
3. **Docker runs the heavy stuff** — Chromium, FFmpeg, Piper TTS are in the Docker image, not on your machine
|
|
110
|
+
2. **`generate()` handles everything** — compiles config, generates voiceover, records the video, outputs subtitles and metadata
|
|
111
111
|
|
|
112
112
|
### Requirements
|
|
113
113
|
|
|
114
|
-
- **Docker** — for recording and voice generation
|
|
115
114
|
- **Node.js 18+** — for running your demo scripts
|
|
115
|
+
- **Playwright** — `pnpm exec playwright install chromium` (peer dependency)
|
|
116
|
+
- **FFmpeg** — for video/audio processing (installed via `ffmpeg-static` or system package)
|
|
117
|
+
- **Piper** (optional) — for local TTS voiceover (auto-downloaded on first use, no setup needed)
|
|
116
118
|
- **API keys** (optional) — `ELEVENLABS_KEY` or `OPENAI_API_KEY` for cloud TTS
|
|
117
119
|
|
|
118
120
|
## Claude Code Integration
|
|
@@ -179,32 +181,32 @@ See `TRACKING.md` for the raw file format and guidance for AI tools that consume
|
|
|
179
181
|
|
|
180
182
|
```typescript
|
|
181
183
|
voice: {
|
|
182
|
-
provider: "
|
|
183
|
-
voice: "
|
|
184
|
+
provider: "piper", // "piper" | "openai" | "elevenlabs"
|
|
185
|
+
voice: "en_US-amy-medium", // any voice name or ID supported by the provider
|
|
184
186
|
speed: 1.0,
|
|
185
|
-
pronunciation: {
|
|
186
|
-
"template": "template",
|
|
187
|
+
pronunciation: { // word replacements before TTS
|
|
188
|
+
"template": "template", // prevent Dutch pronunciation of English words
|
|
187
189
|
},
|
|
188
190
|
},
|
|
189
191
|
```
|
|
190
192
|
|
|
191
|
-
|
|
193
|
+
Voiceover is auto-generated when `scenes` have `narration` text and `voice` is configured. Cached by content hash — only regenerates when narration changes.
|
|
192
194
|
|
|
193
|
-
|
|
194
|
-
- `openai`: `"alloy"`, `"echo"`, `"fable"`, `"onyx"`, `"nova"`, `"shimmer"`
|
|
195
|
-
- `elevenlabs`: `"21m00Tcm4TlvDq8ikWAM"`, `"5zhopMftSdRGaPYVcwKK"`, `CwhRBWXzGAHq8TQ4Fs17`, `60CwgZt94Yf7yYIXMDDe`
|
|
195
|
+
#### Provider Details
|
|
196
196
|
|
|
197
|
-
|
|
197
|
+
**Piper** (local, free) — voice is a model name like `en_US-amy-medium`. Auto-downloaded from HuggingFace on first use. Models are cached in `$PIPER_VOICE_DIR` (defaults to `~/.local/share/piper-voices`). For custom models, use `voicePath` instead of `voice`:
|
|
198
198
|
|
|
199
199
|
```typescript
|
|
200
200
|
voice: {
|
|
201
201
|
provider: "piper",
|
|
202
|
-
voicePath: "/
|
|
202
|
+
voicePath: "/path/to/custom-voice.onnx",
|
|
203
203
|
speed: 1.0,
|
|
204
204
|
}
|
|
205
205
|
```
|
|
206
206
|
|
|
207
|
-
|
|
207
|
+
**OpenAI** — voice is an OpenAI TTS voice name (e.g. `alloy`, `nova`, `shimmer`). Requires `OPENAI_API_KEY` env var.
|
|
208
|
+
|
|
209
|
+
**ElevenLabs** — voice is an ElevenLabs voice ID string. Requires `ELEVENLABS_KEY` or `ELEVENLABS_API_KEY` env var.
|
|
208
210
|
|
|
209
211
|
### Setup & Cleanup
|
|
210
212
|
|
|
@@ -299,13 +301,15 @@ Demo videos are designed as standalone segments that also work as a series:
|
|
|
299
301
|
|
|
300
302
|
```
|
|
301
303
|
demos/
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
304
|
+
├── the-internet-login.demo.ts # login flow (goto, type, click, hover)
|
|
305
|
+
├── the-internet-dynamic-controls.demo.ts # async UI changes (waitFor)
|
|
306
|
+
├── the-internet-checkboxes-dropdown.demo.ts # form controls (check, select)
|
|
307
|
+
├── the-internet-file-upload.demo.ts # file input (upload)
|
|
308
|
+
├── the-internet-hovers.demo.ts # hover reveals (hover)
|
|
309
|
+
└── the-internet-drag-drop.demo.ts # column swap (drag)
|
|
306
310
|
```
|
|
307
311
|
|
|
308
|
-
Each video
|
|
312
|
+
Each video is independently recordable. For apps requiring login, use the `auth` + `setup` blocks to recreate state from scratch.
|
|
309
313
|
|
|
310
314
|
## CI/CD
|
|
311
315
|
|
|
@@ -319,16 +323,29 @@ jobs:
|
|
|
319
323
|
steps:
|
|
320
324
|
- uses: actions/checkout@v4
|
|
321
325
|
- uses: pnpm/action-setup@v4
|
|
322
|
-
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
+
- uses: actions/setup-node@v4
|
|
327
|
+
with:
|
|
328
|
+
node-version: 22
|
|
329
|
+
cache: pnpm
|
|
330
|
+
- run: pnpm ci
|
|
331
|
+
- run: pnpm exec playwright install chromium
|
|
332
|
+
- run: pnpm build
|
|
333
|
+
- run: pnpm demo-reel demos/the-internet-login
|
|
326
334
|
- uses: actions/upload-artifact@v4
|
|
327
335
|
with:
|
|
328
336
|
name: demo-videos
|
|
329
337
|
path: ./output/*.mp4
|
|
330
338
|
```
|
|
331
339
|
|
|
340
|
+
Piper binary and voice models download automatically on first run — no secrets needed for the built-in demos. For cloud TTS, add secrets in your repo settings and pass them as env:
|
|
341
|
+
|
|
342
|
+
```yaml
|
|
343
|
+
- run: pnpm demo-reel demos/my-demo
|
|
344
|
+
env:
|
|
345
|
+
ELEVENLABS_KEY: ${{ secrets.ELEVENLABS_KEY }}
|
|
346
|
+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
347
|
+
```
|
|
348
|
+
|
|
332
349
|
## License
|
|
333
350
|
|
|
334
351
|
MIT
|
package/bin/demo-reel.mjs
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { spawn } from "child_process";
|
|
3
3
|
import { dirname, resolve } from "path";
|
|
4
4
|
import { fileURLToPath } from "url";
|
|
5
5
|
|
|
6
6
|
const SKILL_URL =
|
|
7
7
|
"https://raw.githubusercontent.com/whit3st/demo-reel/main/.claude-plugin/commands/demo-script.md";
|
|
8
|
-
const DEFAULT_IMAGE = "ghcr.io/whit3st/demo-reel:latest";
|
|
9
|
-
const LOCAL_IMAGE = "demo-reel:latest";
|
|
10
8
|
|
|
11
9
|
const args = process.argv.slice(2);
|
|
12
10
|
|
|
@@ -25,21 +23,13 @@ Option 2 — Manual copy:
|
|
|
25
23
|
|
|
26
24
|
Then use /demo-script in Claude Code to create demo videos collaboratively.`);
|
|
27
25
|
} else if (args[0] === "explore") {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"/work",
|
|
36
|
-
"--entrypoint",
|
|
37
|
-
"node",
|
|
38
|
-
image,
|
|
39
|
-
"/app/dist/script/crawl-cli.js",
|
|
40
|
-
...args.slice(1),
|
|
41
|
-
];
|
|
42
|
-
const proc = spawn("docker", dockerArgs, { stdio: "inherit" });
|
|
26
|
+
const crawlCliPath = resolve(
|
|
27
|
+
dirname(fileURLToPath(import.meta.url)),
|
|
28
|
+
"../dist/script/crawl-cli.js",
|
|
29
|
+
);
|
|
30
|
+
const proc = spawn(process.execPath, [crawlCliPath, ...args.slice(1)], {
|
|
31
|
+
stdio: "inherit",
|
|
32
|
+
});
|
|
43
33
|
forwardSignals(proc);
|
|
44
34
|
proc.on("close", (code) => process.exit(code ?? 1));
|
|
45
35
|
} else if (args.length > 0) {
|
|
@@ -61,23 +51,6 @@ CLI commands:
|
|
|
61
51
|
demo-reel explore <url> Crawl a page and show selectors`);
|
|
62
52
|
}
|
|
63
53
|
|
|
64
|
-
function getImage() {
|
|
65
|
-
try {
|
|
66
|
-
execSync(`docker image inspect ${LOCAL_IMAGE}`, { stdio: "ignore" });
|
|
67
|
-
return LOCAL_IMAGE;
|
|
68
|
-
} catch {
|
|
69
|
-
/* no local image */
|
|
70
|
-
}
|
|
71
|
-
try {
|
|
72
|
-
execSync(`docker image inspect ${DEFAULT_IMAGE}`, { stdio: "ignore" });
|
|
73
|
-
return DEFAULT_IMAGE;
|
|
74
|
-
} catch {
|
|
75
|
-
console.log(`Pulling ${DEFAULT_IMAGE}...`);
|
|
76
|
-
execSync(`docker pull ${DEFAULT_IMAGE}`, { stdio: "inherit" });
|
|
77
|
-
return DEFAULT_IMAGE;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
54
|
function forwardSignals(child) {
|
|
82
55
|
const signals = ["SIGINT", "SIGTERM"];
|
|
83
56
|
const forward = (signal) => {
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ import { demoReelConfigSchema, demoReelConfigInputSchema, type DemoReelConfig, t
|
|
|
2
2
|
export type DemoConfig = DemoReelConfigInput;
|
|
3
3
|
export interface GenerateOptions {
|
|
4
4
|
verbose?: boolean;
|
|
5
|
-
noDocker?: boolean;
|
|
6
5
|
}
|
|
7
6
|
export declare function defineConfig(config: DemoConfig): DemoReelConfig;
|
|
8
7
|
export declare const demo: typeof defineConfig;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACzB,MAAM,cAAc,CAAC;AAMtB,MAAM,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,cAAc,CAE/D;AAED,eAAO,MAAM,IAAI,qBAAe,CAAC;AAEjC,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CAE9D;AAoDD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkJ/F;AAED,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxE,mBAAmB,YAAY,CAAC;AAChC,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,KAAK,yBAAyB,GAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,GACX,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,9 @@
|
|
|
1
|
-
import { execSync, spawn, spawnSync } from "child_process";
|
|
2
1
|
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "fs";
|
|
3
2
|
import { basename, dirname, extname, join, relative, resolve } from "path";
|
|
4
3
|
import { demoReelConfigSchema, demoReelConfigInputSchema, } from "./schemas.js";
|
|
5
4
|
import { getNarrationManifestPath } from "./narration-manifest.js";
|
|
6
5
|
import { narrationManifestSchema, NARRATION_PROCESSING_VERSION } from "./narration-manifest.js";
|
|
7
6
|
import { syncNarration, logSyncReport } from "./narration-sync.js";
|
|
8
|
-
const DEFAULT_IMAGE = "ghcr.io/whit3st/demo-reel:latest";
|
|
9
|
-
const LOCAL_IMAGE = "demo-reel:latest";
|
|
10
|
-
const ENV_PASSTHROUGH = [
|
|
11
|
-
"ELEVENLABS_KEY",
|
|
12
|
-
"ELEVENLABS_API_KEY",
|
|
13
|
-
"OPENAI_API_KEY",
|
|
14
|
-
"ANTHROPIC_API_KEY",
|
|
15
|
-
];
|
|
16
7
|
export function defineConfig(config) {
|
|
17
8
|
return validateConfig(config);
|
|
18
9
|
}
|
|
@@ -20,39 +11,6 @@ export const demo = defineConfig;
|
|
|
20
11
|
export function validateConfig(config) {
|
|
21
12
|
return demoReelConfigSchema.parse(config);
|
|
22
13
|
}
|
|
23
|
-
function isDockerAvailable() {
|
|
24
|
-
try {
|
|
25
|
-
execSync("docker info", { stdio: "ignore" });
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function getImage() {
|
|
33
|
-
try {
|
|
34
|
-
execSync(`docker image inspect ${LOCAL_IMAGE}`, { stdio: "ignore" });
|
|
35
|
-
return LOCAL_IMAGE;
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
// No local image, fall through to the published image.
|
|
39
|
-
}
|
|
40
|
-
try {
|
|
41
|
-
execSync(`docker image inspect ${DEFAULT_IMAGE}`, { stdio: "ignore" });
|
|
42
|
-
return DEFAULT_IMAGE;
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
console.log(`Pulling ${DEFAULT_IMAGE}...`);
|
|
46
|
-
execSync(`docker pull ${DEFAULT_IMAGE}`, { stdio: "inherit" });
|
|
47
|
-
return DEFAULT_IMAGE;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
function getDockerUserArgs() {
|
|
51
|
-
if (typeof process.getuid !== "function" || typeof process.getgid !== "function") {
|
|
52
|
-
return [];
|
|
53
|
-
}
|
|
54
|
-
return ["--user", `${process.getuid()}:${process.getgid()}`];
|
|
55
|
-
}
|
|
56
14
|
function getBaseName(config) {
|
|
57
15
|
if (config.name) {
|
|
58
16
|
return config.name;
|
|
@@ -97,7 +55,7 @@ function shouldRegenerateNarrationArtifacts(audioPath, manifestPath) {
|
|
|
97
55
|
}
|
|
98
56
|
}
|
|
99
57
|
export async function generate(config, options = {}) {
|
|
100
|
-
const { verbose = false
|
|
58
|
+
const { verbose = false } = options;
|
|
101
59
|
const resolvedConfig = validateConfig(config);
|
|
102
60
|
const name = getBaseName(resolvedConfig);
|
|
103
61
|
const narratedScenes = getNarratedScenesInPlaybackOrder(resolvedConfig);
|
|
@@ -105,16 +63,18 @@ export async function generate(config, options = {}) {
|
|
|
105
63
|
const hasVoice = resolvedConfig.voice;
|
|
106
64
|
const audioPath = getAudioPath(resolvedConfig);
|
|
107
65
|
const narrationManifestPath = getNarrationManifestPath(audioPath);
|
|
108
|
-
const
|
|
109
|
-
const shouldRegenerateNarration = hasNarration && hasVoice
|
|
66
|
+
const shouldRegenerate = hasNarration && hasVoice
|
|
110
67
|
? shouldRegenerateNarrationArtifacts(audioPath, narrationManifestPath)
|
|
111
68
|
: false;
|
|
112
69
|
mkdirSync(dirname(audioPath), { recursive: true });
|
|
113
|
-
if (hasNarration && hasVoice &&
|
|
70
|
+
if (hasNarration && hasVoice && shouldRegenerate) {
|
|
114
71
|
if (verbose) {
|
|
115
|
-
console.log("Generating voiceover
|
|
72
|
+
console.log("Generating voiceover...");
|
|
116
73
|
}
|
|
117
|
-
const
|
|
74
|
+
const { generateVoiceSegments, generateNarrationAudio } = await import("./script/tts.js");
|
|
75
|
+
const { resolveVoiceConfig } = await import("./voice-config.js");
|
|
76
|
+
const resolvedVoice = resolveVoiceConfig(resolvedConfig.voice);
|
|
77
|
+
const script = {
|
|
118
78
|
title: name,
|
|
119
79
|
description: "auto-generated",
|
|
120
80
|
url: "https://placeholder.local",
|
|
@@ -124,32 +84,10 @@ export async function generate(config, options = {}) {
|
|
|
124
84
|
sourceSceneIndex: index,
|
|
125
85
|
steps: [{ action: "wait", ms: 0 }],
|
|
126
86
|
})),
|
|
127
|
-
voice:
|
|
87
|
+
voice: resolvedVoice,
|
|
128
88
|
};
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const voiceArgs = [
|
|
132
|
-
"run",
|
|
133
|
-
"--rm",
|
|
134
|
-
...getDockerUserArgs(),
|
|
135
|
-
"-v",
|
|
136
|
-
`${process.cwd()}:/work:z`,
|
|
137
|
-
"-w",
|
|
138
|
-
"/work",
|
|
139
|
-
];
|
|
140
|
-
for (const envVar of ENV_PASSTHROUGH) {
|
|
141
|
-
if (process.env[envVar]) {
|
|
142
|
-
voiceArgs.push("-e", `${envVar}=${process.env[envVar]}`);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
voiceArgs.push("--entrypoint", "node", image, "/app/dist/script/voice-cli.js", voiceScriptPath, "--output", relative(process.cwd(), audioPath));
|
|
146
|
-
const voiceResult = spawnSync("docker", voiceArgs, { stdio: "inherit", env: process.env });
|
|
147
|
-
if (voiceResult.status !== 0) {
|
|
148
|
-
throw new Error(`Docker voice generation exited with code ${voiceResult.status}`);
|
|
149
|
-
}
|
|
150
|
-
if (voiceResult.error) {
|
|
151
|
-
throw voiceResult.error;
|
|
152
|
-
}
|
|
89
|
+
const segments = await generateVoiceSegments(script, resolvedVoice, { verbose });
|
|
90
|
+
await generateNarrationAudio(segments, audioPath, { verbose });
|
|
153
91
|
}
|
|
154
92
|
const configWithAudio = hasNarration && existsSync(audioPath)
|
|
155
93
|
? {
|
|
@@ -163,7 +101,6 @@ export async function generate(config, options = {}) {
|
|
|
163
101
|
outputFormat: "mp4",
|
|
164
102
|
}
|
|
165
103
|
: resolvedConfig;
|
|
166
|
-
// --- Narration auto-sync ---
|
|
167
104
|
if (hasNarration && existsSync(narrationManifestPath) && resolvedConfig.scenes) {
|
|
168
105
|
try {
|
|
169
106
|
const syncMode = resolvedConfig.timing.narrationSyncMode ?? "auto";
|
|
@@ -193,7 +130,6 @@ export async function generate(config, options = {}) {
|
|
|
193
130
|
if (verbose) {
|
|
194
131
|
logSyncReport(syncOutput.report, verbose);
|
|
195
132
|
}
|
|
196
|
-
// Apply synced steps and scene indices
|
|
197
133
|
if (syncOutput.report.appliedPadMs > 0) {
|
|
198
134
|
configWithAudio.steps = syncOutput.steps;
|
|
199
135
|
if (resolvedConfig.scenes) {
|
|
@@ -212,7 +148,6 @@ export async function generate(config, options = {}) {
|
|
|
212
148
|
if (verbose) {
|
|
213
149
|
console.warn(`Narration sync skipped: ${error instanceof Error ? error.message : String(error)}`);
|
|
214
150
|
}
|
|
215
|
-
// Re-throw strict mode errors
|
|
216
151
|
if (error instanceof Error &&
|
|
217
152
|
error.message.startsWith("Narration sync") &&
|
|
218
153
|
error.message.includes("strict")) {
|
|
@@ -227,51 +162,7 @@ export async function generate(config, options = {}) {
|
|
|
227
162
|
catch (error) {
|
|
228
163
|
throw new Error(`Failed to write config: ${error instanceof Error ? error.message : error}`);
|
|
229
164
|
}
|
|
230
|
-
const relJsonPath = relative(process.cwd(), jsonPath);
|
|
231
|
-
const cliArgs = [relJsonPath];
|
|
232
|
-
if (verbose) {
|
|
233
|
-
cliArgs.push("--verbose");
|
|
234
|
-
}
|
|
235
165
|
try {
|
|
236
|
-
if (!noDocker && isDockerAvailable()) {
|
|
237
|
-
const image = getImage();
|
|
238
|
-
if (verbose) {
|
|
239
|
-
console.log(`Using Docker image: ${image}`);
|
|
240
|
-
}
|
|
241
|
-
const dockerArgs = [
|
|
242
|
-
"run",
|
|
243
|
-
"--rm",
|
|
244
|
-
...getDockerUserArgs(),
|
|
245
|
-
"-v",
|
|
246
|
-
`${process.cwd()}:/work:z`,
|
|
247
|
-
"-w",
|
|
248
|
-
"/work",
|
|
249
|
-
];
|
|
250
|
-
for (const envVar of ENV_PASSTHROUGH) {
|
|
251
|
-
if (process.env[envVar]) {
|
|
252
|
-
dockerArgs.push("-e", `${envVar}=${process.env[envVar]}`);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
dockerArgs.push(image, ...cliArgs);
|
|
256
|
-
await new Promise((resolvePromise, reject) => {
|
|
257
|
-
const proc = spawn("docker", dockerArgs, {
|
|
258
|
-
stdio: "inherit",
|
|
259
|
-
env: process.env,
|
|
260
|
-
});
|
|
261
|
-
proc.on("close", (code) => {
|
|
262
|
-
if (code === 0) {
|
|
263
|
-
resolvePromise();
|
|
264
|
-
return;
|
|
265
|
-
}
|
|
266
|
-
reject(new Error(`Docker exited with code ${code}`));
|
|
267
|
-
});
|
|
268
|
-
proc.on("error", reject);
|
|
269
|
-
});
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
if (!noDocker) {
|
|
273
|
-
console.log("Docker not available, running locally (requires Playwright, FFmpeg, etc.)");
|
|
274
|
-
}
|
|
275
166
|
const { loadConfig } = await import("./config-loader.js");
|
|
276
167
|
const { runVideoScenario } = await import("./video-handler.js");
|
|
277
168
|
const loaded = await loadConfig(resolve(jsonPath));
|
|
@@ -281,15 +172,7 @@ export async function generate(config, options = {}) {
|
|
|
281
172
|
try {
|
|
282
173
|
unlinkSync(jsonPath);
|
|
283
174
|
}
|
|
284
|
-
catch {
|
|
285
|
-
// Best-effort cleanup for temp files.
|
|
286
|
-
}
|
|
287
|
-
try {
|
|
288
|
-
unlinkSync(voiceScriptPath);
|
|
289
|
-
}
|
|
290
|
-
catch {
|
|
291
|
-
// Best-effort cleanup for temp files.
|
|
292
|
-
}
|
|
175
|
+
catch { }
|
|
293
176
|
}
|
|
294
177
|
}
|
|
295
178
|
export { demoReelConfigSchema, demoReelConfigInputSchema };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/piper.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function ensurePiperBinary(): Promise<string>;
|
|
2
|
+
export declare function getPiperVoiceUrl(voice: string): {
|
|
3
|
+
model: string;
|
|
4
|
+
config: string;
|
|
5
|
+
} | null;
|
|
6
|
+
export declare function ensurePiperModel(voice: string, voiceDir: string): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=piper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piper.d.ts","sourceRoot":"","sources":["../src/piper.ts"],"names":[],"mappings":"AAsCA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CA+BzD;AAeD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUxF;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BvF"}
|