mulmocast 2.0.2 → 2.0.3

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.
package/README.md CHANGED
@@ -440,6 +440,28 @@ Options:
440
440
  --image_width Image width (e.g., 400px, 50%, auto) [string]
441
441
  ```
442
442
 
443
+ ```
444
+ mulmo bundle <file>
445
+
446
+ Generate bundle files
447
+
448
+ Positionals:
449
+ file Mulmo Script File [string] [required]
450
+
451
+ Options:
452
+ --version Show version number [boolean]
453
+ -v, --verbose verbose log [boolean] [required] [default: false]
454
+ -h, --help Show help [boolean]
455
+ -o, --outdir output dir [string]
456
+ -b, --basedir base dir [string]
457
+ -l, --lang target language
458
+ [string] [choices: "en", "ja", "fr", "es", "de", "zh-CN", "zh-TW", "ko", "it",
459
+ "pt", "ar", "hi"]
460
+ -f, --force Force regenerate [boolean] [default: false]
461
+ --backup create backup media file [boolean] [default: false]
462
+ -p, --presentationStyle Presentation Style [string]
463
+ ```
464
+
443
465
  ```
444
466
  mulmo tool <command>
445
467
 
@@ -13,7 +13,7 @@
13
13
  },
14
14
  "imageParams": {
15
15
  "provider": "google",
16
- "model": "gemini-2.5-flash-image-preview",
16
+ "model": "gemini-2.5-flash-image",
17
17
  "style": "<style>Ghibli style multi-panel comic strips in landscape mode. Use speech bubbles with short, natural dialogue (1–6 words). Keep text minimal, like real comics. Let the art convey the story and emotions. Use the input image as the presenter.</style>",
18
18
  "images": {
19
19
  "presenter": {
@@ -58,8 +58,11 @@ export const mulmoViewerBundle = async (context) => {
58
58
  const zipper = new ZipBuilder(path.resolve(dir, zipFileName));
59
59
  // text
60
60
  const resultJson = [];
61
- context.studio.script.beats.forEach((beat) => {
62
- resultJson.push({ text: beat.text, duration: beat.duration, audioSources: {}, multiLinguals: {} });
61
+ context.studio.script.beats.forEach((beat, index) => {
62
+ const sudioBeats = context.studio.beats[index];
63
+ const { duration, startAt } = sudioBeats;
64
+ // console.log(context.studio.beats[index]);
65
+ resultJson.push({ text: beat.text, duration, startTime: startAt, endTime: (startAt ?? 0) + (duration ?? 0), audioSources: {}, multiLinguals: {} });
63
66
  });
64
67
  // audio
65
68
  for (const lang of bundleTargetLang) {
@@ -71,7 +71,7 @@ export const imageGenAIAgent = async ({ namedInputs, params, config, }) => {
71
71
  }
72
72
  try {
73
73
  const ai = new GoogleGenAI({ apiKey });
74
- if (model === "gemini-2.5-flash-image-preview") {
74
+ if (model === "gemini-2.5-flash-image" || model === "gemini-3-pro-image-preview") {
75
75
  const contents = getGeminiContents(prompt, aspectRatio, referenceImages);
76
76
  const response = await ai.models.generateContent({ model, contents });
77
77
  return geminiFlashResult(response);
@@ -17,7 +17,7 @@ export const imageOpenaiAgent = async ({ namedInputs, params, config, }) => {
17
17
  const model = params.model ?? provider2ImageAgent["openai"].defaultModel;
18
18
  const openai = new OpenAI({ apiKey, baseURL });
19
19
  const size = (() => {
20
- if (model === "gpt-image-1") {
20
+ if (model === "gpt-image-1" || model === "gpt-image-1-mini") {
21
21
  if (canvasSize.width > canvasSize.height) {
22
22
  return "1536x1024";
23
23
  }
@@ -46,7 +46,7 @@ export const imageOpenaiAgent = async ({ namedInputs, params, config, }) => {
46
46
  n: 1,
47
47
  size,
48
48
  };
49
- if (model === "gpt-image-1") {
49
+ if (model === "gpt-image-1" || model === "gpt-image-1-mini") {
50
50
  imageOptions.moderation = moderation || "auto";
51
51
  imageOptions.background = "opaque";
52
52
  if (quality) {
@@ -43,7 +43,7 @@ export const movieGenAIAgent = async ({ namedInputs, params, config, }) => {
43
43
  },
44
44
  image: undefined,
45
45
  };
46
- if (model === "veo-3.0-generate-preview") {
46
+ if (model === "veo-3.0-generate-001" || model === "veo-3.1-generate-preview") {
47
47
  payload.config.durationSeconds = undefined;
48
48
  }
49
49
  if (imagePath) {
@@ -39,6 +39,10 @@ export declare const promptTemplates: ({
39
39
  provider?: undefined;
40
40
  model?: undefined;
41
41
  };
42
+ movieParams: {
43
+ provider: string;
44
+ model?: undefined;
45
+ };
42
46
  soundEffectParams: {
43
47
  provider: string;
44
48
  };
@@ -58,7 +62,6 @@ export declare const promptTemplates: ({
58
62
  Teacher?: undefined;
59
63
  };
60
64
  };
61
- movieParams?: undefined;
62
65
  };
63
66
  scriptName: string;
64
67
  systemPrompt: string;
@@ -181,6 +184,10 @@ export declare const promptTemplates: ({
181
184
  style?: undefined;
182
185
  model?: undefined;
183
186
  };
187
+ movieParams: {
188
+ provider: string;
189
+ model?: undefined;
190
+ };
184
191
  soundEffectParams: {
185
192
  provider: string;
186
193
  };
@@ -200,7 +207,6 @@ export declare const promptTemplates: ({
200
207
  Teacher?: undefined;
201
208
  };
202
209
  };
203
- movieParams?: undefined;
204
210
  };
205
211
  scriptName: string;
206
212
  systemPrompt: string;
@@ -233,6 +239,10 @@ export declare const promptTemplates: ({
233
239
  provider?: undefined;
234
240
  model?: undefined;
235
241
  };
242
+ movieParams: {
243
+ provider: string;
244
+ model?: undefined;
245
+ };
236
246
  soundEffectParams: {
237
247
  provider: string;
238
248
  };
@@ -252,7 +262,6 @@ export declare const promptTemplates: ({
252
262
  Teacher?: undefined;
253
263
  };
254
264
  };
255
- movieParams?: undefined;
256
265
  };
257
266
  scriptName: string;
258
267
  systemPrompt: string;
@@ -298,6 +307,10 @@ export declare const promptTemplates: ({
298
307
  provider?: undefined;
299
308
  model?: undefined;
300
309
  };
310
+ movieParams: {
311
+ provider: string;
312
+ model?: undefined;
313
+ };
301
314
  soundEffectParams: {
302
315
  provider: string;
303
316
  };
@@ -317,7 +330,6 @@ export declare const promptTemplates: ({
317
330
  Teacher?: undefined;
318
331
  };
319
332
  };
320
- movieParams?: undefined;
321
333
  };
322
334
  scriptName: string;
323
335
  systemPrompt: string;
@@ -363,6 +375,10 @@ export declare const promptTemplates: ({
363
375
  provider: string;
364
376
  style: string;
365
377
  };
378
+ movieParams: {
379
+ provider: string;
380
+ model?: undefined;
381
+ };
366
382
  soundEffectParams: {
367
383
  provider: string;
368
384
  };
@@ -382,7 +398,6 @@ export declare const promptTemplates: ({
382
398
  Teacher?: undefined;
383
399
  };
384
400
  };
385
- movieParams?: undefined;
386
401
  };
387
402
  scriptName: string;
388
403
  systemPrompt: string;
@@ -434,6 +449,10 @@ export declare const promptTemplates: ({
434
449
  provider?: undefined;
435
450
  model?: undefined;
436
451
  };
452
+ movieParams: {
453
+ provider: string;
454
+ model?: undefined;
455
+ };
437
456
  soundEffectParams: {
438
457
  provider: string;
439
458
  };
@@ -453,7 +472,6 @@ export declare const promptTemplates: ({
453
472
  Teacher?: undefined;
454
473
  };
455
474
  };
456
- movieParams?: undefined;
457
475
  };
458
476
  scriptName: string;
459
477
  systemPrompt: string;
@@ -486,6 +504,10 @@ export declare const promptTemplates: ({
486
504
  provider?: undefined;
487
505
  model?: undefined;
488
506
  };
507
+ movieParams: {
508
+ provider: string;
509
+ model?: undefined;
510
+ };
489
511
  soundEffectParams: {
490
512
  provider: string;
491
513
  };
@@ -515,7 +537,6 @@ export declare const promptTemplates: ({
515
537
  Presenter?: undefined;
516
538
  };
517
539
  };
518
- movieParams?: undefined;
519
540
  };
520
541
  scriptName: string;
521
542
  systemPrompt: string;
@@ -548,6 +569,10 @@ export declare const promptTemplates: ({
548
569
  provider?: undefined;
549
570
  model?: undefined;
550
571
  };
572
+ movieParams: {
573
+ provider: string;
574
+ model?: undefined;
575
+ };
551
576
  soundEffectParams: {
552
577
  provider: string;
553
578
  };
@@ -567,7 +592,6 @@ export declare const promptTemplates: ({
567
592
  Teacher?: undefined;
568
593
  };
569
594
  };
570
- movieParams?: undefined;
571
595
  };
572
596
  scriptName: string;
573
597
  systemPrompt: string;
@@ -613,6 +637,10 @@ export declare const promptTemplates: ({
613
637
  provider?: undefined;
614
638
  model?: undefined;
615
639
  };
640
+ movieParams: {
641
+ provider: string;
642
+ model?: undefined;
643
+ };
616
644
  soundEffectParams: {
617
645
  provider: string;
618
646
  };
@@ -632,7 +660,6 @@ export declare const promptTemplates: ({
632
660
  Teacher?: undefined;
633
661
  };
634
662
  };
635
- movieParams?: undefined;
636
663
  };
637
664
  scriptName: string;
638
665
  systemPrompt: string;
@@ -668,6 +695,10 @@ export declare const promptTemplates: ({
668
695
  provider?: undefined;
669
696
  model?: undefined;
670
697
  };
698
+ movieParams: {
699
+ provider: string;
700
+ model?: undefined;
701
+ };
671
702
  soundEffectParams: {
672
703
  provider: string;
673
704
  };
@@ -687,7 +718,6 @@ export declare const promptTemplates: ({
687
718
  Teacher?: undefined;
688
719
  };
689
720
  };
690
- movieParams?: undefined;
691
721
  };
692
722
  scriptName: string;
693
723
  systemPrompt: string;
@@ -32,6 +32,9 @@ export const promptTemplates = [
32
32
  },
33
33
  style: "<style>AKIRA aesthetic.</style>",
34
34
  },
35
+ movieParams: {
36
+ provider: "replicate",
37
+ },
35
38
  soundEffectParams: {
36
39
  provider: "replicate",
37
40
  },
@@ -149,6 +152,9 @@ export const promptTemplates = [
149
152
  images: {},
150
153
  provider: "openai",
151
154
  },
155
+ movieParams: {
156
+ provider: "replicate",
157
+ },
152
158
  soundEffectParams: {
153
159
  provider: "replicate",
154
160
  },
@@ -192,6 +198,9 @@ export const promptTemplates = [
192
198
  imageParams: {
193
199
  style: "A hand-drawn style illustration with a warm, nostalgic atmosphere. The background is rich with natural scenery—lush forests, cloudy skies, and traditional Japanese architecture. Characters have expressive eyes, soft facial features, and are portrayed with gentle lighting and subtle shading. The color palette is muted yet vivid, using earthy tones and watercolor-like textures. The overall scene feels magical and peaceful, with a sense of quiet wonder and emotional depth, reminiscent of classic 1980s and 1990s Japanese animation.",
194
200
  },
201
+ movieParams: {
202
+ provider: "replicate",
203
+ },
195
204
  soundEffectParams: {
196
205
  provider: "replicate",
197
206
  },
@@ -242,6 +251,9 @@ export const promptTemplates = [
242
251
  imageParams: {
243
252
  style: "<style>A multi panel comic strips. 1990s American workplace humor. Clean, minimalist line art with muted colors. One character is a nerdy office worker with glasses</style>",
244
253
  },
254
+ movieParams: {
255
+ provider: "replicate",
256
+ },
245
257
  soundEffectParams: {
246
258
  provider: "replicate",
247
259
  },
@@ -285,6 +297,9 @@ export const promptTemplates = [
285
297
  imageParams: {
286
298
  style: "<style>Photo realistic and cinematic. Let the art convey the story and emotions without text. Use the image for the aspect ratio</style>",
287
299
  },
300
+ movieParams: {
301
+ provider: "replicate",
302
+ },
288
303
  soundEffectParams: {
289
304
  provider: "replicate",
290
305
  },
@@ -337,6 +352,9 @@ export const promptTemplates = [
337
352
  },
338
353
  style: "<style>Dragon Ball/Dr. Slump aesthetic.</style>",
339
354
  },
355
+ movieParams: {
356
+ provider: "replicate",
357
+ },
340
358
  soundEffectParams: {
341
359
  provider: "replicate",
342
360
  },
@@ -389,6 +407,9 @@ export const promptTemplates = [
389
407
  },
390
408
  style: "<style>Ghibli style</style>",
391
409
  },
410
+ movieParams: {
411
+ provider: "replicate",
412
+ },
392
413
  soundEffectParams: {
393
414
  provider: "replicate",
394
415
  },
@@ -439,10 +460,13 @@ export const promptTemplates = [
439
460
  type: "image",
440
461
  },
441
462
  },
442
- model: "gemini-2.5-flash-image-preview",
463
+ model: "gemini-2.5-flash-image",
443
464
  provider: "google",
444
465
  style: "<style>Ghibli style multi-panel comic strips in landscape mode. Use speech bubbles with short, natural dialogue (1–6 words). Keep text minimal, like real comics. Let the art convey the story and emotions. Use the input image as the presenter.</style>",
445
466
  },
467
+ movieParams: {
468
+ provider: "replicate",
469
+ },
446
470
  soundEffectParams: {
447
471
  provider: "replicate",
448
472
  },
@@ -502,6 +526,9 @@ export const promptTemplates = [
502
526
  },
503
527
  style: "<style>Ghost in the shell aesthetic.</style>",
504
528
  },
529
+ movieParams: {
530
+ provider: "replicate",
531
+ },
505
532
  soundEffectParams: {
506
533
  provider: "replicate",
507
534
  },
@@ -546,6 +573,9 @@ export const promptTemplates = [
546
573
  images: {},
547
574
  provider: "openai",
548
575
  },
576
+ movieParams: {
577
+ provider: "replicate",
578
+ },
549
579
  soundEffectParams: {
550
580
  provider: "replicate",
551
581
  },
@@ -590,6 +620,9 @@ export const promptTemplates = [
590
620
  images: {},
591
621
  provider: "openai",
592
622
  },
623
+ movieParams: {
624
+ provider: "replicate",
625
+ },
593
626
  soundEffectParams: {
594
627
  provider: "replicate",
595
628
  },
@@ -642,6 +675,9 @@ export const promptTemplates = [
642
675
  },
643
676
  style: "<style>One Piece aesthetic.</style>",
644
677
  },
678
+ movieParams: {
679
+ provider: "replicate",
680
+ },
645
681
  soundEffectParams: {
646
682
  provider: "replicate",
647
683
  },
@@ -694,6 +730,9 @@ export const promptTemplates = [
694
730
  },
695
731
  style: "<style>Photo realistic, cinematic.</style>",
696
732
  },
733
+ movieParams: {
734
+ provider: "replicate",
735
+ },
697
736
  soundEffectParams: {
698
737
  provider: "replicate",
699
738
  },
@@ -746,6 +785,9 @@ export const promptTemplates = [
746
785
  },
747
786
  style: "<style>Photo realistic, cinematic.</style>",
748
787
  },
788
+ movieParams: {
789
+ provider: "replicate",
790
+ },
749
791
  soundEffectParams: {
750
792
  provider: "replicate",
751
793
  },
@@ -789,6 +831,9 @@ export const promptTemplates = [
789
831
  imageParams: {
790
832
  style: "<style>Ghibli style. Student (Taro) is a young teenager with a dark short hair with glasses. Teacher is a middle-aged man with grey hair and moustache.</style>",
791
833
  },
834
+ movieParams: {
835
+ provider: "replicate",
836
+ },
792
837
  soundEffectParams: {
793
838
  provider: "replicate",
794
839
  },
@@ -845,6 +890,9 @@ export const promptTemplates = [
845
890
  imageParams: {
846
891
  style: "<style>Photo realistic, cinematic.</style>",
847
892
  },
893
+ movieParams: {
894
+ provider: "replicate",
895
+ },
848
896
  soundEffectParams: {
849
897
  provider: "replicate",
850
898
  },
@@ -898,6 +946,9 @@ export const promptTemplates = [
898
946
  },
899
947
  style: "<style>A dreamy, hyper-detailed anime style that blends photorealistic backgrounds with vibrant, saturated colors. The skies are often filled with luminous clouds, dazzling sunsets, or star-filled nights, rendered with a glowing, almost ethereal quality. Urban landscapes and rural scenery are meticulously illustrated, with attention to tiny details like reflections in puddles, neon lights, or the texture of grass swaying in the wind. Characters are drawn with soft, expressive features, standing out against the breathtaking environments, creating a sense of emotional depth and lyrical atmosphere. The overall mood is cinematic, romantic, and filled with a sense of fleeting beauty and longing.</style>",
900
948
  },
949
+ movieParams: {
950
+ provider: "replicate",
951
+ },
901
952
  soundEffectParams: {
902
953
  provider: "replicate",
903
954
  },
@@ -944,6 +995,9 @@ export const promptTemplates = [
944
995
  imageParams: {
945
996
  style: "<style>Photo realistic, cinematic.</style>",
946
997
  },
998
+ movieParams: {
999
+ provider: "replicate",
1000
+ },
947
1001
  soundEffectParams: {
948
1002
  provider: "replicate",
949
1003
  },
@@ -41,7 +41,7 @@ export const templateDataSet = {
41
41
  "```",
42
42
  ghibli_comic_strips: "Another AI will generate comic strips for each beat based on the text description of that beat. Mention the reference in one of beats, if it exists. Use the JSON below as a template.\n" +
43
43
  "```JSON\n" +
44
- `{"$mulmocast":{"version":"1.1","credit":"closing"},"title":"[TITLE: Brief, engaging title for the topic]","lang":"en","references":[{"url":"[SOURCE_URL: URL of the source material]","title":"[SOURCE_TITLE: Title of the referenced article, or paper]","type":"[SOURCE_TYPE: article, paper]"}],"beats":[{"text":"[OPENING_BEAT: Introduce the topic with a hook. Reference the source material and set up why this topic matters. Usually 2-3 sentences that grab attention and provide context.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]"},{"text":"[SUPPORTING_DETAIL_1: Additional context, examples, or elaboration that helps illustrate the main concept. This could include how it works, why it's important, or real-world applications.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]"},{"text":"[ADDITIONAL_BEATS: Add more beats as necessary to fully explore the topic. Complex topics may require 6-10+ beats to cover adequately. Each beat should advance the narrative or provide valuable information.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]"}],"canvasSize":{"width":1536,"height":1024},"imageParams":{"provider":"google","model":"gemini-2.5-flash-image-preview","style":"<style>Ghibli style multi-panel comic strips in landscape mode. Use speech bubbles with short, natural dialogue (1–6 words). Keep text minimal, like real comics. Let the art convey the story and emotions. Use the input image as the presenter.</style>","images":{"presenter":{"type":"image","source":{"kind":"url","url":"https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/ghibli_presenter.png"}}}}}\n` +
44
+ `{"$mulmocast":{"version":"1.1","credit":"closing"},"title":"[TITLE: Brief, engaging title for the topic]","lang":"en","references":[{"url":"[SOURCE_URL: URL of the source material]","title":"[SOURCE_TITLE: Title of the referenced article, or paper]","type":"[SOURCE_TYPE: article, paper]"}],"beats":[{"text":"[OPENING_BEAT: Introduce the topic with a hook. Reference the source material and set up why this topic matters. Usually 2-3 sentences that grab attention and provide context.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]"},{"text":"[SUPPORTING_DETAIL_1: Additional context, examples, or elaboration that helps illustrate the main concept. This could include how it works, why it's important, or real-world applications.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]"},{"text":"[ADDITIONAL_BEATS: Add more beats as necessary to fully explore the topic. Complex topics may require 6-10+ beats to cover adequately. Each beat should advance the narrative or provide valuable information.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]"}],"canvasSize":{"width":1536,"height":1024},"imageParams":{"provider":"google","model":"gemini-2.5-flash-image","style":"<style>Ghibli style multi-panel comic strips in landscape mode. Use speech bubbles with short, natural dialogue (1–6 words). Keep text minimal, like real comics. Let the art convey the story and emotions. Use the input image as the presenter.</style>","images":{"presenter":{"type":"image","source":{"kind":"url","url":"https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/ghibli_presenter.png"}}}}}\n` +
45
45
  "```",
46
46
  ghost_comic: "Another AI will generate images for each beat based on the image prompt of that beat. Mention the reference in one of beats, if it exists. Use the JSON below as a template.\n" +
47
47
  "```JSON\n" +
@@ -91,7 +91,7 @@ export const MulmoPresentationStyleMethods = {
91
91
  },
92
92
  getMovieAgentInfo(presentationStyle, beat) {
93
93
  const movieParams = { ...presentationStyle.movieParams, ...beat?.movieParams };
94
- const movieProvider = text2MovieProviderSchema.parse(movieParams?.provider);
94
+ const movieProvider = text2MovieProviderSchema.parse(movieParams?.provider ?? defaultProviders.text2movie);
95
95
  const agentInfo = provider2MovieAgent[movieProvider];
96
96
  return {
97
97
  agent: agentInfo.agentName,
@@ -453,9 +453,9 @@ export declare const htmlPromptParamsSchema: z.ZodObject<{
453
453
  data: z.ZodOptional<z.ZodAny>;
454
454
  images: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
455
455
  }, z.core.$strict>;
456
- export declare const text2MovieProviderSchema: z.ZodDefault<z.ZodEnum<{
456
+ export declare const text2MovieProviderSchema: z.ZodEnum<{
457
457
  [x: string]: string;
458
- }>>;
458
+ }>;
459
459
  export declare const text2SoundEffectProviderSchema: z.ZodDefault<z.ZodEnum<{
460
460
  [x: string]: string;
461
461
  }>>;
@@ -601,9 +601,9 @@ export declare const mulmoBeatSchema: z.ZodObject<{
601
601
  movieVolume: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
602
602
  }, z.core.$strict>>;
603
603
  movieParams: z.ZodOptional<z.ZodObject<{
604
- provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
604
+ provider: z.ZodOptional<z.ZodEnum<{
605
605
  [x: string]: string;
606
- }>>>;
606
+ }>>;
607
607
  model: z.ZodOptional<z.ZodString>;
608
608
  fillOption: z.ZodOptional<z.ZodObject<{
609
609
  style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -681,9 +681,9 @@ export declare const mulmoTransitionSchema: z.ZodObject<{
681
681
  duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
682
682
  }, z.core.$strip>;
683
683
  export declare const mulmoMovieParamsSchema: z.ZodObject<{
684
- provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
684
+ provider: z.ZodOptional<z.ZodEnum<{
685
685
  [x: string]: string;
686
- }>>>;
686
+ }>>;
687
687
  model: z.ZodOptional<z.ZodString>;
688
688
  fillOption: z.ZodOptional<z.ZodObject<{
689
689
  style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -761,10 +761,10 @@ export declare const mulmoPresentationStyleSchema: z.ZodObject<{
761
761
  prompt: z.ZodString;
762
762
  }, z.core.$strict>]>>>;
763
763
  }, z.core.$strict>>>;
764
- movieParams: z.ZodOptional<z.ZodObject<{
765
- provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
764
+ movieParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
765
+ provider: z.ZodOptional<z.ZodEnum<{
766
766
  [x: string]: string;
767
- }>>>;
767
+ }>>;
768
768
  model: z.ZodOptional<z.ZodString>;
769
769
  fillOption: z.ZodOptional<z.ZodObject<{
770
770
  style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -779,7 +779,7 @@ export declare const mulmoPresentationStyleSchema: z.ZodObject<{
779
779
  }>;
780
780
  duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
781
781
  }, z.core.$strip>>;
782
- }, z.core.$strict>>;
782
+ }, z.core.$strict>>>;
783
783
  soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
784
784
  provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
785
785
  [x: string]: string;
@@ -897,10 +897,10 @@ export declare const mulmoScriptSchema: z.ZodObject<{
897
897
  prompt: z.ZodString;
898
898
  }, z.core.$strict>]>>>;
899
899
  }, z.core.$strict>>>;
900
- movieParams: z.ZodOptional<z.ZodObject<{
901
- provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
900
+ movieParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
901
+ provider: z.ZodOptional<z.ZodEnum<{
902
902
  [x: string]: string;
903
- }>>>;
903
+ }>>;
904
904
  model: z.ZodOptional<z.ZodString>;
905
905
  fillOption: z.ZodOptional<z.ZodObject<{
906
906
  style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -915,7 +915,7 @@ export declare const mulmoScriptSchema: z.ZodObject<{
915
915
  }>;
916
916
  duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
917
917
  }, z.core.$strip>>;
918
- }, z.core.$strict>>;
918
+ }, z.core.$strict>>>;
919
919
  soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
920
920
  provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
921
921
  [x: string]: string;
@@ -1105,9 +1105,9 @@ export declare const mulmoScriptSchema: z.ZodObject<{
1105
1105
  movieVolume: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
1106
1106
  }, z.core.$strict>>;
1107
1107
  movieParams: z.ZodOptional<z.ZodObject<{
1108
- provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
1108
+ provider: z.ZodOptional<z.ZodEnum<{
1109
1109
  [x: string]: string;
1110
- }>>>;
1110
+ }>>;
1111
1111
  model: z.ZodOptional<z.ZodString>;
1112
1112
  fillOption: z.ZodOptional<z.ZodObject<{
1113
1113
  style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -1309,10 +1309,10 @@ export declare const mulmoStudioSchema: z.ZodObject<{
1309
1309
  prompt: z.ZodString;
1310
1310
  }, z.core.$strict>]>>>;
1311
1311
  }, z.core.$strict>>>;
1312
- movieParams: z.ZodOptional<z.ZodObject<{
1313
- provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
1312
+ movieParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
1313
+ provider: z.ZodOptional<z.ZodEnum<{
1314
1314
  [x: string]: string;
1315
- }>>>;
1315
+ }>>;
1316
1316
  model: z.ZodOptional<z.ZodString>;
1317
1317
  fillOption: z.ZodOptional<z.ZodObject<{
1318
1318
  style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -1327,7 +1327,7 @@ export declare const mulmoStudioSchema: z.ZodObject<{
1327
1327
  }>;
1328
1328
  duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
1329
1329
  }, z.core.$strip>>;
1330
- }, z.core.$strict>>;
1330
+ }, z.core.$strict>>>;
1331
1331
  soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
1332
1332
  provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
1333
1333
  [x: string]: string;
@@ -1517,9 +1517,9 @@ export declare const mulmoStudioSchema: z.ZodObject<{
1517
1517
  movieVolume: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
1518
1518
  }, z.core.$strict>>;
1519
1519
  movieParams: z.ZodOptional<z.ZodObject<{
1520
- provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
1520
+ provider: z.ZodOptional<z.ZodEnum<{
1521
1521
  [x: string]: string;
1522
- }>>>;
1522
+ }>>;
1523
1523
  model: z.ZodOptional<z.ZodString>;
1524
1524
  fillOption: z.ZodOptional<z.ZodObject<{
1525
1525
  style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -1657,10 +1657,10 @@ export declare const mulmoPromptTemplateSchema: z.ZodObject<{
1657
1657
  prompt: z.ZodString;
1658
1658
  }, z.core.$strict>]>>>;
1659
1659
  }, z.core.$strict>>>;
1660
- movieParams: z.ZodOptional<z.ZodObject<{
1661
- provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
1660
+ movieParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
1661
+ provider: z.ZodOptional<z.ZodEnum<{
1662
1662
  [x: string]: string;
1663
- }>>>;
1663
+ }>>;
1664
1664
  model: z.ZodOptional<z.ZodString>;
1665
1665
  fillOption: z.ZodOptional<z.ZodObject<{
1666
1666
  style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -1675,7 +1675,7 @@ export declare const mulmoPromptTemplateSchema: z.ZodObject<{
1675
1675
  }>;
1676
1676
  duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
1677
1677
  }, z.core.$strip>>;
1678
- }, z.core.$strict>>;
1678
+ }, z.core.$strict>>>;
1679
1679
  soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
1680
1680
  provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
1681
1681
  [x: string]: string;
@@ -1787,10 +1787,10 @@ export declare const mulmoPromptTemplateFileSchema: z.ZodObject<{
1787
1787
  prompt: z.ZodString;
1788
1788
  }, z.core.$strict>]>>>;
1789
1789
  }, z.core.$strict>>>;
1790
- movieParams: z.ZodOptional<z.ZodObject<{
1791
- provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
1790
+ movieParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
1791
+ provider: z.ZodOptional<z.ZodEnum<{
1792
1792
  [x: string]: string;
1793
- }>>>;
1793
+ }>>;
1794
1794
  model: z.ZodOptional<z.ZodString>;
1795
1795
  fillOption: z.ZodOptional<z.ZodObject<{
1796
1796
  style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -1805,7 +1805,7 @@ export declare const mulmoPromptTemplateFileSchema: z.ZodObject<{
1805
1805
  }>;
1806
1806
  duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
1807
1807
  }, z.core.$strip>>;
1808
- }, z.core.$strict>>;
1808
+ }, z.core.$strict>>>;
1809
1809
  soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
1810
1810
  provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
1811
1811
  [x: string]: string;
@@ -268,7 +268,7 @@ export const htmlPromptParamsSchema = z
268
268
  images: z.record(z.string(), z.any()).optional(),
269
269
  })
