mulmocast 2.1.12 → 2.1.14

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.
@@ -12,17 +12,11 @@
12
12
  "model": "bytedance/seedance-1-lite"
13
13
  },
14
14
  "speechParams": {
15
- "provider": "openai",
16
15
  "speakers": {
17
16
  "Presenter": {
18
- "voiceId": "shimmer",
19
- "speechOptions": { "instruction": "Speak in a slightly high-pitched, curt tone with sudden flustered shifts—like a tsundere anime girl." },
20
- "lang": {
21
- "ja": {
22
- "provider": "nijivoice",
23
- "voiceId": "9d9ed276-49ee-443a-bc19-26e6136d05f0"
24
- }
25
- }
17
+ "provider": "gemini",
18
+ "voiceId": "Leda",
19
+ "speechOptions": { "instruction": "Speak in a slightly high-pitched, curt tone with sudden flustered shifts—like a tsundere anime girl." }
26
20
  }
27
21
  }
28
22
  },
@@ -37,6 +31,8 @@
37
31
  "height": 1536
38
32
  },
39
33
  "imageParams": {
34
+ "provider": "google",
35
+ "model": "gemini-2.5-flash-image",
40
36
  "style": "<style>A highly polished 2D digital illustration in anime and manga style, featuring clean linework, soft shading, vivid colors, and expressive facial detailing. The composition emphasizes clarity and visual impact with a minimalistic background and a strong character focus. The lighting is even and bright, giving the image a crisp and energetic feel, reminiscent of high-quality character art used in Japanese visual novels or mobile games.</style>",
41
37
  "images": {
42
38
  "ani": {
@@ -0,0 +1,35 @@
1
+ {
2
+ "title": "Presentation by Leda",
3
+ "description": "Template for presentation with Gemini voice Leda.",
4
+ "systemPrompt": "",
5
+ "presentationStyle": {
6
+ "$mulmocast": {
7
+ "version": "1.1",
8
+ "credit": "closing"
9
+ },
10
+ "speechParams": {
11
+ "speakers": {
12
+ "Presenter": {
13
+ "provider": "gemini",
14
+ "voiceId": "Leda",
15
+ "speechOptions": { "instruction": "Speak like a professional news presenter." }
16
+ }
17
+ }
18
+ },
19
+ "audioParams": {
20
+ "bgm": {
21
+ "kind": "url",
22
+ "url": "https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/morning001.mp3"
23
+ }
24
+ },
25
+ "canvasSize": {
26
+ "width": 1024,
27
+ "height": 1536
28
+ },
29
+ "imageParams": {
30
+ "provider": "google",
31
+ "model": "gemini-2.5-flash-image"
32
+ }
33
+ },
34
+ "scriptName": "image_prompts_template.json"
35
+ }
@@ -15,19 +15,19 @@ const downloadFile = async (url, destPath) => {
15
15
  const buffer = await response.arrayBuffer();
16
16
  fs.writeFileSync(destPath, Buffer.from(buffer));
17
17
  };
18
- const processBgm = async (bgm, dir, zipper) => {
18
+ const processBgm = async (bgm, outDir, baseDir, zipper) => {
19
19
  if (!bgm) {
20
20
  return undefined;
21
21
  }
22
22
  if (bgm.kind === "path") {
23
23
  // Local file path
24
- const sourcePath = path.resolve(bgm.path);
24
+ const sourcePath = path.resolve(baseDir, bgm.path);
25
25
  if (!fs.existsSync(sourcePath)) {
26
26
  GraphAILogger.log(`BGM file not found: ${sourcePath}`);
27
27
  return undefined;
28
28
  }
29
29
  const fileName = path.basename(bgm.path);
30
- const destPath = path.resolve(dir, fileName);
30
+ const destPath = path.resolve(outDir, fileName);
31
31
  fs.copyFileSync(sourcePath, destPath);
32
32
  zipper.addFile(sourcePath, fileName);
33
33
  return fileName;
@@ -35,7 +35,7 @@ const processBgm = async (bgm, dir, zipper) => {
35
35
  else if (bgm.kind === "url") {
36
36
  // URL download
37
37
  const fileName = path.basename(new URL(bgm.url).pathname) || "bgm.mp3";
38
- const destPath = path.resolve(dir, fileName);
38
+ const destPath = path.resolve(outDir, fileName);
39
39
  await downloadFile(bgm.url, destPath);
40
40
  zipper.addFile(destPath);
41
41
  return fileName;
@@ -54,9 +54,10 @@ const imageSourceMappings = [
54
54
  ];
55
55
  export const mulmoViewerBundle = async (context) => {
56
56
  const isZip = true;
57
- const dir = context.fileDirs.outDirPath;
58
- mkdir(dir);
59
- const zipper = new ZipBuilder(path.resolve(dir, zipFileName));
57
+ const outDir = context.fileDirs.outDirPath;
58
+ const baseDir = context.fileDirs.baseDirPath;
59
+ mkdir(outDir);
60
+ const zipper = new ZipBuilder(path.resolve(outDir, zipFileName));
60
61
  // text
61
62
  const resultJson = [];
62
63
  context.studio.script.beats.forEach((beat, index) => {
@@ -76,12 +77,12 @@ export const mulmoViewerBundle = async (context) => {
76
77
  }
77
78
  if (fileName === "silent300.mp3") {
78
79
  // Download from GitHub URL
79
- const destPath = path.resolve(dir, fileName);
80
+ const destPath = path.resolve(outDir, fileName);
80
81
  await downloadFile(silentMp3, destPath);
81
82
  zipper.addFile(destPath, fileName);
82
83
  }
83
84
  else if (fs.existsSync(audio)) {
84
- fs.copyFileSync(audio, path.resolve(dir, fileName));
85
+ fs.copyFileSync(audio, path.resolve(outDir, fileName));
85
86
  zipper.addFile(audio, fileName);
86
87
  }
87
88
  }
@@ -95,7 +96,7 @@ export const mulmoViewerBundle = async (context) => {
95
96
  if (typeof value === "string") {
96
97
  data[source] = path.basename(value);
97
98
  if (fs.existsSync(value)) {
98
- fs.copyFileSync(value, path.resolve(dir, path.basename(value)));
99
+ fs.copyFileSync(value, path.resolve(outDir, path.basename(value)));
99
100
  zipper.addFile(value);
100
101
  }
101
102
  }
@@ -110,7 +111,7 @@ export const mulmoViewerBundle = async (context) => {
110
111
  data.videoWithAudioSource === undefined &&
111
112
  data.duration) {
112
113
  const file = `silent_${index}.mp3`;
113
- const audioFile = path.resolve(dir, file);
114
+ const audioFile = path.resolve(outDir, file);
114
115
  await createSilentAudio(audioFile, data.duration);
115
116
  zipper.addFile(audioFile);
116
117
  data.audioSources.ja = file;
@@ -126,10 +127,10 @@ export const mulmoViewerBundle = async (context) => {
126
127
  });
127
128
  });
128
129
  // BGM
129
- const bgmFileName = await processBgm(context.studio?.script.audioParams?.bgm, dir, zipper);
130
+ const bgmFileName = await processBgm(context.studio?.script.audioParams?.bgm, outDir, baseDir, zipper);
130
131
  const bundleData = { beats: resultJson, bgmSource: bgmFileName, title: context.studio.script.title };
131
- fs.writeFileSync(path.resolve(dir, viewJsonFileName), JSON.stringify(bundleData, null, 2));
132
- zipper.addFile(path.resolve(dir, viewJsonFileName));
132
+ fs.writeFileSync(path.resolve(outDir, viewJsonFileName), JSON.stringify(bundleData, null, 2));
133
+ zipper.addFile(path.resolve(outDir, viewJsonFileName));
133
134
  if (isZip) {
134
135
  await zipper.finalize();
135
136
  }
@@ -36,8 +36,8 @@ export declare const promptTemplates: ({
36
36
  "[CHARACTER_2_ID]"?: undefined;
37
37
  };
38
38
  style: string;
39
- provider?: undefined;
40
39
  model?: undefined;
40
+ provider?: undefined;
41
41
  };
42
42
  movieParams: {
43
43
  provider: string;
@@ -54,7 +54,6 @@ export declare const promptTemplates: ({
54
54
  };
55
55
  provider: string;
56
56
  voiceId: string;
57
- lang?: undefined;
58
57
  speechOptions?: undefined;
59
58
  };
60
59
  Announcer?: undefined;
@@ -106,9 +105,9 @@ export declare const promptTemplates: ({
106
105
  "[CHARACTER_1_ID]"?: undefined;
107
106
  "[CHARACTER_2_ID]"?: undefined;
108
107
  };
108
+ model: string;
109
+ provider: string;
109
110
  style: string;
110
- provider?: undefined;
111
- model?: undefined;
112
111
  };
113
112
  movieParams: {
114
113
  model: string;
@@ -120,12 +119,6 @@ export declare const promptTemplates: ({
120
119
  speechParams: {
121
120
  speakers: {
122
121
  Presenter: {
123
- lang: {
124
- ja: {
125
- provider: string;
126
- voiceId: string;
127
- };
128
- };
129
122
  provider: string;
130
123
  speechOptions: {
131
124
  instruction: string;
@@ -199,7 +192,6 @@ export declare const promptTemplates: ({
199
192
  };
200
193
  provider: string;
201
194
  voiceId: string;
202
- lang?: undefined;
203
195
  speechOptions?: undefined;
204
196
  };
205
197
  Announcer?: undefined;
@@ -236,8 +228,8 @@ export declare const promptTemplates: ({
236
228
  imageParams: {
237
229
  style: string;
238
230
  images?: undefined;
239
- provider?: undefined;
240
231
  model?: undefined;
232
+ provider?: undefined;
241
233
  };
242
234
  movieParams: {
243
235
  provider: string;
@@ -254,7 +246,6 @@ export declare const promptTemplates: ({
254
246
  };
255
247
  provider: string;
256
248
  voiceId: string;
257
- lang?: undefined;
258
249
  speechOptions?: undefined;
259
250
  };
260
251
  Announcer?: undefined;
@@ -304,8 +295,8 @@ export declare const promptTemplates: ({
304
295
  "[CHARACTER_2_ID]"?: undefined;
305
296
  };
306
297
  style: string;
307
- provider?: undefined;
308
298
  model?: undefined;
299
+ provider?: undefined;
309
300
  };
310
301
  movieParams: {
311
302
  provider: string;
@@ -322,7 +313,6 @@ export declare const promptTemplates: ({
322
313
  };
323
314
  provider: string;
324
315
  voiceId: string;
325
- lang?: undefined;
326
316
  speechOptions?: undefined;
327
317
  };
328
318
  Announcer?: undefined;
@@ -390,7 +380,6 @@ export declare const promptTemplates: ({
390
380
  };
391
381
  provider: string;
392
382
  voiceId: string;
393
- lang?: undefined;
394
383
  speechOptions?: undefined;
395
384
  };
396
385
  Announcer?: undefined;
@@ -446,8 +435,8 @@ export declare const promptTemplates: ({
446
435
  "[CHARACTER_2_ID]"?: undefined;
447
436
  };
448
437
  style: string;
449
- provider?: undefined;
450
438
  model?: undefined;
439
+ provider?: undefined;
451
440
  };
452
441
  movieParams: {
453
442
  provider: string;
@@ -464,7 +453,6 @@ export declare const promptTemplates: ({
464
453
  };
465
454
  provider: string;
466
455
  voiceId: string;
467
- lang?: undefined;
468
456
  speechOptions?: undefined;
469
457
  };
470
458
  Announcer?: undefined;
@@ -476,6 +464,63 @@ export declare const promptTemplates: ({
476
464
  scriptName: string;
477
465
  systemPrompt: string;
478
466
  title: string;
467
+ } | {
468
+ description: string;
469
+ filename: string;
470
+ presentationStyle: {
471
+ $mulmocast: {
472
+ credit: string;
473
+ version: string;
474
+ };
475
+ audioParams: {
476
+ audioVolume: number;
477
+ bgm: {
478
+ kind: string;
479
+ url: string;
480
+ };
481
+ bgmVolume: number;
482
+ closingPadding: number;
483
+ introPadding: number;
484
+ outroPadding: number;
485
+ padding: number;
486
+ suppressSpeech: boolean;
487
+ };
488
+ canvasSize: {
489
+ height: number;
490
+ width: number;
491
+ };
492
+ imageParams: {
493
+ model: string;
494
+ provider: string;
495
+ images?: undefined;
496
+ style?: undefined;
497
+ };
498
+ movieParams: {
499
+ provider: string;
500
+ model?: undefined;
501
+ };
502
+ soundEffectParams: {
503
+ provider: string;
504
+ };
505
+ speechParams: {
506
+ speakers: {
507
+ Presenter: {
508
+ provider: string;
509
+ speechOptions: {
510
+ instruction: string;
511
+ };
512
+ voiceId: string;
513
+ displayName?: undefined;
514
+ };
515
+ Announcer?: undefined;
516
+ Student?: undefined;
517
+ Teacher?: undefined;
518
+ };
519
+ };
520
+ };
521
+ scriptName: string;
522
+ systemPrompt: string;
523
+ title: string;
479
524
  } | {
480
525
  description: string;
481
526
  filename: string;
@@ -501,8 +546,8 @@ export declare const promptTemplates: ({
501
546
  imageParams: {
502
547
  style: string;
503
548
  images?: undefined;
504
- provider?: undefined;
505
549
  model?: undefined;
550
+ provider?: undefined;
506
551
  };
507
552
  movieParams: {
508
553
  provider: string;
@@ -566,8 +611,8 @@ export declare const promptTemplates: ({
566
611
  imageParams: {
567
612
  style: string;
568
613
  images?: undefined;
569
- provider?: undefined;
570
614
  model?: undefined;
615
+ provider?: undefined;
571
616
  };
572
617
  movieParams: {
573
618
  provider: string;
@@ -584,7 +629,6 @@ export declare const promptTemplates: ({
584
629
  };
585
630
  provider: string;
586
631
  voiceId: string;
587
- lang?: undefined;
588
632
  speechOptions?: undefined;
589
633
  };
590
634
  Announcer?: undefined;
@@ -634,8 +678,8 @@ export declare const promptTemplates: ({
634
678
  optimus?: undefined;
635
679
  };
636
680
  style: string;
637
- provider?: undefined;
638
681
  model?: undefined;
682
+ provider?: undefined;
639
683
  };
640
684
  movieParams: {
641
685
  provider: string;
@@ -652,7 +696,6 @@ export declare const promptTemplates: ({
652
696
  };
653
697
  provider: string;
654
698
  voiceId: string;
655
- lang?: undefined;
656
699
  speechOptions?: undefined;
657
700
  };
658
701
  Announcer?: undefined;
@@ -692,8 +735,8 @@ export declare const promptTemplates: ({
692
735
  imageParams: {
693
736
  style: string;
694
737
  images?: undefined;
695
- provider?: undefined;
696
738
  model?: undefined;
739
+ provider?: undefined;
697
740
  };
698
741
  movieParams: {
699
742
  provider: string;
@@ -710,7 +753,6 @@ export declare const promptTemplates: ({
710
753
  };
711
754
  provider: string;
712
755
  voiceId: string;
713
- lang?: undefined;
714
756
  speechOptions?: undefined;
715
757
  };
716
758
  Announcer?: undefined;
@@ -89,6 +89,8 @@ export const promptTemplates = [
89
89
  type: "image",
90
90
  },
91
91
  },
92
+ model: "gemini-2.5-flash-image",
93
+ provider: "google",
92
94
  style: "<style>A highly polished 2D digital illustration in anime and manga style, featuring clean linework, soft shading, vivid colors, and expressive facial detailing. The composition emphasizes clarity and visual impact with a minimalistic background and a strong character focus. The lighting is even and bright, giving the image a crisp and energetic feel, reminiscent of high-quality character art used in Japanese visual novels or mobile games.</style>",
93
95
  },
94
96
  movieParams: {
@@ -101,17 +103,11 @@ export const promptTemplates = [
101
103
  speechParams: {
102
104
  speakers: {
103
105
  Presenter: {
104
- lang: {
105
- ja: {
106
- provider: "nijivoice",
107
- voiceId: "9d9ed276-49ee-443a-bc19-26e6136d05f0",
108
- },
109
- },
110
- provider: "openai",
106
+ provider: "gemini",
111
107
  speechOptions: {
112
108
  instruction: "Speak in a slightly high-pitched, curt tone with sudden flustered shifts—like a tsundere anime girl.",
113
109
  },
114
- voiceId: "shimmer",
110
+ voiceId: "Leda",
115
111
  },
116
112
  },
117
113
  },
@@ -642,6 +638,57 @@ export const promptTemplates = [
642
638
  systemPrompt: "Another AI will generate images for each beat based on the image prompt of that beat. Movie prompts must be written in English. Mention the reference in one of beats, if it exists. Use the JSON below as a template.",
643
639
  title: "Plain Image Prompt",
644
640
  },
641
+ {
642
+ description: "Template for presentation with Gemini voice Leda.",
643
+ filename: "leda",
644
+ presentationStyle: {
645
+ $mulmocast: {
646
+ credit: "closing",
647
+ version: "1.1",
648
+ },
649
+ audioParams: {
650
+ audioVolume: 1,
651
+ bgm: {
652
+ kind: "url",
653
+ url: "https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/morning001.mp3",
654
+ },
655
+ bgmVolume: 0.2,
656
+ closingPadding: 0.8,
657
+ introPadding: 1,
658
+ outroPadding: 1,
659
+ padding: 0.3,
660
+ suppressSpeech: false,
661
+ },
662
+ canvasSize: {
663
+ height: 1536,
664
+ width: 1024,
665
+ },
666
+ imageParams: {
667
+ model: "gemini-2.5-flash-image",
668
+ provider: "google",
669
+ },
670
+ movieParams: {
671
+ provider: "replicate",
672
+ },
673
+ soundEffectParams: {
674
+ provider: "replicate",
675
+ },
676
+ speechParams: {
677
+ speakers: {
678
+ Presenter: {
679
+ provider: "gemini",
680
+ speechOptions: {
681
+ instruction: "Speak like a professional news presenter.",
682
+ },
683
+ voiceId: "Leda",
684
+ },
685
+ },
686
+ },
687
+ },
688
+ scriptName: "image_prompts_template.json",
689
+ systemPrompt: "",
690
+ title: "Presentation by Leda",
691
+ },
645
692
  {
646
693
  description: "Template for One Piece style comic presentation.",
647
694
  filename: "onepiece_comic",
@@ -13,6 +13,7 @@ export declare const templateDataSet: {
13
13
  ghost_comic: string;
14
14
  html: string;
15
15
  image_prompt: string;
16
+ leda: string;
16
17
  onepiece_comic: string;
17
18
  portrait_movie: string;
18
19
  realistic_movie: string;
@@ -5,7 +5,7 @@ export const templateDataSet = {
5
5
  "```",
6
6
  ani: "言葉づかいは思いっきりツンデレにして。Another AI will generate comic for each beat based on the image prompt of that beat. You don't need to specify the style of the image, just describe the scene. Mention the reference in one of beats, if it exists. Use the JSON below as a template. Create appropriate amount of beats, and make sure the beats are coherent and flow well.\n" +
7
7
  "```JSON\n" +
8
- `{"$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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"}],"movieParams":{"provider":"replicate","model":"bytedance/seedance-1-lite"},"speechParams":{"provider":"openai","speakers":{"Presenter":{"voiceId":"shimmer","speechOptions":{"instruction":"Speak in a slightly high-pitched, curt tone with sudden flustered shifts—like a tsundere anime girl."},"lang":{"ja":{"provider":"nijivoice","voiceId":"9d9ed276-49ee-443a-bc19-26e6136d05f0"}}}}},"audioParams":{"bgm":{"kind":"url","url":"https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/morning001.mp3"}},"canvasSize":{"width":1024,"height":1536},"imageParams":{"style":"<style>A highly polished 2D digital illustration in anime and manga style, featuring clean linework, soft shading, vivid colors, and expressive facial detailing. The composition emphasizes clarity and visual impact with a minimalistic background and a strong character focus. The lighting is even and bright, giving the image a crisp and energetic feel, reminiscent of high-quality character art used in Japanese visual novels or mobile games.</style>","images":{"ani":{"type":"image","source":{"kind":"url","url":"https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/ani.png"}}}}}\n` +
8
+ `{"$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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"}],"movieParams":{"provider":"replicate","model":"bytedance/seedance-1-lite"},"speechParams":{"speakers":{"Presenter":{"provider":"gemini","voiceId":"Leda","speechOptions":{"instruction":"Speak in a slightly high-pitched, curt tone with sudden flustered shifts—like a tsundere anime girl."}}}},"audioParams":{"bgm":{"kind":"url","url":"https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/morning001.mp3"}},"canvasSize":{"width":1024,"height":1536},"imageParams":{"provider":"google","model":"gemini-2.5-flash-image","style":"<style>A highly polished 2D digital illustration in anime and manga style, featuring clean linework, soft shading, vivid colors, and expressive facial detailing. The composition emphasizes clarity and visual impact with a minimalistic background and a strong character focus. The lighting is even and bright, giving the image a crisp and energetic feel, reminiscent of high-quality character art used in Japanese visual novels or mobile games.</style>","images":{"ani":{"type":"image","source":{"kind":"url","url":"https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/ani.png"}}}}}\n` +
9
9
  "```",
10
10
  business: "Use textSlides, markdown, mermaid, or chart to show slides. Extract image links in the article (from <img> tag) to reuse them in the presentation. Mention the reference in one of beats, if it exists. Use the JSON below as a template. chartData is the data for Chart.js\n" +
11
11
  "```JSON\n" +
@@ -55,6 +55,10 @@ export const templateDataSet = {
55
55
  "```JSON\n" +
56
56
  `{"$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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"}],"canvasSize":{"width":1536,"height":1024}}\n` +
57
57
  "```",
58
+ leda: "\n" +
59
+ "```JSON\n" +
60
+ `{"$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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"}],"speechParams":{"speakers":{"Presenter":{"provider":"gemini","voiceId":"Leda","speechOptions":{"instruction":"Speak like a professional news presenter."}}}},"audioParams":{"bgm":{"kind":"url","url":"https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/morning001.mp3"}},"canvasSize":{"width":1024,"height":1536},"imageParams":{"provider":"google","model":"gemini-2.5-flash-image"}}\n` +
61
+ "```",
58
62
  onepiece_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" +
59
63
  "```JSON\n" +
60
64
  `{"$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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"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.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"}],"canvasSize":{"width":1536,"height":1024},"imageParams":{"style":"<style>One Piece aesthetic.</style>","images":{"presenter":{"type":"image","source":{"kind":"url","url":"https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/onepiece_presenter.png"}}}}}\n` +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mulmocast",
3
- "version": "2.1.12",
3
+ "version": "2.1.14",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "lib/index.node.js",