mulmocast 2.1.31 → 2.1.32

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.
@@ -245,6 +245,8 @@ export declare const beat_graph_data: {
245
245
  moderation: string;
246
246
  canvasSize: string;
247
247
  quality: string;
248
+ vertexai_project: string;
249
+ vertexai_location: string;
248
250
  };
249
251
  };
250
252
  defaultValue: {};
@@ -271,6 +273,8 @@ export declare const beat_graph_data: {
271
273
  model: string;
272
274
  duration: string;
273
275
  canvasSize: string;
276
+ vertexai_project: string;
277
+ vertexai_location: string;
274
278
  };
275
279
  };
276
280
  defaultValue: {};
@@ -149,6 +149,8 @@ export const beat_graph_data = {
149
149
  moderation: ":preprocessor.imageParams.moderation",
150
150
  canvasSize: ":context.presentationStyle.canvasSize",
151
151
  quality: ":preprocessor.imageParams.quality",
152
+ vertexai_project: ":preprocessor.imageParams.vertexai_project",
153
+ vertexai_location: ":preprocessor.imageParams.vertexai_location",
152
154
  },
153
155
  },
154
156
  defaultValue: {},
@@ -175,6 +177,8 @@ export const beat_graph_data = {
175
177
  model: ":preprocessor.movieAgentInfo.movieParams.model",
176
178
  duration: ":preprocessor.beatDuration",
177
179
  canvasSize: ":context.presentationStyle.canvasSize",
180
+ vertexai_project: ":preprocessor.movieAgentInfo.movieParams.vertexai_project",
181
+ vertexai_location: ":preprocessor.movieAgentInfo.movieParams.vertexai_location",
178
182
  },
179
183
  },
180
184
  defaultValue: {},
@@ -349,6 +349,26 @@ export declare const mulmoMermaidMediaSchema: z.ZodObject<{
349
349
  path: z.ZodString;
350
350
  }, z.core.$strict>], "kind">;
351
351
  appendix: z.ZodOptional<z.ZodArray<z.ZodString>>;
352
+ style: z.ZodOptional<z.ZodString>;
353
+ backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
354
+ source: z.ZodDiscriminatedUnion<[z.ZodObject<{
355
+ kind: z.ZodLiteral<"url">;
356
+ url: z.ZodURL;
357
+ }, z.core.$strict>, z.ZodObject<{
358
+ kind: z.ZodLiteral<"base64">;
359
+ data: z.ZodString;
360
+ }, z.core.$strict>, z.ZodObject<{
361
+ kind: z.ZodLiteral<"path">;
362
+ path: z.ZodString;
363
+ }, z.core.$strict>], "kind">;
364
+ size: z.ZodOptional<z.ZodEnum<{
365
+ cover: "cover";
366
+ contain: "contain";
367
+ fill: "fill";
368
+ auto: "auto";
369
+ }>>;
370
+ opacity: z.ZodOptional<z.ZodNumber>;
371
+ }, z.core.$strip>]>>>;
352
372
  }, z.core.$strict>;
353
373
  export declare const mulmoHtmlTailwindMediaSchema: z.ZodObject<{
354
374
  type: z.ZodLiteral<"html_tailwind">;
@@ -498,6 +518,26 @@ export declare const mulmoImageAssetSchema: z.ZodUnion<readonly [z.ZodObject<{
498
518
  path: z.ZodString;
499
519
  }, z.core.$strict>], "kind">;
500
520
  appendix: z.ZodOptional<z.ZodArray<z.ZodString>>;
521
+ style: z.ZodOptional<z.ZodString>;
522
+ backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
523
+ source: z.ZodDiscriminatedUnion<[z.ZodObject<{
524
+ kind: z.ZodLiteral<"url">;
525
+ url: z.ZodURL;
526
+ }, z.core.$strict>, z.ZodObject<{
527
+ kind: z.ZodLiteral<"base64">;
528
+ data: z.ZodString;
529
+ }, z.core.$strict>, z.ZodObject<{
530
+ kind: z.ZodLiteral<"path">;
531
+ path: z.ZodString;
532
+ }, z.core.$strict>], "kind">;
533
+ size: z.ZodOptional<z.ZodEnum<{
534
+ cover: "cover";
535
+ contain: "contain";
536
+ fill: "fill";
537
+ auto: "auto";
538
+ }>>;
539
+ opacity: z.ZodOptional<z.ZodNumber>;
540
+ }, z.core.$strip>]>>>;
501
541
  }, z.core.$strict>, z.ZodObject<{
502
542
  type: z.ZodLiteral<"html_tailwind">;
503
543
  html: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
@@ -1092,6 +1132,26 @@ export declare const mulmoBeatSchema: z.ZodObject<{
1092
1132
  path: z.ZodString;
1093
1133
  }, z.core.$strict>], "kind">;
