screenwright 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/screenwright.js +2 -0
- package/dist/bin/screenwright.js.map +1 -1
- package/dist/src/commands/compose.d.ts.map +1 -1
- package/dist/src/commands/compose.js +21 -2
- package/dist/src/commands/compose.js.map +1 -1
- package/dist/src/commands/config.d.ts +3 -0
- package/dist/src/commands/config.d.ts.map +1 -0
- package/dist/src/commands/config.js +97 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +15 -3
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/composition/CursorOverlay.d.ts.map +1 -1
- package/dist/src/composition/CursorOverlay.js +7 -2
- package/dist/src/composition/CursorOverlay.js.map +1 -1
- package/dist/src/composition/cursor-path.d.ts.map +1 -1
- package/dist/src/composition/cursor-path.js +9 -9
- package/dist/src/composition/cursor-path.js.map +1 -1
- package/dist/src/config/config-schema.d.ts +11 -0
- package/dist/src/config/config-schema.d.ts.map +1 -1
- package/dist/src/config/config-schema.js +7 -0
- package/dist/src/config/config-schema.js.map +1 -1
- package/dist/src/config/defaults.d.ts.map +1 -1
- package/dist/src/config/defaults.js +3 -0
- package/dist/src/config/defaults.js.map +1 -1
- package/dist/src/config/load-config.d.ts +7 -0
- package/dist/src/config/load-config.d.ts.map +1 -0
- package/dist/src/config/load-config.js +31 -0
- package/dist/src/config/load-config.js.map +1 -0
- package/dist/src/generator/prompts.d.ts +1 -1
- package/dist/src/generator/prompts.d.ts.map +1 -1
- package/dist/src/generator/prompts.js +1 -6
- package/dist/src/generator/prompts.js.map +1 -1
- package/dist/src/generator/scenario-generator.d.ts.map +1 -1
- package/dist/src/generator/scenario-generator.js +0 -4
- package/dist/src/generator/scenario-generator.js.map +1 -1
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/runtime/action-helpers.d.ts +9 -2
- package/dist/src/runtime/action-helpers.d.ts.map +1 -1
- package/dist/src/runtime/action-helpers.js +58 -31
- package/dist/src/runtime/action-helpers.js.map +1 -1
- package/dist/src/runtime/instrumented-page.d.ts +2 -1
- package/dist/src/runtime/instrumented-page.d.ts.map +1 -1
- package/dist/src/runtime/instrumented-page.js +12 -2
- package/dist/src/runtime/instrumented-page.js.map +1 -1
- package/dist/src/timeline/schema.d.ts +10 -10
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.d.ts.map +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/src/voiceover/narration-timing.d.ts +4 -1
- package/dist/src/voiceover/narration-timing.d.ts.map +1 -1
- package/dist/src/voiceover/narration-timing.js +10 -5
- package/dist/src/voiceover/narration-timing.js.map +1 -1
- package/dist/src/voiceover/openai-engine.d.ts +7 -0
- package/dist/src/voiceover/openai-engine.d.ts.map +1 -0
- package/dist/src/voiceover/openai-engine.js +50 -0
- package/dist/src/voiceover/openai-engine.js.map +1 -0
- package/dist/src/voiceover/piper-engine.d.ts +1 -1
- package/dist/src/voiceover/piper-engine.d.ts.map +1 -1
- package/dist/src/voiceover/piper-engine.js +1 -1
- package/dist/src/voiceover/piper-engine.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +3 -13
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export const SYSTEM_PROMPT = `You are Screenwright, a tool that converts Playwright E2E tests into cinematic product demo scenarios.
|
|
2
2
|
|
|
3
3
|
Given a Playwright test file, generate a new TypeScript file that uses the Screenwright helpers API to create a polished demo with:
|
|
4
|
-
- Natural pacing (deliberate waits between actions)
|
|
5
4
|
- Human-friendly data (replace faker/test data with realistic values)
|
|
6
5
|
- Narration cues (explain what's happening to the viewer)
|
|
7
6
|
- Scene boundaries (organize the demo into logical chapters)
|
|
@@ -23,7 +22,7 @@ Rules:
|
|
|
23
22
|
2. Export a default async function
|
|
24
23
|
3. Replace ALL test/faker data with realistic human-friendly values
|
|
25
24
|
4. Add narration to key actions explaining what the user is doing
|
|
26
|
-
5.
|
|
25
|
+
5. Use sw.wait() sparingly — only at scene transitions. Screenwright adds natural pacing automatically.
|
|
27
26
|
6. Use sw.scene() to organize into 2-5 scenes
|
|
28
27
|
7. Keep the same user flow as the original test
|
|
29
28
|
8. Do NOT include assertions — this is a demo, not a test
|
|
@@ -82,24 +81,20 @@ export default async function scenario(sw: ScreenwrightHelpers) {
|
|
|
82
81
|
await sw.navigate('http://localhost:3000', {
|
|
83
82
|
narration: 'Let\\'s browse the electronics store.',
|
|
84
83
|
});
|
|
85
|
-
await sw.wait(1500);
|
|
86
84
|
|
|
87
85
|
await sw.click('[data-testid="product-laptop"]', {
|
|
88
86
|
narration: 'We\\'ll select the MacBook Pro.',
|
|
89
87
|
});
|
|
90
|
-
await sw.wait(1000);
|
|
91
88
|
|
|
92
89
|
await sw.scene('Adding to Cart');
|
|
93
90
|
await sw.click('[data-testid="add-to-cart"]', {
|
|
94
91
|
narration: 'Add it to our cart.',
|
|
95
92
|
});
|
|
96
|
-
await sw.wait(1500);
|
|
97
93
|
|
|
98
94
|
await sw.scene('Checkout');
|
|
99
95
|
await sw.fill('[data-testid="email"]', 'sarah.chen@acme.co', {
|
|
100
96
|
narration: 'Enter our email address for the order confirmation.',
|
|
101
97
|
});
|
|
102
|
-
await sw.wait(1000);
|
|
103
98
|
|
|
104
99
|
await sw.click('[data-testid="checkout"]', {
|
|
105
100
|
narration: 'Complete the purchase.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/generator/prompts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/generator/prompts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sEAmDyC,CAAC;AAEvE,MAAM,UAAU,eAAe,CAC7B,UAAkB,EAClB,cAAoC,EACpC,cAAuB;IAEvB,IAAI,MAAM,GAAG;;mBAEI,cAAc;EAC/B,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,8DAA8D,CAAC,CAAC,CAAC,yDAAyD;;EAEvJ,cAAc,CAAC,CAAC,CAAC,gBAAgB,cAAc,MAAM,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuD1D,UAAU;;;gDAGoC,CAAC;IAE/C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-generator.d.ts","sourceRoot":"","sources":["../../../src/generator/scenario-generator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,GAAG,UAAU,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAOD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAgB/D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"scenario-generator.d.ts","sourceRoot":"","sources":["../../../src/generator/scenario-generator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,GAAG,UAAU,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAOD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAgB/D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CA6CnE"}
|
|
@@ -73,10 +73,6 @@ export function validateScenarioCode(code) {
|
|
|
73
73
|
if (!/\.scene\s*\(/.test(code)) {
|
|
74
74
|
warnings.push({ code: 'NO_SCENES', message: 'No sw.scene() calls found — consider adding scene boundaries' });
|
|
75
75
|
}
|
|
76
|
-
// Warnings — no waits
|
|
77
|
-
if (!/\.wait\s*\(/.test(code)) {
|
|
78
|
-
warnings.push({ code: 'NO_WAITS', message: 'No sw.wait() calls found — consider adding pacing' });
|
|
79
|
-
}
|
|
80
76
|
// Warnings — no narration
|
|
81
77
|
if (!/narration/.test(code)) {
|
|
82
78
|
warnings.push({ code: 'NO_NARRATION', message: 'No narration found — consider adding narration to actions' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-generator.js","sourceRoot":"","sources":["../../../src/generator/scenario-generator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scenario-generator.js","sourceRoot":"","sources":["../../../src/generator/scenario-generator.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
export type { ScreenwrightHelpers, ActionOptions } from './runtime/action-helpers.js';
|
|
1
|
+
export type { ScreenwrightHelpers, ActionOptions, Pacing, HelpersOptions } from './runtime/action-helpers.js';
|
|
2
|
+
export { getPacingMultiplier, getNarrationOverlap } from './runtime/action-helpers.js';
|
|
2
3
|
export type { ScenarioFn } from './runtime/instrumented-page.js';
|
|
3
4
|
export type { Timeline, TimelineEvent, SceneEvent, ActionEvent, CursorTargetEvent, NarrationEvent, WaitEvent } from './timeline/types.js';
|
|
4
|
-
export type { ScreenwrightConfig } from './config/config-schema.js';
|
|
5
|
+
export type { ScreenwrightConfig, OpenaiVoice } from './config/config-schema.js';
|
|
6
|
+
export { openaiVoices } from './config/config-schema.js';
|
|
5
7
|
export { validateScenarioCode, extractScenarioCode } from './generator/scenario-generator.js';
|
|
6
8
|
export type { ValidationResult, ValidationError, GenerateOptions } from './generator/scenario-generator.js';
|
|
7
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC9G,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvF,YAAY,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC1I,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
+
export { getPacingMultiplier, getNarrationOverlap } from './runtime/action-helpers.js';
|
|
2
|
+
export { openaiVoices } from './config/config-schema.js';
|
|
1
3
|
export { validateScenarioCode, extractScenarioCode } from './generator/scenario-generator.js';
|
|
2
4
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAIvF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC"}
|
|
@@ -14,6 +14,13 @@ export interface ScreenwrightHelpers {
|
|
|
14
14
|
wait(ms: number): Promise<void>;
|
|
15
15
|
narrate(text: string): Promise<void>;
|
|
16
16
|
}
|
|
17
|
-
export
|
|
18
|
-
export
|
|
17
|
+
export type Pacing = 'fast' | 'normal' | 'cinematic';
|
|
18
|
+
export interface HelpersOptions {
|
|
19
|
+
pacingMultiplier?: number;
|
|
20
|
+
narrationOverlap?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function getPacingMultiplier(pacing: Pacing): number;
|
|
23
|
+
export declare function getNarrationOverlap(pacing: Pacing): number;
|
|
24
|
+
export declare function calculateMoveDuration(fromX: number, fromY: number, toX: number, toY: number, pacingMultiplier?: number): number;
|
|
25
|
+
export declare function createHelpers(page: Page, collector: TimelineCollector, opts?: HelpersOptions): ScreenwrightHelpers;
|
|
19
26
|
//# sourceMappingURL=action-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-helpers.d.ts","sourceRoot":"","sources":["../../../src/runtime/action-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;
|
|
1
|
+
{"version":3,"file":"action-helpers.d.ts","sourceRoot":"","sources":["../../../src/runtime/action-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAeD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAOD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,SAAM,GAAG,MAAM,CAI5H;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,mBAAmB,CAuJlH"}
|
|
@@ -1,25 +1,50 @@
|
|
|
1
1
|
const NARRATION_WPM = 150;
|
|
2
|
-
const POST_ACTION_DELAY_MS =
|
|
3
|
-
const
|
|
2
|
+
const POST_ACTION_DELAY_MS = 300;
|
|
3
|
+
const PAGE_LOAD_WAIT_MS = 600;
|
|
4
|
+
const CHAR_TYPE_DELAY_MS = 30;
|
|
5
|
+
const CURSOR_MOVE_MIN_MS = 200;
|
|
6
|
+
const CURSOR_MOVE_MAX_MS = 800;
|
|
7
|
+
const NARRATION_OVERLAP = {
|
|
8
|
+
fast: 0.4,
|
|
9
|
+
normal: 0.6,
|
|
10
|
+
cinematic: 0.85,
|
|
11
|
+
};
|
|
12
|
+
export function getPacingMultiplier(pacing) {
|
|
13
|
+
switch (pacing) {
|
|
14
|
+
case 'fast': return 0.5;
|
|
15
|
+
case 'normal': return 1.0;
|
|
16
|
+
case 'cinematic': return 1.5;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function getNarrationOverlap(pacing) {
|
|
20
|
+
return NARRATION_OVERLAP[pacing];
|
|
21
|
+
}
|
|
4
22
|
function estimateNarrationMs(text) {
|
|
5
23
|
const words = text.split(/\s+/).length;
|
|
6
24
|
return Math.round((words / NARRATION_WPM) * 60 * 1000);
|
|
7
25
|
}
|
|
8
|
-
export function calculateMoveDuration(fromX, fromY, toX, toY) {
|
|
26
|
+
export function calculateMoveDuration(fromX, fromY, toX, toY, pacingMultiplier = 1.0) {
|
|
9
27
|
const distance = Math.sqrt((toX - fromX) ** 2 + (toY - fromY) ** 2);
|
|
10
|
-
|
|
28
|
+
const base = Math.min(CURSOR_MOVE_MAX_MS, Math.max(CURSOR_MOVE_MIN_MS, Math.round(200 * Math.log2(distance / 10 + 1))));
|
|
29
|
+
return Math.round(base * pacingMultiplier);
|
|
11
30
|
}
|
|
12
|
-
export function createHelpers(page, collector) {
|
|
31
|
+
export function createHelpers(page, collector, opts) {
|
|
32
|
+
const pm = opts?.pacingMultiplier ?? 1.0;
|
|
33
|
+
const narrationOverlap = opts?.narrationOverlap ?? 0.6;
|
|
13
34
|
let lastX = 640;
|
|
14
35
|
let lastY = 360;
|
|
36
|
+
function scaled(ms) {
|
|
37
|
+
return Math.round(ms * pm);
|
|
38
|
+
}
|
|
15
39
|
async function emitNarration(text) {
|
|
16
40
|
const estimatedMs = estimateNarrationMs(text);
|
|
41
|
+
const actualWaitMs = Math.round(estimatedMs * narrationOverlap * pm);
|
|
17
42
|
collector.emit({ type: 'narration', text });
|
|
18
|
-
collector.emit({ type: 'wait', durationMs:
|
|
19
|
-
await page.waitForTimeout(
|
|
43
|
+
collector.emit({ type: 'wait', durationMs: actualWaitMs, reason: 'narration_sync' });
|
|
44
|
+
await page.waitForTimeout(actualWaitMs);
|
|
20
45
|
}
|
|
21
46
|
async function moveCursorTo(toX, toY) {
|
|
22
|
-
const moveDurationMs = calculateMoveDuration(lastX, lastY, toX, toY);
|
|
47
|
+
const moveDurationMs = calculateMoveDuration(lastX, lastY, toX, toY, pm);
|
|
23
48
|
collector.emit({
|
|
24
49
|
type: 'cursor_target',
|
|
25
50
|
fromX: lastX, fromY: lastY,
|
|
@@ -44,9 +69,9 @@ export function createHelpers(page, collector) {
|
|
|
44
69
|
async scene(title, description) {
|
|
45
70
|
collector.emit({ type: 'scene', title, description });
|
|
46
71
|
},
|
|
47
|
-
async navigate(url,
|
|
48
|
-
if (
|
|
49
|
-
await emitNarration(
|
|
72
|
+
async navigate(url, actionOpts) {
|
|
73
|
+
if (actionOpts?.narration)
|
|
74
|
+
await emitNarration(actionOpts.narration);
|
|
50
75
|
collector.emit({
|
|
51
76
|
type: 'action',
|
|
52
77
|
action: 'navigate',
|
|
@@ -55,12 +80,13 @@ export function createHelpers(page, collector) {
|
|
|
55
80
|
boundingBox: null,
|
|
56
81
|
});
|
|
57
82
|
await page.goto(url, { waitUntil: 'domcontentloaded' });
|
|
58
|
-
|
|
59
|
-
|
|
83
|
+
const waitMs = scaled(PAGE_LOAD_WAIT_MS);
|
|
84
|
+
collector.emit({ type: 'wait', durationMs: waitMs, reason: 'page_load' });
|
|
85
|
+
await page.waitForTimeout(waitMs);
|
|
60
86
|
},
|
|
61
|
-
async click(selector,
|
|
62
|
-
if (
|
|
63
|
-
await emitNarration(
|
|
87
|
+
async click(selector, actionOpts) {
|
|
88
|
+
if (actionOpts?.narration)
|
|
89
|
+
await emitNarration(actionOpts.narration);
|
|
64
90
|
const center = await resolveCenter(selector);
|
|
65
91
|
await moveCursorTo(center.x, center.y);
|
|
66
92
|
const locator = page.locator(selector).first();
|
|
@@ -73,32 +99,33 @@ export function createHelpers(page, collector) {
|
|
|
73
99
|
boundingBox: box ? { x: Math.round(box.x), y: Math.round(box.y), width: Math.round(box.width), height: Math.round(box.height) } : null,
|
|
74
100
|
});
|
|
75
101
|
await locator.click();
|
|
76
|
-
await page.waitForTimeout(POST_ACTION_DELAY_MS);
|
|
102
|
+
await page.waitForTimeout(scaled(POST_ACTION_DELAY_MS));
|
|
77
103
|
},
|
|
78
|
-
async fill(selector, value,
|
|
79
|
-
if (
|
|
80
|
-
await emitNarration(
|
|
104
|
+
async fill(selector, value, actionOpts) {
|
|
105
|
+
if (actionOpts?.narration)
|
|
106
|
+
await emitNarration(actionOpts.narration);
|
|
81
107
|
const center = await resolveCenter(selector);
|
|
82
108
|
await moveCursorTo(center.x, center.y);
|
|
83
109
|
const locator = page.locator(selector).first();
|
|
84
110
|
const box = await locator.boundingBox();
|
|
85
111
|
await locator.click();
|
|
112
|
+
const charDelay = scaled(CHAR_TYPE_DELAY_MS);
|
|
86
113
|
collector.emit({
|
|
87
114
|
type: 'action',
|
|
88
115
|
action: 'fill',
|
|
89
116
|
selector,
|
|
90
117
|
value,
|
|
91
|
-
durationMs: value.length *
|
|
118
|
+
durationMs: value.length * charDelay,
|
|
92
119
|
boundingBox: box ? { x: Math.round(box.x), y: Math.round(box.y), width: Math.round(box.width), height: Math.round(box.height) } : null,
|
|
93
120
|
});
|
|
94
121
|
for (const char of value) {
|
|
95
|
-
await page.keyboard.type(char, { delay:
|
|
122
|
+
await page.keyboard.type(char, { delay: charDelay });
|
|
96
123
|
}
|
|
97
|
-
await page.waitForTimeout(POST_ACTION_DELAY_MS);
|
|
124
|
+
await page.waitForTimeout(scaled(POST_ACTION_DELAY_MS));
|
|
98
125
|
},
|
|
99
|
-
async hover(selector,
|
|
100
|
-
if (
|
|
101
|
-
await emitNarration(
|
|
126
|
+
async hover(selector, actionOpts) {
|
|
127
|
+
if (actionOpts?.narration)
|
|
128
|
+
await emitNarration(actionOpts.narration);
|
|
102
129
|
const center = await resolveCenter(selector);
|
|
103
130
|
await moveCursorTo(center.x, center.y);
|
|
104
131
|
const locator = page.locator(selector).first();
|
|
@@ -111,11 +138,11 @@ export function createHelpers(page, collector) {
|
|
|
111
138
|
boundingBox: box ? { x: Math.round(box.x), y: Math.round(box.y), width: Math.round(box.width), height: Math.round(box.height) } : null,
|
|
112
139
|
});
|
|
113
140
|
await locator.hover();
|
|
114
|
-
await page.waitForTimeout(POST_ACTION_DELAY_MS);
|
|
141
|
+
await page.waitForTimeout(scaled(POST_ACTION_DELAY_MS));
|
|
115
142
|
},
|
|
116
|
-
async press(key,
|
|
117
|
-
if (
|
|
118
|
-
await emitNarration(
|
|
143
|
+
async press(key, actionOpts) {
|
|
144
|
+
if (actionOpts?.narration)
|
|
145
|
+
await emitNarration(actionOpts.narration);
|
|
119
146
|
collector.emit({
|
|
120
147
|
type: 'action',
|
|
121
148
|
action: 'press',
|
|
@@ -124,7 +151,7 @@ export function createHelpers(page, collector) {
|
|
|
124
151
|
boundingBox: null,
|
|
125
152
|
});
|
|
126
153
|
await page.keyboard.press(key);
|
|
127
|
-
await page.waitForTimeout(POST_ACTION_DELAY_MS);
|
|
154
|
+
await page.waitForTimeout(scaled(POST_ACTION_DELAY_MS));
|
|
128
155
|
},
|
|
129
156
|
async wait(ms) {
|
|
130
157
|
collector.emit({ type: 'wait', durationMs: ms, reason: 'pacing' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-helpers.js","sourceRoot":"","sources":["../../../src/runtime/action-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"action-helpers.js","sourceRoot":"","sources":["../../../src/runtime/action-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Timeline } from '../timeline/types.js';
|
|
2
|
-
import { type ScreenwrightHelpers } from './action-helpers.js';
|
|
2
|
+
import { type ScreenwrightHelpers, type Pacing } from './action-helpers.js';
|
|
3
3
|
export type ScenarioFn = (sw: ScreenwrightHelpers) => Promise<void>;
|
|
4
4
|
export interface RunOptions {
|
|
5
5
|
scenarioFile: string;
|
|
@@ -11,6 +11,7 @@ export interface RunOptions {
|
|
|
11
11
|
colorScheme?: 'light' | 'dark';
|
|
12
12
|
locale?: string;
|
|
13
13
|
timezoneId?: string;
|
|
14
|
+
pacing?: Pacing;
|
|
14
15
|
}
|
|
15
16
|
export interface RunResult {
|
|
16
17
|
timeline: Timeline;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumented-page.d.ts","sourceRoot":"","sources":["../../../src/runtime/instrumented-page.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,
|
|
1
|
+
{"version":3,"file":"instrumented-page.d.ts","sourceRoot":"","sources":["../../../src/runtime/instrumented-page.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAA2D,KAAK,mBAAmB,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAErI,MAAM,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CA+D5F"}
|
|
@@ -3,7 +3,7 @@ import { mkdtemp, writeFile } from 'node:fs/promises';
|
|
|
3
3
|
import { tmpdir } from 'node:os';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { TimelineCollector } from './timeline-collector.js';
|
|
6
|
-
import { createHelpers } from './action-helpers.js';
|
|
6
|
+
import { createHelpers, getPacingMultiplier, getNarrationOverlap } from './action-helpers.js';
|
|
7
7
|
export async function runScenario(scenario, opts) {
|
|
8
8
|
const viewport = opts.viewport ?? { width: 1280, height: 720 };
|
|
9
9
|
const tempDir = await mkdtemp(join(tmpdir(), 'screenwright-'));
|
|
@@ -18,10 +18,20 @@ export async function runScenario(scenario, opts) {
|
|
|
18
18
|
timezoneId: opts.timezoneId ?? 'America/New_York',
|
|
19
19
|
recordVideo: { dir: tempDir, size: viewport },
|
|
20
20
|
});
|
|
21
|
+
// Hide the native cursor so only the Screenwright overlay cursor appears
|
|
22
|
+
await context.addInitScript(`
|
|
23
|
+
const s = document.createElement('style');
|
|
24
|
+
s.textContent = '*, *::before, *::after { cursor: none !important; }';
|
|
25
|
+
(document.head || document.documentElement).appendChild(s);
|
|
26
|
+
`);
|
|
21
27
|
const page = await context.newPage();
|
|
22
28
|
const collector = new TimelineCollector();
|
|
23
29
|
collector.start();
|
|
24
|
-
const
|
|
30
|
+
const pacing = opts.pacing ?? 'normal';
|
|
31
|
+
const sw = createHelpers(page, collector, {
|
|
32
|
+
pacingMultiplier: getPacingMultiplier(pacing),
|
|
33
|
+
narrationOverlap: getNarrationOverlap(pacing),
|
|
34
|
+
});
|
|
25
35
|
await scenario(sw);
|
|
26
36
|
// Close page to finalize video
|
|
27
37
|
await page.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumented-page.js","sourceRoot":"","sources":["../../../src/runtime/instrumented-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"instrumented-page.js","sourceRoot":"","sources":["../../../src/runtime/instrumented-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,41 +70,41 @@ export declare const timelineSchema: z.ZodObject<{
|
|
|
70
70
|
width: z.ZodNumber;
|
|
71
71
|
height: z.ZodNumber;
|
|
72
72
|
}, "strip", z.ZodTypeAny, {
|
|
73
|
-
x: number;
|
|
74
73
|
width: number;
|
|
75
74
|
height: number;
|
|
75
|
+
x: number;
|
|
76
76
|
y: number;
|
|
77
77
|
}, {
|
|
78
|
-
x: number;
|
|
79
78
|
width: number;
|
|
80
79
|
height: number;
|
|
80
|
+
x: number;
|
|
81
81
|
y: number;
|
|
82
82
|
}>>;
|
|
83
83
|
}, "strip", z.ZodTypeAny, {
|
|
84
|
-
action: "fill" | "click" | "hover" | "select" | "press" | "navigate";
|
|
85
84
|
type: "action";
|
|
85
|
+
action: "fill" | "click" | "hover" | "select" | "press" | "navigate";
|
|
86
86
|
id: string;
|
|
87
87
|
timestampMs: number;
|
|
88
88
|
selector: string;
|
|
89
89
|
durationMs: number;
|
|
90
90
|
boundingBox: {
|
|
91
|
-
x: number;
|
|
92
91
|
width: number;
|
|
93
92
|
height: number;
|
|
93
|
+
x: number;
|
|
94
94
|
y: number;
|
|
95
95
|
} | null;
|
|
96
96
|
value?: string | undefined;
|
|
97
97
|
}, {
|
|
98
|
-
action: "fill" | "click" | "hover" | "select" | "press" | "navigate";
|
|
99
98
|
type: "action";
|
|
99
|
+
action: "fill" | "click" | "hover" | "select" | "press" | "navigate";
|
|
100
100
|
id: string;
|
|
101
101
|
timestampMs: number;
|
|
102
102
|
selector: string;
|
|
103
103
|
durationMs: number;
|
|
104
104
|
boundingBox: {
|
|
105
|
-
x: number;
|
|
106
105
|
width: number;
|
|
107
106
|
height: number;
|
|
107
|
+
x: number;
|
|
108
108
|
y: number;
|
|
109
109
|
} | null;
|
|
110
110
|
value?: string | undefined;
|
|
@@ -198,16 +198,16 @@ export declare const timelineSchema: z.ZodObject<{
|
|
|
198
198
|
title: string;
|
|
199
199
|
description?: string | undefined;
|
|
200
200
|
} | {
|
|
201
|
-
action: "fill" | "click" | "hover" | "select" | "press" | "navigate";
|
|
202
201
|
type: "action";
|
|
202
|
+
action: "fill" | "click" | "hover" | "select" | "press" | "navigate";
|
|
203
203
|
id: string;
|
|
204
204
|
timestampMs: number;
|
|
205
205
|
selector: string;
|
|
206
206
|
durationMs: number;
|
|
207
207
|
boundingBox: {
|
|
208
|
-
x: number;
|
|
209
208
|
width: number;
|
|
210
209
|
height: number;
|
|
210
|
+
x: number;
|
|
211
211
|
y: number;
|
|
212
212
|
} | null;
|
|
213
213
|
value?: string | undefined;
|
|
@@ -255,16 +255,16 @@ export declare const timelineSchema: z.ZodObject<{
|
|
|
255
255
|
title: string;
|
|
256
256
|
description?: string | undefined;
|
|
257
257
|
} | {
|
|
258
|
-
action: "fill" | "click" | "hover" | "select" | "press" | "navigate";
|
|
259
258
|
type: "action";
|
|
259
|
+
action: "fill" | "click" | "hover" | "select" | "press" | "navigate";
|
|
260
260
|
id: string;
|
|
261
261
|
timestampMs: number;
|
|
262
262
|
selector: string;
|
|
263
263
|
durationMs: number;
|
|
264
264
|
boundingBox: {
|
|
265
|
-
x: number;
|
|
266
265
|
width: number;
|
|
267
266
|
height: number;
|
|
267
|
+
x: number;
|
|
268
268
|
y: number;
|
|
269
269
|
} | null;
|
|
270
270
|
value?: string | undefined;
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.1.
|
|
1
|
+
export declare const VERSION = "0.1.10";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAC"}
|
package/dist/src/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = "0.1.
|
|
1
|
+
export const VERSION = "0.1.10";
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/dist/src/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { Timeline } from '../timeline/types.js';
|
|
2
|
+
import type { OpenaiVoice } from '../config/config-schema.js';
|
|
2
3
|
export interface NarrationOptions {
|
|
3
4
|
modelPath?: string;
|
|
4
5
|
tempDir: string;
|
|
6
|
+
ttsProvider?: 'piper' | 'openai';
|
|
7
|
+
openaiVoice?: OpenaiVoice;
|
|
5
8
|
}
|
|
6
9
|
/**
|
|
7
|
-
* Generate voiceover
|
|
10
|
+
* Generate voiceover audio files for all narration events in a timeline.
|
|
8
11
|
* Updates each narration event with the audioFile path and actual duration.
|
|
9
12
|
* Returns a new timeline with updated narration events.
|
|
10
13
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"narration-timing.d.ts","sourceRoot":"","sources":["../../../src/voiceover/narration-timing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,sBAAsB,CAAC;AAGrE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"narration-timing.d.ts","sourceRoot":"","sources":["../../../src/voiceover/narration-timing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,sBAAsB,CAAC;AAGrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC,CAwBnB"}
|
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
-
import { synthesize } from './piper-engine.js';
|
|
2
|
+
import { synthesize as piperSynthesize } from './piper-engine.js';
|
|
3
|
+
import { synthesize as openaiSynthesize } from './openai-engine.js';
|
|
3
4
|
/**
|
|
4
|
-
* Generate voiceover
|
|
5
|
+
* Generate voiceover audio files for all narration events in a timeline.
|
|
5
6
|
* Updates each narration event with the audioFile path and actual duration.
|
|
6
7
|
* Returns a new timeline with updated narration events.
|
|
7
8
|
*/
|
|
8
9
|
export async function generateNarration(timeline, opts) {
|
|
10
|
+
const provider = opts.ttsProvider ?? 'piper';
|
|
11
|
+
const ext = provider === 'openai' ? '.mp3' : '.wav';
|
|
9
12
|
const events = [...timeline.events];
|
|
10
13
|
for (let i = 0; i < events.length; i++) {
|
|
11
14
|
const event = events[i];
|
|
12
15
|
if (event.type !== 'narration')
|
|
13
16
|
continue;
|
|
14
17
|
const narration = event;
|
|
15
|
-
const outputPath = join(opts.tempDir, `narration-${narration.id}
|
|
16
|
-
const result =
|
|
18
|
+
const outputPath = join(opts.tempDir, `narration-${narration.id}${ext}`);
|
|
19
|
+
const result = provider === 'openai'
|
|
20
|
+
? await openaiSynthesize(narration.text, outputPath, opts.openaiVoice)
|
|
21
|
+
: await piperSynthesize(narration.text, outputPath, opts.modelPath);
|
|
17
22
|
events[i] = {
|
|
18
23
|
...narration,
|
|
19
|
-
audioFile: result.
|
|
24
|
+
audioFile: result.audioPath,
|
|
20
25
|
audioDurationMs: result.durationMs,
|
|
21
26
|
};
|
|
22
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"narration-timing.js","sourceRoot":"","sources":["../../../src/voiceover/narration-timing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"narration-timing.js","sourceRoot":"","sources":["../../../src/voiceover/narration-timing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAUpE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAkB,EAClB,IAAsB;IAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC;IAC7C,MAAM,GAAG,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACpD,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAEzC,MAAM,SAAS,GAAG,KAAuB,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;QAEzE,MAAM,MAAM,GAAG,QAAQ,KAAK,QAAQ;YAClC,CAAC,CAAC,MAAM,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC;YACtE,CAAC,CAAC,MAAM,eAAe,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtE,MAAM,CAAC,CAAC,CAAC,GAAG;YACV,GAAG,SAAS;YACZ,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,eAAe,EAAE,MAAM,CAAC,UAAU;SACnC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { OpenaiVoice } from '../config/config-schema.js';
|
|
2
|
+
export interface SynthesizeResult {
|
|
3
|
+
audioPath: string;
|
|
4
|
+
durationMs: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function synthesize(text: string, outputPath: string, voice?: OpenaiVoice): Promise<SynthesizeResult>;
|
|
7
|
+
//# sourceMappingURL=openai-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-engine.d.ts","sourceRoot":"","sources":["../../../src/voiceover/openai-engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAI9D,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,WAAoB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAiC3B"}
|