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 + +

+ + + Animated Remotion Logo + +

+ +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" },