1094
1134
  appendix: z.ZodOptional<z.ZodArray<z.ZodString>>;
1135
+ style: z.ZodOptional<z.ZodString>;
1136
+ backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
1137
+ source: z.ZodDiscriminatedUnion<[z.ZodObject<{
1138
+ kind: z.ZodLiteral<"url">;
1139
+ url: z.ZodURL;
1140
+ }, z.core.$strict>, z.ZodObject<{
1141
+ kind: z.ZodLiteral<"base64">;
1142
+ data: z.ZodString;
1143
+ }, z.core.$strict>, z.ZodObject<{
1144
+ kind: z.ZodLiteral<"path">;
1145
+ path: z.ZodString;
1146
+ }, z.core.$strict>], "kind">;
1147
+ size: z.ZodOptional<z.ZodEnum<{
1148
+ cover: "cover";
1149
+ contain: "contain";
1150
+ fill: "fill";
1151
+ auto: "auto";
1152
+ }>>;
1153
+ opacity: z.ZodOptional<z.ZodNumber>;
1154
+ }, z.core.$strip>]>>>;
1095
1155
  }, z.core.$strict>, z.ZodObject<{
1096
1156
  type: z.ZodLiteral<"html_tailwind">;
1097
1157
  html: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
@@ -2363,6 +2423,26 @@ export declare const mulmoScriptSchema: z.ZodObject<{
2363
2423
  path: z.ZodString;
2364
2424
  }, z.core.$strict>], "kind">;
2365
2425
  appendix: z.ZodOptional<z.ZodArray<z.ZodString>>;
2426
+ style: z.ZodOptional<z.ZodString>;
2427
+ backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
2428
+ source: z.ZodDiscriminatedUnion<[z.ZodObject<{
2429
+ kind: z.ZodLiteral<"url">;
2430
+ url: z.ZodURL;
2431
+ }, z.core.$strict>, z.ZodObject<{
2432
+ kind: z.ZodLiteral<"base64">;
2433
+ data: z.ZodString;
2434
+ }, z.core.$strict>, z.ZodObject<{
2435
+ kind: z.ZodLiteral<"path">;
2436
+ path: z.ZodString;
2437
+ }, z.core.$strict>], "kind">;
2438
+ size: z.ZodOptional<z.ZodEnum<{
2439
+ cover: "cover";
2440
+ contain: "contain";
2441
+ fill: "fill";
2442
+ auto: "auto";
2443
+ }>>;
2444
+ opacity: z.ZodOptional<z.ZodNumber>;
2445
+ }, z.core.$strip>]>>>;
2366
2446
  }, z.core.$strict>, z.ZodObject<{
2367
2447
  type: z.ZodLiteral<"html_tailwind">;
2368
2448
  html: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
@@ -3319,6 +3399,26 @@ export declare const mulmoStudioSchema: z.ZodObject<{
3319
3399
  path: z.ZodString;
3320
3400
  }, z.core.$strict>], "kind">;
3321
3401
  appendix: z.ZodOptional<z.ZodArray<z.ZodString>>;
