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 +22 -0
- package/assets/templates/ghibli_comic_strips.json +1 -1
- package/lib/actions/bundle.js +5 -2
- package/lib/agents/image_genai_agent.js +1 -1
- package/lib/agents/image_openai_agent.js +2 -2
- package/lib/agents/movie_genai_agent.js +1 -1
- package/lib/data/promptTemplates.d.ts +40 -10
- package/lib/data/promptTemplates.js +55 -1
- package/lib/data/templateDataSet.js +1 -1
- package/lib/methods/mulmo_presentation_style.js +1 -1
- package/lib/types/schema.d.ts +30 -30
- package/lib/types/schema.js +4 -2
- package/lib/types/type.d.ts +2 -0
- package/lib/utils/context.d.ts +33 -33
- package/lib/utils/provider2agent.d.ts +4 -1
- package/lib/utils/provider2agent.js +11 -8
- package/package.json +6 -6
- package/scripts/test/gpt.json +6 -0
- package/scripts/test/image-2.png +0 -0
- package/scripts/test/test_genai.json +17 -9
- package/scripts/test/test_image_refs.json +1 -1
- package/scripts/test/test_lipsync2.json +66 -0
- package/scripts/test/test_lipsync2.json~ +24 -0
- package/scripts/test/test_replicate.json +6 -6
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
|
|
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": {
|
package/lib/actions/bundle.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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,
|
package/lib/types/schema.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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;
|
package/lib/types/schema.js
CHANGED
|
@@ -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))
|
|
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
|
}),
|
package/lib/types/type.d.ts
CHANGED
|
@@ -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;
|
package/lib/utils/context.d.ts
CHANGED
|
@@ -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.
|
|
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
|
|
46
|
-
models: ["imagen-
|
|
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-
|
|
81
|
-
"wan-video/wan-2.2-t2v-
|
|
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-
|
|
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-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
98
|
+
"marked": "^17.0.1",
|
|
99
99
|
"mulmocast-vision": "^1.0.4",
|
|
100
100
|
"ora": "^9.0.0",
|
|
101
|
-
"puppeteer": "^24.
|
|
102
|
-
"replicate": "^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.
|
|
120
|
+
"typescript-eslint": "^8.47.0"
|
|
121
121
|
},
|
|
122
122
|
"engines": {
|
|
123
123
|
"node": ">=20.0.0"
|
package/scripts/test/gpt.json
CHANGED
|
@@ -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": "
|
|
14
|
-
"text": "image generated by gemini-
|
|
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-
|
|
17
|
+
"model": "gemini-3-pro-image-preview"
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
|
-
"id": "
|
|
22
|
-
"text": "image generated by
|
|
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": "
|
|
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-
|
|
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
|
|
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-
|
|
80
|
+
"model": "veo-3.0-generate-001"
|
|
73
81
|
}
|
|
74
82
|
}
|
|
75
83
|
]
|
|
@@ -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-
|
|
147
|
-
"text": "wan-video/wan-2.2-i2v-
|
|
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-
|
|
152
|
+
"model": "wan-video/wan-2.2-i2v-fast"
|
|
153
153
|
}
|
|
154
154
|
},
|
|
155
155
|
{
|
|
156
|
-
"id": "wan-2.2-t2v-
|
|
157
|
-
"text": "wan-video/wan-2.2-t2v-
|
|
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-
|
|
161
|
+
"model": "wan-video/wan-2.2-t2v-fast"
|
|
162
162
|
}
|
|
163
163
|
},
|
|
164
164
|
{
|