mulmocast 2.1.11 → 2.1.13

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
+ }
@@ -1,6 +1,5 @@
1
1
  import type { AgentFunction, AgentFunctionInfo } from "graphai";
2
2
  import type { AgentBufferResult, ImageAgentInputs, ImageAgentParams, GenAIImageAgentConfig } from "../types/agent.js";
3
- export declare const ratio2BlankPath: (aspectRatio: string) => string;
4
3
  export declare const imageGenAIAgent: AgentFunction<ImageAgentParams, AgentBufferResult, ImageAgentInputs, GenAIImageAgentConfig>;
5
4
  declare const imageGenAIAgentInfo: AgentFunctionInfo;
6
5
  export default imageGenAIAgentInfo;
@@ -3,25 +3,11 @@ import { GraphAILogger } from "graphai";
3
3
  import { provider2ImageAgent } from "../utils/provider2agent.js";
4
4
  import { apiKeyMissingError, agentIncorrectAPIKeyError, agentGenerationError, agentInvalidResponseError, imageAction, imageFileTarget, hasCause, getGenAIErrorReason, resultify, } from "../utils/error_cause.js";
5
5
  import { getAspectRatio } from "../utils/utils.js";
6
- import { ASPECT_RATIOS } from "../utils/const.js";
6
+ import { ASPECT_RATIOS, PRO_ASPECT_RATIOS } from "../utils/const.js";
7
7
  import { GoogleGenAI, PersonGeneration } from "@google/genai";
8
- import { blankImagePath, blankSquareImagePath, blankVerticalImagePath } from "../utils/file.js";
9
- export const ratio2BlankPath = (aspectRatio) => {
10
- if (aspectRatio === "9:16") {
11
- return blankVerticalImagePath();
12
- }
13
- else if (aspectRatio === "1:1") {
14
- return blankSquareImagePath();
15
- }
16
- return blankImagePath();
17
- };
18
- const getGeminiContents = (prompt, referenceImages, aspectRatio) => {
8
+ const getGeminiContents = (prompt, referenceImages) => {
19
9
  const contents = [{ text: prompt }];
20
10
  const images = [...(referenceImages ?? [])];
21
- // NOTE: There is no way to explicitly specify the aspect ratio for Gemini. This is just a hint.
22
- if (aspectRatio) {
23
- images.push(ratio2BlankPath(aspectRatio));
24
- }
25
11
  images.forEach((imagePath) => {
26
12
  const imageData = fs.readFileSync(imagePath);
27
13
  const base64Image = imageData.toString("base64");
@@ -71,7 +57,6 @@ const errorProcess = (error) => {
71
57
  };
72
58
  export const imageGenAIAgent = async ({ namedInputs, params, config, }) => {
73
59
  const { prompt, referenceImages } = namedInputs;
74
- const aspectRatio = getAspectRatio(params.canvasSize, ASPECT_RATIOS);
75
60
  const model = params.model ?? provider2ImageAgent["google"].defaultModel;
76
61
  const apiKey = config?.apiKey;
77
62
  if (!apiKey) {
@@ -82,13 +67,7 @@ export const imageGenAIAgent = async ({ namedInputs, params, config, }) => {
82
67
  const ai = new GoogleGenAI({ apiKey });
83
68
  if (model === "gemini-2.5-flash-image" || model === "gemini-3-pro-image-preview") {
84
69
  const contentParams = (() => {
85
- if (model === "gemini-2.5-flash-image") {
86
- const contents = getGeminiContents(prompt, referenceImages, aspectRatio);
87
- return { model, contents };
88
- }
89
- // gemini-3-pro-image-preview
90
70
  const contents = getGeminiContents(prompt, referenceImages);
91
- const PRO_ASPECT_RATIOS = ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"];
92
71
  return {
93
72
  model,
94
73
  contents,
@@ -111,7 +90,7 @@ export const imageGenAIAgent = async ({ namedInputs, params, config, }) => {
111
90
  prompt,
112
91
  config: {
113
92
  numberOfImages: 1, // default is 4!
114
- aspectRatio,
93
+ aspectRatio: getAspectRatio(params.canvasSize, ASPECT_RATIOS),
115
94
  personGeneration: PersonGeneration.ALLOW_ALL,
116
95
  // safetyFilterLevel: SafetyFilterLevel.BLOCK_ONLY_HIGH,
117
96
  },
@@ -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` +
@@ -12,3 +12,4 @@ export declare const storyToScriptGenerateMode: {
12
12
  };
13
13
  export declare const bundleTargetLang: string[];
14
14
  export declare const ASPECT_RATIOS: string[];
15
+ export declare const PRO_ASPECT_RATIOS: string[];
@@ -12,3 +12,4 @@ export const storyToScriptGenerateMode = {
12
12
  };
13
13
  export const bundleTargetLang = ["ja", "en"];
14
14
  export const ASPECT_RATIOS = ["1:1", "9:16", "16:9"];
15
+ export const PRO_ASPECT_RATIOS = ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mulmocast",
3
- "version": "2.1.11",
3
+ "version": "2.1.13",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "lib/index.node.js",