demofly 0.1.3 → 0.1.4
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/commands/auth/login.js +1 -1
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/demos/delete.d.ts +3 -0
- package/dist/commands/demos/delete.d.ts.map +1 -0
- package/dist/commands/demos/delete.js +41 -0
- package/dist/commands/demos/delete.js.map +1 -0
- package/dist/commands/demos/get.d.ts +3 -0
- package/dist/commands/demos/get.d.ts.map +1 -0
- package/dist/commands/demos/get.js +30 -0
- package/dist/commands/demos/get.js.map +1 -0
- package/dist/commands/demos/index.d.ts +3 -0
- package/dist/commands/demos/index.d.ts.map +1 -0
- package/dist/commands/demos/index.js +17 -0
- package/dist/commands/demos/index.js.map +1 -0
- package/dist/commands/demos/list.d.ts +3 -0
- package/dist/commands/demos/list.d.ts.map +1 -0
- package/dist/commands/demos/list.js +117 -0
- package/dist/commands/demos/list.js.map +1 -0
- package/dist/commands/demos/open.d.ts +3 -0
- package/dist/commands/demos/open.d.ts.map +1 -0
- package/dist/commands/demos/open.js +45 -0
- package/dist/commands/demos/open.js.map +1 -0
- package/dist/commands/demos/update.d.ts +3 -0
- package/dist/commands/demos/update.d.ts.map +1 -0
- package/dist/commands/demos/update.js +31 -0
- package/dist/commands/demos/update.js.map +1 -0
- package/dist/commands/generate.d.ts +6 -0
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +73 -17
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +12 -9
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/render.d.ts +11 -0
- package/dist/commands/render.d.ts.map +1 -0
- package/dist/commands/render.js +161 -0
- package/dist/commands/render.js.map +1 -0
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +2 -1
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +22 -10
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/audio-stitching.d.ts +64 -0
- package/dist/lib/audio-stitching.d.ts.map +1 -0
- package/dist/lib/audio-stitching.js +260 -0
- package/dist/lib/audio-stitching.js.map +1 -0
- package/dist/lib/credentials.d.ts.map +1 -1
- package/dist/lib/credentials.js +2 -0
- package/dist/lib/credentials.js.map +1 -1
- package/dist/lib/demo-scanner.d.ts +17 -0
- package/dist/lib/demo-scanner.d.ts.map +1 -0
- package/dist/lib/demo-scanner.js +70 -0
- package/dist/lib/demo-scanner.js.map +1 -0
- package/dist/lib/enhancement-client.d.ts +17 -0
- package/dist/lib/enhancement-client.d.ts.map +1 -0
- package/dist/lib/enhancement-client.js +129 -0
- package/dist/lib/enhancement-client.js.map +1 -0
- package/dist/lib/hybrid-rendering.d.ts +52 -0
- package/dist/lib/hybrid-rendering.d.ts.map +1 -0
- package/dist/lib/hybrid-rendering.js +161 -0
- package/dist/lib/hybrid-rendering.js.map +1 -0
- package/dist/lib/logger.d.ts +7 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +19 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/tts.d.ts +12 -0
- package/dist/lib/tts.d.ts.map +1 -1
- package/dist/lib/tts.js +64 -28
- package/dist/lib/tts.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hybrid Rendering Pipeline - CLI Side
|
|
3
|
+
*
|
|
4
|
+
* Handles local audio generation with timing metadata extraction,
|
|
5
|
+
* then optionally sends to cloud for enhancement while preserving sync.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
8
|
+
import { resolve } from "node:path";
|
|
9
|
+
import {} from "./timing.js";
|
|
10
|
+
import { parseTranscript, generateAudio } from "./tts.js";
|
|
11
|
+
/** Segment speech text at natural boundaries */
|
|
12
|
+
export function segmentSpeech(text) {
|
|
13
|
+
const sentences = text.split(/([.!?]+)\s*/);
|
|
14
|
+
const segments = [];
|
|
15
|
+
let current = "";
|
|
16
|
+
let isStart = true;
|
|
17
|
+
for (let i = 0; i < sentences.length; i++) {
|
|
18
|
+
const part = sentences[i].trim();
|
|
19
|
+
if (!part)
|
|
20
|
+
continue;
|
|
21
|
+
const isPunctuation = /^[.!?]+$/.test(part);
|
|
22
|
+
if (isPunctuation) {
|
|
23
|
+
current += part;
|
|
24
|
+
const isEnd = true;
|
|
25
|
+
const pauseAfter = part.includes('.') ? 0.8 : part.includes('!') || part.includes('?') ? 0.6 : 0.3;
|
|
26
|
+
segments.push({
|
|
27
|
+
text: current.trim(),
|
|
28
|
+
boundaryInfo: {
|
|
29
|
+
sentenceStart: isStart,
|
|
30
|
+
sentenceEnd: isEnd,
|
|
31
|
+
pauseAfter
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
current = "";
|
|
35
|
+
isStart = true;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Handle clause boundaries within sentences
|
|
39
|
+
const clauses = part.split(/,\s*|\s*;\s*/);
|
|
40
|
+
for (let j = 0; j < clauses.length; j++) {
|
|
41
|
+
const clause = clauses[j].trim();
|
|
42
|
+
if (!clause)
|
|
43
|
+
continue;
|
|
44
|
+
current += (current ? " " : "") + clause;
|
|
45
|
+
if (j < clauses.length - 1) {
|
|
46
|
+
// Mid-sentence clause boundary
|
|
47
|
+
segments.push({
|
|
48
|
+
text: current.trim(),
|
|
49
|
+
boundaryInfo: {
|
|
50
|
+
sentenceStart: isStart,
|
|
51
|
+
sentenceEnd: false,
|
|
52
|
+
pauseAfter: 0.2
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
current = "";
|
|
56
|
+
isStart = false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
isStart = false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Handle any remaining text
|
|
63
|
+
if (current.trim()) {
|
|
64
|
+
segments.push({
|
|
65
|
+
text: current.trim(),
|
|
66
|
+
boundaryInfo: {
|
|
67
|
+
sentenceStart: isStart,
|
|
68
|
+
sentenceEnd: true,
|
|
69
|
+
pauseAfter: 0.0
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return segments;
|
|
74
|
+
}
|
|
75
|
+
/** Generate local audio with enhanced timing metadata */
|
|
76
|
+
export function generateLocalRender(transcriptPath, timingPath, projectDir, options = {}) {
|
|
77
|
+
const transcriptContent = readFileSync(transcriptPath, "utf-8");
|
|
78
|
+
// Load timing data for future scene-matching (currently segments are placed sequentially)
|
|
79
|
+
if (existsSync(timingPath)) {
|
|
80
|
+
JSON.parse(readFileSync(timingPath, "utf-8"));
|
|
81
|
+
}
|
|
82
|
+
const transcriptScenes = parseTranscript(transcriptContent);
|
|
83
|
+
const audioDir = resolve(projectDir, "audio");
|
|
84
|
+
const segments = [];
|
|
85
|
+
const silenceRegions = [];
|
|
86
|
+
let currentTime = 0;
|
|
87
|
+
for (let sceneIndex = 0; sceneIndex < transcriptScenes.length; sceneIndex++) {
|
|
88
|
+
const scene = transcriptScenes[sceneIndex];
|
|
89
|
+
// Generate speech segments for this scene
|
|
90
|
+
const speechSegments = segmentSpeech(scene.text);
|
|
91
|
+
for (let segmentIndex = 0; segmentIndex < speechSegments.length; segmentIndex++) {
|
|
92
|
+
const segment = speechSegments[segmentIndex];
|
|
93
|
+
const segmentId = `${scene.sceneId}_seg${segmentIndex.toString().padStart(3, '0')}`;
|
|
94
|
+
// Generate audio for this segment
|
|
95
|
+
const audioPath = resolve(audioDir, `${segmentId}.wav`);
|
|
96
|
+
try {
|
|
97
|
+
console.log(` 🎵 Generating: ${segmentId} (${segment.text.substring(0, 50)}...)`);
|
|
98
|
+
const result = generateAudio(segment.text, audioPath, options);
|
|
99
|
+
const startTime = currentTime;
|
|
100
|
+
const endTime = currentTime + result.durationS;
|
|
101
|
+
segments.push({
|
|
102
|
+
id: segmentId,
|
|
103
|
+
startTime,
|
|
104
|
+
endTime,
|
|
105
|
+
text: segment.text,
|
|
106
|
+
type: "speech",
|
|
107
|
+
naturalBoundaries: segment.boundaryInfo,
|
|
108
|
+
audioPath,
|
|
109
|
+
duration: result.durationS
|
|
110
|
+
});
|
|
111
|
+
currentTime = endTime;
|
|
112
|
+
// Add silence after this segment if indicated
|
|
113
|
+
if (segment.boundaryInfo.pauseAfter > 0) {
|
|
114
|
+
silenceRegions.push({
|
|
115
|
+
startTime: currentTime,
|
|
116
|
+
endTime: currentTime + segment.boundaryInfo.pauseAfter,
|
|
117
|
+
type: segment.boundaryInfo.sentenceEnd ? "natural_pause" : "breathing"
|
|
118
|
+
});
|
|
119
|
+
currentTime += segment.boundaryInfo.pauseAfter;
|
|
120
|
+
}
|
|
121
|
+
console.log(` ✅ ${result.durationS.toFixed(1)}s audio @ ${startTime.toFixed(1)}s`);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
console.error(` ❌ Failed to generate ${segmentId}:`, error);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Add scene transition silence
|
|
128
|
+
if (sceneIndex < transcriptScenes.length - 1) {
|
|
129
|
+
const transitionDuration = 1.2;
|
|
130
|
+
silenceRegions.push({
|
|
131
|
+
startTime: currentTime,
|
|
132
|
+
endTime: currentTime + transitionDuration,
|
|
133
|
+
type: "scene_transition"
|
|
134
|
+
});
|
|
135
|
+
currentTime += transitionDuration;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const metadata = {
|
|
139
|
+
version: "1.0",
|
|
140
|
+
totalDuration: currentTime,
|
|
141
|
+
segments,
|
|
142
|
+
silenceRegions
|
|
143
|
+
};
|
|
144
|
+
// Save timing metadata
|
|
145
|
+
const metadataPath = resolve(projectDir, "audio-timing.json");
|
|
146
|
+
writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));
|
|
147
|
+
console.log(`\n📋 Timing metadata saved: ${metadataPath}`);
|
|
148
|
+
return metadata;
|
|
149
|
+
}
|
|
150
|
+
export function prepareCloudEnhancement(projectId, metadata, options = {}) {
|
|
151
|
+
return {
|
|
152
|
+
projectId,
|
|
153
|
+
metadata,
|
|
154
|
+
preferences: {
|
|
155
|
+
voice: options.voice,
|
|
156
|
+
speed: options.speed,
|
|
157
|
+
enhancementLevel: "standard"
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=hybrid-rendering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-rendering.js","sourceRoot":"","sources":["../../src/lib/hybrid-rendering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare let verbose: boolean;
|
|
2
|
+
export declare function setVerbose(v: boolean): void;
|
|
3
|
+
export declare function debug(msg: string): void;
|
|
4
|
+
export declare function info(msg: string): void;
|
|
5
|
+
export declare function warn(msg: string): void;
|
|
6
|
+
export declare function error(msg: string): void;
|
|
7
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAAA,eAAO,IAAI,OAAO,SAAQ,CAAC;AAE3B,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAE3C;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIvC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export let verbose = false;
|
|
2
|
+
export function setVerbose(v) {
|
|
3
|
+
verbose = v;
|
|
4
|
+
}
|
|
5
|
+
export function debug(msg) {
|
|
6
|
+
if (verbose) {
|
|
7
|
+
console.error(`[debug] ${msg}`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function info(msg) {
|
|
11
|
+
console.log(msg);
|
|
12
|
+
}
|
|
13
|
+
export function warn(msg) {
|
|
14
|
+
console.warn(msg);
|
|
15
|
+
}
|
|
16
|
+
export function error(msg) {
|
|
17
|
+
console.error(msg);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAI,OAAO,GAAG,KAAK,CAAC;AAE3B,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,OAAO,GAAG,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
|
package/dist/lib/tts.d.ts
CHANGED
|
@@ -29,6 +29,18 @@ export interface TranscriptScene {
|
|
|
29
29
|
* Scene IDs default to "scene-N" (matching timing.json convention).
|
|
30
30
|
* Override with explicit ID in header: ## Scene 1: Title {#my-custom-id}
|
|
31
31
|
*/
|
|
32
|
+
/**
|
|
33
|
+
* Parse transcript.md — extracts narration text from `<narration>` tags.
|
|
34
|
+
*
|
|
35
|
+
* Only text inside `<narration>...</narration>` is extracted. Everything
|
|
36
|
+
* outside (headers, word budgets, metadata, comments) is ignored.
|
|
37
|
+
*
|
|
38
|
+
* Format:
|
|
39
|
+
* ## Scene 1: Title
|
|
40
|
+
* ### Beat 1.1 — Label [at 0ms, window: 5.2s]
|
|
41
|
+
* **Word budget**: 8 words
|
|
42
|
+
* <narration>Welcome to the app. It's really simple.</narration>
|
|
43
|
+
*/
|
|
32
44
|
export declare function parseTranscript(content: string): TranscriptScene[];
|
|
33
45
|
/**
|
|
34
46
|
* Generate TTS audio for a single piece of text.
|
package/dist/lib/tts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../../src/lib/tts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkCH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../../src/lib/tts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkCH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAsElE;AAmFD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,UAAe,EACxB,WAAW,CAAC,EAAE,GAAG,GAChB,SAAS,CAsBX;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,UAAe,GACvB,SAAS,EAAE,CAmCb"}
|
package/dist/lib/tts.js
CHANGED
|
@@ -38,12 +38,25 @@ const DEFAULT_VOICE = "af_heart";
|
|
|
38
38
|
* Scene IDs default to "scene-N" (matching timing.json convention).
|
|
39
39
|
* Override with explicit ID in header: ## Scene 1: Title {#my-custom-id}
|
|
40
40
|
*/
|
|
41
|
+
/**
|
|
42
|
+
* Parse transcript.md — extracts narration text from `<narration>` tags.
|
|
43
|
+
*
|
|
44
|
+
* Only text inside `<narration>...</narration>` is extracted. Everything
|
|
45
|
+
* outside (headers, word budgets, metadata, comments) is ignored.
|
|
46
|
+
*
|
|
47
|
+
* Format:
|
|
48
|
+
* ## Scene 1: Title
|
|
49
|
+
* ### Beat 1.1 — Label [at 0ms, window: 5.2s]
|
|
50
|
+
* **Word budget**: 8 words
|
|
51
|
+
* <narration>Welcome to the app. It's really simple.</narration>
|
|
52
|
+
*/
|
|
41
53
|
export function parseTranscript(content) {
|
|
42
54
|
const scenes = [];
|
|
43
55
|
let currentScene = null;
|
|
44
56
|
let sceneIndex = 0;
|
|
57
|
+
let insideNarration = false;
|
|
45
58
|
for (const line of content.split("\n")) {
|
|
46
|
-
// Scene header
|
|
59
|
+
// Scene header
|
|
47
60
|
const sceneMatch = line.match(/^## Scene (\d+):\s*(.+)/);
|
|
48
61
|
if (sceneMatch) {
|
|
49
62
|
if (currentScene && currentScene.lines.length > 0) {
|
|
@@ -54,44 +67,49 @@ export function parseTranscript(content) {
|
|
|
54
67
|
}
|
|
55
68
|
sceneIndex++;
|
|
56
69
|
const title = sceneMatch[2].trim();
|
|
57
|
-
// Check for explicit ID override: {#my-id}
|
|
58
70
|
const idOverride = title.match(/\{#([^}]+)\}/);
|
|
59
71
|
const id = idOverride ? idOverride[1] : `scene-${sceneIndex}`;
|
|
60
72
|
currentScene = { id, lines: [] };
|
|
73
|
+
insideNarration = false;
|
|
61
74
|
continue;
|
|
62
75
|
}
|
|
63
|
-
|
|
64
|
-
if (line.startsWith("#") || line.startsWith("### Beat") || line.trim() === "")
|
|
65
|
-
continue;
|
|
66
|
-
if (line.match(/^_\(.*silent.*\)_/i))
|
|
76
|
+
if (!currentScene)
|
|
67
77
|
continue;
|
|
68
|
-
|
|
78
|
+
// Handle single-line: <narration>text here</narration>
|
|
79
|
+
const singleLine = line.match(/<narration>(.*?)<\/narration>/i);
|
|
80
|
+
if (singleLine) {
|
|
81
|
+
const cleaned = cleanNarrationText(singleLine[1]);
|
|
82
|
+
if (cleaned)
|
|
83
|
+
currentScene.lines.push(cleaned);
|
|
69
84
|
continue;
|
|
70
|
-
|
|
85
|
+
}
|
|
86
|
+
// Handle multi-line open/close
|
|
87
|
+
if (/<narration>/i.test(line)) {
|
|
88
|
+
insideNarration = true;
|
|
89
|
+
const after = line.replace(/.*<narration>/i, "").trim();
|
|
90
|
+
if (after) {
|
|
91
|
+
const cleaned = cleanNarrationText(after);
|
|
92
|
+
if (cleaned)
|
|
93
|
+
currentScene.lines.push(cleaned);
|
|
94
|
+
}
|
|
71
95
|
continue;
|
|
72
|
-
|
|
73
|
-
if (
|
|
96
|
+
}
|
|
97
|
+
if (/<\/narration>/i.test(line)) {
|
|
98
|
+
const before = line.replace(/<\/narration>.*/i, "").trim();
|
|
99
|
+
if (before) {
|
|
100
|
+
const cleaned = cleanNarrationText(before);
|
|
101
|
+
if (cleaned)
|
|
102
|
+
currentScene.lines.push(cleaned);
|
|
103
|
+
}
|
|
104
|
+
insideNarration = false;
|
|
74
105
|
continue;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// Strip inline backtick code spans
|
|
81
|
-
cleaned = cleaned.replace(/`[^`]+`/g, "");
|
|
82
|
-
// Strip inline markdown bold and italic
|
|
83
|
-
cleaned = cleaned.replace(/\*\*([^*]+)\*\*/g, "$1");
|
|
84
|
-
cleaned = cleaned.replace(/(?<!\w)_([^_]+)_(?!\w)/g, "$1");
|
|
85
|
-
// Strip surrounding double quotes from narration lines
|
|
86
|
-
cleaned = cleaned.replace(/^"(.*)"$/, "$1");
|
|
87
|
-
// Collapse multiple spaces into one
|
|
88
|
-
cleaned = cleaned.replace(/\s{2,}/g, " ");
|
|
89
|
-
cleaned = cleaned.trim();
|
|
90
|
-
if (cleaned && currentScene) {
|
|
91
|
-
currentScene.lines.push(cleaned);
|
|
106
|
+
}
|
|
107
|
+
if (insideNarration) {
|
|
108
|
+
const cleaned = cleanNarrationText(line);
|
|
109
|
+
if (cleaned)
|
|
110
|
+
currentScene.lines.push(cleaned);
|
|
92
111
|
}
|
|
93
112
|
}
|
|
94
|
-
// Push last scene
|
|
95
113
|
if (currentScene && currentScene.lines.length > 0) {
|
|
96
114
|
scenes.push({
|
|
97
115
|
sceneId: currentScene.id,
|
|
@@ -100,6 +118,24 @@ export function parseTranscript(content) {
|
|
|
100
118
|
}
|
|
101
119
|
return scenes;
|
|
102
120
|
}
|
|
121
|
+
/** Clean a single line of narration text — strip TTS directives, markdown, quotes. */
|
|
122
|
+
function cleanNarrationText(line) {
|
|
123
|
+
// Strip directives: [warmly], [casual], [pause: 0.3s], [confidently], [impressed], etc.
|
|
124
|
+
let cleaned = line.replace(/\[(?:warmly|casual|confidently|impressed|pause:\s*[\d.]+s?)\]\s*/gi, "");
|
|
125
|
+
cleaned = cleaned.replace(/\[.*?\]\s*/g, ""); // catch any remaining bracketed directives
|
|
126
|
+
// Strip SSML-like tags (but not <narration> tags — those are structural)
|
|
127
|
+
cleaned = cleaned.replace(/<(?!\/?\s*narration)[^>]+\/?>/gi, "");
|
|
128
|
+
// Strip inline backtick code spans
|
|
129
|
+
cleaned = cleaned.replace(/`[^`]+`/g, "");
|
|
130
|
+
// Strip inline markdown bold and italic
|
|
131
|
+
cleaned = cleaned.replace(/\*\*([^*]+)\*\*/g, "$1");
|
|
132
|
+
cleaned = cleaned.replace(/(?<!\w)_([^_]+)_(?!\w)/g, "$1");
|
|
133
|
+
// Strip surrounding double quotes from narration lines
|
|
134
|
+
cleaned = cleaned.replace(/^"(.*)"$/, "$1");
|
|
135
|
+
// Collapse multiple spaces into one
|
|
136
|
+
cleaned = cleaned.replace(/\s{2,}/g, " ");
|
|
137
|
+
return cleaned.trim();
|
|
138
|
+
}
|
|
103
139
|
/** Resolve the model directory, checking that required files exist. */
|
|
104
140
|
function resolveModelDir(options) {
|
|
105
141
|
const modelDir = options.modelDir ?? process.env.DEMOFLY_TTS_MODEL_DIR ?? DEFAULT_MODEL_DIR;
|
package/dist/lib/tts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tts.js","sourceRoot":"","sources":["../../src/lib/tts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,gFAAgF;AAChF,IAAI,YAAiB,CAAC;AACtB,SAAS,aAAa;IACpB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,8BAA8B;AAC9B,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AAEtF,uCAAuC;AACvC,MAAM,SAAS,GAA2B;IACxC,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;IACX,SAAS,EAAE,CAAC;IACZ,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,aAAa,GAAG,UAAU,CAAC;AAsBjC;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,YAAY,GAA2C,IAAI,CAAC;IAChE,IAAI,UAAU,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"tts.js","sourceRoot":"","sources":["../../src/lib/tts.ts"],"names":[],"mappings":"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"}
|