@revideo/create 0.5.11-alpha.1102 → 0.5.11-alpha.1104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/examples/README.md +43 -0
  2. package/examples/avatar-with-background/package.json +27 -0
  3. package/examples/avatar-with-background/src/project.meta +31 -0
  4. package/examples/avatar-with-background/src/project.ts +6 -0
  5. package/examples/avatar-with-background/src/render.ts +14 -0
  6. package/examples/avatar-with-background/src/revideo.d.ts +1 -0
  7. package/examples/avatar-with-background/src/scenes/example.meta +5 -0
  8. package/examples/avatar-with-background/src/scenes/example.tsx +28 -0
  9. package/examples/avatar-with-background/tsconfig.json +9 -0
  10. package/examples/avatar-with-background/vite.config.ts +8 -0
  11. package/examples/default/README.md +19 -0
  12. package/examples/default/package.json +20 -0
  13. package/examples/default/src/project.tsx +56 -0
  14. package/examples/default/src/render.ts +15 -0
  15. package/examples/default/tsconfig.json +10 -0
  16. package/examples/github-stars-celebration/package-lock.json +3833 -0
  17. package/examples/github-stars-celebration/package.json +24 -0
  18. package/examples/github-stars-celebration/src/global.css +1 -0
  19. package/examples/github-stars-celebration/src/project.meta +28 -0
  20. package/examples/github-stars-celebration/src/project.ts +8 -0
  21. package/examples/github-stars-celebration/src/render.ts +15 -0
  22. package/examples/github-stars-celebration/src/revideo.d.ts +1 -0
  23. package/examples/github-stars-celebration/src/scenes/example.meta +5 -0
  24. package/examples/github-stars-celebration/src/scenes/example.tsx +51 -0
  25. package/examples/github-stars-celebration/tsconfig.json +9 -0
  26. package/examples/github-stars-celebration/vite.config.ts +8 -0
  27. package/examples/google-cloud-run-parallelized/README.md +127 -0
  28. package/examples/google-cloud-run-parallelized/render-orchestrator/Dockerfile +56 -0
  29. package/examples/google-cloud-run-parallelized/render-orchestrator/package.json +22 -0
  30. package/examples/google-cloud-run-parallelized/render-orchestrator/src/index.ts +72 -0
  31. package/examples/google-cloud-run-parallelized/render-orchestrator/src/revideo.d.ts +1 -0
  32. package/examples/google-cloud-run-parallelized/render-orchestrator/tsconfig.json +10 -0
  33. package/examples/google-cloud-run-parallelized/render-worker/.gcloudignore +17 -0
  34. package/examples/google-cloud-run-parallelized/render-worker/.puppeteerrc.cjs +9 -0
  35. package/examples/google-cloud-run-parallelized/render-worker/package.json +30 -0
  36. package/examples/google-cloud-run-parallelized/render-worker/src/index.ts +45 -0
  37. package/examples/google-cloud-run-parallelized/render-worker/src/project.meta +31 -0
  38. package/examples/google-cloud-run-parallelized/render-worker/src/project.ts +6 -0
  39. package/examples/google-cloud-run-parallelized/render-worker/src/render.ts +14 -0
  40. package/examples/google-cloud-run-parallelized/render-worker/src/revideo.d.ts +1 -0
  41. package/examples/google-cloud-run-parallelized/render-worker/src/scenes/example.tsx +30 -0
  42. package/examples/google-cloud-run-parallelized/render-worker/tsconfig.json +13 -0
  43. package/examples/google-cloud-run-parallelized/render-worker/vite.config.ts +9 -0
  44. package/examples/logo.svg +6 -0
  45. package/examples/logo_dark.svg +6 -0
  46. package/examples/marketing-templates/README.md +10 -0
  47. package/examples/marketing-templates/marketing-template/package.json +24 -0
  48. package/examples/marketing-templates/marketing-template/src/globals.css +0 -0
  49. package/examples/marketing-templates/marketing-template/src/project.meta +28 -0
  50. package/examples/marketing-templates/marketing-template/src/project.ts +9 -0
  51. package/examples/marketing-templates/marketing-template/src/render.ts +15 -0
  52. package/examples/marketing-templates/marketing-template/src/revideo.d.ts +1 -0
  53. package/examples/marketing-templates/marketing-template/src/scenes/example.meta +5 -0
  54. package/examples/marketing-templates/marketing-template/src/scenes/example.tsx +67 -0
  55. package/examples/marketing-templates/marketing-template/tsconfig.json +9 -0
  56. package/examples/marketing-templates/marketing-template/vite.config.ts +9 -0
  57. package/examples/marketing-templates/multiple-videos-in-one/package.json +24 -0
  58. package/examples/marketing-templates/multiple-videos-in-one/src/project.meta +28 -0
  59. package/examples/marketing-templates/multiple-videos-in-one/src/project.ts +9 -0
  60. package/examples/marketing-templates/multiple-videos-in-one/src/render.ts +15 -0
  61. package/examples/marketing-templates/multiple-videos-in-one/src/revideo.d.ts +1 -0
  62. package/examples/marketing-templates/multiple-videos-in-one/src/scenes/example.meta +5 -0
  63. package/examples/marketing-templates/multiple-videos-in-one/src/scenes/example.tsx +122 -0
  64. package/examples/marketing-templates/multiple-videos-in-one/tsconfig.json +9 -0
  65. package/examples/marketing-templates/multiple-videos-in-one/vite.config.ts +9 -0
  66. package/examples/minimal-drag-drop/README.md +29 -0
  67. package/examples/minimal-drag-drop/next/app/api/render/route.ts +22 -0
  68. package/examples/minimal-drag-drop/next/app/globals.css +3 -0
  69. package/examples/minimal-drag-drop/next/app/layout.tsx +25 -0
  70. package/examples/minimal-drag-drop/next/app/page.tsx +277 -0
  71. package/examples/minimal-drag-drop/next/next-env.d.ts +5 -0
  72. package/examples/minimal-drag-drop/next/next.config.mjs +4 -0
  73. package/examples/minimal-drag-drop/next/package-lock.json +5577 -0
  74. package/examples/minimal-drag-drop/next/package.json +35 -0
  75. package/examples/minimal-drag-drop/next/postcss.config.js +6 -0
  76. package/examples/minimal-drag-drop/next/public/favicon.ico +0 -0
  77. package/examples/minimal-drag-drop/next/public/next.svg +1 -0
  78. package/examples/minimal-drag-drop/next/public/vercel.svg +1 -0
  79. package/examples/minimal-drag-drop/next/tailwind.config.ts +30 -0
  80. package/examples/minimal-drag-drop/next/tsconfig.json +26 -0
  81. package/examples/minimal-drag-drop/next/utils/parse.ts +35 -0
  82. package/examples/minimal-drag-drop/revideo/package-lock.json +3771 -0
  83. package/examples/minimal-drag-drop/revideo/package.json +24 -0
  84. package/examples/minimal-drag-drop/revideo/src/global.css +1 -0
  85. package/examples/minimal-drag-drop/revideo/src/project.meta +28 -0
  86. package/examples/minimal-drag-drop/revideo/src/project.ts +9 -0
  87. package/examples/minimal-drag-drop/revideo/src/render.ts +15 -0
  88. package/examples/minimal-drag-drop/revideo/src/revideo.d.ts +1 -0
  89. package/examples/minimal-drag-drop/revideo/src/scenes/example.meta +5 -0
  90. package/examples/minimal-drag-drop/revideo/src/scenes/example.tsx +44 -0
  91. package/examples/minimal-drag-drop/revideo/tsconfig.json +9 -0
  92. package/examples/minimal-drag-drop/revideo/vite.config.ts +6 -0
  93. package/examples/parallelized-aws-lambda/.dockerignore +3 -0
  94. package/examples/parallelized-aws-lambda/Dockerfile +21 -0
  95. package/examples/parallelized-aws-lambda/Dockerfile.base +64 -0
  96. package/examples/parallelized-aws-lambda/README.md +197 -0
  97. package/examples/parallelized-aws-lambda/revideo-project/.puppeteerrc.cjs +9 -0
  98. package/examples/parallelized-aws-lambda/revideo-project/package-lock.json +4133 -0
  99. package/examples/parallelized-aws-lambda/revideo-project/package.json +28 -0
  100. package/examples/parallelized-aws-lambda/revideo-project/src/lambda.ts +157 -0
  101. package/examples/parallelized-aws-lambda/revideo-project/src/project.meta +28 -0
  102. package/examples/parallelized-aws-lambda/revideo-project/src/project.ts +7 -0
  103. package/examples/parallelized-aws-lambda/revideo-project/src/render.ts +17 -0
  104. package/examples/parallelized-aws-lambda/revideo-project/src/revideo.d.ts +1 -0
  105. package/examples/parallelized-aws-lambda/revideo-project/src/scenes/example.meta +5 -0
  106. package/examples/parallelized-aws-lambda/revideo-project/src/scenes/example.tsx +30 -0
  107. package/examples/parallelized-aws-lambda/revideo-project/tsconfig.json +10 -0
  108. package/examples/parallelized-aws-lambda/revideo-project/vite.config.ts +9 -0
  109. package/examples/reddit-post-video/README.md +84 -0
  110. package/examples/reddit-post-video/package-lock.json +2941 -0
  111. package/examples/reddit-post-video/package.json +27 -0
  112. package/examples/reddit-post-video/src/global.css +1 -0
  113. package/examples/reddit-post-video/src/metadata.json +576 -0
  114. package/examples/reddit-post-video/src/project.meta +31 -0
  115. package/examples/reddit-post-video/src/project.ts +9 -0
  116. package/examples/reddit-post-video/src/render.ts +157 -0
  117. package/examples/reddit-post-video/src/revideo.d.ts +1 -0
  118. package/examples/reddit-post-video/src/scenes/example.meta +5 -0
  119. package/examples/reddit-post-video/src/scenes/example.tsx +74 -0
  120. package/examples/reddit-post-video/tsconfig.json +9 -0
  121. package/examples/reddit-post-video/vite.config.ts +6 -0
  122. package/examples/rive-explanation-video/README.md +9 -0
  123. package/examples/rive-explanation-video/package.json +25 -0
  124. package/examples/rive-explanation-video/src/global.css +1 -0
  125. package/examples/rive-explanation-video/src/project.meta +31 -0
  126. package/examples/rive-explanation-video/src/project.ts +8 -0
  127. package/examples/rive-explanation-video/src/render.ts +15 -0
  128. package/examples/rive-explanation-video/src/revideo.d.ts +1 -0
  129. package/examples/rive-explanation-video/src/scenes/example.meta +5 -0
  130. package/examples/rive-explanation-video/src/scenes/example.tsx +218 -0
  131. package/examples/rive-explanation-video/tsconfig.json +9 -0
  132. package/examples/rive-explanation-video/vite.config.ts +8 -0
  133. package/examples/saas-template/.prettierrc +9 -0
  134. package/examples/saas-template/README.md +26 -0
  135. package/examples/saas-template/app/actions.tsx +114 -0
  136. package/examples/saas-template/app/api/render/route.ts +23 -0
  137. package/examples/saas-template/app/globals.css +3 -0
  138. package/examples/saas-template/app/layout.tsx +25 -0
  139. package/examples/saas-template/app/page.tsx +204 -0
  140. package/examples/saas-template/next.config.mjs +4 -0
  141. package/examples/saas-template/package.json +40 -0
  142. package/examples/saas-template/postcss.config.js +6 -0
  143. package/examples/saas-template/revideo/global.css +1 -0
  144. package/examples/saas-template/revideo/project.ts +9 -0
  145. package/examples/saas-template/revideo/scene.tsx +179 -0
  146. package/examples/saas-template/tailwind.config.ts +30 -0
  147. package/examples/saas-template/tsconfig.json +27 -0
  148. package/examples/saas-template/utils/parse.ts +35 -0
  149. package/examples/stitching-videos/README.md +7 -0
  150. package/examples/stitching-videos/package.json +23 -0
  151. package/examples/stitching-videos/src/project.meta +28 -0
  152. package/examples/stitching-videos/src/project.ts +20 -0
  153. package/examples/stitching-videos/src/render.ts +27 -0
  154. package/examples/stitching-videos/src/revideo.d.ts +1 -0
  155. package/examples/stitching-videos/src/scenes/example.tsx +30 -0
  156. package/examples/stitching-videos/tsconfig.json +9 -0
  157. package/examples/stitching-videos/vite.config.ts +8 -0
  158. package/examples/three-js-example/README.md +8 -0
  159. package/examples/three-js-example/package-lock.json +2753 -0
  160. package/examples/three-js-example/package.json +25 -0
  161. package/examples/three-js-example/src/components/Three.ts +166 -0
  162. package/examples/three-js-example/src/global.css +1 -0
  163. package/examples/three-js-example/src/project.meta +31 -0
  164. package/examples/three-js-example/src/project.ts +8 -0
  165. package/examples/three-js-example/src/render.ts +15 -0
  166. package/examples/three-js-example/src/revideo.d.ts +1 -0
  167. package/examples/three-js-example/src/scenes/basic3D.meta +5 -0
  168. package/examples/three-js-example/src/scenes/basic3D.tsx +89 -0
  169. package/examples/three-js-example/tsconfig.json +9 -0
  170. package/examples/three-js-example/vite.config.ts +6 -0
  171. package/examples/youtube-shorts/README.md +65 -0
  172. package/examples/youtube-shorts/package-lock.json +3881 -0
  173. package/examples/youtube-shorts/package.json +30 -0
  174. package/examples/youtube-shorts/src/get-assets.ts +34 -0
  175. package/examples/youtube-shorts/src/global.css +3 -0
  176. package/examples/youtube-shorts/src/metadata.json +635 -0
  177. package/examples/youtube-shorts/src/project.meta +28 -0
  178. package/examples/youtube-shorts/src/project.ts +9 -0
  179. package/examples/youtube-shorts/src/render.ts +12 -0
  180. package/examples/youtube-shorts/src/revideo.d.ts +1 -0
  181. package/examples/youtube-shorts/src/scenes/example.tsx +224 -0
  182. package/examples/youtube-shorts/src/utils.ts +123 -0
  183. package/examples/youtube-shorts/tsconfig.json +9 -0
  184. package/examples/youtube-shorts/vite.config.ts +8 -0
  185. package/package.json +9 -9
