Spaces:
Running
Running
| // Turn a written script into estimated word timings (~2.7 words/sec + punctuation | |
| // pauses) so a script-only project (no recording yet) can still drive the timeline, | |
| // captions and preview. Real timings replace these once you record/transcribe or TTS it. | |
| // cap so a runaway paste can't create a multi-hour timeline (and a giant render job) | |
| export const MAX_SCRIPT_WORDS = 4000; | |
| export function scriptToWords(script: string): { text: string; startMs: number; endMs: number }[] { | |
| const tokens = String(script || "").replace(/\s+/g, " ").trim().split(" ").filter(Boolean).slice(0, MAX_SCRIPT_WORDS); | |
| const out: { text: string; startMs: number; endMs: number }[] = []; | |
| let t = 0; | |
| for (const tok of tokens) { | |
| const letters = tok.replace(/[^\p{L}\p{N}]/gu, "").length || 1; | |
| const dur = Math.max(180, Math.min(620, 70 * letters + 110)); | |
| out.push({ text: tok, startMs: t, endMs: t + dur }); | |
| t += dur + (/[.!?]$/.test(tok) ? 320 : /[,;:]$/.test(tok) ? 160 : 50); | |
| } | |
| return out; | |
| } | |