3402
+ style: z.ZodOptional<z.ZodString>;
3403
+ backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
3404
+ source: z.ZodDiscriminatedUnion<[z.ZodObject<{
3405
+ kind: z.ZodLiteral<"url">;
3406
+ url: z.ZodURL;
3407
+ }, z.core.$strict>, z.ZodObject<{
3408
+ kind: z.ZodLiteral<"base64">;
3409
+ data: z.ZodString;
3410
+ }, z.core.$strict>, z.ZodObject<{
3411
+ kind: z.ZodLiteral<"path">;
3412
+ path: z.ZodString;
3413
+ }, z.core.$strict>], "kind">;
3414
+ size: z.ZodOptional<z.ZodEnum<{
3415
+ cover: "cover";
3416
+ contain: "contain";
3417
+ fill: "fill";
3418
+ auto: "auto";
3419
+ }>>;
3420
+ opacity: z.ZodOptional<z.ZodNumber>;
3421
+ }, z.core.$strip>]>>>;
3322
3422
  }, z.core.$strict>, z.ZodObject<{
3323
3423
  type: z.ZodLiteral<"html_tailwind">;
3324
3424
  html: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
@@ -186,6 +186,8 @@ export const mulmoMermaidMediaSchema = z
186
186
  title: z.string().describe("The title of the diagram"),
187
187
  code: mediaSourceMermaidSchema.describe("The code of the mermaid diagram"),
188
188
  appendix: z.array(z.string()).optional().describe("The appendix of the mermaid diagram; typically, style information."),
189
+ style: z.string().optional(),
190
+ backgroundImage: backgroundImageSchema,
189
191
  })
190
192
  .strict();
191
193
  export const mulmoHtmlTailwindMediaSchema = z
@@ -395,6 +395,21 @@ export declare const createStudioData: (_mulmoScript: MulmoScript, fileName: str
395
395
  path: string;
396
396
  };
397
397
  appendix?: string[] | undefined;