@@ -0,0 +1,28 @@
1
+ {
2
+ "version": 1,
3
+ "shared": {
4
+ "background": null,
5
+ "range": [
6
+ 0,
7
+ null
8
+ ],
9
+ "size": {
10
+ "x": 1080,
11
+ "y": 1792
12
+ },
13
+ "audioOffset": 0
14
+ },
15
+ "preview": {
16
+ "fps": 30,
17
+ "resolutionScale": 1
18
+ },
19
+ "rendering": {
20
+ "fps": 30,
21
+ "resolutionScale": 1,
22
+ "colorSpace": "srgb",
23
+ "exporter": {
24
+ "name": "@revideo/core/wasm",
25
+ "options": {}
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,9 @@
1
+ import {makeProject} from '@revideo/core';
2
+ import example from './scenes/example?scene';
3
+ import metadata from './metadata.json'
4
+ import "./global.css";
5
+
6
+ export default makeProject({
7
+ scenes: [example],
8
+ variables: metadata
9
+ });
@@ -0,0 +1,12 @@
1
+ import {renderVideo} from '@revideo/renderer';
2
+ import metadata from './metadata.json';
3
+
4
+ async function render(){
5
+ await renderVideo({
6
+ projectFile: './src/project.ts',
7
+ variables: metadata,
8
+ settings: {logProgress: true}
9
+ });
10
+ }
11
+
12
+ render();
@@ -0,0 +1 @@
1
+ /// <reference types="@revideo/core/project" />
@@ -0,0 +1,224 @@
1
+ import {Audio, Img, makeScene2D, Txt, Rect, Layout} from '@revideo/2d';
2
+ import {all, createRef, waitFor, useScene, Reference, createSignal} from '@revideo/core';
3
+
4
+ interface Word {
5
+ punctuated_word: string;
6
+ start: number;
7
+ end: number;
8
+ }
9
+
10
+ interface captionSettings {
11
+ fontSize: number;
12
+ textColor: string;
13
+ fontWeight: number;
14
+ fontFamily: string;
15
+ numSimultaneousWords: number;
16
+ stream: boolean;
17
+ textAlign: "center" | "left";
18
+ textBoxWidthInPercent: number;
19
+ borderColor?: string;
20
+ borderWidth?: number;
21
+ currentWordColor?: string;
22
+ currentWordBackgroundColor?: string;
23
+ shadowColor?: string;
24
+ shadowBlur?: number;
25
+ fadeInAnimation?: boolean;
26
+ }
27
+
28
+ const textSettings: captionSettings = {
29
+ fontSize: 80,
30
+ numSimultaneousWords: 4, // how many words are shown at most simultaneously
31
+ textColor: "white",
32
+ fontWeight: 800,
33
+ fontFamily: "Mulish",
34
+ stream: false, // if true, words appear one by one
35
+ textAlign: "center",
36
+ textBoxWidthInPercent: 70,
37
+ fadeInAnimation: true,
38
+ currentWordColor: "cyan",
39
+ currentWordBackgroundColor: "red", // adds a colored box to the word currently spoken
40
+ shadowColor: "black",
41
+ shadowBlur: 30
42
+ }
43
+
44
+
45
+ export default makeScene2D(function* (view) {
46
+ const images = useScene().variables.get('images', [])();
47
+ const audioUrl = useScene().variables.get('audioUrl', 'none')();
48
+ const words = useScene().variables.get('words', [])();
49
+
50
+ const duration = words[words.length-1].end + 0.5;
51
+
52
+ const imageContainer = createRef<Layout>();
53
+ const textContainer = createRef<Layout>();
54
+
55
+ yield view.add(
56
+ <>
57
+ <Layout
58
+ size={"100%"}
59
+ ref={imageContainer}
60
+ />
61
+ <Layout
62
+ size={"100%"}
63
+ ref={textContainer}
64
+ />
65
+ <Audio
66
+ src={audioUrl}
67
+ play={true}
68
+ />
69
+ <Audio
70
+ src={"https://revideo-example-assets.s3.amazonaws.com/chill-beat-2.mp3"}
71
+ play={true}
72
+ volume={0.1}
73
+ />
74
+ </>
75
+ );
76
+
77
+ yield* all(
78
+ displayImages(imageContainer, images, duration),
79
+ displayWords(
80
+ textContainer,
81
+ words,
82
+ textSettings
83
+ )
84
+ )
85
+ });
86
+
87
+ function* displayImages(container: Reference<Layout>, images: string[], totalDuration: number){
88
+ for(const img of images){
89
+ const ref = createRef<Img>();
90
+ container().add(<Img
91
+ src={img}
92
+ size={["100%", "100%"]}
93
+ ref={ref}
94
+ zIndex={0}
95
+ />
96
+ )
97
+ yield* waitFor(totalDuration/images.length);
98
+ }
99
+ }
100
+
101
+ function* displayWords(container: Reference<Layout>, words: Word[], settings: captionSettings){
102
+ let waitBefore = words[0].start;
103
+
104
+ for (let i = 0; i < words.length; i += settings.numSimultaneousWords) {
105
+ const currentBatch = words.slice(i, i + settings.numSimultaneousWords);
106
+ const nextClipStart =
107
+ i < words.length - 1 ? words[i + settings.numSimultaneousWords]?.start || null : null;
108
+ const isLastClip = i + settings.numSimultaneousWords >= words.length;
109
+ const waitAfter = isLastClip ? 1 : 0;
110
+ const textRef = createRef<Txt>();
111
+ yield* waitFor(waitBefore);
112
+
113
+ if(settings.stream){
114
+ let nextWordStart = 0;
115
+ yield container().add(<Txt width={`${settings.textBoxWidthInPercent}%`} textWrap={true} zIndex={2} textAlign={settings.textAlign} ref={textRef}/>);
116
+
117
+ for(let j = 0; j < currentBatch.length; j++){
118
+ const word = currentBatch[j];
119
+ yield* waitFor(nextWordStart);
120
+ const optionalSpace = j === currentBatch.length-1? "" : " ";
121
+ const backgroundRef = createRef<Rect>();
122
+ const wordRef = createRef<Txt>();
123
+ const opacitySignal = createSignal(settings.fadeInAnimation ? 0.5 : 1);
124
+ textRef().add(
125
+ <Txt
126
+ fontSize={settings.fontSize}
127
+ fontWeight={settings.fontWeight}
128
+ fontFamily={settings.fontFamily}
129
+ textWrap={true}
130
+ textAlign={settings.textAlign}
131
+ fill={settings.currentWordColor}
132
+ ref={wordRef}
133
+ lineWidth={settings.borderWidth}
134
+ shadowBlur={settings.shadowBlur}
135
+ shadowColor={settings.shadowColor}
136
+ zIndex={2}
137
+ stroke={settings.borderColor}
138
+ opacity={opacitySignal}
139
+ >
140
+ {word.punctuated_word}
141
+ </Txt>
142
+ );
143
+ textRef().add(<Txt fontSize={settings.fontSize}>{optionalSpace}</Txt>);
144
+ container().add(<Rect fill={settings.currentWordBackgroundColor} zIndex={1} size={wordRef().size} position={wordRef().position} radius={10} padding={10} ref={backgroundRef} />);
145
+ yield* all(waitFor(word.end-word.start), opacitySignal(1, Math.min((word.end-word.start)*0.5, 0.1)));
146
+ wordRef().fill(settings.textColor);
147
+ backgroundRef().remove();
148
+ nextWordStart = currentBatch[j+1]?.start - word.end || 0;
149
+ }
150
+ textRef().remove();
151
+
152
+ } else {
153
+ yield container().add(<Txt width={`${settings.textBoxWidthInPercent}%`} textAlign={settings.textAlign} ref={textRef} textWrap={true} zIndex={2}/>);
154
+
155
+ const wordRefs = [];
156
+ const opacitySignal = createSignal(settings.fadeInAnimation ? 0.5 : 1);
157
+ for(let j = 0; j < currentBatch.length; j++){
158
+ const word = currentBatch[j];
159
+ const optionalSpace = j === currentBatch.length-1? "" : " ";
160
+ const wordRef = createRef<Txt>();
161
+ textRef().add(
162
+ <Txt
163
+ fontSize={settings.fontSize}
164
+ fontWeight={settings.fontWeight}
165
+ ref={wordRef}
166
+ fontFamily={settings.fontFamily}
167
+ textWrap={true}
168
+ textAlign={settings.textAlign}
169
+ fill={settings.textColor}
170
+ zIndex={2}
171
+ stroke={settings.borderColor}
172
+ lineWidth={settings.borderWidth}
173
+ shadowBlur={settings.shadowBlur}
174
+ shadowColor={settings.shadowColor}
175
+ opacity={opacitySignal}
176
+ >
177
+ {word.punctuated_word}
178
+ </Txt>
179
+ );
180
+ textRef().add(<Txt fontSize={settings.fontSize}>{optionalSpace}</Txt>);
181
+
182
+ // we have to yield once to await the first word being aligned correctly
183
+ if(j===0 && i === 0){
184
+ yield;
185
+ }
186
+ wordRefs.push(wordRef);
187
+ }
188
+
189
+ yield* all(
190
+ opacitySignal(1, Math.min(0.1, (currentBatch[0].end-currentBatch[0].start)*0.5)),
191
+ highlightCurrentWord(container, currentBatch, wordRefs, settings.currentWordColor, settings.currentWordBackgroundColor),
192
+ waitFor(currentBatch[currentBatch.length-1].end - currentBatch[0].start + waitAfter),
193
+ );
194
+ textRef().remove();
195
+ }
196
+ waitBefore = nextClipStart !== null ? nextClipStart - currentBatch[currentBatch.length-1].end : 0;
197
+ }
198
+ }
199
+
200
+ function* highlightCurrentWord(container: Reference<Layout>, currentBatch: Word[], wordRefs: Reference<Txt>[], wordColor: string, backgroundColor: string){
201
+ let nextWordStart = 0;
202
+
203
+ for(let i = 0; i < currentBatch.length; i++){
204
+ yield* waitFor(nextWordStart);
205
+ const word = currentBatch[i];
206
+ const originalColor = wordRefs[i]().fill();
207
+ nextWordStart = currentBatch[i+1]?.start - word.end || 0;
208
+ wordRefs[i]().text(wordRefs[i]().text());
209
+ wordRefs[i]().fill(wordColor);
210
+
211
+ const backgroundRef = createRef<Rect>();
212
+ if(backgroundColor){
213
+ container().add(<Rect fill={backgroundColor} zIndex={1} size={wordRefs[i]().size} position={wordRefs[i]().position} radius={10} padding={10} ref={backgroundRef} />);
214
+ }
215
+
216
+ yield* waitFor(word.end-word.start);
217
+ wordRefs[i]().text(wordRefs[i]().text());
218
+ wordRefs[i]().fill(originalColor);
219
+
220
+ if(backgroundColor){
221
+ backgroundRef().remove();
222
+ }
223
+ }
224
+ }
@@ -0,0 +1,123 @@
1
+ import OpenAI from 'openai';
2
+ import axios from "axios";
3
+ import * as fs from "fs";
4
+ import { createClient } from "@deepgram/sdk";
5
+
6
+ const deepgram = createClient(process.env["DEEPGRAM_API_KEY"] || "");
7
+ const openai = new OpenAI({
8
+ apiKey: process.env['OPENAI_API_KEY'],
9
+ });
10
+
11
+ export async function getWordTimestamps(audioFilePath: string){
12
+ const {result} = await deepgram.listen.prerecorded.transcribeFile(fs.readFileSync(audioFilePath), {
13
+ model: "nova-2",
14
+ smart_format: true,
15
+ });
16
+
17
+ if (result) {
18
+ return result.results.channels[0].alternatives[0].words;
19
+ } else {
20
+ throw Error("transcription result is null");
21
+ }
22
+
23
+ }
24
+
25
+ export async function generateAudio(text: string, voiceName: string, savePath: string) {
26
+ const data = {
27
+ model_id: "eleven_multilingual_v2",
28
+ text: text,
29
+ };
30
+
31
+ const voiceId = await getVoiceByName(voiceName);
32
+
33
+ const response = await axios.post(`https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`, data, {
34
+ headers: {
35
+ "Content-Type": "application/json",
36
+ "xi-api-key": process.env.ELEVEN_API_KEY || "",
37
+ },
38
+ responseType: "arraybuffer",
39
+ });
40
+
41
+ fs.writeFileSync(savePath, response.data);
42
+ }
43
+
44
+ async function getVoiceByName(name: string) {
45
+ const response = await fetch("https://api.elevenlabs.io/v1/voices", {
46
+ method: "GET",
47
+ headers: {
48
+ "xi-api-key": process.env.ELEVEN_API_KEY || "",
49
+ },
50
+ });
51
+
52
+ if (!response.ok) {
53
+ throw new Error(`HTTP error! status: ${response.status}`);
54
+ }
55
+
56
+ const data: any = await response.json();
57
+ const voice = data.voices.find((voice: {name: string; voice_id: string}) => voice.name === name);
58
+ return voice ? voice.voice_id : null;
59
+ }
60
+
61
+ export async function getVideoScript(videoTopic: string) {
62
+ const prompt = `Create a script for a youtube short. The script should be around 60 to 80 words long and be an interesting text about the provided topic, and it should start with a catchy headline, something like "Did you know that?" or "This will blow your mind". Remember that this is for a voiceover that should be read, so things like hashtags should not be included. Now write the script for the following topic: "${videoTopic}". Now return the script and nothing else, also no meta-information - ONLY THE VOICEOVER.`;
63
+
64
+ const chatCompletion = await openai.chat.completions.create({
65
+ messages: [{ role: 'user', content: prompt }],
66
+ model: 'gpt-4-turbo-preview',
67
+ });
68
+
69
+ const result = chatCompletion.choices[0].message.content;
70
+
71
+ if (result) {
72
+ return result;
73
+ } else {
74
+ throw Error("returned text is null");
75
+ }
76
+
77
+ }
78
+
79
+ export async function getImagePromptFromScript(script: string) {
80
+ const prompt = `My goal is to create a Youtube Short based on the following script. To create a background image for the video, I am using a text-to-video AI model. Please write a short (not longer than a single sentence), suitable prompt for such a model based on this script: ${script}.\n\nNow return the prompt and nothing else.`;
81
+
82
+ const chatCompletion = await openai.chat.completions.create({
83
+ messages: [{ role: 'user', content: prompt }],
84
+ model: 'gpt-4-turbo-preview',
85
+ temperature: 1.0 // high temperature for "creativeness"
86
+ });
87
+
88
+ const result = chatCompletion.choices[0].message.content;
89
+
90
+ if (result) {
91
+ return result;
92
+ } else {
93
+ throw Error("returned text is null");
94
+ }
95
+
96
+ }
97
+
98
+ export async function dalleGenerate(prompt: string, savePath: string) {
99
+ const response = await openai.images.generate({
100
+ model: "dall-e-3",
101
+ prompt: prompt,
102
+ size: "1024x1792",
103
+ quality: "standard",
104
+ n: 1,
105
+ });
106
+
107
+ if (!response.data || !response.data[0]) {
108
+ throw new Error("No image generated");
109
+ }
110
+
111
+ const url = response.data[0].url;
112
+ const responseImage = await axios.get(url || "", {
113
+ responseType: "arraybuffer",
114
+ });
115
+ const buffer = Buffer.from(responseImage.data, "binary");
116
+
117
+ try {
118
+ await fs.promises.writeFile(savePath, buffer);
119
+ } catch (error) {
120
+ console.error("Error saving the file:", error);
121
+ throw error; // Rethrow the error so it can be handled by the caller
122
+ }
123
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "@revideo/2d/tsconfig.project.json",
3
+ "include": ["src"],
4
+ "compilerOptions": {
5
+ "noEmit": false,
6
+ "outDir": "dist",
7
+ "module": "CommonJS"
8
+ }
9
+ }
@@ -0,0 +1,8 @@
1
+ import {defineConfig} from 'vite';
2
+ import motionCanvas from '@revideo/vite-plugin';
3
+
4
+ export default defineConfig({
5
+ plugins: [
6
+ motionCanvas()
7
+ ],
8
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revideo/create",
3
- "version": "0.5.11-alpha.1102+0e7e4d50",
3
+ "version": "0.5.11-alpha.1104+bde9632d",
4
4
  "description": "Quickly scaffold revideo projects",
5
5
  "main": "index.js",
6
6
  "author": "revideo",
@@ -20,17 +20,17 @@
20
20
  "url": "https://github.com/havenhq/revideo.git"
21
21
  },
22
22
  "devDependencies": {
23
- "@revideo/2d": "^0.5.11-alpha.1102+0e7e4d50",
24
- "@revideo/core": "^0.5.11-alpha.1102+0e7e4d50",
25
- "@revideo/ffmpeg": "^0.5.11-alpha.1102+0e7e4d50",
26
- "@revideo/renderer": "^0.5.11-alpha.1102+0e7e4d50",
27
- "@revideo/ui": "^0.5.11-alpha.1102+0e7e4d50",
28
- "@revideo/vite-plugin": "^0.5.11-alpha.1102+0e7e4d50"
23
+ "@revideo/2d": "^0.5.11-alpha.1104+bde9632d",
24
+ "@revideo/core": "^0.5.11-alpha.1104+bde9632d",
25
+ "@revideo/ffmpeg": "^0.5.11-alpha.1104+bde9632d",
26
+ "@revideo/renderer": "^0.5.11-alpha.1104+bde9632d",
27
+ "@revideo/ui": "^0.5.11-alpha.1104+bde9632d",
28
+ "@revideo/vite-plugin": "^0.5.11-alpha.1104+bde9632d"
29
29
  },
30
30
  "dependencies": {
31
- "@revideo/telemetry": "^0.5.11-alpha.1102+0e7e4d50",
31
+ "@revideo/telemetry": "^0.5.11-alpha.1104+bde9632d",
32
32
  "minimist": "^1.2.8",
33
33
  "prompts": "^2.4.2"
34
34
  },
35
- "gitHead": "0e7e4d507edb33100545ec8d052af54452455a04"
35
+ "gitHead": "bde9632d22c56cf625242c5ea2136a83fd39b952"
36
36
  }