diff --git a/bun.lock b/bun.lock
index c9587f6507..9d0c87cc27 100644
--- a/bun.lock
+++ b/bun.lock
@@ -1319,6 +1319,41 @@
"@remotion/bundler": "workspace:*",
},
},
+ "packages/template-ai-video": {
+ "name": "template-ai-video",
+ "version": "1.0.0",
+ "dependencies": {
+ "@remotion/animation-utils": "workspace:*",
+ "@remotion/cli": "workspace:*",
+ "@remotion/google-fonts": "workspace:*",
+ "@remotion/layout-utils": "workspace:*",
+ "@remotion/zod-types": "workspace:*",
+ "react": "19.0.0",
+ "react-dom": "19.0.0",
+ "remotion": "workspace:*",
+ "zod": "3.22.3",
+ },
+ "devDependencies": {
+ "@elevenlabs/elevenlabs-js": "^2.20.0",
+ "@remotion/eslint-config-flat": "workspace:*",
+ "@types/prompts": "^2.4.9",
+ "@types/react": "19.0.0",
+ "@types/uuid": "^11.0.0",
+ "@types/web": "0.0.166",
+ "@types/yargs": "^17.0.33",
+ "chalk": "^5.6.2",
+ "dotenv": "^17.2.3",
+ "eslint": "9.19.0",
+ "ora": "^9.0.0",
+ "prettier": "3.6.0",
+ "prompts": "^2.4.2",
+ "tsx": "^4.20.6",
+ "typescript": "5.8.2",
+ "uuid": "^13.0.0",
+ "yargs": "^18.0.0",
+ "zod-to-json-schema": "^3.24.6",
+ },
+ },
"packages/template-audiogram": {
"name": "template-audiogram",
"version": "1.0.0",
@@ -2584,6 +2619,8 @@
"@docusaurus/utils-validation": ["@docusaurus/utils-validation@3.9.1", "", { "dependencies": { "@docusaurus/logger": "3.9.1", "@docusaurus/utils": "3.9.1", "@docusaurus/utils-common": "3.9.1", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "tslib": "^2.6.0" } }, "sha512-5bzab5si3E1udrlZuVGR17857Lfwe8iFPoy5AvMP9PXqDfoyIKT7gDQgAmxdRDMurgHaJlyhXEHHdzDKkOxxZQ=="],
+ "@elevenlabs/elevenlabs-js": ["@elevenlabs/elevenlabs-js@2.20.0", "", { "dependencies": { "command-exists": "^1.2.9", "node-fetch": "^2.7.0" } }, "sha512-xe3nHHU+P0rNl2a2KKy4iCCLtUFsTksBleYU4afszfJq2jDYvaRAFQ7NCc+/tOduJof4eEm/KQIWM7Y+85+M6Q=="],
+
"@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="],
"@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="],
@@ -3792,7 +3829,7 @@
"@types/prompt": ["@types/prompt@1.1.2", "", { "dependencies": { "@types/node": "20.12.14", "@types/revalidator": "0.3.8" } }, "sha512-Zc9YzOvjAWxxGY7qo0Q6yINMVVspAa4p68UCzucWMU+GaPujpjwbOwzI38s7Jq01k0GztzLxXlRiFcZf/aeIWA=="],
- "@types/prompts": ["@types/prompts@2.4.1", "", { "dependencies": { "@types/node": "20.12.14" } }, "sha512-1Mqzhzi9W5KlooNE4o0JwSXGUDeQXKldbGn9NO4tpxwZbHXYd+WcKpCksG2lbhH7U9I9LigfsdVsP2QAY0lNPA=="],
+ "@types/prompts": ["@types/prompts@2.4.9", "", { "dependencies": { "@types/node": "*", "kleur": "^3.0.3" } }, "sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA=="],
"@types/qs": ["@types/qs@6.9.7", "", {}, "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="],
@@ -3866,7 +3903,7 @@
"@types/ws": ["@types/ws@8.5.10", "", { "dependencies": { "@types/node": "20.12.14" } }, "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A=="],
- "@types/yargs": ["@types/yargs@17.0.32", "", { "dependencies": { "@types/yargs-parser": "21.0.0" } }, "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog=="],
+ "@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="],
"@types/yargs-parser": ["@types/yargs-parser@21.0.0", "", {}, "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA=="],
@@ -4278,9 +4315,9 @@
"cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="],
- "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="],
+ "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
- "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="],
+ "cli-spinners": ["cli-spinners@3.3.0", "", {}, "sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ=="],
"cli-table3": ["cli-table3@0.6.5", "", { "dependencies": { "string-width": "4.2.3" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ=="],
@@ -4288,7 +4325,7 @@
"clipboard": ["clipboard@2.0.11", "", { "dependencies": { "good-listener": "^1.2.2", "select": "^1.1.2", "tiny-emitter": "^2.0.0" } }, "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw=="],
- "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "4.2.3", "strip-ansi": "6.0.1", "wrap-ansi": "7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
+ "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="],
"clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="],
@@ -4324,6 +4361,8 @@
"comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
+ "command-exists": ["command-exists@1.2.9", "", {}, "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w=="],
+
"commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="],
"common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="],
@@ -4860,7 +4899,7 @@
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
- "get-east-asian-width": ["get-east-asian-width@1.2.0", "", {}, "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA=="],
+ "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
"get-func-name": ["get-func-name@2.0.2", "", {}, "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ=="],
@@ -5136,7 +5175,7 @@
"is-installed-globally": ["is-installed-globally@0.4.0", "", { "dependencies": { "global-dirs": "3.0.0", "is-path-inside": "3.0.3" } }, "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ=="],
- "is-interactive": ["is-interactive@1.0.0", "", {}, "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="],
+ "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
"is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="],
@@ -5180,7 +5219,7 @@
"is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="],
- "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="],
+ "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
"is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="],
@@ -5342,7 +5381,7 @@
"lodash.zip": ["lodash.zip@4.2.0", "", {}, "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg=="],
- "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "4.1.2", "is-unicode-supported": "0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="],
+ "log-symbols": ["log-symbols@7.0.1", "", { "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" } }, "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg=="],
"loglevel": ["loglevel@1.9.2", "", {}, "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg=="],
@@ -5540,6 +5579,8 @@
"mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
+ "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
+
"mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="],
"mini-css-extract-plugin": ["mini-css-extract-plugin@2.9.2", "", { "dependencies": { "schema-utils": "4.2.0", "tapable": "2.2.1" }, "peerDependencies": { "webpack": "5.96.1" } }, "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w=="],
@@ -5696,7 +5737,7 @@
"optionator": ["optionator@0.9.3", "", { "dependencies": { "@aashutoshrathi/word-wrap": "1.2.6", "deep-is": "0.1.4", "fast-levenshtein": "2.0.6", "levn": "0.4.1", "prelude-ls": "1.2.1", "type-check": "0.4.0" } }, "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg=="],
- "ora": ["ora@5.4.1", "", { "dependencies": { "bl": "4.1.0", "chalk": "4.1.2", "cli-cursor": "3.1.0", "cli-spinners": "2.9.2", "is-interactive": "1.0.0", "is-unicode-supported": "0.1.0", "log-symbols": "4.1.0", "strip-ansi": "6.0.1", "wcwidth": "1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="],
+ "ora": ["ora@9.0.0", "", { "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", "cli-spinners": "^3.2.0", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.1.0", "log-symbols": "^7.0.1", "stdin-discarder": "^0.2.2", "string-width": "^8.1.0", "strip-ansi": "^7.1.2" } }, "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A=="],
"outdent": ["outdent@0.8.0", "", {}, "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A=="],
@@ -6184,7 +6225,7 @@
"resq": ["resq@1.11.0", "", { "dependencies": { "fast-deep-equal": "2.0.1" } }, "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw=="],
- "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "5.1.2", "signal-exit": "3.0.7" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="],
+ "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
"restructure": ["restructure@3.0.2", "", {}, "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw=="],
@@ -6390,6 +6431,8 @@
"std-env": ["std-env@3.7.0", "", {}, "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg=="],
+ "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="],
+
"stop-iteration-iterator": ["stop-iteration-iterator@1.0.0", "", { "dependencies": { "internal-slot": "1.1.0" } }, "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ=="],
"stream-browserify": ["stream-browserify@3.0.0", "", { "dependencies": { "inherits": "2.0.4", "readable-stream": "3.6.0" } }, "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA=="],
@@ -6404,7 +6447,7 @@
"string-hash": ["string-hash@1.1.3", "", {}, "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A=="],
- "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "10.4.0", "get-east-asian-width": "1.2.0", "strip-ansi": "7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+ "string-width": ["string-width@8.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg=="],
"string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
@@ -6490,6 +6533,8 @@
"teeny-request": ["teeny-request@9.0.0", "", { "dependencies": { "http-proxy-agent": "5.0.0", "https-proxy-agent": "5.0.1", "node-fetch": "2.6.9", "stream-events": "1.0.5", "uuid": "9.0.1" } }, "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g=="],
+ "template-ai-video": ["template-ai-video@workspace:packages/template-ai-video"],
+
"template-audiogram": ["template-audiogram@workspace:packages/template-audiogram"],
"template-code-hike": ["template-code-hike@workspace:packages/template-code-hike"],
@@ -6624,7 +6669,7 @@
"tsutils": ["tsutils@3.21.0", "", { "dependencies": { "tslib": "1.14.1" }, "peerDependencies": { "typescript": "5.8.2" } }, "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA=="],
- "tsx": ["tsx@4.19.3", "", { "dependencies": { "esbuild": "0.25.0", "get-tsconfig": "4.8.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ=="],
+ "tsx": ["tsx@4.20.6", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg=="],
"tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="],
@@ -6916,7 +6961,7 @@
"yaml": ["yaml@2.2.2", "", {}, "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA=="],
- "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "8.0.1", "escalade": "3.2.0", "get-caller-file": "2.0.5", "require-directory": "2.1.1", "string-width": "4.2.3", "y18n": "5.0.8", "yargs-parser": "21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
+ "yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="],
"yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
@@ -7416,6 +7461,8 @@
"@docusaurus/utils-validation/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+ "@elevenlabs/elevenlabs-js/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "5.0.0" } }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="],
+
"@emnapi/core/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"@emnapi/runtime/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
@@ -7512,6 +7559,8 @@
"@google-cloud/text-to-speech/google-gax": ["google-gax@3.6.1", "", { "dependencies": { "@grpc/grpc-js": "1.8.22", "@grpc/proto-loader": "0.7.13", "@types/long": "4.0.2", "@types/rimraf": "3.0.2", "abort-controller": "3.0.0", "duplexify": "4.1.3", "fast-text-encoding": "1.0.6", "google-auth-library": "8.7.0", "is-stream-ended": "0.1.4", "node-fetch": "2.6.9", "object-hash": "3.0.0", "proto3-json-serializer": "1.1.1", "protobufjs": "7.2.4", "protobufjs-cli": "1.1.1", "retry-request": "5.0.2" }, "bin": { "compileProtos": "build/tools/compileProtos.js", "minifyProtoJson": "build/tools/minify.js" } }, "sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w=="],
+ "@grpc/proto-loader/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "8.0.1", "escalade": "3.2.0", "get-caller-file": "2.0.5", "require-directory": "2.1.1", "string-width": "4.2.3", "y18n": "5.0.8", "yargs-parser": "21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
+
"@happy-dom/global-registrator/happy-dom": ["happy-dom@14.5.1", "", { "dependencies": { "entities": "4.5.0", "webidl-conversions": "7.0.0", "whatwg-mimetype": "3.0.0" } }, "sha512-nCmCszZnhHHvcY3gDqLNZrU71QzCT1sI2OUQy2YSn3omMYWe+QHSTO1PfS/1r6fds6zt6GI7L1tRIxo7RgC8lg=="],
"@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
@@ -7560,6 +7609,8 @@
"@puppeteer/browsers/tar-fs": ["tar-fs@3.1.0", "", { "dependencies": { "pump": "3.0.0", "tar-stream": "3.1.7" }, "optionalDependencies": { "bare-fs": "4.2.1", "bare-path": "3.0.0" } }, "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w=="],
+ "@puppeteer/browsers/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "8.0.1", "escalade": "3.2.0", "get-caller-file": "2.0.5", "require-directory": "2.1.1", "string-width": "4.2.3", "y18n": "5.0.8", "yargs-parser": "21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
+
"@radix-ui/react-arrow/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "19.0.0", "@types/react-dom": "19.0.0", "react": "19.0.0", "react-dom": "19.0.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
"@radix-ui/react-collection/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "19.0.0", "react": "19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="],
@@ -7730,6 +7781,8 @@
"@remix-run/dev/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+ "@remix-run/dev/ora": ["ora@5.4.1", "", { "dependencies": { "bl": "4.1.0", "chalk": "4.1.2", "cli-cursor": "3.1.0", "cli-spinners": "2.9.2", "is-interactive": "1.0.0", "is-unicode-supported": "0.1.0", "log-symbols": "4.1.0", "strip-ansi": "6.0.1", "wcwidth": "1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="],
+
"@remix-run/dev/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
"@remix-run/dev/postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "3.3.11", "picocolors": "1.1.1", "source-map-js": "1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="],
@@ -7932,6 +7985,8 @@
"@types/nlcst/@types/unist": ["@types/unist@2.0.6", "", {}, "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="],
+ "@types/prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
+
"@types/request/form-data": ["form-data@2.5.1", "", { "dependencies": { "asynckit": "0.4.0", "combined-stream": "1.0.8", "mime-types": "2.1.34" } }, "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA=="],
"@types/serve-index/@types/express": ["@types/express@5.0.1", "", { "dependencies": { "@types/body-parser": "1.19.1", "@types/express-serve-static-core": "5.0.4", "@types/serve-static": "1.13.10" } }, "sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ=="],
@@ -8062,6 +8117,8 @@
"boxen/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="],
+ "boxen/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "10.4.0", "get-east-asian-width": "1.2.0", "strip-ansi": "7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
"browserify-zlib/pako": ["pako@0.2.9", "", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="],
"cacache/fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "7.1.2" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="],
@@ -8084,9 +8141,9 @@
"cli-table3/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
- "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+ "cliui/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "10.4.0", "get-east-asian-width": "1.2.0", "strip-ansi": "7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
- "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "4.3.0", "string-width": "4.2.3", "strip-ansi": "6.0.1" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+ "cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
"cloudevents/ajv": ["ajv@8.11.0", "", { "dependencies": { "fast-deep-equal": "3.1.3", "json-schema-traverse": "1.0.0", "require-from-string": "2.0.2", "uri-js": "4.4.1" } }, "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg=="],
@@ -8588,6 +8645,10 @@
"openai/@types/node": ["@types/node@18.14.6", "", {}, "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA=="],
+ "ora/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
+
+ "ora/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
"p-queue/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
"pac-proxy-agent/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
@@ -8784,6 +8845,10 @@
"resq/fast-deep-equal": ["fast-deep-equal@2.0.1", "", {}, "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w=="],
+ "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
+
+ "restore-cursor/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
+
"rimraf/glob": ["glob@7.2.0", "", { "dependencies": { "fs.realpath": "1.0.0", "inflight": "1.0.6", "inherits": "2.0.4", "minimatch": "3.1.2", "once": "1.4.0", "path-is-absolute": "1.0.1" } }, "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q=="],
"router/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
@@ -8840,9 +8905,7 @@
"ssri/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
- "string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
-
- "string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
+ "string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
"string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
@@ -8872,6 +8935,14 @@
"teeny-request/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="],
+ "template-ai-video/@types/uuid": ["@types/uuid@11.0.0", "", { "dependencies": { "uuid": "*" } }, "sha512-HVyk8nj2m+jcFRNazzqyVKiZezyhDKrGUA3jlEcg/nZ6Ms+qHwocba1Y/AaVaznJTAM9xpdFSh+ptbNrhOGvZA=="],
+
+ "template-ai-video/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
+
+ "template-ai-video/dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="],
+
+ "template-ai-video/uuid": ["uuid@13.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w=="],
+
"template-next-app/@eslint/js": ["@eslint/js@9.38.0", "", {}, "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A=="],
"template-next-app/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.46.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.46.0", "@typescript-eslint/type-utils": "8.46.0", "@typescript-eslint/utils": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.46.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA=="],
@@ -8934,14 +9005,20 @@
"template-render-server/express": ["express@5.1.0", "", { "dependencies": { "accepts": "2.0.0", "body-parser": "2.2.0", "content-disposition": "1.0.0", "content-type": "1.0.5", "cookie": "0.7.2", "cookie-signature": "1.2.1", "debug": "4.4.0", "encodeurl": "2.0.0", "escape-html": "1.0.3", "etag": "1.8.1", "finalhandler": "2.1.0", "fresh": "2.0.0", "http-errors": "2.0.0", "merge-descriptors": "2.0.0", "mime-types": "3.0.1", "on-finished": "2.4.1", "once": "1.4.0", "parseurl": "1.3.3", "proxy-addr": "2.0.7", "qs": "6.14.0", "range-parser": "1.2.1", "router": "2.2.0", "send": "1.2.0", "serve-static": "2.2.0", "statuses": "2.0.1", "type-is": "2.0.1", "vary": "1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="],
+ "template-render-server/tsx": ["tsx@4.19.3", "", { "dependencies": { "esbuild": "0.25.0", "get-tsconfig": "4.8.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ=="],
+
"template-still/@types/express": ["@types/express@4.17.13", "", { "dependencies": { "@types/body-parser": "1.19.1", "@types/express-serve-static-core": "4.17.35", "@types/qs": "6.9.7", "@types/serve-static": "1.13.10" } }, "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA=="],
"template-still/dotenv": ["dotenv@16.0.3", "", {}, "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="],
+ "template-tts-azure/tsx": ["tsx@4.19.3", "", { "dependencies": { "esbuild": "0.25.0", "get-tsconfig": "4.8.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ=="],
+
"template-tts-google/@types/express": ["@types/express@4.17.13", "", { "dependencies": { "@types/body-parser": "1.19.1", "@types/express-serve-static-core": "4.17.35", "@types/qs": "6.9.7", "@types/serve-static": "1.13.10" } }, "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA=="],
"template-tts-google/dotenv": ["dotenv@16.0.3", "", {}, "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="],
+ "template-tts-google/tsx": ["tsx@4.19.3", "", { "dependencies": { "esbuild": "0.25.0", "get-tsconfig": "4.8.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ=="],
+
"terser/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
"terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
@@ -9078,8 +9155,12 @@
"whatwg-url/webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="],
+ "widest-line/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "10.4.0", "get-east-asian-width": "1.2.0", "strip-ansi": "7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
"wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
+ "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "10.4.0", "get-east-asian-width": "1.2.0", "strip-ansi": "7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
"wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
"wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
@@ -9088,7 +9169,9 @@
"xmlhttprequest-ts/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="],
- "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+ "yargs/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "10.4.0", "get-east-asian-width": "1.2.0", "strip-ansi": "7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
+ "yargs/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="],
"zip-stream/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "3.0.0", "buffer": "6.0.3", "events": "3.3.0", "process": "0.11.10", "string_decoder": "1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="],
@@ -9586,6 +9669,8 @@
"@docusaurus/utils/p-queue/p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="],
+ "@elevenlabs/elevenlabs-js/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "0.0.3", "webidl-conversions": "3.0.1" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
+
"@eslint/eslintrc/espree/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
"@firebase/auth-compat/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "0.0.3", "webidl-conversions": "3.0.1" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
@@ -9632,6 +9717,10 @@
"@google-cloud/text-to-speech/google-gax/retry-request": ["retry-request@5.0.2", "", { "dependencies": { "debug": "4.4.1", "extend": "3.0.2" } }, "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ=="],
+ "@grpc/proto-loader/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "4.2.3", "strip-ansi": "6.0.1", "wrap-ansi": "7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
+
+ "@grpc/proto-loader/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
"@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="],
"@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
@@ -9670,6 +9759,10 @@
"@puppeteer/browsers/tar-fs/tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "1.6.6", "fast-fifo": "1.3.2", "streamx": "2.20.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="],
+ "@puppeteer/browsers/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "4.2.3", "strip-ansi": "6.0.1", "wrap-ansi": "7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
+
+ "@puppeteer/browsers/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
"@radix-ui/react-dialog/@radix-ui/react-presence/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "19.0.0", "react": "19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="],
"@radix-ui/react-dialog/@radix-ui/react-use-controllable-state/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "19.0.0", "react": "19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="],
@@ -10160,11 +10253,23 @@
"body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+ "boxen/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
+
+ "boxen/string-width/get-east-asian-width": ["get-east-asian-width@1.2.0", "", {}, "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA=="],
+
+ "boxen/string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
+
"chokidar/anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
"cli-table3/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
- "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+ "cliui/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
+
+ "cliui/string-width/get-east-asian-width": ["get-east-asian-width@1.2.0", "", {}, "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA=="],
+
+ "cliui/string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
+
+ "cliui/strip-ansi/ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="],
"cloudevents/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
@@ -10532,6 +10637,8 @@
"node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
+ "ora/strip-ansi/ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="],
+
"peek-stream/duplexify/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "1.0.3", "inherits": "2.0.4", "isarray": "1.0.0", "process-nextick-args": "2.0.1", "safe-buffer": "5.1.2", "string_decoder": "1.1.1", "util-deprecate": "1.0.2" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
"pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
@@ -10928,11 +11035,25 @@
"webpackbar/wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+ "widest-line/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
+
+ "widest-line/string-width/get-east-asian-width": ["get-east-asian-width@1.2.0", "", {}, "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA=="],
+
+ "widest-line/string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
+
"wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+ "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
+
+ "wrap-ansi/string-width/get-east-asian-width": ["get-east-asian-width@1.2.0", "", {}, "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA=="],
+
"wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="],
- "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+ "yargs/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
+
+ "yargs/string-width/get-east-asian-width": ["get-east-asian-width@1.2.0", "", {}, "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA=="],
+
+ "yargs/string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
"@astrojs/react/@vitejs/plugin-react/@babel/core/@babel/parser": ["@babel/parser@7.26.2", "", { "dependencies": { "@babel/types": "7.26.0" }, "bin": "./bin/babel-parser.js" }, "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ=="],
@@ -11702,6 +11823,10 @@
"@docusaurus/utils/@docusaurus/types/@mdx-js/mdx/unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "3.0.2" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+ "@elevenlabs/elevenlabs-js/node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
+
+ "@elevenlabs/elevenlabs-js/node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
+
"@firebase/auth-compat/node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
"@firebase/auth-compat/node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
@@ -11710,6 +11835,8 @@
"@firebase/auth/node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
+ "@firebase/firestore/@grpc/grpc-js/@grpc/proto-loader/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "8.0.1", "escalade": "3.2.0", "get-caller-file": "2.0.5", "require-directory": "2.1.1", "string-width": "4.2.3", "y18n": "5.0.8", "yargs-parser": "21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
+
"@firebase/firestore/@grpc/proto-loader/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "4.2.3", "strip-ansi": "6.0.1", "wrap-ansi": "7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="],
"@firebase/firestore/@grpc/proto-loader/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
@@ -11734,6 +11861,10 @@
"@google-cloud/text-to-speech/google-gax/retry-request/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
+ "@grpc/proto-loader/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "4.3.0", "string-width": "4.2.3", "strip-ansi": "6.0.1" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "@grpc/proto-loader/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
"@mdx-js/mdx/remark-parse/@types/mdast/@types/unist": ["@types/unist@2.0.6", "", {}, "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="],
"@mdx-js/mdx/remark-parse/mdast-util-from-markdown/@types/unist": ["@types/unist@2.0.6", "", {}, "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="],
@@ -11762,6 +11893,10 @@
"@puppeteer/browsers/tar-fs/bare-path/bare-os": ["bare-os@3.6.2", "", {}, "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A=="],
+ "@puppeteer/browsers/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "4.3.0", "string-width": "4.2.3", "strip-ansi": "6.0.1" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "@puppeteer/browsers/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
"@radix-ui/react-menu/@radix-ui/react-roving-focus/@radix-ui/react-use-controllable-state/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "19.0.0", "react": "19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="],
"@react-router/dev/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="],
@@ -12310,6 +12445,10 @@
"@vitest/mocker/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="],
+ "boxen/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="],
+
+ "cliui/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="],
+
"copy-webpack-plugin/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
"cross-fetch/node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
@@ -12826,6 +12965,10 @@
"webpackbar/wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+ "widest-line/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="],
+
+ "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="],
+
"@babel/plugin-transform-modules-commonjs/@babel/helper-module-transforms/@babel/core/@babel/helper-compilation-targets/@babel/compat-data": ["@babel/compat-data@7.27.5", "", {}, "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg=="],
"@babel/plugin-transform-modules-commonjs/@babel/helper-module-transforms/@babel/core/@babel/helper-compilation-targets/@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="],
@@ -13204,6 +13347,10 @@
"@docusaurus/utils/@docusaurus/types/@mdx-js/mdx/unist-util-stringify-position/@types/unist": ["@types/unist@3.0.2", "", {}, "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="],
+ "@firebase/firestore/@grpc/grpc-js/@grpc/proto-loader/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "4.2.3", "strip-ansi": "6.0.1", "wrap-ansi": "7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
+
+ "@firebase/firestore/@grpc/grpc-js/@grpc/proto-loader/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
"@firebase/firestore/@grpc/proto-loader/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "4.3.0", "string-width": "4.2.3", "strip-ansi": "6.0.1" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
"@firebase/firestore/@grpc/proto-loader/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
@@ -13790,6 +13937,10 @@
"@docusaurus/utils/@docusaurus/types/@mdx-js/mdx/remark-mdx/micromark-extension-mdxjs/micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "1.0.7", "devlop": "1.1.0", "micromark-core-commonmark": "2.0.1", "micromark-util-character": "2.1.0", "micromark-util-events-to-acorn": "2.0.2", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0", "unist-util-position-from-estree": "2.0.0", "vfile-message": "4.0.2" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="],
+ "@firebase/firestore/@grpc/grpc-js/@grpc/proto-loader/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "4.3.0", "string-width": "4.2.3", "strip-ansi": "6.0.1" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "@firebase/firestore/@grpc/grpc-js/@grpc/proto-loader/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
"@mdx-js/mdx/remark-parse/mdast-util-from-markdown/micromark/micromark-core-commonmark/micromark-factory-destination": ["micromark-factory-destination@1.0.0", "", { "dependencies": { "micromark-util-character": "1.1.0", "micromark-util-symbol": "1.0.1", "micromark-util-types": "1.0.2" } }, "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw=="],
"@mdx-js/mdx/remark-parse/mdast-util-from-markdown/micromark/micromark-core-commonmark/micromark-factory-label": ["micromark-factory-label@1.0.2", "", { "dependencies": { "micromark-util-character": "1.1.0", "micromark-util-symbol": "1.0.1", "micromark-util-types": "1.0.2", "uvu": "0.5.6" } }, "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg=="],
diff --git a/packages/create-video/src/prompts.ts b/packages/create-video/src/prompts.ts
index 1b23ccbc80..e308e181e4 100644
--- a/packages/create-video/src/prompts.ts
+++ b/packages/create-video/src/prompts.ts
@@ -25,7 +25,6 @@ export async function selectAsync(
const {value} = await prompt({
limit: 11,
...questions,
- // @ts-expect-error: onRender not in the types
onRender(this: {
cursor: number;
firstRender: boolean;
diff --git a/packages/create-video/src/templates.ts b/packages/create-video/src/templates.ts
index 987579b66e..9037906171 100644
--- a/packages/create-video/src/templates.ts
+++ b/packages/create-video/src/templates.ts
@@ -37,6 +37,7 @@ export type Template = {
| 'google-tts'
| 'audiogram'
| 'music-visualization'
+ | 'ai-video'
| 'skia'
| 'overlay'
| 'stargazer'
@@ -376,6 +377,27 @@ export const FEATURED_TEMPLATES: Template[] = [
templateInMonorepo: 'template-music-visualization',
allowEnableTailwind: true,
},
+ {
+ homePageLabel: 'AI Video',
+ shortName: 'AI Video',
+ org: 'remotion-dev',
+ repoName: 'template-ai-video',
+ description: 'Create AI Videos from description',
+ longerDescription:
+ 'A template that turns video descriptions into full videos that can be posted on Social Media.',
+ promoVideo: {
+ muxId: 'FGl01Rw6c5YOjBCTdVhn5wrmVaRWDOjDeT28iY3Sv47w',
+ height: 1920,
+ width: 1080,
+ },
+ cliId: 'ai-video' as const,
+ type: 'video' as const,
+ defaultBranch: 'main',
+ featuredOnHomePage: null,
+ previewURL: null,
+ templateInMonorepo: 'template-ai-video',
+ allowEnableTailwind: true,
+ },
{
homePageLabel: 'Skia',
shortName: 'Skia',
diff --git a/packages/template-ai-video/.env.example b/packages/template-ai-video/.env.example
new file mode 100644
index 0000000000..6eb968ff7e
--- /dev/null
+++ b/packages/template-ai-video/.env.example
@@ -0,0 +1,2 @@
+OPENAI_API_KEY=
+ELEVENLABS_API_KEY=
\ No newline at end of file
diff --git a/packages/template-ai-video/.gitignore b/packages/template-ai-video/.gitignore
new file mode 100644
index 0000000000..b62197ba2f
--- /dev/null
+++ b/packages/template-ai-video/.gitignore
@@ -0,0 +1,7 @@
+node_modules
+dist
+.DS_Store
+.env
+
+# Ignore the output video from Git but not videos you import into src/.
+out
diff --git a/packages/template-ai-video/.prettierrc b/packages/template-ai-video/.prettierrc
new file mode 100644
index 0000000000..37d5071748
--- /dev/null
+++ b/packages/template-ai-video/.prettierrc
@@ -0,0 +1,5 @@
+{
+ "useTabs": false,
+ "bracketSpacing": true,
+ "tabWidth": 2
+}
diff --git a/packages/template-ai-video/Promo.png b/packages/template-ai-video/Promo.png
new file mode 100644
index 0000000000..3da13c20a6
Binary files /dev/null and b/packages/template-ai-video/Promo.png differ
diff --git a/packages/template-ai-video/README.md b/packages/template-ai-video/README.md
new file mode 100644
index 0000000000..6a60a8a60a
--- /dev/null
+++ b/packages/template-ai-video/README.md
@@ -0,0 +1,120 @@
+# Remotion AI Video template
+
+
+
+
+
+
+
+
+Using this template you can create high quality **AI videos for TikTok or Instagram**.
+
+It includes a CLI that will generate story script, images and voiceover using OpenAI and ElevenLabs.
+
+## Getting started with demo video
+
+**Install Dependencies**
+
+```console
+bun install
+```
+
+**Start Preview**
+
+```console
+npm run dev
+```
+
+## How do I render my video?
+
+Run this:
+
+```console
+npx remotion render
+```
+
+Or check out the [Remotion docs](/docs/render/). There are lots of ways to render.
+
+## Creating your own videos
+
+You can easily create your own videos using provided CLI.
+
+It will generate a script, images, voiceover and timeline based on your story title and topic. (topic can be e.g. history, eli5, fun facts, science, etc)
+
+**Configure environment variables**
+
+Create .env file with following env vars (you can also find them in .env.example):
+
+```
+OPENAI_API_KEY=
+ELEVENLABS_API_KEY=
+```
+
+If you did not create env file - you will be prompted for these variables when using CLI.
+
+**Select voice**
+
+In **generateVoice()** function replace the voice id from ElevenLabs with the one you like. You can use their API for this. Alternatively, you can open any voice on their website and extract the Voice Id from the url (id comes after **voiceId=**)
+
+```console
+https://elevenlabs.io/app/voice-library?voiceId=aTxZrSrp47xsP6Ot4Kgd
+```
+
+**Generate srory timeline**
+
+```console
+bun gen
+```
+
+You will be prompted to enter story title and topic.
+
+Title can be a vague one or long and detailed. Short title on the first slide will be generated based on it.
+
+Topic can be e.g. History, Interesting facts, ELI5 etc.
+
+After you enter title and topic, CLI will generate text, images and audio with timestamps, and combine all those into a timeline that van be used by this template to render a video.
+
+## Technical overview
+
+Remotion is rendering videos based on Timeline (timeline.json in project folder). This timeline is generated by CLI.
+
+It consists of three blocks - Elements, Text and Audio.
+
+Elements define slide backgrounds and include enter/exit transitions (e.g. blur) and animations that are applied while slide is active (e.g. scale, rotate).
+
+Text and audio are self explanatory. The only special thing about them is that they are synced.
+
+You can customize the generation of the timeline in **createTimeLineFromStoryWithDetails()** function.
+
+## Deploying on a remove server
+
+Current project nees light modification if you want to deploy it as a remote service.
+
+Remotion renderer with template bundle shuold be deployed as per usual.
+
+Then you have to update Root.tsx to use timeline url that you will pass as a prop (instead of project name).
+
+The last thing - you have to upload generated resources (images and audio) to server and use urls to them instead of file names when generating a timeline.
+
+## Optimisations
+
+You can significantly speed up the story generation by generating audio and images in parallel.
+
+## Issues
+
+Found an issue with Remotion? Upgrade Remotion to receive fixes:
+
+```
+npx remotion upgrade
+```
+
+Didn't help? [File an issue here](https://github.com/remotion-dev/remotion/issues/new).
+
+## Contributing
+
+The source of this template is in the [Remotion Monorepo](https://github.com/remotion-dev/remotion/tree/main/packages/template-ai-video).
+Don't send pull requests here, this is only a mirror.
+
+## License
+
+Note that for some entities a company license is needed. [Read the terms here](https://github.com/remotion-dev/remotion/blob/main/LICENSE.md).
diff --git a/packages/template-ai-video/cli/cli.ts b/packages/template-ai-video/cli/cli.ts
new file mode 100644
index 0000000000..1f666ecdb8
--- /dev/null
+++ b/packages/template-ai-video/cli/cli.ts
@@ -0,0 +1,295 @@
+#!/usr/bin/env node
+
+import yargs from "yargs";
+import { hideBin } from "yargs/helpers";
+import prompts from "prompts";
+import ora from "ora";
+import chalk from "chalk";
+import * as dotenv from "dotenv";
+import {
+ generateAiImage,
+ generateVoice,
+ getGenerateImageDescriptionPrompt,
+ getGenerateStoryPrompt,
+ openaiStructuredCompletion,
+ setApiKey,
+} from "./service";
+import {
+ ContentItemWithDetails,
+ StoryMetadataWithDetails,
+ StoryScript,
+ StoryWithImages,
+ Timeline,
+} from "../src/lib/types";
+import { v4 as uuidv4 } from "uuid";
+import * as fs from "fs";
+import * as path from "path";
+import { createTimeLineFromStoryWithDetails } from "./timeline";
+
+dotenv.config();
+
+interface GenerateOptions {
+ apiKey?: string;
+ elevenlabsApiKey?: string;
+ title?: string;
+ topic?: string;
+}
+
+class ContentFS {
+ title: string;
+ slug: string;
+
+ constructor(title: string) {
+ this.title = title;
+ this.slug = this.getSlug();
+ }
+
+ saveDescriptor(descriptor: StoryMetadataWithDetails) {
+ const dirPath = this.getDir();
+ const filePath = path.join(dirPath, "descriptor.json");
+ fs.writeFileSync(filePath, JSON.stringify(descriptor, null, 2));
+ }
+
+ saveTimeline(timeline: Timeline) {
+ const dirPath = this.getDir();
+ const filePath = path.join(dirPath, "timeline.json");
+ fs.writeFileSync(filePath, JSON.stringify(timeline, null, 2));
+ }
+
+ getDir(dir?: string): string {
+ const segments = ["public", "content", this.slug];
+ if (dir) {
+ segments.push(dir);
+ }
+ const p = path.join(process.cwd(), ...segments);
+ fs.mkdirSync(p, { recursive: true });
+ return p;
+ }
+
+ getImagePath(uid: string): string {
+ const dirPath = this.getDir("images");
+ return path.join(dirPath, `${uid}.png`);
+ }
+
+ getAudioPath(uid: string): string {
+ const dirPath = this.getDir("audio");
+ return path.join(dirPath, `${uid}.mp3`);
+ }
+
+ getSlug(): string {
+ return this.title
+ .toLowerCase()
+ .replace(/[^a-z0-9]+/g, "_")
+ .replace(/^_+|_+$/g, "");
+ }
+}
+
+async function generateStory(options: GenerateOptions) {
+ try {
+ let apiKey = options.apiKey || process.env.OPENAI_API_KEY;
+ let elevenlabsApiKey =
+ options.elevenlabsApiKey || process.env.ELEVENLABS_API_KEY;
+
+ if (!apiKey) {
+ const response = await prompts({
+ type: "password",
+ name: "apiKey",
+ message: "Enter your OpenAI API key:",
+ validate: (value) => value.length > 0 || "API key is required",
+ });
+
+ if (!response.apiKey) {
+ console.log(chalk.red("API key is required. Exiting..."));
+ process.exit(1);
+ }
+
+ apiKey = response.apiKey;
+ }
+
+ if (!elevenlabsApiKey) {
+ const response = await prompts({
+ type: "password",
+ name: "elevenlabsApiKey",
+ message: "Enter your ElevenLabs API key:",
+ validate: (value) =>
+ value.length > 0 || "ElevenLabs API key is required",
+ });
+
+ if (!response.elevenlabsApiKey) {
+ console.log(chalk.red("API key is required. Exiting..."));
+ process.exit(1);
+ }
+
+ elevenlabsApiKey = response.elevenlabsApiKey;
+ }
+
+ let { title, topic } = options;
+
+ if (!title || !topic) {
+ const response = await prompts([
+ {
+ type: "text",
+ name: "title",
+ message: "Enter the title of the story:",
+ initial: title,
+ validate: (value) => value.length > 0 || "Title is required",
+ },
+ {
+ type: "text",
+ name: "topic",
+ message: "Enter the topic of the story:",
+ initial: topic,
+ validate: (value) => value.length > 0 || "Topic is required",
+ },
+ ]);
+
+ if (!response.title || !response.topic) {
+ console.log(chalk.red("Title and topic are required. Exiting..."));
+ process.exit(1);
+ }
+
+ title = response.title;
+ topic = response.topic;
+ }
+
+ console.log(chalk.blue(`\n📖 Creating story: "${title}"`));
+ console.log(chalk.blue(`📝 Topic: ${topic}\n`));
+
+ const storyWithDetails: StoryMetadataWithDetails = {
+ shortTitle: title!,
+ content: [],
+ };
+
+ const storySpinner = ora("Generating story...").start();
+ setApiKey(apiKey!);
+ const storyRes = await openaiStructuredCompletion(
+ getGenerateStoryPrompt(title!, topic!),
+ StoryScript,
+ );
+ storySpinner.succeed(chalk.green("Story generated!"));
+
+ const descriptionsSpinner = ora("Generating image descriptions...").start();
+ const storyWithImagesRes = await openaiStructuredCompletion(
+ getGenerateImageDescriptionPrompt(storyRes.text),
+ StoryWithImages,
+ );
+ descriptionsSpinner.succeed(chalk.green("Image descriptions generated!"));
+
+ for (const item of storyWithImagesRes.result) {
+ const contentWithDetails: ContentItemWithDetails = {
+ text: item.text,
+ imageDescription: item.imageDescription,
+ uid: uuidv4(),
+ audioTimestamps: {
+ characters: [],
+ characterStartTimesSeconds: [],
+ characterEndTimesSeconds: [],
+ },
+ };
+
+ storyWithDetails.content.push(contentWithDetails);
+ }
+
+ const contentFs = new ContentFS(title!);
+ contentFs.saveDescriptor(storyWithDetails);
+
+ const imagesSpinner = ora("Generating images and voice...").start();
+ for (let i = 0; i < storyWithDetails.content.length; i++) {
+ const storyItem = storyWithDetails.content[i];
+
+ await generateAiImage(
+ storyItem.imageDescription,
+ contentFs.getImagePath(storyItem.uid),
+ );
+ const timings = await generateVoice(
+ storyItem.text,
+ elevenlabsApiKey!,
+ contentFs.getAudioPath(storyItem.uid),
+ );
+ storyItem.audioTimestamps = timings;
+ }
+ contentFs.saveDescriptor(storyWithDetails);
+ imagesSpinner.succeed(chalk.green("Images generated!"));
+
+ const finalSpinner = ora("Generating final result...").start();
+ const timeline = createTimeLineFromStoryWithDetails(storyWithDetails);
+ contentFs.saveTimeline(timeline);
+ finalSpinner.succeed(chalk.green("Final result generated!"));
+
+ console.log(chalk.green.bold("\n✨ Story generation complete!\n"));
+
+ return {};
+ } catch (error) {
+ console.error(chalk.red("\n❌ Error:"), error);
+ process.exit(1);
+ }
+}
+
+yargs(hideBin(process.argv))
+ .command(
+ "generate",
+ "Generate story timeline for given title and topic",
+ (yargs) => {
+ return yargs
+ .option("api-key", {
+ alias: "k",
+ type: "string",
+ description: "OpenAI API key",
+ })
+ .option("title", {
+ alias: "t",
+ type: "string",
+ description: "Title of the story",
+ })
+ .option("topic", {
+ alias: "p",
+ type: "string",
+ description:
+ "Topic of the story (e.g. Interesting Facts, History, etc.)",
+ });
+ },
+ async (argv) => {
+ await generateStory({
+ apiKey: argv["api-key"],
+ title: argv.title,
+ topic: argv.topic,
+ });
+ },
+ )
+ .command(
+ "$0",
+ "Generate a story (default command)",
+ (yargs) => {
+ return yargs
+ .option("api-key", {
+ alias: "k",
+ type: "string",
+ description: "OpenAI API key",
+ })
+ .option("title", {
+ alias: "t",
+ type: "string",
+ description: "Title of the story",
+ })
+ .option("topic", {
+ alias: "p",
+ type: "string",
+ description:
+ "Topic of the story (e.g. Interesting Facts, History, etc.)",
+ });
+ },
+ async (argv) => {
+ await generateStory({
+ apiKey: argv["api-key"],
+ title: argv.title,
+ topic: argv.topic,
+ });
+ },
+ )
+ .demandCommand(0, 1)
+ .help()
+ .alias("help", "h")
+ .version()
+ .alias("version", "v")
+ .strict()
+ .parse();
diff --git a/packages/template-ai-video/cli/service.ts b/packages/template-ai-video/cli/service.ts
new file mode 100644
index 0000000000..bd9dbc9851
--- /dev/null
+++ b/packages/template-ai-video/cli/service.ts
@@ -0,0 +1,149 @@
+import z from "zod";
+import * as fs from "fs";
+import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
+import { CharacterAlignmentResponseModel } from "@elevenlabs/elevenlabs-js/api";
+import { ImageHeight, ImageWidth } from "../src/lib/constants";
+import { zodToJsonSchema } from "zod-to-json-schema";
+
+let apiKey: string | null = null;
+
+export const setApiKey = (key: string) => {
+ apiKey = key;
+};
+
+export const openaiStructuredCompletion = async (
+ prompt: string,
+ schema: z.ZodType,
+): Promise => {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ const jsonSchema = zodToJsonSchema(schema) as any;
+
+ const res = await fetch("https://api.openai.com/v1/chat/completions", {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${apiKey}`,
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ model: "gpt-4.1",
+ messages: [{ role: "user", content: prompt }],
+ response_format: {
+ type: "json_schema",
+ json_schema: {
+ name: "response",
+ schema: {
+ type: jsonSchema.type || "object",
+ properties: jsonSchema.properties,
+ required: jsonSchema.required,
+ additionalProperties: jsonSchema.additionalProperties ?? false,
+ },
+ strict: true,
+ },
+ },
+ }),
+ });
+
+ if (!res.ok) throw new Error(`OpenAI error: ${await res.text()}`);
+
+ const data = await res.json();
+ const content = data.choices[0]?.message?.content;
+
+ if (!content) {
+ throw new Error("No content in OpenAI response");
+ }
+
+ const parsed = JSON.parse(content);
+ return schema.parse(parsed);
+};
+
+function saveUint8ArrayToPng(uint8Array: Uint8Array, filePath: string) {
+ const buffer = Buffer.from(uint8Array);
+ fs.writeFileSync(filePath, buffer as Uint8Array);
+}
+
+export const generateAiImage = async (prompt: string, path: string) => {
+ const res = await fetch("https://api.openai.com/v1/images/generations", {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${apiKey}`,
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ model: "dall-e-3",
+ prompt,
+ size: `${ImageWidth}x${ImageHeight}`,
+ response_format: "b64_json",
+ }),
+ });
+
+ if (!res.ok) throw new Error(`OpenAI error: ${await res.text()}`);
+
+ const data = await res.json();
+ const buffer = Buffer.from(data.data[0].b64_json, "base64");
+ const uint8Array = new Uint8Array(buffer);
+
+ saveUint8ArrayToPng(uint8Array, path);
+};
+
+export const getGenerateStoryPrompt = (title: string, topic: string) => {
+ const prompt = `Write a short story with title [${title}] (its topic is [${topic}]).
+ You must follow best practices for great storytelling.
+ The script must be 8-10 sentences long.
+ Story events can be from anywhere in the world, but text must be translated into English language.
+ Result result without any formatting and title, as one continuous text.
+ Skip new lines.`;
+
+ return prompt;
+};
+
+export const getGenerateImageDescriptionPrompt = (storyText: string) => {
+ const prompt = `You are given story text.
+ Generate (in English) 5-8 very detailed image descriptions for this story.
+ Return their description as json array with story sentences matched to images.
+ Story sentences must be in the same order as in the story and their content must be preserved.
+ Each image must match 1-2 sentence from the story.
+ Images must show story content in a way that is visually appealing and engaging, not just characters.
+ Give output in json format:
+
+ [
+ {
+ "text": "....",
+ "imageDescription": "..."
+ }
+ ]
+
+
+ ${storyText}
+ `;
+
+ return prompt;
+};
+
+const saveBase64ToMp3 = (data: string, path: string) => {
+ const buffer = Buffer.from(data, "base64");
+ fs.writeFileSync(path, buffer as Uint8Array);
+};
+
+export const generateVoice = async (
+ text: string,
+ apiKey: string,
+ path: string,
+): Promise => {
+ const client = new ElevenLabsClient({
+ environment: "https://api.elevenlabs.io",
+ apiKey,
+ });
+
+ const voiceId = "21m00Tcm4TlvDq8ikWAM";
+
+ const data = await client.textToSpeech.convertWithTimestamps(voiceId, {
+ text,
+ });
+
+ if (!data.alignment || !data.alignment.characterEndTimesSeconds.length) {
+ throw new Error("ElevenLabs response missing timestamps");
+ }
+
+ saveBase64ToMp3(data.audioBase64, path);
+ return data.alignment;
+};
diff --git a/packages/template-ai-video/cli/timeline.ts b/packages/template-ai-video/cli/timeline.ts
new file mode 100644
index 0000000000..b6fe21f465
--- /dev/null
+++ b/packages/template-ai-video/cli/timeline.ts
@@ -0,0 +1,211 @@
+import type {
+ BackgroundElement,
+ ElementAnimation,
+ StoryMetadataWithDetails,
+ TextElement,
+ Timeline,
+} from "../src/lib/types";
+
+export const createTimeLineFromStoryWithDetails = (
+ storyWithDetails: StoryMetadataWithDetails,
+): Timeline => {
+ const timeline: Timeline = {
+ elements: [],
+ text: [],
+ audio: [],
+ shortTitle: storyWithDetails.shortTitle,
+ };
+
+ let durationMs = 0;
+ let zoomIn = true;
+
+ for (let i = 0; i < storyWithDetails.content.length; i++) {
+ const content = storyWithDetails.content[i];
+
+ const lenMs = Math.ceil(
+ content.audioTimestamps.characterEndTimesSeconds[
+ content.audioTimestamps.characterEndTimesSeconds.length - 1
+ ] * 1000,
+ );
+
+ const bgElem: BackgroundElement = {
+ startMs: durationMs,
+ endMs: durationMs + lenMs,
+ imageUrl: content.uid,
+ enterTransition: "blur",
+ exitTransition: "blur",
+ animations: getBgAnimations(lenMs, zoomIn),
+ };
+
+ timeline.elements.push(bgElem);
+ timeline.audio.push({
+ startMs: durationMs,
+ endMs: durationMs + lenMs,
+ audioUrl: content.uid,
+ });
+
+ // hadnle text word by word
+ const words = content.text.split(" ");
+ const {
+ characterStartTimesSeconds: character_start_times_seconds,
+ characterEndTimesSeconds: character_end_times_seconds,
+ } = content.audioTimestamps;
+
+ const MaxSentenseSizeChars = 14;
+
+ let currentText = "";
+ let currentStartMs = character_start_times_seconds[0] * 1000 + durationMs;
+ let currentEndMs = durationMs;
+ let currentCharIndex = 0;
+
+ for (const word of words) {
+ if ((currentText + word).length > MaxSentenseSizeChars) {
+ const textElem: TextElement = {
+ startMs: currentStartMs,
+ endMs: currentEndMs,
+ text: currentText.trim(),
+ position: "center",
+ animations: getTextAnimations(),
+ };
+
+ timeline.text.push(textElem);
+
+ currentText = "";
+ currentStartMs = currentEndMs;
+ }
+
+ currentText += `${word} `;
+ for (let i = 0; i < word.length; i++) {
+ currentEndMs =
+ character_end_times_seconds[currentCharIndex] * 1000 + durationMs;
+ currentCharIndex++;
+ }
+
+ currentEndMs =
+ character_end_times_seconds[currentCharIndex] * 1000 + durationMs;
+ currentCharIndex++;
+ }
+
+ if (currentText.trim().length > 0) {
+ const textElem: TextElement = {
+ startMs: currentStartMs,
+ endMs:
+ character_end_times_seconds[character_end_times_seconds.length - 1] *
+ 1000 +
+ durationMs,
+ text: currentText.trim(),
+ position: "center",
+ animations: getTextAnimations(),
+ };
+
+ timeline.text.push(textElem);
+ }
+
+ durationMs += lenMs;
+
+ zoomIn = !zoomIn;
+ }
+
+ return timeline;
+};
+
+export function findAllSpaceIndexes(str: string) {
+ const indexes = [];
+ for (let i = 0; i < str.length; i++) {
+ if (str[i] === " ") {
+ indexes.push(i);
+ }
+ }
+ return indexes;
+}
+
+export const getBgAnimations = (durationMs: number, zoomIn: boolean) => {
+ const animations: ElementAnimation[] = [];
+
+ const startMs = 0;
+ const endMs = durationMs;
+
+ const scaleFrom = zoomIn ? 1.5 : 1;
+ const scaleTo = zoomIn ? 1 : 1.5;
+
+ animations.push({
+ type: "scale",
+ from: scaleFrom,
+ to: scaleTo,
+ startMs,
+ endMs,
+ });
+
+ // eslint-disable-next-line @remotion/deterministic-randomness
+ const randomDir = Math.random() > 0.5 ? 1 : -1;
+ // eslint-disable-next-line @remotion/deterministic-randomness
+ const randomDeg = Math.random() * 10 * randomDir;
+ // eslint-disable-next-line @remotion/deterministic-randomness
+ const startAtZero = Math.random() > 0.5;
+
+ // rotate
+ animations.push({
+ type: "rotate",
+ from: startAtZero ? 0 : randomDeg,
+ to: startAtZero ? randomDeg : 0,
+ startMs,
+ endMs,
+ });
+
+ return animations;
+};
+
+export const getTextAnimations = () => {
+ const animations: ElementAnimation[] = [];
+
+ const durationMs = 300;
+
+ const startMs = 0;
+ const endMs = durationMs;
+
+ // eslint-disable-next-line @remotion/deterministic-randomness
+ const randomDir = Math.random() > 0.5 ? 1 : -1;
+ // eslint-disable-next-line @remotion/deterministic-randomness
+ const randomDeg = Math.random() * 10 * randomDir;
+ // eslint-disable-next-line @remotion/deterministic-randomness
+ const dontRotate = Math.random() > 0.5;
+
+ // rotate
+ animations.push({
+ type: "rotate",
+ from: dontRotate ? 0 : randomDeg,
+ to: 0,
+ startMs,
+ endMs,
+ });
+
+ // start scale from 0.5 to 0.7
+ // eslint-disable-next-line @remotion/deterministic-randomness
+ const startScale = Math.random() * 0.2 + 0.5;
+ // dont scale with 40% chance
+ // eslint-disable-next-line @remotion/deterministic-randomness
+ const dontScale = Math.random() > 0.6;
+ // eslint-disable-next-line @remotion/deterministic-randomness
+ const bounces = Math.random() > 0.5;
+
+ // scale
+ animations.push({
+ type: "scale",
+ from: dontScale ? 1 : startScale,
+ to: bounces ? 1.25 : 1,
+ startMs,
+ endMs,
+ });
+
+ if (bounces) {
+ animations.push({
+ type: "scale",
+ from: 1.25,
+ to: 1,
+ startMs: endMs,
+ endMs: endMs + 200,
+ });
+ }
+
+ return animations;
+};
diff --git a/packages/template-ai-video/eslint.config.mjs b/packages/template-ai-video/eslint.config.mjs
new file mode 100644
index 0000000000..13b44a0d65
--- /dev/null
+++ b/packages/template-ai-video/eslint.config.mjs
@@ -0,0 +1,3 @@
+import { config } from "@remotion/eslint-config-flat";
+
+export default config;
diff --git a/packages/template-ai-video/package.json b/packages/template-ai-video/package.json
new file mode 100644
index 0000000000..8d5b9144a7
--- /dev/null
+++ b/packages/template-ai-video/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "template-ai-video",
+ "version": "1.0.0",
+ "description": "Create AI videos using remotion",
+ "scripts": {
+ "dev": "remotion studio",
+ "build": "remotion bundle",
+ "upgrade": "remotion upgrade",
+ "lint": "eslint src && tsc",
+ "gen": "bun cli/cli.ts"
+ },
+ "repository": {},
+ "license": "UNLICENSED",
+ "dependencies": {
+ "@remotion/animation-utils": "workspace:*",
+ "@remotion/cli": "workspace:*",
+ "@remotion/google-fonts": "workspace:*",
+ "@remotion/layout-utils": "workspace:*",
+ "@remotion/zod-types": "workspace:*",
+ "react": "19.0.0",
+ "react-dom": "19.0.0",
+ "remotion": "workspace:*",
+ "zod": "3.22.3"
+ },
+ "devDependencies": {
+ "@elevenlabs/elevenlabs-js": "^2.20.0",
+ "@remotion/eslint-config-flat": "workspace:*",
+ "@types/prompts": "^2.4.9",
+ "@types/react": "19.0.0",
+ "@types/uuid": "^11.0.0",
+ "@types/web": "0.0.166",
+ "@types/yargs": "^17.0.33",
+ "chalk": "^5.6.2",
+ "dotenv": "^17.2.3",
+ "eslint": "9.19.0",
+ "ora": "^9.0.0",
+ "prettier": "3.6.0",
+ "prompts": "^2.4.2",
+ "tsx": "^4.20.6",
+ "typescript": "5.8.2",
+ "uuid": "^13.0.0",
+ "yargs": "^18.0.0",
+ "zod-to-json-schema": "^3.24.6"
+ },
+ "private": true
+}
diff --git a/packages/template-ai-video/public/content/history_of_venus/audio/11f4911a-f39f-4567-8963-41511d05b593.mp3 b/packages/template-ai-video/public/content/history_of_venus/audio/11f4911a-f39f-4567-8963-41511d05b593.mp3
new file mode 100644
index 0000000000..1aeec4f756
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/audio/11f4911a-f39f-4567-8963-41511d05b593.mp3 differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/audio/20cf0ab8-49cb-4ead-816d-6af0b588668a.mp3 b/packages/template-ai-video/public/content/history_of_venus/audio/20cf0ab8-49cb-4ead-816d-6af0b588668a.mp3
new file mode 100644
index 0000000000..95b8da2639
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/audio/20cf0ab8-49cb-4ead-816d-6af0b588668a.mp3 differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/audio/33b24fbd-dc71-4692-87af-fdff7661c222.mp3 b/packages/template-ai-video/public/content/history_of_venus/audio/33b24fbd-dc71-4692-87af-fdff7661c222.mp3
new file mode 100644
index 0000000000..d370445b13
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/audio/33b24fbd-dc71-4692-87af-fdff7661c222.mp3 differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/audio/5584e376-d02e-48fc-9e47-fc7bf86000af.mp3 b/packages/template-ai-video/public/content/history_of_venus/audio/5584e376-d02e-48fc-9e47-fc7bf86000af.mp3
new file mode 100644
index 0000000000..8c8b6f7ec7
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/audio/5584e376-d02e-48fc-9e47-fc7bf86000af.mp3 differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/audio/83e869e5-18fd-4de9-b70f-dc0f180da912.mp3 b/packages/template-ai-video/public/content/history_of_venus/audio/83e869e5-18fd-4de9-b70f-dc0f180da912.mp3
new file mode 100644
index 0000000000..c234dc656f
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/audio/83e869e5-18fd-4de9-b70f-dc0f180da912.mp3 differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/audio/90917ba0-8b7c-4309-a784-4f1fdc28d9fb.mp3 b/packages/template-ai-video/public/content/history_of_venus/audio/90917ba0-8b7c-4309-a784-4f1fdc28d9fb.mp3
new file mode 100644
index 0000000000..fdbdfc3a6a
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/audio/90917ba0-8b7c-4309-a784-4f1fdc28d9fb.mp3 differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/audio/919d538b-3407-440a-b26a-73a5321a3af0.mp3 b/packages/template-ai-video/public/content/history_of_venus/audio/919d538b-3407-440a-b26a-73a5321a3af0.mp3
new file mode 100644
index 0000000000..a6b4a112b2
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/audio/919d538b-3407-440a-b26a-73a5321a3af0.mp3 differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/audio/99af6411-714b-4b72-b66e-f6c02a184493.mp3 b/packages/template-ai-video/public/content/history_of_venus/audio/99af6411-714b-4b72-b66e-f6c02a184493.mp3
new file mode 100644
index 0000000000..0d12f8c0d5
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/audio/99af6411-714b-4b72-b66e-f6c02a184493.mp3 differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/descriptor.json b/packages/template-ai-video/public/content/history_of_venus/descriptor.json
new file mode 100644
index 0000000000..06237c75b7
--- /dev/null
+++ b/packages/template-ai-video/public/content/history_of_venus/descriptor.json
@@ -0,0 +1,2893 @@
+{
+ "shortTitle": "History of Venus",
+ "content": [
+ {
+ "text": "Once upon a time, long before telescopes watched the sky, people looked up and saw a bright star, not knowing it was Venus.",
+ "imageDescription": "A tranquil nighttime scene from ancient times, with people in simple robes gazing up at a sparkling, brilliantly bright 'star' in the deep indigo sky. The landscape is dotted with flickering bonfires and shadowy figures pointing upwards in wonder. There are no modern instruments, just the natural awe of humans watching the heavens.",
+ "uid": "83e869e5-18fd-4de9-b70f-dc0f180da912",
+ "audioTimestamps": {
+ "characters": [
+ "O",
+ "n",
+ "c",
+ "e",
+ " ",
+ "u",
+ "p",
+ "o",
+ "n",
+ " ",
+ "a",
+ " ",
+ "t",
+ "i",
+ "m",
+ "e",
+ ",",
+ " ",
+ "l",
+ "o",
+ "n",
+ "g",
+ " ",
+ "b",
+ "e",
+ "f",
+ "o",
+ "r",
+ "e",
+ " ",
+ "t",
+ "e",
+ "l",
+ "e",
+ "s",
+ "c",
+ "o",
+ "p",
+ "e",
+ "s",
+ " ",
+ "w",
+ "a",
+ "t",
+ "c",
+ "h",
+ "e",
+ "d",
+ " ",
+ "t",
+ "h",
+ "e",
+ " ",
+ "s",
+ "k",
+ "y",
+ ",",
+ " ",
+ "p",
+ "e",
+ "o",
+ "p",
+ "l",
+ "e",
+ " ",
+ "l",
+ "o",
+ "o",
+ "k",
+ "e",
+ "d",
+ " ",
+ "u",
+ "p",
+ " ",
+ "a",
+ "n",
+ "d",
+ " ",
+ "s",
+ "a",
+ "w",
+ " ",
+ "a",
+ " ",
+ "b",
+ "r",
+ "i",
+ "g",
+ "h",
+ "t",
+ " ",
+ "s",
+ "t",
+ "a",
+ "r",
+ ",",
+ " ",
+ "n",
+ "o",
+ "t",
+ " ",
+ "k",
+ "n",
+ "o",
+ "w",
+ "i",
+ "n",
+ "g",
+ " ",
+ "i",
+ "t",
+ " ",
+ "w",
+ "a",
+ "s",
+ " ",
+ "V",
+ "e",
+ "n",
+ "u",
+ "s",
+ "."
+ ],
+ "characterStartTimesSeconds": [
+ 0,
+ 0.186,
+ 0.255,
+ 0.29,
+ 0.325,
+ 0.36,
+ 0.406,
+ 0.453,
+ 0.522,
+ 0.557,
+ 0.604,
+ 0.627,
+ 0.685,
+ 0.731,
+ 0.882,
+ 0.952,
+ 1.126,
+ 1.161,
+ 1.405,
+ 1.474,
+ 1.556,
+ 1.614,
+ 1.637,
+ 1.695,
+ 1.73,
+ 1.788,
+ 1.834,
+ 1.869,
+ 1.927,
+ 1.962,
+ 1.997,
+ 2.043,
+ 2.113,
+ 2.183,
+ 2.241,
+ 2.31,
+ 2.368,
+ 2.438,
+ 2.485,
+ 2.531,
+ 2.554,
+ 2.612,
+ 2.647,
+ 2.717,
+ 2.763,
+ 2.81,
+ 2.844,
+ 2.879,
+ 2.902,
+ 2.937,
+ 2.961,
+ 2.984,
+ 3.007,
+ 3.042,
+ 3.1,
+ 3.17,
+ 3.448,
+ 3.564,
+ 3.843,
+ 3.901,
+ 3.947,
+ 3.994,
+ 4.04,
+ 4.087,
+ 4.11,
+ 4.145,
+ 4.18,
+ 4.226,
+ 4.261,
+ 4.296,
+ 4.342,
+ 4.365,
+ 4.412,
+ 4.47,
+ 4.516,
+ 4.574,
+ 4.598,
+ 4.621,
+ 4.656,
+ 4.714,
+ 4.76,
+ 4.853,
+ 4.899,
+ 4.957,
+ 4.992,
+ 5.05,
+ 5.108,
+ 5.178,
+ 5.213,
+ 5.248,
+ 5.283,
+ 5.329,
+ 5.41,
+ 5.457,
+ 5.538,
+ 5.689,
+ 5.817,
+ 5.933,
+ 6.142,
+ 6.211,
+ 6.269,
+ 6.304,
+ 6.339,
+ 6.374,
+ 6.409,
+ 6.444,
+ 6.49,
+ 6.548,
+ 6.571,
+ 6.594,
+ 6.641,
+ 6.676,
+ 6.699,
+ 6.734,
+ 6.769,
+ 6.803,
+ 6.838,
+ 6.896,
+ 6.931,
+ 7.001,
+ 7.082,
+ 7.198,
+ 7.314
+ ],
+ "characterEndTimesSeconds": [
+ 0.186,
+ 0.255,
+ 0.29,
+ 0.325,
+ 0.36,
+ 0.406,
+ 0.453,
+ 0.522,
+ 0.557,
+ 0.604,
+ 0.627,
+ 0.685,
+ 0.731,
+ 0.882,
+ 0.952,
+ 1.126,
+ 1.161,
+ 1.405,
+ 1.474,
+ 1.556,
+ 1.614,
+ 1.637,
+ 1.695,
+ 1.73,
+ 1.788,
+ 1.834,
+ 1.869,
+ 1.927,
+ 1.962,
+ 1.997,
+ 2.043,
+ 2.113,
+ 2.183,
+ 2.241,
+ 2.31,
+ 2.368,
+ 2.438,
+ 2.485,
+ 2.531,
+ 2.554,
+ 2.612,
+ 2.647,
+ 2.717,
+ 2.763,
+ 2.81,
+ 2.844,
+ 2.879,
+ 2.902,
+ 2.937,
+ 2.961,
+ 2.984,
+ 3.007,
+ 3.042,
+ 3.1,
+ 3.17,
+ 3.448,
+ 3.564,
+ 3.843,
+ 3.901,
+ 3.947,
+ 3.994,
+ 4.04,
+ 4.087,
+ 4.11,
+ 4.145,
+ 4.18,
+ 4.226,
+ 4.261,
+ 4.296,
+ 4.342,
+ 4.365,
+ 4.412,
+ 4.47,
+ 4.516,
+ 4.574,
+ 4.598,
+ 4.621,
+ 4.656,
+ 4.714,
+ 4.76,
+ 4.853,
+ 4.899,
+ 4.957,
+ 4.992,
+ 5.05,
+ 5.108,
+ 5.178,
+ 5.213,
+ 5.248,
+ 5.283,
+ 5.329,
+ 5.41,
+ 5.457,
+ 5.538,
+ 5.689,
+ 5.817,
+ 5.933,
+ 6.142,
+ 6.211,
+ 6.269,
+ 6.304,
+ 6.339,
+ 6.374,
+ 6.409,
+ 6.444,
+ 6.49,
+ 6.548,
+ 6.571,
+ 6.594,
+ 6.641,
+ 6.676,
+ 6.699,
+ 6.734,
+ 6.769,
+ 6.803,
+ 6.838,
+ 6.896,
+ 6.931,
+ 7.001,
+ 7.082,
+ 7.198,
+ 7.314,
+ 7.616
+ ]
+ }
+ },
+ {
+ "text": "The ancient Romans named it after their goddess of love because of its beautiful glow.",
+ "imageDescription": "A classical Roman courtyard where wise men, women in togas, and children admire Venus's radiant glow in the sky. A statue of the goddess Venus stands prominently, bathed in the same soft, glowing light as the 'star' above, reinforcing the connection between the goddess and the planet.",
+ "uid": "99af6411-714b-4b72-b66e-f6c02a184493",
+ "audioTimestamps": {
+ "characters": [
+ "T",
+ "h",
+ "e",
+ " ",
+ "a",
+ "n",
+ "c",
+ "i",
+ "e",
+ "n",
+ "t",
+ " ",
+ "R",
+ "o",
+ "m",
+ "a",
+ "n",
+ "s",
+ " ",
+ "n",
+ "a",
+ "m",
+ "e",
+ "d",
+ " ",
+ "i",
+ "t",
+ " ",
+ "a",
+ "f",
+ "t",
+ "e",
+ "r",
+ " ",
+ "t",
+ "h",
+ "e",
+ "i",
+ "r",
+ " ",
+ "g",
+ "o",
+ "d",
+ "d",
+ "e",
+ "s",
+ "s",
+ " ",
+ "o",
+ "f",
+ " ",
+ "l",
+ "o",
+ "v",
+ "e",
+ " ",
+ "b",
+ "e",
+ "c",
+ "a",
+ "u",
+ "s",
+ "e",
+ " ",
+ "o",
+ "f",
+ " ",
+ "i",
+ "t",
+ "s",
+ " ",
+ "b",
+ "e",
+ "a",
+ "u",
+ "t",
+ "i",
+ "f",
+ "u",
+ "l",
+ " ",
+ "g",
+ "l",
+ "o",
+ "w",
+ "."
+ ],
+ "characterStartTimesSeconds": [
+ 0,
+ 0.163,
+ 0.209,
+ 0.232,
+ 0.29,
+ 0.325,
+ 0.383,
+ 0.418,
+ 0.464,
+ 0.499,
+ 0.534,
+ 0.557,
+ 0.615,
+ 0.662,
+ 0.743,
+ 0.813,
+ 0.871,
+ 0.917,
+ 0.975,
+ 1.045,
+ 1.091,
+ 1.149,
+ 1.196,
+ 1.242,
+ 1.265,
+ 1.3,
+ 1.335,
+ 1.37,
+ 1.416,
+ 1.474,
+ 1.533,
+ 1.579,
+ 1.614,
+ 1.637,
+ 1.683,
+ 1.707,
+ 1.73,
+ 1.765,
+ 1.8,
+ 1.834,
+ 1.881,
+ 1.927,
+ 1.997,
+ 2.055,
+ 2.09,
+ 2.125,
+ 2.183,
+ 2.229,
+ 2.264,
+ 2.299,
+ 2.322,
+ 2.392,
+ 2.438,
+ 2.519,
+ 2.566,
+ 2.612,
+ 2.659,
+ 2.694,
+ 2.752,
+ 2.798,
+ 2.833,
+ 2.879,
+ 2.914,
+ 2.949,
+ 2.984,
+ 3.007,
+ 3.03,
+ 3.077,
+ 3.111,
+ 3.158,
+ 3.193,
+ 3.239,
+ 3.274,
+ 3.32,
+ 3.367,
+ 3.402,
+ 3.448,
+ 3.495,
+ 3.553,
+ 3.611,
+ 3.657,
+ 3.715,
+ 3.762,
+ 3.843,
+ 3.959,
+ 4.029
+ ],
+ "characterEndTimesSeconds": [
+ 0.163,
+ 0.209,
+ 0.232,
+ 0.29,
+ 0.325,
+ 0.383,
+ 0.418,
+ 0.464,
+ 0.499,
+ 0.534,
+ 0.557,
+ 0.615,
+ 0.662,
+ 0.743,
+ 0.813,
+ 0.871,
+ 0.917,
+ 0.975,
+ 1.045,
+ 1.091,
+ 1.149,
+ 1.196,
+ 1.242,
+ 1.265,
+ 1.3,
+ 1.335,
+ 1.37,
+ 1.416,
+ 1.474,
+ 1.533,
+ 1.579,
+ 1.614,
+ 1.637,
+ 1.683,
+ 1.707,
+ 1.73,
+ 1.765,
+ 1.8,
+ 1.834,
+ 1.881,
+ 1.927,
+ 1.997,
+ 2.055,
+ 2.09,
+ 2.125,
+ 2.183,
+ 2.229,
+ 2.264,
+ 2.299,
+ 2.322,
+ 2.392,
+ 2.438,
+ 2.519,
+ 2.566,
+ 2.612,
+ 2.659,
+ 2.694,
+ 2.752,
+ 2.798,
+ 2.833,
+ 2.879,
+ 2.914,
+ 2.949,
+ 2.984,
+ 3.007,
+ 3.03,
+ 3.077,
+ 3.111,
+ 3.158,
+ 3.193,
+ 3.239,
+ 3.274,
+ 3.32,
+ 3.367,
+ 3.402,
+ 3.448,
+ 3.495,
+ 3.553,
+ 3.611,
+ 3.657,
+ 3.715,
+ 3.762,
+ 3.843,
+ 3.959,
+ 4.029,
+ 4.319
+ ]
+ }
+ },
+ {
+ "text": "Incredibly, there were times it was called both the 'Morning Star' and the 'Evening Star'—no one realized they were the same planet!",
+ "imageDescription": "A magical transition scene showing the same bright planet in a pastel dawn sky labeled 'Morning Star' on one horizon, and again glimmering over a sunset landscape labeled 'Evening Star' on the other. Two groups of people observe at different times, unaware they see the same object.",
+ "uid": "919d538b-3407-440a-b26a-73a5321a3af0",
+ "audioTimestamps": {
+ "characters": [
+ "I",
+ "n",
+ "c",
+ "r",
+ "e",
+ "d",
+ "i",
+ "b",
+ "l",
+ "y",
+ ",",
+ " ",
+ "t",
+ "h",
+ "e",
+ "r",
+ "e",
+ " ",
+ "w",
+ "e",
+ "r",
+ "e",
+ " ",
+ "t",
+ "i",
+ "m",
+ "e",
+ "s",
+ " ",
+ "i",
+ "t",
+ " ",
+ "w",
+ "a",
+ "s",
+ " ",
+ "c",
+ "a",
+ "l",
+ "l",
+ "e",
+ "d",
+ " ",
+ "b",
+ "o",
+ "t",
+ "h",
+ " ",
+ "t",
+ "h",
+ "e",
+ " ",
+ "'",
+ "M",
+ "o",
+ "r",
+ "n",
+ "i",
+ "n",
+ "g",
+ " ",
+ "S",
+ "t",
+ "a",
+ "r",
+ "'",
+ " ",
+ "a",
+ "n",
+ "d",
+ " ",
+ "t",
+ "h",
+ "e",
+ " ",
+ "'",
+ "E",
+ "v",
+ "e",
+ "n",
+ "i",
+ "n",
+ "g",
+ " ",
+ "S",
+ "t",
+ "a",
+ "r",
+ "'",
+ "—",
+ "n",
+ "o",
+ " ",
+ "o",
+ "n",
+ "e",
+ " ",
+ "r",
+ "e",
+ "a",
+ "l",
+ "i",
+ "z",
+ "e",
+ "d",
+ " ",
+ "t",
+ "h",
+ "e",
+ "y",
+ " ",
+ "w",
+ "e",
+ "r",
+ "e",
+ " ",
+ "t",
+ "h",
+ "e",
+ " ",
+ "s",
+ "a",
+ "m",
+ "e",
+ " ",
+ "p",
+ "l",
+ "a",
+ "n",
+ "e",
+ "t",
+ "!"
+ ],
+ "characterStartTimesSeconds": [
+ 0,
+ 0.197,
+ 0.279,
+ 0.337,
+ 0.383,
+ 0.43,
+ 0.488,
+ 0.534,
+ 0.604,
+ 0.673,
+ 0.708,
+ 0.731,
+ 0.755,
+ 0.778,
+ 0.801,
+ 0.836,
+ 0.871,
+ 0.894,
+ 0.929,
+ 0.952,
+ 0.987,
+ 1.022,
+ 1.045,
+ 1.08,
+ 1.126,
+ 1.207,
+ 1.265,
+ 1.324,
+ 1.358,
+ 1.393,
+ 1.428,
+ 1.451,
+ 1.486,
+ 1.509,
+ 1.544,
+ 1.567,
+ 1.625,
+ 1.66,
+ 1.707,
+ 1.741,
+ 1.788,
+ 1.834,
+ 1.858,
+ 1.892,
+ 1.927,
+ 1.974,
+ 2.02,
+ 2.055,
+ 2.09,
+ 2.113,
+ 2.136,
+ 2.159,
+ 2.183,
+ 2.206,
+ 2.252,
+ 2.322,
+ 2.368,
+ 2.415,
+ 2.461,
+ 2.485,
+ 2.519,
+ 2.589,
+ 2.635,
+ 2.705,
+ 2.856,
+ 2.949,
+ 3.123,
+ 3.297,
+ 3.355,
+ 3.402,
+ 3.437,
+ 3.483,
+ 3.506,
+ 3.529,
+ 3.553,
+ 3.587,
+ 3.611,
+ 3.692,
+ 3.738,
+ 3.773,
+ 3.82,
+ 3.866,
+ 3.889,
+ 3.913,
+ 3.982,
+ 4.017,
+ 4.087,
+ 4.203,
+ 4.272,
+ 4.423,
+ 4.69,
+ 4.76,
+ 4.807,
+ 4.865,
+ 4.899,
+ 4.946,
+ 4.981,
+ 5.027,
+ 5.074,
+ 5.132,
+ 5.19,
+ 5.259,
+ 5.341,
+ 5.387,
+ 5.445,
+ 5.468,
+ 5.503,
+ 5.526,
+ 5.55,
+ 5.584,
+ 5.608,
+ 5.642,
+ 5.666,
+ 5.7,
+ 5.724,
+ 5.747,
+ 5.782,
+ 5.805,
+ 5.828,
+ 5.851,
+ 5.886,
+ 5.933,
+ 5.991,
+ 6.037,
+ 6.084,
+ 6.118,
+ 6.165,
+ 6.223,
+ 6.293,
+ 6.362,
+ 6.432,
+ 6.548
+ ],
+ "characterEndTimesSeconds": [
+ 0.197,
+ 0.279,
+ 0.337,
+ 0.383,
+ 0.43,
+ 0.488,
+ 0.534,
+ 0.604,
+ 0.673,
+ 0.708,
+ 0.731,
+ 0.755,
+ 0.778,
+ 0.801,
+ 0.836,
+ 0.871,
+ 0.894,
+ 0.929,
+ 0.952,
+ 0.987,
+ 1.022,
+ 1.045,
+ 1.08,
+ 1.126,
+ 1.207,
+ 1.265,
+ 1.324,
+ 1.358,
+ 1.393,
+ 1.428,
+ 1.451,
+ 1.486,
+ 1.509,
+ 1.544,
+ 1.567,
+ 1.625,
+ 1.66,
+ 1.707,
+ 1.741,
+ 1.788,
+ 1.834,
+ 1.858,
+ 1.892,
+ 1.927,
+ 1.974,
+ 2.02,
+ 2.055,
+ 2.09,
+ 2.113,
+ 2.136,
+ 2.159,
+ 2.183,
+ 2.206,
+ 2.252,
+ 2.322,
+ 2.368,
+ 2.415,
+ 2.461,
+ 2.485,
+ 2.519,
+ 2.589,
+ 2.635,
+ 2.705,
+ 2.856,
+ 2.949,
+ 3.123,
+ 3.297,
+ 3.355,
+ 3.402,
+ 3.437,
+ 3.483,
+ 3.506,
+ 3.529,
+ 3.553,
+ 3.587,
+ 3.611,
+ 3.692,
+ 3.738,
+ 3.773,
+ 3.82,
+ 3.866,
+ 3.889,
+ 3.913,
+ 3.982,
+ 4.017,
+ 4.087,
+ 4.203,
+ 4.272,
+ 4.423,
+ 4.69,
+ 4.76,
+ 4.807,
+ 4.865,
+ 4.899,
+ 4.946,
+ 4.981,
+ 5.027,
+ 5.074,
+ 5.132,
+ 5.19,
+ 5.259,
+ 5.341,
+ 5.387,
+ 5.445,
+ 5.468,
+ 5.503,
+ 5.526,
+ 5.55,
+ 5.584,
+ 5.608,
+ 5.642,
+ 5.666,
+ 5.7,
+ 5.724,
+ 5.747,
+ 5.782,
+ 5.805,
+ 5.828,
+ 5.851,
+ 5.886,
+ 5.933,
+ 5.991,
+ 6.037,
+ 6.084,
+ 6.118,
+ 6.165,
+ 6.223,
+ 6.293,
+ 6.362,
+ 6.432,
+ 6.548,
+ 6.827
+ ]
+ }
+ },
+ {
+ "text": "Unlike any other planet, Venus spins backwards, so the Sun rises in the west and sets in the east.",
+ "imageDescription": "A surreal Venusian landscape with rocky plains and an enormous, thickly clouded sky. The Sun is shown rising in the western part of the sky with unusual shadows, highlighting the alien concept of a backward sunrise.",
+ "uid": "20cf0ab8-49cb-4ead-816d-6af0b588668a",
+ "audioTimestamps": {
+ "characters": [
+ "U",
+ "n",
+ "l",
+ "i",
+ "k",
+ "e",
+ " ",
+ "a",
+ "n",
+ "y",
+ " ",
+ "o",
+ "t",
+ "h",
+ "e",
+ "r",
+ " ",
+ "p",
+ "l",
+ "a",
+ "n",
+ "e",
+ "t",
+ ",",
+ " ",
+ "V",
+ "e",
+ "n",
+ "u",
+ "s",
+ " ",
+ "s",
+ "p",
+ "i",
+ "n",
+ "s",
+ " ",
+ "b",
+ "a",
+ "c",
+ "k",
+ "w",
+ "a",
+ "r",
+ "d",
+ "s",
+ ",",
+ " ",
+ "s",
+ "o",
+ " ",
+ "t",
+ "h",
+ "e",
+ " ",
+ "S",
+ "u",
+ "n",
+ " ",
+ "r",
+ "i",
+ "s",
+ "e",
+ "s",
+ " ",
+ "i",
+ "n",
+ " ",
+ "t",
+ "h",
+ "e",
+ " ",
+ "w",
+ "e",
+ "s",
+ "t",
+ " ",
+ "a",
+ "n",
+ "d",
+ " ",
+ "s",
+ "e",
+ "t",
+ "s",
+ " ",
+ "i",
+ "n",
+ " ",
+ "t",
+ "h",
+ "e",
+ " ",
+ "e",
+ "a",
+ "s",
+ "t",
+ "."
+ ],
+ "characterStartTimesSeconds": [
+ 0,
+ 0.209,
+ 0.29,
+ 0.348,
+ 0.395,
+ 0.441,
+ 0.488,
+ 0.534,
+ 0.569,
+ 0.639,
+ 0.685,
+ 0.743,
+ 0.789,
+ 0.836,
+ 0.859,
+ 0.894,
+ 0.929,
+ 0.987,
+ 1.033,
+ 1.091,
+ 1.161,
+ 1.242,
+ 1.312,
+ 1.428,
+ 1.498,
+ 1.614,
+ 1.683,
+ 1.753,
+ 1.823,
+ 1.892,
+ 1.939,
+ 1.974,
+ 2.02,
+ 2.078,
+ 2.136,
+ 2.194,
+ 2.252,
+ 2.322,
+ 2.368,
+ 2.426,
+ 2.473,
+ 2.531,
+ 2.601,
+ 2.659,
+ 2.705,
+ 2.775,
+ 2.891,
+ 3.042,
+ 3.193,
+ 3.262,
+ 3.332,
+ 3.39,
+ 3.413,
+ 3.437,
+ 3.46,
+ 3.506,
+ 3.553,
+ 3.646,
+ 3.692,
+ 3.762,
+ 3.808,
+ 3.878,
+ 3.936,
+ 4.029,
+ 4.063,
+ 4.11,
+ 4.133,
+ 4.168,
+ 4.203,
+ 4.226,
+ 4.249,
+ 4.272,
+ 4.307,
+ 4.342,
+ 4.458,
+ 4.54,
+ 4.609,
+ 4.679,
+ 4.702,
+ 4.737,
+ 4.772,
+ 4.83,
+ 4.865,
+ 4.946,
+ 5.004,
+ 5.039,
+ 5.085,
+ 5.108,
+ 5.143,
+ 5.178,
+ 5.201,
+ 5.224,
+ 5.248,
+ 5.306,
+ 5.375,
+ 5.433,
+ 5.515,
+ 5.666
+ ],
+ "characterEndTimesSeconds": [
+ 0.209,
+ 0.29,
+ 0.348,
+ 0.395,
+ 0.441,
+ 0.488,
+ 0.534,
+ 0.569,
+ 0.639,
+ 0.685,
+ 0.743,
+ 0.789,
+ 0.836,
+ 0.859,
+ 0.894,
+ 0.929,
+ 0.987,
+ 1.033,
+ 1.091,
+ 1.161,
+ 1.242,
+ 1.312,
+ 1.428,
+ 1.498,
+ 1.614,
+ 1.683,
+ 1.753,
+ 1.823,
+ 1.892,
+ 1.939,
+ 1.974,
+ 2.02,
+ 2.078,
+ 2.136,
+ 2.194,
+ 2.252,
+ 2.322,
+ 2.368,
+ 2.426,
+ 2.473,
+ 2.531,
+ 2.601,
+ 2.659,
+ 2.705,
+ 2.775,
+ 2.891,
+ 3.042,
+ 3.193,
+ 3.262,
+ 3.332,
+ 3.39,
+ 3.413,
+ 3.437,
+ 3.46,
+ 3.506,
+ 3.553,
+ 3.646,
+ 3.692,
+ 3.762,
+ 3.808,
+ 3.878,
+ 3.936,
+ 4.029,
+ 4.063,
+ 4.11,
+ 4.133,
+ 4.168,
+ 4.203,
+ 4.226,
+ 4.249,
+ 4.272,
+ 4.307,
+ 4.342,
+ 4.458,
+ 4.54,
+ 4.609,
+ 4.679,
+ 4.702,
+ 4.737,
+ 4.772,
+ 4.83,
+ 4.865,
+ 4.946,
+ 5.004,
+ 5.039,
+ 5.085,
+ 5.108,
+ 5.143,
+ 5.178,
+ 5.201,
+ 5.224,
+ 5.248,
+ 5.306,
+ 5.375,
+ 5.433,
+ 5.515,
+ 5.666,
+ 5.991
+ ]
+ }
+ },
+ {
+ "text": "Its days are longer than its years, making time seem strange up there.",
+ "imageDescription": "A dreamlike, time-warped scene featuring the surface of Venus with swirling clocks melting over jagged rocks and a skewed horizon hinting at an odd flow of time—a visual metaphor for days lasting longer than years.",
+ "uid": "11f4911a-f39f-4567-8963-41511d05b593",
+ "audioTimestamps": {
+ "characters": [
+ "I",
+ "t",
+ "s",
+ " ",
+ "d",
+ "a",
+ "y",
+ "s",
+ " ",
+ "a",
+ "r",
+ "e",
+ " ",
+ "l",
+ "o",
+ "n",
+ "g",
+ "e",
+ "r",
+ " ",
+ "t",
+ "h",
+ "a",
+ "n",
+ " ",
+ "i",
+ "t",
+ "s",
+ " ",
+ "y",
+ "e",
+ "a",
+ "r",
+ "s",
+ ",",
+ " ",
+ "m",
+ "a",
+ "k",
+ "i",
+ "n",
+ "g",
+ " ",
+ "t",
+ "i",
+ "m",
+ "e",
+ " ",
+ "s",
+ "e",
+ "e",
+ "m",
+ " ",
+ "s",
+ "t",
+ "r",
+ "a",
+ "n",
+ "g",
+ "e",
+ " ",
+ "u",
+ "p",
+ " ",
+ "t",
+ "h",
+ "e",
+ "r",
+ "e",
+ "."
+ ],
+ "characterStartTimesSeconds": [
+ 0,
+ 0.232,
+ 0.29,
+ 0.337,
+ 0.383,
+ 0.43,
+ 0.488,
+ 0.546,
+ 0.592,
+ 0.627,
+ 0.662,
+ 0.708,
+ 0.731,
+ 0.766,
+ 0.813,
+ 0.882,
+ 0.929,
+ 0.987,
+ 1.033,
+ 1.068,
+ 1.115,
+ 1.138,
+ 1.173,
+ 1.219,
+ 1.242,
+ 1.289,
+ 1.324,
+ 1.37,
+ 1.405,
+ 1.463,
+ 1.509,
+ 1.567,
+ 1.614,
+ 1.73,
+ 1.881,
+ 2.055,
+ 2.264,
+ 2.322,
+ 2.368,
+ 2.426,
+ 2.485,
+ 2.519,
+ 2.543,
+ 2.589,
+ 2.635,
+ 2.717,
+ 2.775,
+ 2.821,
+ 2.856,
+ 2.902,
+ 2.949,
+ 3.007,
+ 3.053,
+ 3.123,
+ 3.17,
+ 3.216,
+ 3.274,
+ 3.332,
+ 3.39,
+ 3.448,
+ 3.495,
+ 3.529,
+ 3.576,
+ 3.622,
+ 3.669,
+ 3.692,
+ 3.715,
+ 3.773,
+ 3.82,
+ 3.947
+ ],
+ "characterEndTimesSeconds": [
+ 0.232,
+ 0.29,
+ 0.337,
+ 0.383,
+ 0.43,
+ 0.488,
+ 0.546,
+ 0.592,
+ 0.627,
+ 0.662,
+ 0.708,
+ 0.731,
+ 0.766,
+ 0.813,
+ 0.882,
+ 0.929,
+ 0.987,
+ 1.033,
+ 1.068,
+ 1.115,
+ 1.138,
+ 1.173,
+ 1.219,
+ 1.242,
+ 1.289,
+ 1.324,
+ 1.37,
+ 1.405,
+ 1.463,
+ 1.509,
+ 1.567,
+ 1.614,
+ 1.73,
+ 1.881,
+ 2.055,
+ 2.264,
+ 2.322,
+ 2.368,
+ 2.426,
+ 2.485,
+ 2.519,
+ 2.543,
+ 2.589,
+ 2.635,
+ 2.717,
+ 2.775,
+ 2.821,
+ 2.856,
+ 2.902,
+ 2.949,
+ 3.007,
+ 3.053,
+ 3.123,
+ 3.17,
+ 3.216,
+ 3.274,
+ 3.332,
+ 3.39,
+ 3.448,
+ 3.495,
+ 3.529,
+ 3.576,
+ 3.622,
+ 3.669,
+ 3.692,
+ 3.715,
+ 3.773,
+ 3.82,
+ 3.947,
+ 4.133
+ ]
+ }
+ },
+ {
+ "text": "Volcanoes cover much of its surface, but thick clouds of toxic gas hide them from our view.",
+ "imageDescription": "A dramatic, cross-section image showing tall, craggy volcanoes erupting on Venus’s surface, with waves of bright lava flows partially obscured by dense, swirling yellow-brown clouds, conveying the mysterious hidden world beneath.",
+ "uid": "5584e376-d02e-48fc-9e47-fc7bf86000af",
+ "audioTimestamps": {
+ "characters": [
+ "V",
+ "o",
+ "l",
+ "c",
+ "a",
+ "n",
+ "o",
+ "e",
+ "s",
+ " ",
+ "c",
+ "o",
+ "v",
+ "e",
+ "r",
+ " ",
+ "m",
+ "u",
+ "c",
+ "h",
+ " ",
+ "o",
+ "f",
+ " ",
+ "i",
+ "t",
+ "s",
+ " ",
+ "s",
+ "u",
+ "r",
+ "f",
+ "a",
+ "c",
+ "e",
+ ",",
+ " ",
+ "b",
+ "u",
+ "t",
+ " ",
+ "t",
+ "h",
+ "i",
+ "c",
+ "k",
+ " ",
+ "c",
+ "l",
+ "o",
+ "u",
+ "d",
+ "s",
+ " ",
+ "o",
+ "f",
+ " ",
+ "t",
+ "o",
+ "x",
+ "i",
+ "c",
+ " ",
+ "g",
+ "a",
+ "s",
+ " ",
+ "h",
+ "i",
+ "d",
+ "e",
+ " ",
+ "t",
+ "h",
+ "e",
+ "m",
+ " ",
+ "f",
+ "r",
+ "o",
+ "m",
+ " ",
+ "o",
+ "u",
+ "r",
+ " ",
+ "v",
+ "i",
+ "e",
+ "w",
+ "."
+ ],
+ "characterStartTimesSeconds": [
+ 0,
+ 0.209,
+ 0.267,
+ 0.313,
+ 0.372,
+ 0.464,
+ 0.546,
+ 0.592,
+ 0.65,
+ 0.685,
+ 0.743,
+ 0.778,
+ 0.848,
+ 0.894,
+ 0.94,
+ 0.975,
+ 1.045,
+ 1.08,
+ 1.138,
+ 1.184,
+ 1.219,
+ 1.254,
+ 1.277,
+ 1.312,
+ 1.358,
+ 1.393,
+ 1.44,
+ 1.474,
+ 1.498,
+ 1.533,
+ 1.591,
+ 1.649,
+ 1.707,
+ 1.8,
+ 1.858,
+ 2.009,
+ 2.032,
+ 2.148,
+ 2.218,
+ 2.276,
+ 2.322,
+ 2.38,
+ 2.403,
+ 2.461,
+ 2.508,
+ 2.554,
+ 2.589,
+ 2.647,
+ 2.682,
+ 2.752,
+ 2.81,
+ 2.856,
+ 2.914,
+ 2.961,
+ 2.995,
+ 3.019,
+ 3.053,
+ 3.111,
+ 3.158,
+ 3.309,
+ 3.402,
+ 3.495,
+ 3.541,
+ 3.587,
+ 3.646,
+ 3.82,
+ 3.889,
+ 3.959,
+ 4.017,
+ 4.087,
+ 4.133,
+ 4.18,
+ 4.214,
+ 4.238,
+ 4.261,
+ 4.296,
+ 4.331,
+ 4.389,
+ 4.412,
+ 4.447,
+ 4.481,
+ 4.516,
+ 4.563,
+ 4.598,
+ 4.632,
+ 4.667,
+ 4.714,
+ 4.76,
+ 4.807,
+ 4.853,
+ 4.934
+ ],
+ "characterEndTimesSeconds": [
+ 0.209,
+ 0.267,
+ 0.313,
+ 0.372,
+ 0.464,
+ 0.546,
+ 0.592,
+ 0.65,
+ 0.685,
+ 0.743,
+ 0.778,
+ 0.848,
+ 0.894,
+ 0.94,
+ 0.975,
+ 1.045,
+ 1.08,
+ 1.138,
+ 1.184,
+ 1.219,
+ 1.254,
+ 1.277,
+ 1.312,
+ 1.358,
+ 1.393,
+ 1.44,
+ 1.474,
+ 1.498,
+ 1.533,
+ 1.591,
+ 1.649,
+ 1.707,
+ 1.8,
+ 1.858,
+ 2.009,
+ 2.032,
+ 2.148,
+ 2.218,
+ 2.276,
+ 2.322,
+ 2.38,
+ 2.403,
+ 2.461,
+ 2.508,
+ 2.554,
+ 2.589,
+ 2.647,
+ 2.682,
+ 2.752,
+ 2.81,
+ 2.856,
+ 2.914,
+ 2.961,
+ 2.995,
+ 3.019,
+ 3.053,
+ 3.111,
+ 3.158,
+ 3.309,
+ 3.402,
+ 3.495,
+ 3.541,
+ 3.587,
+ 3.646,
+ 3.82,
+ 3.889,
+ 3.959,
+ 4.017,
+ 4.087,
+ 4.133,
+ 4.18,
+ 4.214,
+ 4.238,
+ 4.261,
+ 4.296,
+ 4.331,
+ 4.389,
+ 4.412,
+ 4.447,
+ 4.481,
+ 4.516,
+ 4.563,
+ 4.598,
+ 4.632,
+ 4.667,
+ 4.714,
+ 4.76,
+ 4.807,
+ 4.853,
+ 4.934,
+ 5.201
+ ]
+ }
+ },
+ {
+ "text": "Although it is Earth's twin in size, Venus is the hottest planet, with surface temperatures high enough to melt lead.",
+ "imageDescription": "A comparative illustration showing Venus and Earth side by side in space, similar in size, but with Venus’s surface glowing intensely red and orange to represent extreme heat; a thermometer graphic dramatically exceeding the melting point of lead.",
+ "uid": "33b24fbd-dc71-4692-87af-fdff7661c222",
+ "audioTimestamps": {
+ "characters": [
+ "A",
+ "l",
+ "t",
+ "h",
+ "o",
+ "u",
+ "g",
+ "h",
+ " ",
+ "i",
+ "t",
+ " ",
+ "i",
+ "s",
+ " ",
+ "E",
+ "a",
+ "r",
+ "t",
+ "h",
+ "'",
+ "s",
+ " ",
+ "t",
+ "w",
+ "i",
+ "n",
+ " ",
+ "i",
+ "n",
+ " ",
+ "s",
+ "i",
+ "z",
+ "e",
+ ",",
+ " ",
+ "V",
+ "e",
+ "n",
+ "u",
+ "s",
+ " ",
+ "i",
+ "s",
+ " ",
+ "t",
+ "h",
+ "e",
+ " ",
+ "h",
+ "o",
+ "t",
+ "t",
+ "e",
+ "s",
+ "t",
+ " ",
+ "p",
+ "l",
+ "a",
+ "n",
+ "e",
+ "t",
+ ",",
+ " ",
+ "w",
+ "i",
+ "t",
+ "h",
+ " ",
+ "s",
+ "u",
+ "r",
+ "f",
+ "a",
+ "c",
+ "e",
+ " ",
+ "t",
+ "e",
+ "m",
+ "p",
+ "e",
+ "r",
+ "a",
+ "t",
+ "u",
+ "r",
+ "e",
+ "s",
+ " ",
+ "h",
+ "i",
+ "g",
+ "h",
+ " ",
+ "e",
+ "n",
+ "o",
+ "u",
+ "g",
+ "h",
+ " ",
+ "t",
+ "o",
+ " ",
+ "m",
+ "e",
+ "l",
+ "t",
+ " ",
+ "l",
+ "e",
+ "a",
+ "d",
+ "."
+ ],
+ "characterStartTimesSeconds": [
+ 0,
+ 0.221,
+ 0.279,
+ 0.313,
+ 0.337,
+ 0.372,
+ 0.395,
+ 0.43,
+ 0.453,
+ 0.488,
+ 0.511,
+ 0.546,
+ 0.58,
+ 0.627,
+ 0.662,
+ 0.72,
+ 0.755,
+ 0.789,
+ 0.824,
+ 0.882,
+ 0.906,
+ 0.952,
+ 0.987,
+ 1.022,
+ 1.08,
+ 1.149,
+ 1.231,
+ 1.277,
+ 1.335,
+ 1.37,
+ 1.405,
+ 1.486,
+ 1.544,
+ 1.753,
+ 1.823,
+ 1.997,
+ 2.032,
+ 2.206,
+ 2.276,
+ 2.345,
+ 2.426,
+ 2.508,
+ 2.554,
+ 2.612,
+ 2.659,
+ 2.694,
+ 2.74,
+ 2.763,
+ 2.786,
+ 2.81,
+ 2.856,
+ 2.902,
+ 2.949,
+ 2.995,
+ 3.042,
+ 3.088,
+ 3.123,
+ 3.158,
+ 3.204,
+ 3.251,
+ 3.309,
+ 3.379,
+ 3.46,
+ 3.529,
+ 3.646,
+ 3.762,
+ 3.971,
+ 4.029,
+ 4.075,
+ 4.11,
+ 4.145,
+ 4.191,
+ 4.238,
+ 4.284,
+ 4.342,
+ 4.389,
+ 4.447,
+ 4.493,
+ 4.516,
+ 4.551,
+ 4.574,
+ 4.621,
+ 4.667,
+ 4.702,
+ 4.737,
+ 4.772,
+ 4.807,
+ 4.853,
+ 4.899,
+ 4.946,
+ 4.992,
+ 5.016,
+ 5.074,
+ 5.108,
+ 5.166,
+ 5.201,
+ 5.236,
+ 5.271,
+ 5.306,
+ 5.352,
+ 5.387,
+ 5.422,
+ 5.457,
+ 5.492,
+ 5.538,
+ 5.561,
+ 5.596,
+ 5.666,
+ 5.701,
+ 5.747,
+ 5.793,
+ 5.84,
+ 5.898,
+ 5.944,
+ 6.014,
+ 6.072,
+ 6.188
+ ],
+ "characterEndTimesSeconds": [
+ 0.221,
+ 0.279,
+ 0.313,
+ 0.337,
+ 0.372,
+ 0.395,
+ 0.43,
+ 0.453,
+ 0.488,
+ 0.511,
+ 0.546,
+ 0.58,
+ 0.627,
+ 0.662,
+ 0.72,
+ 0.755,
+ 0.789,
+ 0.824,
+ 0.882,
+ 0.906,
+ 0.952,
+ 0.987,
+ 1.022,
+ 1.08,
+ 1.149,
+ 1.231,
+ 1.277,
+ 1.335,
+ 1.37,
+ 1.405,
+ 1.486,
+ 1.544,
+ 1.753,
+ 1.823,
+ 1.997,
+ 2.032,
+ 2.206,
+ 2.276,
+ 2.345,
+ 2.426,
+ 2.508,
+ 2.554,
+ 2.612,
+ 2.659,
+ 2.694,
+ 2.74,
+ 2.763,
+ 2.786,
+ 2.81,
+ 2.856,
+ 2.902,
+ 2.949,
+ 2.995,
+ 3.042,
+ 3.088,
+ 3.123,
+ 3.158,
+ 3.204,
+ 3.251,
+ 3.309,
+ 3.379,
+ 3.46,
+ 3.529,
+ 3.646,
+ 3.762,
+ 3.971,
+ 4.029,
+ 4.075,
+ 4.11,
+ 4.145,
+ 4.191,
+ 4.238,
+ 4.284,
+ 4.342,
+ 4.389,
+ 4.447,
+ 4.493,
+ 4.516,
+ 4.551,
+ 4.574,
+ 4.621,
+ 4.667,
+ 4.702,
+ 4.737,
+ 4.772,
+ 4.807,
+ 4.853,
+ 4.899,
+ 4.946,
+ 4.992,
+ 5.016,
+ 5.074,
+ 5.108,
+ 5.166,
+ 5.201,
+ 5.236,
+ 5.271,
+ 5.306,
+ 5.352,
+ 5.387,
+ 5.422,
+ 5.457,
+ 5.492,
+ 5.538,
+ 5.561,
+ 5.596,
+ 5.666,
+ 5.701,
+ 5.747,
+ 5.793,
+ 5.84,
+ 5.898,
+ 5.944,
+ 6.014,
+ 6.072,
+ 6.188,
+ 6.409
+ ]
+ }
+ },
+ {
+ "text": "Despite its harsh environment, it continues to spark our imagination, reminding us that mysteries often hide in plain sight. People dream that one day, we might find a way to explore its hidden secrets up close.",
+ "imageDescription": "An imaginative vision of future explorers in advanced protective suits standing beside a futuristic spacecraft on Venus’s surface. Swirling clouds and shimmering hazes fill the sky, while the explorers look out with wonder, symbolizing hope and the human thirst for discovery.",
+ "uid": "90917ba0-8b7c-4309-a784-4f1fdc28d9fb",
+ "audioTimestamps": {
+ "characters": [
+ "D",
+ "e",
+ "s",
+ "p",
+ "i",
+ "t",
+ "e",
+ " ",
+ "i",
+ "t",
+ "s",
+ " ",
+ "h",
+ "a",
+ "r",
+ "s",
+ "h",
+ " ",
+ "e",
+ "n",
+ "v",
+ "i",
+ "r",
+ "o",
+ "n",
+ "m",
+ "e",
+ "n",
+ "t",
+ ",",
+ " ",
+ "i",
+ "t",
+ " ",
+ "c",
+ "o",
+ "n",
+ "t",
+ "i",
+ "n",
+ "u",
+ "e",
+ "s",
+ " ",
+ "t",
+ "o",
+ " ",
+ "s",
+ "p",
+ "a",
+ "r",
+ "k",
+ " ",
+ "o",
+ "u",
+ "r",
+ " ",
+ "i",
+ "m",
+ "a",
+ "g",
+ "i",
+ "n",
+ "a",
+ "t",
+ "i",
+ "o",
+ "n",
+ ",",
+ " ",
+ "r",
+ "e",
+ "m",
+ "i",
+ "n",
+ "d",
+ "i",
+ "n",
+ "g",
+ " ",
+ "u",
+ "s",
+ " ",
+ "t",
+ "h",
+ "a",
+ "t",
+ " ",
+ "m",
+ "y",
+ "s",
+ "t",
+ "e",
+ "r",
+ "i",
+ "e",
+ "s",
+ " ",
+ "o",
+ "f",
+ "t",
+ "e",
+ "n",
+ " ",
+ "h",
+ "i",
+ "d",
+ "e",
+ " ",
+ "i",
+ "n",
+ " ",
+ "p",
+ "l",
+ "a",
+ "i",
+ "n",
+ " ",
+ "s",
+ "i",
+ "g",
+ "h",
+ "t",
+ ".",
+ " ",
+ "P",
+ "e",
+ "o",
+ "p",
+ "l",
+ "e",
+ " ",
+ "d",
+ "r",
+ "e",
+ "a",
+ "m",
+ " ",
+ "t",
+ "h",
+ "a",
+ "t",
+ " ",
+ "o",
+ "n",
+ "e",
+ " ",
+ "d",
+ "a",
+ "y",
+ ",",
+ " ",
+ "w",
+ "e",
+ " ",
+ "m",
+ "i",
+ "g",
+ "h",
+ "t",
+ " ",
+ "f",
+ "i",
+ "n",
+ "d",
+ " ",
+ "a",
+ " ",
+ "w",
+ "a",
+ "y",
+ " ",
+ "t",
+ "o",
+ " ",
+ "e",
+ "x",
+ "p",
+ "l",
+ "o",
+ "r",
+ "e",
+ " ",
+ "i",
+ "t",
+ "s",
+ " ",
+ "h",
+ "i",
+ "d",
+ "d",
+ "e",
+ "n",
+ " ",
+ "s",
+ "e",
+ "c",
+ "r",
+ "e",
+ "t",
+ "s",
+ " ",
+ "u",
+ "p",
+ " ",
+ "c",
+ "l",
+ "o",
+ "s",
+ "e",
+ "."
+ ],
+ "characterStartTimesSeconds": [
+ 0,
+ 0.197,
+ 0.267,
+ 0.325,
+ 0.406,
+ 0.464,
+ 0.522,
+ 0.569,
+ 0.604,
+ 0.639,
+ 0.685,
+ 0.72,
+ 0.778,
+ 0.813,
+ 0.871,
+ 0.929,
+ 0.975,
+ 1.01,
+ 1.057,
+ 1.091,
+ 1.138,
+ 1.196,
+ 1.289,
+ 1.347,
+ 1.393,
+ 1.44,
+ 1.486,
+ 1.544,
+ 1.591,
+ 1.707,
+ 1.823,
+ 2.032,
+ 2.101,
+ 2.148,
+ 2.194,
+ 2.218,
+ 2.264,
+ 2.322,
+ 2.38,
+ 2.438,
+ 2.519,
+ 2.577,
+ 2.647,
+ 2.67,
+ 2.717,
+ 2.74,
+ 2.775,
+ 2.833,
+ 2.879,
+ 2.949,
+ 2.995,
+ 3.053,
+ 3.123,
+ 3.181,
+ 3.228,
+ 3.262,
+ 3.286,
+ 3.332,
+ 3.367,
+ 3.425,
+ 3.495,
+ 3.553,
+ 3.611,
+ 3.68,
+ 3.773,
+ 3.843,
+ 3.901,
+ 3.947,
+ 4.063,
+ 4.214,
+ 4.54,
+ 4.598,
+ 4.656,
+ 4.725,
+ 4.795,
+ 4.841,
+ 4.888,
+ 4.957,
+ 4.981,
+ 5.004,
+ 5.074,
+ 5.143,
+ 5.236,
+ 5.317,
+ 5.341,
+ 5.399,
+ 5.433,
+ 5.468,
+ 5.526,
+ 5.573,
+ 5.631,
+ 5.7,
+ 5.759,
+ 5.805,
+ 5.863,
+ 5.921,
+ 5.979,
+ 6.026,
+ 6.107,
+ 6.153,
+ 6.246,
+ 6.316,
+ 6.362,
+ 6.397,
+ 6.455,
+ 6.502,
+ 6.594,
+ 6.653,
+ 6.687,
+ 6.722,
+ 6.757,
+ 6.78,
+ 6.838,
+ 6.885,
+ 6.931,
+ 6.978,
+ 7.036,
+ 7.07,
+ 7.14,
+ 7.198,
+ 7.279,
+ 7.326,
+ 7.361,
+ 7.477,
+ 7.57,
+ 8.266,
+ 8.336,
+ 8.394,
+ 8.44,
+ 8.499,
+ 8.557,
+ 8.603,
+ 8.649,
+ 8.707,
+ 8.766,
+ 8.812,
+ 8.87,
+ 8.928,
+ 8.986,
+ 9.009,
+ 9.044,
+ 9.079,
+ 9.114,
+ 9.172,
+ 9.242,
+ 9.311,
+ 9.358,
+ 9.404,
+ 9.451,
+ 9.567,
+ 9.718,
+ 9.868,
+ 10.112,
+ 10.182,
+ 10.24,
+ 10.298,
+ 10.344,
+ 10.391,
+ 10.426,
+ 10.461,
+ 10.495,
+ 10.542,
+ 10.6,
+ 10.67,
+ 10.728,
+ 10.751,
+ 10.809,
+ 10.832,
+ 10.879,
+ 10.913,
+ 10.971,
+ 11.018,
+ 11.088,
+ 11.122,
+ 11.157,
+ 11.238,
+ 11.285,
+ 11.366,
+ 11.447,
+ 11.517,
+ 11.587,
+ 11.633,
+ 11.668,
+ 11.714,
+ 11.749,
+ 11.796,
+ 11.842,
+ 11.889,
+ 11.923,
+ 11.97,
+ 12.016,
+ 12.051,
+ 12.098,
+ 12.132,
+ 12.202,
+ 12.249,
+ 12.341,
+ 12.411,
+ 12.469,
+ 12.516,
+ 12.585,
+ 12.632,
+ 12.678,
+ 12.736,
+ 12.783,
+ 12.852,
+ 12.899,
+ 12.98,
+ 13.096,
+ 13.166,
+ 13.41
+ ],
+ "characterEndTimesSeconds": [
+ 0.197,
+ 0.267,
+ 0.325,
+ 0.406,
+ 0.464,
+ 0.522,
+ 0.569,
+ 0.604,
+ 0.639,
+ 0.685,
+ 0.72,
+ 0.778,
+ 0.813,
+ 0.871,
+ 0.929,
+ 0.975,
+ 1.01,
+ 1.057,
+ 1.091,
+ 1.138,
+ 1.196,
+ 1.289,
+ 1.347,
+ 1.393,
+ 1.44,
+ 1.486,
+ 1.544,
+ 1.591,
+ 1.707,
+ 1.823,
+ 2.032,
+ 2.101,
+ 2.148,
+ 2.194,
+ 2.218,
+ 2.264,
+ 2.322,
+ 2.38,
+ 2.438,
+ 2.519,
+ 2.577,
+ 2.647,
+ 2.67,
+ 2.717,
+ 2.74,
+ 2.775,
+ 2.833,
+ 2.879,
+ 2.949,
+ 2.995,
+ 3.053,
+ 3.123,
+ 3.181,
+ 3.228,
+ 3.262,
+ 3.286,
+ 3.332,
+ 3.367,
+ 3.425,
+ 3.495,
+ 3.553,
+ 3.611,
+ 3.68,
+ 3.773,
+ 3.843,
+ 3.901,
+ 3.947,
+ 4.063,
+ 4.214,
+ 4.54,
+ 4.598,
+ 4.656,
+ 4.725,
+ 4.795,
+ 4.841,
+ 4.888,
+ 4.957,
+ 4.981,
+ 5.004,
+ 5.074,
+ 5.143,
+ 5.236,
+ 5.317,
+ 5.341,
+ 5.399,
+ 5.433,
+ 5.468,
+ 5.526,
+ 5.573,
+ 5.631,
+ 5.7,
+ 5.759,
+ 5.805,
+ 5.863,
+ 5.921,
+ 5.979,
+ 6.026,
+ 6.107,
+ 6.153,
+ 6.246,
+ 6.316,
+ 6.362,
+ 6.397,
+ 6.455,
+ 6.502,
+ 6.594,
+ 6.653,
+ 6.687,
+ 6.722,
+ 6.757,
+ 6.78,
+ 6.838,
+ 6.885,
+ 6.931,
+ 6.978,
+ 7.036,
+ 7.07,
+ 7.14,
+ 7.198,
+ 7.279,
+ 7.326,
+ 7.361,
+ 7.477,
+ 7.57,
+ 8.266,
+ 8.336,
+ 8.394,
+ 8.44,
+ 8.499,
+ 8.557,
+ 8.603,
+ 8.649,
+ 8.707,
+ 8.766,
+ 8.812,
+ 8.87,
+ 8.928,
+ 8.986,
+ 9.009,
+ 9.044,
+ 9.079,
+ 9.114,
+ 9.172,
+ 9.242,
+ 9.311,
+ 9.358,
+ 9.404,
+ 9.451,
+ 9.567,
+ 9.718,
+ 9.868,
+ 10.112,
+ 10.182,
+ 10.24,
+ 10.298,
+ 10.344,
+ 10.391,
+ 10.426,
+ 10.461,
+ 10.495,
+ 10.542,
+ 10.6,
+ 10.67,
+ 10.728,
+ 10.751,
+ 10.809,
+ 10.832,
+ 10.879,
+ 10.913,
+ 10.971,
+ 11.018,
+ 11.088,
+ 11.122,
+ 11.157,
+ 11.238,
+ 11.285,
+ 11.366,
+ 11.447,
+ 11.517,
+ 11.587,
+ 11.633,
+ 11.668,
+ 11.714,
+ 11.749,
+ 11.796,
+ 11.842,
+ 11.889,
+ 11.923,
+ 11.97,
+ 12.016,
+ 12.051,
+ 12.098,
+ 12.132,
+ 12.202,
+ 12.249,
+ 12.341,
+ 12.411,
+ 12.469,
+ 12.516,
+ 12.585,
+ 12.632,
+ 12.678,
+ 12.736,
+ 12.783,
+ 12.852,
+ 12.899,
+ 12.98,
+ 13.096,
+ 13.166,
+ 13.41,
+ 13.56
+ ]
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/template-ai-video/public/content/history_of_venus/images/11f4911a-f39f-4567-8963-41511d05b593.png b/packages/template-ai-video/public/content/history_of_venus/images/11f4911a-f39f-4567-8963-41511d05b593.png
new file mode 100644
index 0000000000..0668858b44
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/images/11f4911a-f39f-4567-8963-41511d05b593.png differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/images/20cf0ab8-49cb-4ead-816d-6af0b588668a.png b/packages/template-ai-video/public/content/history_of_venus/images/20cf0ab8-49cb-4ead-816d-6af0b588668a.png
new file mode 100644
index 0000000000..f3bcda5fc9
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/images/20cf0ab8-49cb-4ead-816d-6af0b588668a.png differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/images/33b24fbd-dc71-4692-87af-fdff7661c222.png b/packages/template-ai-video/public/content/history_of_venus/images/33b24fbd-dc71-4692-87af-fdff7661c222.png
new file mode 100644
index 0000000000..c9abdb6f3e
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/images/33b24fbd-dc71-4692-87af-fdff7661c222.png differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/images/5584e376-d02e-48fc-9e47-fc7bf86000af.png b/packages/template-ai-video/public/content/history_of_venus/images/5584e376-d02e-48fc-9e47-fc7bf86000af.png
new file mode 100644
index 0000000000..b204078679
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/images/5584e376-d02e-48fc-9e47-fc7bf86000af.png differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/images/83e869e5-18fd-4de9-b70f-dc0f180da912.png b/packages/template-ai-video/public/content/history_of_venus/images/83e869e5-18fd-4de9-b70f-dc0f180da912.png
new file mode 100644
index 0000000000..ccfd4a4c60
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/images/83e869e5-18fd-4de9-b70f-dc0f180da912.png differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/images/90917ba0-8b7c-4309-a784-4f1fdc28d9fb.png b/packages/template-ai-video/public/content/history_of_venus/images/90917ba0-8b7c-4309-a784-4f1fdc28d9fb.png
new file mode 100644
index 0000000000..a4b85bc60b
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/images/90917ba0-8b7c-4309-a784-4f1fdc28d9fb.png differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/images/919d538b-3407-440a-b26a-73a5321a3af0.png b/packages/template-ai-video/public/content/history_of_venus/images/919d538b-3407-440a-b26a-73a5321a3af0.png
new file mode 100644
index 0000000000..d5ae39fe4c
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/images/919d538b-3407-440a-b26a-73a5321a3af0.png differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/images/99af6411-714b-4b72-b66e-f6c02a184493.png b/packages/template-ai-video/public/content/history_of_venus/images/99af6411-714b-4b72-b66e-f6c02a184493.png
new file mode 100644
index 0000000000..0c48cb8cef
Binary files /dev/null and b/packages/template-ai-video/public/content/history_of_venus/images/99af6411-714b-4b72-b66e-f6c02a184493.png differ
diff --git a/packages/template-ai-video/public/content/history_of_venus/timeline.json b/packages/template-ai-video/public/content/history_of_venus/timeline.json
new file mode 100644
index 0000000000..95bc2d04c2
--- /dev/null
+++ b/packages/template-ai-video/public/content/history_of_venus/timeline.json
@@ -0,0 +1,2208 @@
+{
+ "elements": [
+ {
+ "startMs": 0,
+ "endMs": 7616,
+ "imageUrl": "83e869e5-18fd-4de9-b70f-dc0f180da912",
+ "enterTransition": "blur",
+ "exitTransition": "blur",
+ "animations": [
+ {
+ "type": "scale",
+ "from": 1.5,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 7616
+ },
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": -7.105360115918952,
+ "startMs": 0,
+ "endMs": 7616
+ }
+ ]
+ },
+ {
+ "startMs": 7616,
+ "endMs": 11935,
+ "imageUrl": "99af6411-714b-4b72-b66e-f6c02a184493",
+ "enterTransition": "blur",
+ "exitTransition": "blur",
+ "animations": [
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.5,
+ "startMs": 0,
+ "endMs": 4319
+ },
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": -4.835479712748861,
+ "startMs": 0,
+ "endMs": 4319
+ }
+ ]
+ },
+ {
+ "startMs": 11935,
+ "endMs": 18762,
+ "imageUrl": "919d538b-3407-440a-b26a-73a5321a3af0",
+ "enterTransition": "blur",
+ "exitTransition": "blur",
+ "animations": [
+ {
+ "type": "scale",
+ "from": 1.5,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 6827
+ },
+ {
+ "type": "rotate",
+ "from": 1.9870856892182087,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 6827
+ }
+ ]
+ },
+ {
+ "startMs": 18762,
+ "endMs": 24753,
+ "imageUrl": "20cf0ab8-49cb-4ead-816d-6af0b588668a",
+ "enterTransition": "blur",
+ "exitTransition": "blur",
+ "animations": [
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.5,
+ "startMs": 0,
+ "endMs": 5991
+ },
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": -8.6385189197096,
+ "startMs": 0,
+ "endMs": 5991
+ }
+ ]
+ },
+ {
+ "startMs": 24753,
+ "endMs": 28886,
+ "imageUrl": "11f4911a-f39f-4567-8963-41511d05b593",
+ "enterTransition": "blur",
+ "exitTransition": "blur",
+ "animations": [
+ {
+ "type": "scale",
+ "from": 1.5,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 4133
+ },
+ {
+ "type": "rotate",
+ "from": 1.0522832008779737,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 4133
+ }
+ ]
+ },
+ {
+ "startMs": 28886,
+ "endMs": 34087,
+ "imageUrl": "5584e376-d02e-48fc-9e47-fc7bf86000af",
+ "enterTransition": "blur",
+ "exitTransition": "blur",
+ "animations": [
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.5,
+ "startMs": 0,
+ "endMs": 5201
+ },
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 1.3607085888199189,
+ "startMs": 0,
+ "endMs": 5201
+ }
+ ]
+ },
+ {
+ "startMs": 34087,
+ "endMs": 40496,
+ "imageUrl": "33b24fbd-dc71-4692-87af-fdff7661c222",
+ "enterTransition": "blur",
+ "exitTransition": "blur",
+ "animations": [
+ {
+ "type": "scale",
+ "from": 1.5,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 6409
+ },
+ {
+ "type": "rotate",
+ "from": -4.804644959713991,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 6409
+ }
+ ]
+ },
+ {
+ "startMs": 40496,
+ "endMs": 54056,
+ "imageUrl": "90917ba0-8b7c-4309-a784-4f1fdc28d9fb",
+ "enterTransition": "blur",
+ "exitTransition": "blur",
+ "animations": [
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.5,
+ "startMs": 0,
+ "endMs": 13560
+ },
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": -2.2489889673202015,
+ "startMs": 0,
+ "endMs": 13560
+ }
+ ]
+ }
+ ],
+ "text": [
+ {
+ "startMs": 0,
+ "endMs": 685,
+ "text": "Once upon a",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 685,
+ "endMs": 1695,
+ "text": "time, long",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5070892202427698,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 1695,
+ "endMs": 1997,
+ "text": "before",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 7.41129280579405,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.650247613480069,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 1997,
+ "endMs": 2612,
+ "text": "telescopes",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -0.11120221155174304,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 2612,
+ "endMs": 3042,
+ "text": "watched the",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 9.750771800621902,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 3042,
+ "endMs": 4145,
+ "text": "sky, people",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 8.39953751401852,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5312906191856691,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 4145,
+ "endMs": 4714,
+ "text": "looked up and",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6984326431081123,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 4714,
+ "endMs": 5410,
+ "text": "saw a bright",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 4.810947315043355,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6445892502264121,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 5410,
+ "endMs": 6339,
+ "text": "star, not",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0.7876225703042095,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 6339,
+ "endMs": 6896,
+ "text": "knowing it was",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -7.638214320691771,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 6896,
+ "endMs": 7616,
+ "text": "Venus.",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 7616,
+ "endMs": 8231,
+ "text": "The ancient",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -9.327898518604613,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 8231,
+ "endMs": 8916,
+ "text": "Romans named",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.662161653933625,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 8916,
+ "endMs": 9497,
+ "text": "it after their",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 4.508359665555006,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 9497,
+ "endMs": 10008,
+ "text": "goddess of",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6388131110354789,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 10008,
+ "endMs": 10600,
+ "text": "love because",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6323294044608418,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 10600,
+ "endMs": 10855,
+ "text": "of its",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 10855,
+ "endMs": 11331,
+ "text": "beautiful",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.689881743853058,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 11331,
+ "endMs": 11935,
+ "text": "glow.",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -9.201159551524198,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5843134627873369,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 11935,
+ "endMs": 12690,
+ "text": "Incredibly,",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -2.16017933512608,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 12690,
+ "endMs": 13015,
+ "text": "there were",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6822711271671517,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 13015,
+ "endMs": 13560,
+ "text": "times it was",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6171702148398952,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 13560,
+ "endMs": 14025,
+ "text": "called both",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 14025,
+ "endMs": 14524,
+ "text": "the 'Morning",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 2.8532779795346332,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6213784824708739,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 14524,
+ "endMs": 15522,
+ "text": "Star' and the",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -4.941277294991979,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 15522,
+ "endMs": 15917,
+ "text": "'Evening",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.679307191316065,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 15917,
+ "endMs": 16962,
+ "text": "Star'—no one",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 4.788781402097829,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6175949484127287,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 16962,
+ "endMs": 17577,
+ "text": "realized they",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 8.934363232174972,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 17577,
+ "endMs": 18053,
+ "text": "were the same",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 18053,
+ "endMs": 18762,
+ "text": "planet!",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -1.2693799782520299,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 18762,
+ "endMs": 19505,
+ "text": "Unlike any",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -5.637661922079329,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.59875153690998,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 19505,
+ "endMs": 20376,
+ "text": "other planet,",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 3.533298688930447,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5666186805089255,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 20376,
+ "endMs": 21084,
+ "text": "Venus spins",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -3.630883509152363,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6654676119000248,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 21084,
+ "endMs": 22152,
+ "text": "backwards, so",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -9.736131114877832,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6171542494318256,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 22152,
+ "endMs": 22872,
+ "text": "the Sun rises",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6799068445538758,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 22872,
+ "endMs": 23441,
+ "text": "in the west",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6524040045014661,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 23441,
+ "endMs": 23940,
+ "text": "and sets in",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -3.137604031495914,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6973740497614885,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 23940,
+ "endMs": 24753,
+ "text": "the east.",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -9.091707303457586,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 24753,
+ "endMs": 25519,
+ "text": "Its days are",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5017647501826319,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 25519,
+ "endMs": 26042,
+ "text": "longer than",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5972452883935493,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 26042,
+ "endMs": 27017,
+ "text": "its years,",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.564986619802243,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 27017,
+ "endMs": 27609,
+ "text": "making time",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 2.489366052844666,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6018507711057028,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 27609,
+ "endMs": 28282,
+ "text": "seem strange",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5782847024126105,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 28282,
+ "endMs": 28886,
+ "text": "up there.",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -4.190740069548097,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5055966053795952,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 28886,
+ "endMs": 29629,
+ "text": "Volcanoes",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -4.914984260179916,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5629222453413919,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 29629,
+ "endMs": 30244,
+ "text": "cover much of",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 6.033671475696686,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5699858221834716,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 30244,
+ "endMs": 31034,
+ "text": "its surface,",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5950691148336467,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 31034,
+ "endMs": 31533,
+ "text": "but thick",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -6.155938430802468,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5566802724360221,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 31533,
+ "endMs": 31997,
+ "text": "clouds of",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5366881194737613,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 31997,
+ "endMs": 33100,
+ "text": "toxic gas hide",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0.6156000954485374,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 33100,
+ "endMs": 33600,
+ "text": "them from our",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -0.2956705455966857,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6484750077540622,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 33600,
+ "endMs": 34087,
+ "text": "view.",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5735095017110776,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 34087,
+ "endMs": 34807,
+ "text": "Although it is",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 34807,
+ "endMs": 35422,
+ "text": "Earth's twin",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -9.088208117785825,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6985425271710941,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 35422,
+ "endMs": 36699,
+ "text": "in size, Venus",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6887989441787467,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 36699,
+ "endMs": 37291,
+ "text": "is the hottest",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6311379480437896,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 37291,
+ "endMs": 38278,
+ "text": "planet, with",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 3.0880349550652064,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5681166169682664,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 38278,
+ "endMs": 38638,
+ "text": "surface",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.654541893694066,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 38638,
+ "endMs": 39161,
+ "text": "temperatures",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 39161,
+ "endMs": 39753,
+ "text": "high enough to",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6818260316184099,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 39753,
+ "endMs": 40496,
+ "text": "melt lead.",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5424967449824123,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 40496,
+ "endMs": 41274,
+ "text": "Despite its",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -7.735823281290651,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5271325069222614,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 41274,
+ "endMs": 41553,
+ "text": "harsh",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 41553,
+ "endMs": 42528,
+ "text": "environment,",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 42528,
+ "endMs": 43213,
+ "text": "it continues",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6036401812144718,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 43213,
+ "endMs": 43828,
+ "text": "to spark our",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -3.853160721805775,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 43828,
+ "endMs": 45036,
+ "text": "imagination,",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 45036,
+ "endMs": 45813,
+ "text": "reminding us",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 45813,
+ "endMs": 46603,
+ "text": "that mysteries",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 46603,
+ "endMs": 47334,
+ "text": "often hide in",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6491396876752396,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 47334,
+ "endMs": 48762,
+ "text": "plain sight.",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6418804091035437,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 48762,
+ "endMs": 49482,
+ "text": "People dream",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5264743831317681,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 49482,
+ "endMs": 50608,
+ "text": "that one day,",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -7.039075133181622,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 50608,
+ "endMs": 51305,
+ "text": "we might find",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.5898792305191535,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 51305,
+ "endMs": 51734,
+ "text": "a way to",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 1.6760108455025668,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6063143077570282,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 51734,
+ "endMs": 52385,
+ "text": "explore its",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0.19277359187750642,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6772011243839006,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ },
+ {
+ "startMs": 52385,
+ "endMs": 53174,
+ "text": "hidden secrets",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": -3.0010986713851064,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1,
+ "to": 1,
+ "startMs": 0,
+ "endMs": 300
+ }
+ ]
+ },
+ {
+ "startMs": 53174,
+ "endMs": 54056,
+ "text": "up close.",
+ "position": "center",
+ "animations": [
+ {
+ "type": "rotate",
+ "from": 0,
+ "to": 0,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 0.6598653425552847,
+ "to": 1.25,
+ "startMs": 0,
+ "endMs": 300
+ },
+ {
+ "type": "scale",
+ "from": 1.25,
+ "to": 1,
+ "startMs": 300,
+ "endMs": 500
+ }
+ ]
+ }
+ ],
+ "audio": [
+ {
+ "startMs": 0,
+ "endMs": 7616,
+ "audioUrl": "83e869e5-18fd-4de9-b70f-dc0f180da912"
+ },
+ {
+ "startMs": 7616,
+ "endMs": 11935,
+ "audioUrl": "99af6411-714b-4b72-b66e-f6c02a184493"
+ },
+ {
+ "startMs": 11935,
+ "endMs": 18762,
+ "audioUrl": "919d538b-3407-440a-b26a-73a5321a3af0"
+ },
+ {
+ "startMs": 18762,
+ "endMs": 24753,
+ "audioUrl": "20cf0ab8-49cb-4ead-816d-6af0b588668a"
+ },
+ {
+ "startMs": 24753,
+ "endMs": 28886,
+ "audioUrl": "11f4911a-f39f-4567-8963-41511d05b593"
+ },
+ {
+ "startMs": 28886,
+ "endMs": 34087,
+ "audioUrl": "5584e376-d02e-48fc-9e47-fc7bf86000af"
+ },
+ {
+ "startMs": 34087,
+ "endMs": 40496,
+ "audioUrl": "33b24fbd-dc71-4692-87af-fdff7661c222"
+ },
+ {
+ "startMs": 40496,
+ "endMs": 54056,
+ "audioUrl": "90917ba0-8b7c-4309-a784-4f1fdc28d9fb"
+ }
+ ],
+ "shortTitle": "History of Venus"
+}
\ No newline at end of file
diff --git a/packages/template-ai-video/remotion.config.ts b/packages/template-ai-video/remotion.config.ts
new file mode 100644
index 0000000000..2fb58bae46
--- /dev/null
+++ b/packages/template-ai-video/remotion.config.ts
@@ -0,0 +1,9 @@
+// See all configuration options: https://remotion.dev/docs/config
+// Each option also is available as a CLI flag: https://remotion.dev/docs/cli
+
+// Note: When using the Node.JS APIs, the config file doesn't apply. Instead, pass options directly to the APIs
+
+import { Config } from "@remotion/cli/config";
+
+Config.setVideoImageFormat("jpeg");
+Config.setOverwriteOutput(true);
diff --git a/packages/template-ai-video/src/Root.tsx b/packages/template-ai-video/src/Root.tsx
new file mode 100644
index 0000000000..af7768c794
--- /dev/null
+++ b/packages/template-ai-video/src/Root.tsx
@@ -0,0 +1,59 @@
+import {
+ Composition,
+ continueRender,
+ delayRender,
+ getInputProps,
+} from "remotion";
+import { AIVideo, aiVideoSchema } from "./components/AIVideo";
+import { useEffect, useMemo, useState } from "react";
+import { FPS, WindowHeight, WindowWidth } from "./lib/constants";
+import { getTimelinePath, loadTimelineFromFile } from "./lib/utils";
+
+interface InputProps extends Record {
+ projectName?: string;
+}
+
+export const RemotionRoot: React.FC = () => {
+ const inputProps = getInputProps();
+ const [frameLength, setFrameLength] = useState(1);
+
+ const resolvedProjectName = useMemo(
+ () => inputProps.projectName ?? "history_of_venus",
+ [inputProps],
+ );
+
+ useEffect(() => {
+ const handle = delayRender("Calculating FPS duration...");
+
+ const fetchConfig = async () => {
+ const { lengthFrames } = await loadTimelineFromFile(
+ getTimelinePath(resolvedProjectName),
+ );
+ setFrameLength(lengthFrames);
+ continueRender(handle);
+ };
+
+ fetchConfig();
+
+ return () => {
+ continueRender(handle);
+ };
+ }, [resolvedProjectName]);
+
+ return (
+ <>
+
+ >
+ );
+};
diff --git a/packages/template-ai-video/src/components/AIVideo.tsx b/packages/template-ai-video/src/components/AIVideo.tsx
new file mode 100644
index 0000000000..4181ebab71
--- /dev/null
+++ b/packages/template-ai-video/src/components/AIVideo.tsx
@@ -0,0 +1,143 @@
+import {
+ AbsoluteFill,
+ Html5Audio,
+ Sequence,
+ staticFile,
+ useDelayRender,
+} from "remotion";
+import { z } from "zod";
+import { Timeline } from "../lib/types";
+import { IntoFrameDuration } from "../lib/constants";
+import { loadFont } from "@remotion/google-fonts/BreeSerif";
+import { Background } from "./Background";
+import Subtitle from "./Subtitle";
+import { useEffect, useState } from "react";
+import {
+ calculateFrameTiming,
+ getAudioPath,
+ getTimelinePath,
+ loadTimelineFromFile,
+} from "../lib/utils";
+
+export const aiVideoSchema = z.object({
+ projectName: z.string().min(1),
+});
+
+export const AIVideo: React.FC> = ({
+ projectName,
+}) => {
+ const { fontFamily } = loadFont();
+ const [timeline, setTimeline] = useState();
+ const { delayRender, continueRender } = useDelayRender();
+
+ useEffect(() => {
+ const handle = delayRender("Loading timeline...");
+
+ const fetchConfig = async () => {
+ const { timeline } = await loadTimelineFromFile(
+ getTimelinePath(projectName),
+ );
+ setTimeline(timeline);
+ continueRender(handle);
+ };
+
+ fetchConfig();
+
+ return () => {
+ continueRender(handle);
+ };
+ }, [projectName]);
+
+ return (
+
+ {timeline && (
+ <>
+
+
+
+ {timeline.shortTitle}
+
+
+
+
+ {timeline.elements.map((element, index) => {
+ const { startFrame, duration } = calculateFrameTiming(
+ element.startMs,
+ element.endMs,
+ { includeIntro: index === 0 },
+ );
+
+ return (
+
+
+
+ );
+ })}
+
+ {timeline.text.map((element, index) => {
+ const { startFrame, duration } = calculateFrameTiming(
+ element.startMs,
+ element.endMs,
+ { addIntroOffset: true },
+ );
+
+ return (
+
+
+
+ );
+ })}
+
+ {timeline.audio.map((element, index) => {
+ const { startFrame, duration } = calculateFrameTiming(
+ element.startMs,
+ element.endMs,
+ { addIntroOffset: true },
+ );
+
+ return (
+
+
+
+ );
+ })}
+ >
+ )}
+
+ );
+};
diff --git a/packages/template-ai-video/src/components/Background.tsx b/packages/template-ai-video/src/components/Background.tsx
new file mode 100644
index 0000000000..4c18879575
--- /dev/null
+++ b/packages/template-ai-video/src/components/Background.tsx
@@ -0,0 +1,68 @@
+import { AbsoluteFill, Img, staticFile, useCurrentFrame } from "remotion";
+import {
+ FPS,
+ ImageHeight,
+ ImageWidth,
+ WindowHeight,
+ WindowWidth,
+} from "../lib/constants";
+import { BackgroundElement } from "../lib/types";
+import { calculateBlur, getImagePath } from "../lib/utils";
+
+const EXTRA_SCALE = 0.2;
+
+export const Background: React.FC<{
+ item: BackgroundElement;
+ project: string;
+}> = ({ item, project }) => {
+ const frame = useCurrentFrame();
+ const localMs = (frame / FPS) * 1000;
+
+ const viewSize = { width: WindowWidth, height: WindowHeight };
+ const imageRatio = ImageHeight / ImageWidth;
+
+ const imgWidth = viewSize.height;
+ const imgHeight = imgWidth * imageRatio;
+ let animScale = 1 + EXTRA_SCALE;
+
+ const currentScaleAnim = item.animations?.find(
+ (anim) =>
+ anim.type === "scale" && anim.startMs <= localMs && anim.endMs >= localMs,
+ );
+
+ if (currentScaleAnim) {
+ const progress =
+ (localMs - currentScaleAnim.startMs) /
+ (currentScaleAnim.endMs - currentScaleAnim.startMs);
+ animScale =
+ EXTRA_SCALE +
+ progress * (currentScaleAnim.to - currentScaleAnim.from) +
+ currentScaleAnim.from;
+ }
+
+ const imgScale = animScale;
+ const top = -(imgHeight * imgScale - viewSize.height) / 2;
+ const left = -(imgWidth * imgScale - viewSize.width) / 2;
+
+ const blur = calculateBlur({ item, localMs });
+ const maxBlur = 25;
+
+ const currentBlur = maxBlur * blur;
+
+ return (
+
+
+
+ );
+};
diff --git a/packages/template-ai-video/src/components/Subtitle.tsx b/packages/template-ai-video/src/components/Subtitle.tsx
new file mode 100644
index 0000000000..389ec762a3
--- /dev/null
+++ b/packages/template-ai-video/src/components/Subtitle.tsx
@@ -0,0 +1,35 @@
+import React from "react";
+import {
+ AbsoluteFill,
+ spring,
+ useCurrentFrame,
+ useVideoConfig,
+} from "remotion";
+import { Word } from "./Word";
+
+const Subtitle: React.FC<{ text: string }> = ({ text }) => {
+ const frame = useCurrentFrame();
+ const { fps } = useVideoConfig();
+
+ const enter = spring({
+ frame,
+ fps,
+ config: {
+ damping: 200,
+ },
+ durationInFrames: 5,
+ });
+
+ return (
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Subtitle;
diff --git a/packages/template-ai-video/src/components/Word.tsx b/packages/template-ai-video/src/components/Word.tsx
new file mode 100644
index 0000000000..bc30632b16
--- /dev/null
+++ b/packages/template-ai-video/src/components/Word.tsx
@@ -0,0 +1,52 @@
+import type React from "react";
+import { AbsoluteFill, interpolate, useVideoConfig } from "remotion";
+import { fitText } from "@remotion/layout-utils";
+import { makeTransform, scale, translateY } from "@remotion/animation-utils";
+import { loadFont } from "@remotion/google-fonts/BreeSerif";
+
+export const Word: React.FC<{
+ enterProgress: number;
+ text: string;
+ stroke: boolean;
+}> = ({ enterProgress, text, stroke }) => {
+ const { fontFamily } = loadFont();
+ const { width } = useVideoConfig();
+ const desiredFontSize = 120;
+
+ const fittedText = fitText({
+ fontFamily,
+ text,
+ withinWidth: width * 0.8,
+ });
+
+ const fontSize = Math.min(desiredFontSize, fittedText.fontSize);
+
+ return (
+
+
+ {text}
+
+
+ );
+};
diff --git a/packages/template-ai-video/src/index.ts b/packages/template-ai-video/src/index.ts
new file mode 100644
index 0000000000..f31c790edb
--- /dev/null
+++ b/packages/template-ai-video/src/index.ts
@@ -0,0 +1,4 @@
+import { registerRoot } from "remotion";
+import { RemotionRoot } from "./Root";
+
+registerRoot(RemotionRoot);
diff --git a/packages/template-ai-video/src/lib/constants.ts b/packages/template-ai-video/src/lib/constants.ts
new file mode 100644
index 0000000000..d7499af502
--- /dev/null
+++ b/packages/template-ai-video/src/lib/constants.ts
@@ -0,0 +1,6 @@
+export const FPS = 30;
+export const WindowWidth = 1080;
+export const WindowHeight = 1920;
+export const IntoFrameDuration = 1;
+export const ImageWidth = 1024;
+export const ImageHeight = 1792;
diff --git a/packages/template-ai-video/src/lib/types.ts b/packages/template-ai-video/src/lib/types.ts
new file mode 100644
index 0000000000..394f9f7162
--- /dev/null
+++ b/packages/template-ai-video/src/lib/types.ts
@@ -0,0 +1,100 @@
+import { CharacterAlignmentResponseModel } from "@elevenlabs/elevenlabs-js/api";
+import { z } from "zod";
+
+const BackgroundTransitionTypeSchema = z.union([
+ z.literal("fade"),
+ z.literal("blur"),
+ z.literal("none"),
+]);
+
+const TimelineElementSchema = z.object({
+ startMs: z.number(),
+ endMs: z.number(),
+});
+
+const ElementAnimationSchema = TimelineElementSchema.extend({
+ type: z.union([z.literal("scale"), z.literal("rotate")]),
+ from: z.number(),
+ to: z.number(),
+});
+
+const BackgroundElementSchema = TimelineElementSchema.extend({
+ imageUrl: z.string(),
+ enterTransition: BackgroundTransitionTypeSchema.optional(),
+ exitTransition: BackgroundTransitionTypeSchema.optional(),
+ animations: z.array(ElementAnimationSchema).optional(),
+});
+
+const TextElementSchema = TimelineElementSchema.extend({
+ text: z.string(),
+ position: z.union([
+ z.literal("top"),
+ z.literal("bottom"),
+ z.literal("center"),
+ ]),
+ animations: z.array(ElementAnimationSchema).optional(),
+});
+
+const AudioElementSchema = TimelineElementSchema.extend({
+ audioUrl: z.string(),
+});
+
+const TimelineSchema = z.object({
+ shortTitle: z.string(),
+ elements: z.array(BackgroundElementSchema),
+ text: z.array(TextElementSchema),
+ audio: z.array(AudioElementSchema),
+});
+
+export type BackgroundTransitionType = z.infer<
+ typeof BackgroundTransitionTypeSchema
+>;
+
+export type TimelineElement = z.infer;
+export type ElementAnimation = z.infer;
+export type BackgroundElement = z.infer;
+export type TextElement = z.infer;
+export type AudioElement = z.infer;
+export type Timeline = z.infer;
+
+export {
+ BackgroundTransitionTypeSchema,
+ TimelineElementSchema,
+ ElementAnimationSchema,
+ BackgroundElementSchema,
+ TextElementSchema,
+ AudioElementSchema,
+ TimelineSchema,
+};
+
+export const StoryScript = z.object({
+ text: z.string(),
+});
+
+export const StoryWithImages = z.object({
+ result: z.array(
+ z.object({
+ text: z.string(),
+ imageDescription: z.string(),
+ }),
+ ),
+});
+
+export const VoiceDescriptorSchema = z.object({
+ id: z.string(),
+ name: z.string(),
+});
+
+export type VoiceDescriptor = z.infer;
+
+export interface StoryMetadataWithDetails {
+ shortTitle: string;
+ content: ContentItemWithDetails[];
+}
+
+export interface ContentItemWithDetails {
+ text: string;
+ imageDescription: string;
+ uid: string;
+ audioTimestamps: CharacterAlignmentResponseModel;
+}
diff --git a/packages/template-ai-video/src/lib/utils.ts b/packages/template-ai-video/src/lib/utils.ts
new file mode 100644
index 0000000000..5d012d0db0
--- /dev/null
+++ b/packages/template-ai-video/src/lib/utils.ts
@@ -0,0 +1,69 @@
+import { staticFile } from "remotion";
+import { BackgroundElement, Timeline } from "./types";
+import { FPS, IntoFrameDuration } from "./constants";
+
+export const loadTimelineFromFile = async (filename: string) => {
+ const res = await fetch(staticFile(filename));
+ const json = await res.json();
+ const timeline = json as Timeline;
+ timeline.elements.sort((a, b) => a.startMs - b.startMs);
+
+ const lengthMs =
+ timeline.elements.length > 0
+ ? timeline.elements[timeline.elements.length - 1].endMs / 1000
+ : 0;
+ const lengthFrames = Math.floor(lengthMs * FPS);
+
+ return { timeline, lengthFrames };
+};
+
+export const calculateFrameTiming = (
+ startMs: number,
+ endMs: number,
+ options: { includeIntro?: boolean; addIntroOffset?: boolean } = {},
+) => {
+ const { includeIntro = false, addIntroOffset = false } = options;
+
+ const startFrame =
+ (startMs * FPS) / 1000 + (addIntroOffset ? IntoFrameDuration : 0);
+ const duration =
+ ((endMs - startMs) * FPS) / 1000 + (includeIntro ? IntoFrameDuration : 0);
+
+ return { startFrame, duration };
+};
+
+export const calculateBlur = ({
+ item,
+ localMs,
+}: {
+ item: BackgroundElement;
+ localMs: number;
+}) => {
+ const maxBlur = 1;
+ const fadeMs = 1000;
+
+ const startMs = item.startMs;
+ const endMs = item.endMs;
+
+ const { enterTransition } = item;
+ const { exitTransition } = item;
+
+ if (enterTransition === "blur" && localMs < fadeMs) {
+ return (1 - localMs / fadeMs) * maxBlur;
+ }
+
+ if (exitTransition === "blur" && localMs > endMs - startMs - fadeMs) {
+ return (1 - (endMs - startMs - localMs) / fadeMs) * maxBlur;
+ }
+
+ return 0;
+};
+
+export const getTimelinePath = (proj: string) =>
+ `content/${proj}/timeline.json`;
+
+export const getImagePath = (proj: string, uid: string) =>
+ `content/${proj}/images/${uid}.png`;
+
+export const getAudioPath = (proj: string, uid: string) =>
+ `content/${proj}/audio/${uid}.mp3`;
diff --git a/packages/template-ai-video/tsconfig.json b/packages/template-ai-video/tsconfig.json
new file mode 100644
index 0000000000..4bdf271b9d
--- /dev/null
+++ b/packages/template-ai-video/tsconfig.json
@@ -0,0 +1,15 @@
+{
+ "compilerOptions": {
+ "target": "ES2018",
+ "module": "commonjs",
+ "jsx": "react-jsx",
+ "strict": true,
+ "noEmit": true,
+ "lib": ["es2015"],
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "noUnusedLocals": true
+ },
+ "exclude": ["remotion.config.ts"]
+}
diff --git a/tsconfig.json b/tsconfig.json
index 8fd0bfd8c6..58233b2157 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -171,6 +171,9 @@
{
"path": "./packages/template-audiogram"
},
+ {
+ "path": "./packages/template-ai-video"
+ },
{
"path": "./packages/template-music-visualization"
},