398
+ style?: string | undefined;
399
+ backgroundImage?: string | {
400
+ source: {
401
+ kind: "url";
402
+ url: string;
403
+ } | {
404
+ kind: "base64";
405
+ data: string;
406
+ } | {
407
+ kind: "path";
408
+ path: string;
409
+ };
410
+ size?: "cover" | "contain" | "fill" | "auto" | undefined;
411
+ opacity?: number | undefined;
412
+ } | null | undefined;
398
413
  } | {
399
414
  type: "html_tailwind";
400
415
  html: string | string[];
@@ -1104,6 +1119,21 @@ export declare const initializeContextFromFiles: (files: FileObject, raiseError:
1104
1119
  path: string;
1105
1120
  };
1106
1121
  appendix?: string[] | undefined;
1122
+ style?: string | undefined;
1123
+ backgroundImage?: string | {
1124
+ source: {
1125
+ kind: "url";
1126
+ url: string;
1127
+ } | {
1128
+ kind: "base64";
1129
+ data: string;
1130
+ } | {
1131
+ kind: "path";
1132
+ path: string;
1133
+ };
1134
+ size?: "cover" | "contain" | "fill" | "auto" | undefined;
1135
+ opacity?: number | undefined;
1136
+ } | null | undefined;
1107
1137
  } | {
1108
1138
  type: "html_tailwind";
1109
1139
  html: string | string[];
@@ -1,8 +1,13 @@
1
- import { BackgroundImage, MulmoStudioContext } from "../../types/index.js";
1
+ import { BackgroundImage, MulmoStudioContext, ImageProcessorParams } from "../../types/index.js";
2
2
  /**
3
3
  * Resolve background image from beat level and global level settings.
4
4
  * Beat level takes precedence over global level.
5
5
  * null explicitly disables background image.
6
6
  */
7
7
  export declare const resolveBackgroundImage: (beatBackgroundImage: BackgroundImage | undefined, globalBackgroundImage: BackgroundImage | undefined) => BackgroundImage | undefined;
8
+ /**
9
+ * Resolve combined style from background image and custom style.
10
+ * Common pattern used by markdown, textSlide, mermaid plugins.
11
+ */
12
+ export declare const resolveCombinedStyle: (params: ImageProcessorParams, beatBackgroundImage: BackgroundImage | undefined, beatStyle: string | undefined) => Promise<string>;
8
13
  export declare const backgroundImageToCSS: (backgroundImage: BackgroundImage | undefined, context: MulmoStudioContext) => Promise<string>;
@@ -1,4 +1,5 @@
1
1
  import { MulmoMediaSourceMethods } from "../../methods/mulmo_media_source.js";
2
+ import { resolveStyle } from "./utils.js";
2
3
  const DEFAULT_FETCH_TIMEOUT_MS = 30000;
3
4
  /**
4
5
  * Resolve background image from beat level and global level settings.
@@ -52,6 +53,18 @@ const fetchUrlAsDataUrl = async (url, timeoutMs = DEFAULT_FETCH_TIMEOUT_MS) => {
52
53
  const sizeToCSS = (size) => {
53
54
  return size === "fill" ? "100% 100%" : size;
54
55
  };
56
+ /**
57
+ * Resolve combined style from background image and custom style.
58
+ * Common pattern used by markdown, textSlide, mermaid plugins.
59
+ */
60
+ export const resolveCombinedStyle = async (params, beatBackgroundImage, beatStyle) => {
61
+ const { context, textSlideStyle } = params;
62
+ const globalBackgroundImage = context.studio.script.imageParams?.backgroundImage;
63
+ const resolvedBackgroundImage = resolveBackgroundImage(beatBackgroundImage, globalBackgroundImage);
64
+ const backgroundCSS = await backgroundImageToCSS(resolvedBackgroundImage, context);
65
+ const style = resolveStyle(beatStyle, textSlideStyle);
66
+ return backgroundCSS + style;
67
+ };
55
68
  export const backgroundImageToCSS = async (backgroundImage, context) => {
56
69
  if (!backgroundImage) {
57
70
  return "";
@@ -1,7 +1,7 @@
1
1
  import { getHTMLFile } from "../file.js";
2
2
  import { renderHTMLToImage, interpolate } from "../html_render.js";
3
- import { parrotingImagePath, resolveStyle } from "./utils.js";
4
- import { resolveBackgroundImage, backgroundImageToCSS } from "./bg_image_util.js";
3
+ import { parrotingImagePath } from "./utils.js";
4
+ import { resolveCombinedStyle } from "./bg_image_util.js";
5
5
  import { generateLayoutHtml, layoutToMarkdown, toMarkdownString, parseMarkdown } from "./markdown_layout.js";
6
6
  import { isObject } from "graphai";
7
7
  export const imageType = "markdown";
@@ -24,17 +24,11 @@ const dumpMarkdown = (params) => {
24
24
  };
25
25
  // Generate full HTML for rendering
26
26
  const generateHtml = async (params) => {
27
- const { beat, context } = params;
27
+ const { beat } = params;
28
28
  if (!beat.image || beat.image.type !== imageType)
29
29
  return "";
30
30
  const md = beat.image.markdown;
31
- const style = resolveStyle(beat.image.style, params.textSlideStyle);
32
- // Resolve background image (beat level overrides global)
33
- const globalBackgroundImage = context.studio.script.imageParams?.backgroundImage;
34
- const beatBackgroundImage = beat.image.backgroundImage;
35
- const resolvedBackgroundImage = resolveBackgroundImage(beatBackgroundImage, globalBackgroundImage);
36
- const backgroundCSS = await backgroundImageToCSS(resolvedBackgroundImage, context);
37
- const combinedStyle = backgroundCSS + style;
31
+ const combinedStyle = await resolveCombinedStyle(params, beat.image.backgroundImage, beat.image.style);
38
32
  if (isMarkdownLayout(md)) {
39
33
  const htmlBody = await generateLayoutHtml(md);
40
34
  const template = getHTMLFile("tailwind");
@@ -46,6 +40,15 @@ const generateHtml = async (params) => {
46
40
  }
47
41
  const markdown = dumpMarkdown(params) ?? "";
48
42
  const body = await parseMarkdown(markdown);
43
+ // Use tailwind template if mermaid is present to ensure mermaid CDN is loaded
44
+ if (containsMermaid(md)) {
45
+ const template = getHTMLFile("tailwind");
46
+ return interpolate(template, {
47
+ title: "Markdown",
48
+ html_body: `<div class="prose max-w-none p-6">${body}</div>`,
49
+ custom_style: combinedStyle,
50
+ });
51
+ }
49
52
  return `<html><head><style>${combinedStyle}</style></head><body>${body}</body></html>`;
50
53
  };
51
54
  // Check if markdown content contains mermaid code blocks
@@ -2,6 +2,7 @@ import { MulmoMediaSourceMethods } from "../../methods/index.js";
2
2
  import { getHTMLFile } from "../file.js";
3
3
  import { renderHTMLToImage, interpolate } from "../html_render.js";
4
4
  import { parrotingImagePath, generateUniqueId } from "./utils.js";
5
+ import { resolveCombinedStyle } from "./bg_image_util.js";
5
6
  export const imageType = "mermaid";
6
7
  // Generate mermaid HTML from code string (shared utility)
7
8
  export const generateMermaidHtml = (code, title) => {
@@ -18,15 +19,16 @@ export const generateMermaidHtml = (code, title) => {
18
19
  </div>`;
19
20
  };
20
21
  const processMermaid = async (params) => {
21
- const { beat, imagePath, canvasSize, context, textSlideStyle } = params;
22
+ const { beat, imagePath, canvasSize, context } = params;
22
23
  if (!beat?.image || beat.image.type !== imageType)
23
24
  return;
24
25
  const template = getHTMLFile("mermaid");
25
26
  const diagram_code = await MulmoMediaSourceMethods.getText(beat.image.code, context);
26
27
  if (diagram_code) {
28
+ const combinedStyle = await resolveCombinedStyle(params, beat.image.backgroundImage, beat.image.style);
27
29
  const htmlData = interpolate(template, {
28
30
  title: beat.image.title,
29
- style: textSlideStyle,
31
+ style: combinedStyle,
30
32
  diagram_code: `${diagram_code}\n${beat.image.appendix?.join("\n") ?? ""}`,
31
33
  });
32
34
  await renderHTMLToImage(htmlData, imagePath, canvasSize.width, canvasSize.height, true);
@@ -1,20 +1,14 @@
1
1
  import { renderMarkdownToImage } from "../html_render.js";
2
- import { parrotingImagePath, resolveStyle } from "./utils.js";
3
- import { resolveBackgroundImage, backgroundImageToCSS } from "./bg_image_util.js";
2
+ import { parrotingImagePath } from "./utils.js";
3
+ import { resolveCombinedStyle } from "./bg_image_util.js";
4
4
  import { marked } from "marked";
5
5
  export const imageType = "textSlide";
6
6
  const processTextSlide = async (params) => {
7
- const { beat, context, imagePath, textSlideStyle, canvasSize } = params;
7
+ const { beat, imagePath, canvasSize } = params;
8
8
  if (!beat.image || beat.image.type !== imageType)
9
9
  return;
10
10
  const slide = beat.image.slide;
11
- const style = resolveStyle(beat.image.style, textSlideStyle);
12
- // Resolve background image (beat level overrides global)
13
- const globalBackgroundImage = context.studio.script.imageParams?.backgroundImage;
14
- const beatBackgroundImage = beat.image.backgroundImage;
15
- const resolvedBackgroundImage = resolveBackgroundImage(beatBackgroundImage, globalBackgroundImage);
16
- const backgroundCSS = await backgroundImageToCSS(resolvedBackgroundImage, context);
17
- const combinedStyle = backgroundCSS + style;
11
+ const combinedStyle = await resolveCombinedStyle(params, beat.image.backgroundImage, beat.image.style);
18
12
  const markdown = dumpMarkdown(params) ?? "";
19
13
  const topMargin = (() => {
20
14
  if (slide.bullets?.length && slide.bullets.length > 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mulmocast",
3
- "version": "2.1.31",
3
+ "version": "2.1.32",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "lib/index.node.js",
@@ -123,6 +123,6 @@
123
123
  "typescript-eslint": "^8.54.0"
124
124
  },
125
125
  "engines": {
126
- "node": ">=20.0.0"
126
+ "node": ">=22.0.0"
127
127
  }
128
128
  }
@@ -108,6 +108,40 @@
108
108
  "size": "cover"
109
109
  }
110
110
  }
111
+ },
112
+ {
113
+ "text": "マークダウンにMermaid図を埋め込むこともできます。",
114
+ "image": {
115
+ "type": "markdown",
116
+ "markdown": "# システム構成\n\n```mermaid\ngraph TD\n A[ユーザー] --> B[API]\n B --> C[データベース]\n```",
117
+ "backgroundImage": {
118
+ "source": {
119
+ "kind": "url",
120
+ "url": "https://raw.githubusercontent.com/SingularitySociety/societys_statement/main/images/mulmocast/mulmocast-logo.png"
121
+ },
122
+ "opacity": 0.2,
123
+ "size": "cover"
124
+ }
125
+ }
126
+ },
127
+ {
128
+ "text": "Mermaidタイプでも背景画像が使えます。",
129
+ "image": {
130
+ "type": "mermaid",
131
+ "title": "アーキテクチャ",
132
+ "code": {
133
+ "kind": "text",
134
+ "text": "graph LR\n Client --> Gateway\n Gateway --> Service\n Service --> Database[(DB)]"
135
+ },
136
+ "backgroundImage": {
137
+ "source": {
138
+ "kind": "url",
139
+ "url": "https://raw.githubusercontent.com/SingularitySociety/societys_statement/main/images/mulmocast/mulmocast-logo.png"
140
+ },
141
+ "opacity": 0.2,
142
+ "size": "cover"
143
+ }
144
+ }
111
145
  }
112
146
  ]
113
147
  }
@@ -1,24 +1,122 @@
1
1
  {
2
- "$mulmocast": {
3
- "version": "1.1",
4
- "credit": "closing"
5
- },
6
- "title": "Vertex AI Test",
7
- "description": "Test Vertex AI integration",
2
+ "$mulmocast": { "version": "1.1" },
8
3
  "lang": "en",
4
+ "title": "Vertex AI Test (TTS + Image + Movie)",
5
+ "description": "Replace YOUR_PROJECT_ID with your Google Cloud project ID",
6
+ "speechParams": {
7
+ "speakers": {
8
+ "GCP": {
9
+ "provider": "google",
10
+ "voiceId": "en-US-Studio-O"
11
+ },
12
+ "Gemini": {
13
+ "provider": "google",
14
+ "model": "gemini-2.5-pro-tts",
15
+ "voiceId": "Kore"
16
+ }
17
+ }
18
+ },
9
19
  "imageParams": {
10
20
  "provider": "google",
11
21
  "model": "imagen-4.0-generate-001",
12
- "vertexai_project": "${GOOGLE_PROJECT_ID}",
22
+ "vertexai_project": "YOUR_PROJECT_ID",
13
23
  "vertexai_location": "us-central1"
14
24
  },
15
- "speechParams": {
16
- "provider": "mock"
25
+ "movieParams": {
26
+ "provider": "google",
27
+ "model": "veo-2.0-generate-001",
28
+ "vertexai_project": "YOUR_PROJECT_ID",
29
+ "vertexai_location": "us-central1"
17
30
  },
18
31
  "beats": [
19
32
  {
20
- "text": "Hello",
21
- "imagePrompt": "A simple blue circle on white background"
33
+ "id": "gcp_tts_imagen4",
34
+ "speaker": "GCP",
35
+ "text": "TTS: Google Cloud TTS en-US-Studio-O. Image: Imagen 4.",
36
+ "imagePrompt": "A beautiful mountain landscape at sunrise"
37
+ },
38
+ {
39
+ "id": "gemini_tts_imagen4",
40
+ "speaker": "Gemini",
41
+ "text": "TTS: Gemini 2.5 Pro TTS Kore. Image: Imagen 4.",
42
+ "imagePrompt": "A futuristic city with flying cars"
43
+ },
44
+ {
45
+ "id": "imagen4_ultra_override",
46
+ "speaker": "GCP",
47
+ "text": "TTS: Google Cloud TTS en-US-Studio-O. Image: Imagen 4 Ultra override.",
48
+ "imagePrompt": "A woman walking through Tokyo at night with neon lights",
49
+ "imageParams": {
50
+ "model": "imagen-4.0-ultra-generate-001",
51
+ "vertexai_project": "YOUR_PROJECT_ID",
52
+ "vertexai_location": "us-central1"
53
+ }
54
+ },
55
+ {
56
+ "id": "imagen4_fast_override",
57
+ "speaker": "Gemini",
58
+ "text": "TTS: Gemini 2.5 Pro TTS Kore. Image: Imagen 4 Fast override.",
59
+ "imagePrompt": "A cat sitting on a windowsill watching rain",
60
+ "imageParams": {
61
+ "model": "imagen-4.0-fast-generate-001",
62
+ "vertexai_project": "YOUR_PROJECT_ID",
63
+ "vertexai_location": "us-central1"
64
+ }
65
+ },
66
+ {
67
+ "id": "veo2_movie",
68
+ "speaker": "GCP",
69
+ "text": "TTS: Google Cloud TTS en-US-Studio-O. Movie: Veo 2.",
70
+ "moviePrompt": "A butterfly flying in slow motion through a garden",
71
+ "duration": 5
72
+ },
73
+ {
74
+ "id": "veo3_movie_override",
75
+ "speaker": "Gemini",
76
+ "text": "TTS: Gemini 2.5 Pro TTS Kore. Movie: Veo 3 override.",
77
+ "moviePrompt": "Ocean waves crashing on a beach at sunset",
78
+ "movieParams": {
79
+ "model": "veo-3.0-generate-001",
80
+ "vertexai_project": "YOUR_PROJECT_ID",
81
+ "vertexai_location": "us-central1"
82
+ }
83
+ },
84
+ {
85
+ "id": "image_to_movie_veo2",
86
+ "speaker": "GCP",
87
+ "text": "TTS: Google Cloud TTS en-US-Studio-O. Image: Imagen 4. Movie: Veo 2 with image reference.",
88
+ "imagePrompt": "A woman standing in a busy Tokyo street at night",
89
+ "moviePrompt": "The woman takes a selfie with her phone",
90
+ "duration": 5
91
+ },
92
+ {
93
+ "id": "image_to_movie_veo3_override",
94
+ "speaker": "Gemini",
95
+ "text": "TTS: Gemini 2.5 Pro TTS Kore. Image: Imagen 4 Fast override. Movie: Veo 3 override with image reference.",
96
+ "imagePrompt": "A robot standing in a futuristic laboratory",
97
+ "imageParams": {
98
+ "model": "imagen-4.0-fast-generate-001",
99
+ "vertexai_project": "YOUR_PROJECT_ID",
100
+ "vertexai_location": "us-central1"
101
+ },
102
+ "moviePrompt": "The robot turns its head and waves at the camera",
103
+ "movieParams": {
104
+ "model": "veo-3.0-generate-001",
105
+ "vertexai_project": "YOUR_PROJECT_ID",
106
+ "vertexai_location": "us-central1"
107
+ },
108
+ "duration": 5
109
+ },
110
+ {
111
+ "id": "gemini_flash_image_override",
112
+ "speaker": "GCP",
113
+ "text": "TTS: Google Cloud TTS en-US-Studio-O. Image: Gemini 2.5 Flash Image override.",
114
+ "imagePrompt": "A cozy coffee shop interior with warm lighting",
115
+ "imageParams": {
116
+ "model": "gemini-2.5-flash-image",
117
+ "vertexai_project": "YOUR_PROJECT_ID",
118
+ "vertexai_location": "us-central1"
119
+ }
22
120
  }
23
121
  ]
24
122
  }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$mulmocast": { "version": "1.1" },
3
+ "lang": "en",
4
+ "title": "Vertex AI Simple Test",
5
+ "description": "Replace YOUR_PROJECT_ID with your Google Cloud project ID",
6
+ "imageParams": {
7
+ "provider": "google",
8
+ "model": "imagen-4.0-generate-001",
9
+ "vertexai_project": "YOUR_PROJECT_ID"
10
+ },
11
+ "beats": [
12
+ {
13
+ "text": "Hello, world! This is a simple Vertex AI test.",
14
+ "imagePrompt": "A beautiful sunset over the ocean"
15
+ }
16
+ ]
17
+ }