270
270
  .strict();
271
- export const text2MovieProviderSchema = z.enum(Object.keys(provider2MovieAgent)).default(defaultProviders.text2movie);
271
+ export const text2MovieProviderSchema = z.enum(Object.keys(provider2MovieAgent));
272
272
  export const text2SoundEffectProviderSchema = z.enum(Object.keys(provider2SoundEffectAgent)).default(defaultProviders.soundEffect);
273
273
  export const mulmoSoundEffectParamsSchema = z.object({
274
274
  provider: text2SoundEffectProviderSchema.optional(),
@@ -359,7 +359,9 @@ export const mulmoPresentationStyleSchema = z.object({
359
359
  provider: defaultProviders.text2image,
360
360
  images: {},
361
361
  }),
362
- movieParams: mulmoMovieParamsSchema.optional(),
362
+ movieParams: mulmoMovieParamsSchema.optional().default({
363
+ provider: defaultProviders.text2movie,
364
+ }),
363
365
  soundEffectParams: mulmoSoundEffectParamsSchema.optional().default({
364
366
  provider: defaultProviders.soundEffect,
365
367
  }),
@@ -139,6 +139,8 @@ export type ImageType = "image" | "movie";
139
139
  export type MulmoViewerBeat = {
140
140
  text?: string;
141
141
  duration?: number;
142
+ startTime?: number;
143
+ endTime?: number;
142
144
  multiLinguals?: Record<string, string>;
143
145
  audioSources?: Record<string, string>;
144
146
  imageSource?: string;
@@ -56,6 +56,17 @@ export declare const createStudioData: (_mulmoScript: MulmoScript, fileName: str
56
56
  prompt: string;
57
57
  }> | undefined;
58
58
  };
59
+ movieParams: {
60
+ provider?: string | undefined;
61
+ model?: string | undefined;
62
+ fillOption?: {
63
+ style: "aspectFit" | "aspectFill";
64
+ } | undefined;
65
+ transition?: {
66
+ type: "fade" | "slideout_left";
67
+ duration: number;
68
+ } | undefined;
69
+ };
59
70
  soundEffectParams: {
60
71
  provider?: string | undefined;
61
72
  model?: string | undefined;
@@ -252,17 +263,6 @@ export declare const createStudioData: (_mulmoScript: MulmoScript, fileName: str
252
263
  enableLipSync?: boolean | undefined;
253
264
  hidden?: boolean | undefined;
254
265
  }[];
255
- movieParams?: {
256
- provider?: string | undefined;
257
- model?: string | undefined;
258
- fillOption?: {
259
- style: "aspectFit" | "aspectFill";
260
- } | undefined;
261
- transition?: {
262
- type: "fade" | "slideout_left";
263
- duration: number;
264
- } | undefined;
265
- } | undefined;
266
266
  lipSyncParams?: {
267
267
  provider?: string | undefined;
268
268
  model?: string | undefined;
@@ -371,6 +371,17 @@ export declare const initializeContextFromFiles: (files: FileObject, raiseError:
371
371
  prompt: string;
372
372
  }> | undefined;
373
373
  };
374
+ movieParams: {
375
+ provider?: string | undefined;
376
+ model?: string | undefined;
377
+ fillOption?: {
378
+ style: "aspectFit" | "aspectFill";
379
+ } | undefined;
380
+ transition?: {
381
+ type: "fade" | "slideout_left";
382
+ duration: number;
383
+ } | undefined;
384
+ };
374
385
  soundEffectParams: {
375
386
  provider?: string | undefined;
376
387
  model?: string | undefined;
@@ -567,17 +578,6 @@ export declare const initializeContextFromFiles: (files: FileObject, raiseError:
567
578
  enableLipSync?: boolean | undefined;
568
579
  hidden?: boolean | undefined;
569
580
  }[];
570
- movieParams?: {
571
- provider?: string | undefined;
572
- model?: string | undefined;
573
- fillOption?: {
574
- style: "aspectFit" | "aspectFill";
575
- } | undefined;
576
- transition?: {
577
- type: "fade" | "slideout_left";
578
- duration: number;
579
- } | undefined;
580
- } | undefined;
581
581
  lipSyncParams?: {
582
582
  provider?: string | undefined;
583
583
  model?: string | undefined;
@@ -693,6 +693,17 @@ export declare const initializeContextFromFiles: (files: FileObject, raiseError:
693
693
  prompt: string;
694
694
  }> | undefined;
695
695
  };
696
+ movieParams: {
697
+ provider?: string | undefined;
698
+ model?: string | undefined;
699
+ fillOption?: {
700
+ style: "aspectFit" | "aspectFill";
701
+ } | undefined;
702
+ transition?: {
703
+ type: "fade" | "slideout_left";
704
+ duration: number;
705
+ } | undefined;
706
+ };
696
707
  soundEffectParams: {
697
708
  provider?: string | undefined;
698
709
  model?: string | undefined;
@@ -716,17 +727,6 @@ export declare const initializeContextFromFiles: (files: FileObject, raiseError:
716
727
  path: string;
717
728
  } | undefined;
718
729
  };
719
- movieParams?: {
720
- provider?: string | undefined;
721
- model?: string | undefined;
722
- fillOption?: {
723
- style: "aspectFit" | "aspectFill";
724
- } | undefined;
725
- transition?: {
726
- type: "fade" | "slideout_left";
727
- duration: number;
728
- } | undefined;
729
- } | undefined;
730
730
  lipSyncParams?: {
731
731
  provider?: string | undefined;
732
732
  model?: string | undefined;
@@ -76,7 +76,10 @@ export declare const provider2MovieAgent: {
76
76
  models: string[];
77
77
  keyName: string;
78
78
  modelParams: {
79
- "veo-3.0-generate-preview": {
79
+ "veo-3.1-generate-preview": {
80
+ durations: number[];
81
+ };
82
+ "veo-3.0-generate-001": {
80
83
  durations: number[];
81
84
  };
82
85
  "veo-2.0-generate-001": {
@@ -42,8 +42,8 @@ export const provider2ImageAgent = {
42
42
  },
43
43
  google: {
44
44
  agentName: "imageGenAIAgent",
45
- defaultModel: "gemini-2.5-flash-image-preview",
46
- models: ["imagen-3.0-generate-002", "imagen-4.0-generate-preview-06-06", "imagen-4.0-ultra-generate-preview-06-06", "gemini-2.5-flash-image-preview"],
45
+ defaultModel: "gemini-2.5-flash-image",
46
+ models: ["imagen-4.0-generate-preview-06-06", "imagen-4.0-ultra-generate-preview-06-06", "gemini-2.5-flash-image", "gemini-3-pro-image-preview"],
47
47
  keyName: "GEMINI_API_KEY",
48
48
  },
49
49
  replicate: {
@@ -77,8 +77,8 @@ export const provider2MovieAgent = {
77
77
  "minimax/hailuo-02",
78
78
  "minimax/hailuo-02-fast",
79
79
  "pixverse/pixverse-v4.5",
80
- "wan-video/wan-2.2-i2v-480p-fast",
81
- "wan-video/wan-2.2-t2v-480p-fast",
80
+ "wan-video/wan-2.2-i2v-fast",
81
+ "wan-video/wan-2.2-t2v-fast",
82
82
  ],
83
83
  modelParams: {
84
84
  "bytedance/seedance-1-lite": {
@@ -144,12 +144,12 @@ export const provider2MovieAgent = {
144
144
  last_image: "last_frame_image",
145
145
  price_per_sec: 0.12,
146
146
  },
147
- "wan-video/wan-2.2-i2v-480p-fast": {
147
+ "wan-video/wan-2.2-i2v-fast": {
148
148
  durations: [5],
149
149
  start_image: "image",
150
150
  price_per_sec: 0.012,
151
151
  },
152
- "wan-video/wan-2.2-t2v-480p-fast": {
152
+ "wan-video/wan-2.2-t2v-fast": {
153
153
  durations: [5],
154
154
  start_image: undefined,
155
155
  price_per_sec: 0.012,
@@ -159,10 +159,13 @@ export const provider2MovieAgent = {
159
159
  google: {
160
160
  agentName: "movieGenAIAgent",
161
161
  defaultModel: "veo-2.0-generate-001",
162
- models: ["veo-2.0-generate-001", "veo-3.0-generate-preview"],
162
+ models: ["veo-2.0-generate-001", "veo-3.0-generate-001", "veo-3.1-generate-preview"],
163
163
  keyName: "GEMINI_API_KEY",
164
164
  modelParams: {
165
- "veo-3.0-generate-preview": {
165
+ "veo-3.1-generate-preview": {
166
+ durations: [4, 6, 8],
167
+ },
168
+ "veo-3.0-generate-001": {
166
169
  durations: [4, 6, 8],
167
170
  },
168
171
  "veo-2.0-generate-001": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mulmocast",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "lib/index.node.js",
@@ -74,7 +74,7 @@
74
74
  "homepage": "https://github.com/receptron/mulmocast-cli#readme",
75
75
  "dependencies": {
76
76
  "@google-cloud/text-to-speech": "^6.4.0",
77
- "@google/genai": "^1.29.1",
77
+ "@google/genai": "^1.30.0",
78
78
  "@graphai/anthropic_agent": "^2.0.11",
79
79
  "@graphai/browserless_agent": "^2.0.1",
80
80
  "@graphai/gemini_agent": "^2.0.1",
@@ -95,11 +95,11 @@
95
95
  "fluent-ffmpeg": "^2.1.3",
96
96
  "graphai": "^2.0.16",
97
97
  "jsdom": "^27.2.0",
98
- "marked": "^17.0.0",
98
+ "marked": "^17.0.1",
99
99
  "mulmocast-vision": "^1.0.4",
100
100
  "ora": "^9.0.0",
101
- "puppeteer": "^24.30.0",
102
- "replicate": "^1.3.1",
101
+ "puppeteer": "^24.31.0",
102
+ "replicate": "^1.4.0",
103
103
  "yaml": "^2.8.1",
104
104
  "yargs": "^18.0.0",
105
105
  "zod": "^4.1.12"
@@ -117,7 +117,7 @@
117
117
  "prettier": "^3.6.2",
118
118
  "tsx": "^4.20.6",
119
119
  "typescript": "^5.9.3",
120
- "typescript-eslint": "^8.46.4"
120
+ "typescript-eslint": "^8.47.0"
121
121
  },
122
122
  "engines": {
123
123
  "node": ">=20.0.0"
@@ -21,11 +21,17 @@
21
21
  }
22
22
  },
23
23
  "beats": [
24
+ {
25
+ "speaker": "Host",
26
+ "text": "How are you?",
27
+ "imagePrompt": "A witch in Harajuku"
28
+ },
24
29
  {
25
30
  "speaker": "Host",
26
31
  "text": "How are you?",
27
32
  "imagePrompt": "A witch in Harajuku",
28
33
  "imageParams": {
34
+ "model": "gpt-image-1-mini",
29
35
  "style": "Ukiyoe-style"
30
36
  }
31
37
  }
Binary file
@@ -10,19 +10,19 @@
10
10
  "lang": "en",
11
11
  "beats": [
12
12
  {
13
- "id": "gemini_2_5_flash_image_preview",
14
- "text": "image generated by gemini-2.5-flash-image-preview",
13
+ "id": "gemini_3_pro_image_preview",
14
+ "text": "image generated by gemini-3-pro-image-preview",
15
15
  "imagePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
16
16
  "imageParams": {
17
- "model": "gemini-2.5-flash-image-preview"
17
+ "model": "gemini-3-pro-image-preview"
18
18
  }
19
19
  },
20
20
  {
21
- "id": "imagen_3",
22
- "text": "image generated by imagen-3",
21
+ "id": "gemini_2_5_flash_image",
22
+ "text": "image generated by gemini-2.5-flash-image",
23
23
  "imagePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
24
24
  "imageParams": {
25
- "model": "imagen-3.0-generate-002"
25
+ "model": "gemini-2.5-flash-image"
26
26
  }
27
27
  },
28
28
  {
@@ -56,7 +56,15 @@
56
56
  "text": "movie generated by veo3",
57
57
  "moviePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
58
58
  "movieParams": {
59
- "model": "veo-3.0-generate-preview"
59
+ "model": "veo-3.0-generate-001"
60
+ }
61
+ },
62
+ {
63
+ "id": "genai_veo3_1",
64
+ "text": "movie generated by veo3_1",
65
+ "moviePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
66
+ "movieParams": {
67
+ "model": "veo-3.1-generate-preview"
60
68
  }
61
69
  },
62
70
  {
@@ -65,11 +73,11 @@
65
73
  "duration": 5,
66
74
  "imagePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
67
75
  "imageParams": {
68
- "model": "gemini-2.5-flash-image-preview"
76
+ "model": "gemini-2.5-flash-image"
69
77
  },
70
78
  "moviePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
71
79
  "movieParams": {
72
- "model": "veo-3.0-generate-preview"
80
+ "model": "veo-3.0-generate-001"
73
81
  }
74
82
  }
75
83
  ]
@@ -53,7 +53,7 @@
53
53
  "imageNames": ["witch", "broom"],
54
54
  "imageParams": {
55
55
  "provider": "google",
56
- "model": "gemini-2.5-flash-image-preview"
56
+ "model": "gemini-2.5-flash-image"
57
57
  }
58
58
  },
59
59
  {
@@ -0,0 +1,66 @@
1
+ {
2
+ "$mulmocast": {
3
+ "version": "1.1",
4
+ "credit": "closing"
5
+ },
6
+ "canvasSize": {
7
+ "width": 1280,
8
+ "height": 720
9
+ },
10
+ "speechParams": {
11
+ "speakers": {
12
+ "Presenter": {
13
+ "displayName": {
14
+ "en": "Presenter"
15
+ },
16
+ "voiceId": "shimmer",
17
+ "provider": "openai"
18
+ }
19
+ }
20
+ },
21
+ "imageParams": {
22
+ "provider": "openai",
23
+ "images": {
24
+ "woman": {
25
+ "type": "image",
26
+ "source": {
27
+ "kind": "path",
28
+ "path": "./image-2.png"
29
+ }
30
+ }
31
+ }
32
+ },
33
+ "movieParams": {
34
+ "provider": "replicate",
35
+ "model": "bytedance/seedance-1-lite"
36
+ },
37
+ "soundEffectParams": {
38
+ "provider": "replicate"
39
+ },
40
+ "lipSyncParams": {
41
+ "provider": "replicate",
42
+ "model": "bytedance/latentsync"
43
+ },
44
+ "audioParams": {
45
+ "padding": 0.3,
46
+ "introPadding": 1,
47
+ "closingPadding": 0.8,
48
+ "outroPadding": 1,
49
+ "bgmVolume": 0.2,
50
+ "audioVolume": 1,
51
+ "suppressSpeech": false
52
+ },
53
+ "title": "リップシンク(generate contents)",
54
+ "description": "mulmocast",
55
+ "lang": "en",
56
+ "beats": [
57
+ {
58
+ "speaker": "Presenter",
59
+ "text": "You've had a challenging day. The evidence is clear: you need rest. You're more capable than you realize. Case closed. hello hello !!",
60
+ "id": "c0e344e1-4ed7-4145-b7fc-c878c093cffd",
61
+ "imagePrompt": "in the city",
62
+ "moviePrompt": "never looking away from camera",
63
+ "enableLipSync": true
64
+ }
65
+ ]
66
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$mulmocast": {
3
+ "version": "1.1"
4
+ },
5
+ "lang": "en",
6
+ "movieParams": {
7
+ "provider": "google"
8
+ },
9
+ "lipSyncParams": {
10
+ "provider": "replicate",
11
+ "model": "bytedance/latentsync"
12
+ },
13
+ "canvasSize": {
14
+ "width": 1280,
15
+ "height": 720
16
+ },
17
+ "beats": [
18
+ {
19
+ "text": "Hello, I'm macoro. Hello, I'm macoro. Hello, I'm macoro.",
20
+ "moviePrompt": "macoro is speaking",
21
+ "enableLipSync": true
22
+ }
23
+ ]
24
+ }
@@ -143,22 +143,22 @@
143
143
  }
144
144
  },
145
145
  {
146
- "id": "wan-2.2-i2v-480p-fast",
147
- "text": "wan-video/wan-2.2-i2v-480p-fast",
146
+ "id": "wan-2.2-i2v-fast",
147
+ "text": "wan-video/wan-2.2-i2v-fast",
148
148
  "duration": 5,
149
149
  "imagePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
150
150
  "moviePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
151
151
  "movieParams": {
152
- "model": "wan-video/wan-2.2-i2v-480p-fast"
152
+ "model": "wan-video/wan-2.2-i2v-fast"
153
153
  }
154
154
  },
155
155
  {
156
- "id": "wan-2.2-t2v-480p-fast",
157
- "text": "wan-video/wan-2.2-t2v-480p-fast",
156
+ "id": "wan-2.2-t2v-fast",
157
+ "text": "wan-video/wan-2.2-t2v-fast",
158
158
  "duration": 5,
159
159
  "moviePrompt": "a woman is walking through a busy Tokyo street at night, she is wearing dark sunglasses",
160
160
  "movieParams": {
161
- "model": "wan-video/wan-2.2-t2v-480p-fast"
161
+ "model": "wan-video/wan-2.2-t2v-fast"
162
162
  }
163
163
  },
164
164
  {