mulmocast 0.0.8 → 0.0.10

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.
Files changed (45) hide show
  1. package/assets/templates/akira_comic.json +28 -0
  2. package/assets/templates/children_book.json +13 -0
  3. package/assets/templates/comic_strips.json +14 -1
  4. package/assets/templates/drslump_comic.json +28 -0
  5. package/assets/templates/ghibli_comic.json +28 -0
  6. package/assets/templates/ghost_comic.json +35 -0
  7. package/assets/templates/onepiece_comic.json +28 -0
  8. package/assets/templates/portrait_movie.json +28 -0
  9. package/assets/templates/realistic_movie.json +28 -0
  10. package/assets/templates/sensei_and_taro.json +21 -0
  11. package/lib/actions/audio.js +1 -1
  12. package/lib/actions/captions.js +1 -1
  13. package/lib/actions/images.js +98 -13
  14. package/lib/actions/movie.d.ts +1 -1
  15. package/lib/actions/movie.js +13 -11
  16. package/lib/actions/pdf.js +6 -4
  17. package/lib/actions/translate.js +1 -1
  18. package/lib/agents/image_openai_agent.d.ts +1 -0
  19. package/lib/agents/image_openai_agent.js +16 -4
  20. package/lib/agents/movie_google_agent.d.ts +17 -0
  21. package/lib/agents/movie_google_agent.js +114 -0
  22. package/lib/cli/bin.js +19 -0
  23. package/lib/cli/helpers.js +2 -1
  24. package/lib/methods/mulmo_studio.d.ts +1 -1
  25. package/lib/tools/create_mulmo_script_from_url.js +1 -1
  26. package/lib/tools/create_mulmo_script_interactively.js +1 -1
  27. package/lib/tools/story_to_script.js +1 -1
  28. package/lib/types/schema.d.ts +1966 -322
  29. package/lib/types/schema.js +21 -3
  30. package/lib/types/type.d.ts +3 -1
  31. package/lib/utils/file.js +20 -9
  32. package/lib/utils/pdf.d.ts +1 -0
  33. package/lib/utils/pdf.js +5 -3
  34. package/lib/utils/preprocess.d.ts +57 -16
  35. package/lib/utils/utils.d.ts +1 -0
  36. package/lib/utils/utils.js +3 -0
  37. package/package.json +9 -9
  38. package/scripts/templates/children_book.json +0 -7
  39. package/scripts/templates/image_prompts_template.json +41 -0
  40. package/scripts/templates/movie_prompts_template.json +50 -0
  41. package/scripts/templates/sensei_and_taro.json +0 -11
  42. package/scripts/templates/text_only_template.json +35 -0
  43. package/assets/templates/ghibli_strips.json +0 -6
  44. package/scripts/templates/comic_strips.json +0 -30
  45. package/scripts/templates/ghibli_strips.json +0 -30
@@ -109,7 +109,9 @@ export const mulmoImageAssetSchema = z.union([
109
109
  mulmoPdfMediaSchema,
110
110
  mulmoImageMediaSchema,
111
111
  mulmoSvgMediaSchema,
112
- mulmoMovieMediaSchema,
112
+ mulmoMovieMediaSchema.extend({
113
+ mixAudio: z.number().default(1.0),
114
+ }),
113
115
  mulmoTextSlideMediaSchema,
114
116
  mulmoChartMediaSchema,
115
117
  mulmoMermaidMediaSchema,
@@ -128,12 +130,14 @@ const mulmoMidiMediaSchema = z
128
130
  })
129
131
  .strict();
130
132
  export const mulmoAudioAssetSchema = z.union([mulmoAudioMediaSchema, mulmoMidiMediaSchema]);
133
+ const imageIdSchema = z.string();
131
134
  export const mulmoImageParamsSchema = z
132
135
  .object({
133
136
  model: z.string().optional(), // default: provider specific
134
137
  size: z.string().optional(), // default: provider specific
135
138
  style: z.string().optional(), // optional image style
136
139
  moderation: z.string().optional(), // optional image style
140
+ images: z.record(imageIdSchema, mulmoImageMediaSchema).optional(),
137
141
  })
138
142
  .strict();
139
143
  export const textSlideParamsSchema = z
@@ -173,7 +177,9 @@ export const mulmoBeatSchema = z
173
177
  audioParams: beatAudioParamsSchema.optional(), // beat specific parameters
174
178
  speechOptions: speechOptionsSchema.optional(),
175
179
  textSlideParams: textSlideParamsSchema.optional(),
176
- imagePrompt: z.string().optional(), // specified or inserted by preprocessor
180
+ imageNames: z.array(imageIdSchema).optional(), // list of image names to use for image generation. The default is all images in the imageParams.images.
181
+ imagePrompt: z.string().optional(),
182
+ moviePrompt: z.string().optional(),
177
183
  })
178
184
  .strict();
179
185
  export const mulmoCanvasDimensionSchema = z
@@ -197,6 +203,13 @@ export const mulmoSpeechParamsSchema = z
197
203
  })
198
204
  .strict();
199
205
  export const text2ImageProviderSchema = z.union([z.literal("openai"), z.literal("google")]).default("openai");
206
+ export const text2MovieProviderSchema = z.union([z.literal("openai"), z.literal("google")]).default("google");
207
+ export const mulmoMovieParamsSchema = z
208
+ .object({
209
+ provider: text2MovieProviderSchema.optional(),
210
+ model: z.string().optional(), // default: provider specific
211
+ })
212
+ .strict();
200
213
  export const mulmoPresentationStyleSchema = z.object({
201
214
  $mulmocast: mulmoCastCreditSchema,
202
215
  canvasSize: mulmoCanvasDimensionSchema, // has default value
@@ -215,6 +228,7 @@ export const mulmoPresentationStyleSchema = z.object({
215
228
  provider: text2ImageProviderSchema, // has default value
216
229
  })
217
230
  .optional(),
231
+ movieParams: mulmoMovieParamsSchema.optional(),
218
232
  // for textSlides
219
233
  textSlideParams: textSlideParamsSchema.optional(),
220
234
  // videoParams: videoParamsSchema.optional(),
@@ -231,7 +245,7 @@ export const mulmoReferenceSchema = z.object({
231
245
  url: URLStringSchema,
232
246
  title: z.string().optional(),
233
247
  description: z.string().optional(),
234
- type: z.union([z.literal("article"), z.literal("image"), z.literal("video"), z.literal("audio")]).default("article"),
248
+ type: z.union([z.literal("article"), z.literal("paper"), z.literal("image"), z.literal("video"), z.literal("audio")]).default("article"),
235
249
  });
236
250
  export const mulmoScriptSchema = mulmoPresentationStyleSchema
237
251
  .extend({
@@ -252,6 +266,7 @@ export const mulmoStudioBeatSchema = z
252
266
  duration: z.number().optional(),
253
267
  audioFile: z.string().optional(),
254
268
  imageFile: z.string().optional(), // path to the image
269
+ movieFile: z.string().optional(), // path to the movie file
255
270
  captionFile: z.string().optional(), // path to the caption image
256
271
  })
257
272
  .strict();
@@ -271,6 +286,7 @@ export const mulmoSessionStateSchema = z.object({
271
286
  inBeatSession: z.object({
272
287
  audio: z.set(z.number()),
273
288
  image: z.set(z.number()),
289
+ movie: z.set(z.number()),
274
290
  multiLingual: z.set(z.number()),
275
291
  caption: z.set(z.number()),
276
292
  }),
@@ -293,6 +309,7 @@ export const mulmoStudioSchema = z
293
309
  inBeatSession: {
294
310
  audio: new Set(),
295
311
  image: new Set(),
312
+ movie: new Set(),
296
313
  multiLingual: new Set(),
297
314
  caption: new Set(),
298
315
  },
@@ -305,6 +322,7 @@ export const mulmoScriptTemplateSchema = z
305
322
  description: z.string(),
306
323
  systemPrompt: z.string(),
307
324
  scriptName: z.string().optional(),
325
+ presentationStyle: mulmoPresentationStyleSchema.optional(),
308
326
  })
309
327
  .strict();
310
328
  export const mulmoStoryboardSceneSchema = z
@@ -1,4 +1,4 @@
1
- import { langSchema, localizedTextSchema, mulmoBeatSchema, mulmoScriptSchema, mulmoStudioSchema, mulmoStudioBeatSchema, mulmoStoryboardSchema, mulmoStoryboardSceneSchema, mulmoStudioMultiLingualSchema, mulmoStudioMultiLingualDataSchema, speakerDictionarySchema, mulmoImageParamsSchema, mulmoSpeechParamsSchema, textSlideParamsSchema, speechOptionsSchema, mulmoCanvasDimensionSchema, mulmoScriptTemplateSchema, text2ImageProviderSchema, text2SpeechProviderSchema, mulmoPresentationStyleSchema, multiLingualTextsSchema, mulmoMermaidMediaSchema, mulmoTextSlideMediaSchema, mulmoMarkdownMediaSchema, mulmoImageMediaSchema, mulmoChartMediaSchema, mediaSourceSchema } from "./schema.js";
1
+ import { langSchema, localizedTextSchema, mulmoBeatSchema, mulmoScriptSchema, mulmoStudioSchema, mulmoStudioBeatSchema, mulmoStoryboardSchema, mulmoStoryboardSceneSchema, mulmoStudioMultiLingualSchema, mulmoStudioMultiLingualDataSchema, speakerDictionarySchema, mulmoImageParamsSchema, mulmoMovieParamsSchema, mulmoSpeechParamsSchema, textSlideParamsSchema, speechOptionsSchema, mulmoCanvasDimensionSchema, mulmoScriptTemplateSchema, text2ImageProviderSchema, text2MovieProviderSchema, text2SpeechProviderSchema, mulmoPresentationStyleSchema, multiLingualTextsSchema, mulmoMermaidMediaSchema, mulmoTextSlideMediaSchema, mulmoMarkdownMediaSchema, mulmoImageMediaSchema, mulmoChartMediaSchema, mediaSourceSchema } from "./schema.js";
2
2
  import { pdf_modes, pdf_sizes, storyToScriptGenerateMode } from "../utils/const.js";
3
3
  import { LLM } from "../utils/utils.js";
4
4
  import { z } from "zod";
@@ -10,6 +10,7 @@ export type SpeechOptions = z.infer<typeof speechOptionsSchema>;
10
10
  export type MulmoImageParams = z.infer<typeof mulmoImageParamsSchema>;
11
11
  export type TextSlideParams = z.infer<typeof textSlideParamsSchema>;
12
12
  export type Text2ImageProvider = z.infer<typeof text2ImageProviderSchema>;
13
+ export type Text2MovieProvider = z.infer<typeof text2MovieProviderSchema>;
13
14
  export type Text2SpeechProvider = z.infer<typeof text2SpeechProviderSchema>;
14
15
  export type LocalizedText = z.infer<typeof localizedTextSchema>;
15
16
  export type MulmoScript = z.infer<typeof mulmoScriptSchema>;
@@ -24,6 +25,7 @@ export type MulmoScriptTemplate = z.infer<typeof mulmoScriptTemplateSchema>;
24
25
  export type MulmoStudioMultiLingual = z.infer<typeof mulmoStudioMultiLingualSchema>;
25
26
  export type MulmoStudioMultiLingualData = z.infer<typeof mulmoStudioMultiLingualDataSchema>;
26
27
  export type MultiLingualTexts = z.infer<typeof multiLingualTextsSchema>;
28
+ export type MulmoMovieParams = z.infer<typeof mulmoMovieParamsSchema>;
27
29
  export type MulmoTextSlideMedia = z.infer<typeof mulmoTextSlideMediaSchema>;
28
30
  export type MulmoMarkdownMedia = z.infer<typeof mulmoMarkdownMediaSchema>;
29
31
  export type MulmoImageMedia = z.infer<typeof mulmoImageMediaSchema>;
package/lib/utils/file.js CHANGED
@@ -18,13 +18,22 @@ export function readMulmoScriptFile(arg2, errorMessage) {
18
18
  return null;
19
19
  }
20
20
  const scriptData = fs.readFileSync(scriptPath, "utf-8");
21
- const script = ([".yaml", ".yml"].includes(path.extname(scriptPath).toLowerCase()) ? yamlParse(scriptData) : JSON.parse(scriptData));
22
- const parsedPath = path.parse(scriptPath);
23
- return {
24
- mulmoData: script,
25
- mulmoDataPath: scriptPath,
26
- fileName: parsedPath.name,
27
- };
21
+ try {
22
+ const script = ([".yaml", ".yml"].includes(path.extname(scriptPath).toLowerCase()) ? yamlParse(scriptData) : JSON.parse(scriptData));
23
+ const parsedPath = path.parse(scriptPath);
24
+ return {
25
+ mulmoData: script,
26
+ mulmoDataPath: scriptPath,
27
+ fileName: parsedPath.name,
28
+ };
29
+ }
30
+ catch (__error) {
31
+ if (errorMessage) {
32
+ GraphAILogger.info("read file format is broken.");
33
+ process.exit(1);
34
+ }
35
+ return null;
36
+ }
28
37
  }
29
38
  export const fetchMulmoScriptFile = async (url) => {
30
39
  try {
@@ -120,10 +129,12 @@ export const readScriptTemplateFile = (scriptName) => {
120
129
  export const readTemplatePrompt = (templateName) => {
121
130
  const templatePath = getTemplateFilePath(templateName);
122
131
  const templateData = fs.readFileSync(templatePath, "utf-8");
123
- const template = mulmoScriptTemplateSchema.parse(JSON.parse(templateData));
132
+ // NOTE: We don't want to schema parse the template here to eliminate default values.
133
+ const template = JSON.parse(templateData);
124
134
  const script = (() => {
125
135
  if (template.scriptName) {
126
- return readScriptTemplateFile(template.scriptName);
136
+ const script = readScriptTemplateFile(template.scriptName);
137
+ return { ...script, ...(template.presentationStyle ?? {}) };
127
138
  }
128
139
  return undefined;
129
140
  })();
@@ -2,6 +2,7 @@ import { PDFFont } from "pdf-lib";
2
2
  export declare const fontSize = 12;
3
3
  export declare const textMargin = 6;
4
4
  export declare const drawSize: (fitWidth: boolean, expectWidth: number, expectHeight: number, origWidth: number, origHeight: number) => {
5
+ containerWidth: number;
5
6
  drawWidth: number;
6
7
  drawHeight: number;
7
8
  };
package/lib/utils/pdf.js CHANGED
@@ -6,6 +6,7 @@ export const drawSize = (fitWidth, expectWidth, expectHeight, origWidth, origHei
6
6
  const scale = drawWidth / origWidth;
7
7
  const drawHeight = origHeight * scale;
8
8
  return {
9
+ containerWidth: expectWidth,
9
10
  drawWidth,
10
11
  drawHeight,
11
12
  };
@@ -14,6 +15,7 @@ export const drawSize = (fitWidth, expectWidth, expectHeight, origWidth, origHei
14
15
  const scale = drawHeight / origHeight;
15
16
  const drawWidth = origWidth * scale;
16
17
  return {
18
+ containerWidth: expectWidth,
17
19
  drawWidth,
18
20
  drawHeight,
19
21
  };
@@ -37,10 +39,10 @@ export const wrapText = (text, font, fontSize, maxWidth) => {
37
39
  const currentIsFull = isFullwidth(char);
38
40
  const nextIsFull = nextChar && isFullwidth(nextChar);
39
41
  const isBreakable = currentIsFull || (!currentIsFull && (char === " " || nextChar === " " || nextIsFull));
40
- if (width > maxWidth && buffer) {
42
+ if (width > maxWidth && line) {
41
43
  lines.push(line);
42
- line = "";
43
- buffer = char;
44
+ line = buffer;
45
+ buffer = "";
44
46
  }
45
47
  if (isBreakable || i === rawLine.length - 1) {
46
48
  line += buffer;
@@ -5,6 +5,7 @@ export declare const createOrUpdateStudioData: (_mulmoScript: MulmoScript, curre
5
5
  hash?: string | undefined;
6
6
  audioFile?: string | undefined;
7
7
  imageFile?: string | undefined;
8
+ movieFile?: string | undefined;
8
9
  captionFile?: string | undefined;
9
10
  }[];
10
11
  multiLingual: {
@@ -101,21 +102,6 @@ export declare const createOrUpdateStudioData: (_mulmoScript: MulmoScript, curre
101
102
  path: string;
102
103
  kind: "path";
103
104
  };
104
- } | {
105
- type: "movie";
106
- source: {
107
- url: string;
108
- kind: "url";
109
- } | {
110
- kind: "base64";
111
- data: string;
112
- } | {
113
- text: string;
114
- kind: "text";
115
- } | {
116
- path: string;
117
- kind: "path";
118
- };
119
105
  } | {
120
106
  type: "textSlide";
121
107
  slide: {
@@ -147,6 +133,22 @@ export declare const createOrUpdateStudioData: (_mulmoScript: MulmoScript, curre
147
133
  } | {
148
134
  type: "html_tailwind";
149
135
  html: string | string[];
136
+ } | {
137
+ type: "movie";
138
+ source: {
139
+ url: string;
140
+ kind: "url";
141
+ } | {
142
+ kind: "base64";
143
+ data: string;
144
+ } | {
145
+ text: string;
146
+ kind: "text";
147
+ } | {
148
+ path: string;
149
+ kind: "path";
150
+ };
151
+ mixAudio: number;
150
152
  } | undefined;
151
153
  audio?: {
152
154
  type: "audio";
@@ -172,6 +174,22 @@ export declare const createOrUpdateStudioData: (_mulmoScript: MulmoScript, curre
172
174
  size?: string | undefined;
173
175
  style?: string | undefined;
174
176
  moderation?: string | undefined;
177
+ images?: Record<string, {
178
+ type: "image";
179
+ source: {
180
+ url: string;
181
+ kind: "url";
182
+ } | {
183
+ kind: "base64";
184
+ data: string;
185
+ } | {
186
+ text: string;
187
+ kind: "text";
188
+ } | {
189
+ path: string;
190
+ kind: "path";
191
+ };
192
+ }> | undefined;
175
193
  } | undefined;
176
194
  audioParams?: {
177
195
  padding?: number | undefined;
@@ -179,7 +197,9 @@ export declare const createOrUpdateStudioData: (_mulmoScript: MulmoScript, curre
179
197
  textSlideParams?: {
180
198
  cssStyles: string | string[];
181
199
  } | undefined;
200
+ imageNames?: string[] | undefined;
182
201
  imagePrompt?: string | undefined;
202
+ moviePrompt?: string | undefined;
183
203
  }[];
184
204
  lang?: string | undefined;
185
205
  title?: string | undefined;
@@ -189,14 +209,34 @@ export declare const createOrUpdateStudioData: (_mulmoScript: MulmoScript, curre
189
209
  size?: string | undefined;
190
210
  style?: string | undefined;
191
211
  moderation?: string | undefined;
212
+ images?: Record<string, {
213
+ type: "image";
214
+ source: {
215
+ url: string;
216
+ kind: "url";
217
+ } | {
218
+ kind: "base64";
219
+ data: string;
220
+ } | {
221
+ text: string;
222
+ kind: "text";
223
+ } | {
224
+ path: string;
225
+ kind: "path";
226
+ };
227
+ }> | undefined;
192
228
  } | undefined;
193
229
  textSlideParams?: {
194
230
  cssStyles: string | string[];
195
231
  } | undefined;
232
+ movieParams?: {
233
+ model?: string | undefined;
234
+ provider?: "openai" | "google" | undefined;
235
+ } | undefined;
196
236
  omitCaptions?: boolean | undefined;
197
237
  description?: string | undefined;
198
238
  references?: {
199
- type: "image" | "audio" | "article" | "video";
239
+ type: "image" | "audio" | "article" | "paper" | "video";
200
240
  url: string;
201
241
  title?: string | undefined;
202
242
  description?: string | undefined;
@@ -216,6 +256,7 @@ export declare const createOrUpdateStudioData: (_mulmoScript: MulmoScript, curre
216
256
  };
217
257
  inBeatSession: {
218
258
  image: Set<number>;
259
+ movie: Set<number>;
219
260
  audio: Set<number>;
220
261
  multiLingual: Set<number>;
221
262
  caption: Set<number>;
@@ -15,3 +15,4 @@ export declare const chunkArray: <T>(array: T[], size?: number) => T[][];
15
15
  export declare const isHttp: (fileOrUrl: string) => boolean;
16
16
  export declare const text2hash: (input: string) => string;
17
17
  export declare const localizedText: (beat: MulmoBeat, multiLingualData?: MulmoStudioMultiLingualData, lang?: string) => string;
18
+ export declare const sleep: (milliseconds: number) => Promise<unknown>;
@@ -52,3 +52,6 @@ export const localizedText = (beat, multiLingualData, lang) => {
52
52
  }
53
53
  return beat.text;
54
54
  };
55
+ export const sleep = async (milliseconds) => {
56
+ return await new Promise((resolve) => setTimeout(resolve, milliseconds));
57
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mulmocast",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "lib/cli/bin.js",
@@ -52,22 +52,22 @@
52
52
  "homepage": "https://github.com/receptron/mulmocast-cli#readme",
53
53
  "dependencies": {
54
54
  "@google-cloud/text-to-speech": "^6.1.0",
55
- "@graphai/anthropic_agent": "^2.0.0",
55
+ "@graphai/anthropic_agent": "^2.0.2",
56
56
  "@graphai/browserless_agent": "^2.0.0",
57
- "@graphai/gemini_agent": "^1.0.1",
58
- "@graphai/groq_agent": "^1.0.1",
57
+ "@graphai/gemini_agent": "^2.0.0",
58
+ "@graphai/groq_agent": "^2.0.0",
59
59
  "@graphai/input_agents": "^1.0.1",
60
- "@graphai/openai_agent": "^2.0.0",
61
- "@graphai/stream_agent_filter": "^2.0.1",
62
- "@graphai/vanilla": "^2.0.2",
63
- "@graphai/vanilla_node_agents": "^2.0.0",
60
+ "@graphai/openai_agent": "^2.0.3",
61
+ "@graphai/stream_agent_filter": "^2.0.2",
62
+ "@graphai/vanilla": "^2.0.4",
63
+ "@graphai/vanilla_node_agents": "^2.0.1",
64
64
  "@pdf-lib/fontkit": "^1.1.1",
65
65
  "canvas": "^3.1.0",
66
66
  "clipboardy": "^4.0.0",
67
67
  "dotenv": "^16.4.7",
68
68
  "fluent-ffmpeg": "^2.1.3",
69
69
  "google-auth-library": "^9.15.1",
70
- "graphai": "^2.0.3",
70
+ "graphai": "^2.0.5",
71
71
  "inquirer": "^12.6.1",
72
72
  "marked": "^15.0.11",
73
73
  "ora": "^8.2.0",
@@ -4,13 +4,6 @@
4
4
  "credit": "closing"
5
5
  },
6
6
  "title": "桃太郎",
7
- "canvasSize": {
8
- "width": 1536,
9
- "height": 1024
10
- },
11
- "imageParams": {
12
- "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."
13
- },
14
7
  "lang": "ja",
15
8
  "beats": [
16
9
  {
@@ -0,0 +1,41 @@
1
+ {
2
+ "$mulmocast": {
3
+ "version": "1.0",
4
+ "credit": "closing"
5
+ },
6
+ "title": "[TITLE: Brief, engaging title for the topic]",
7
+ "lang": "en",
8
+ "references": [
9
+ {
10
+ "url": "[SOURCE_URL: URL of the source material]",
11
+ "title": "[SOURCE_TITLE: Title of the referenced article, or paper]",
12
+ "type": "[SOURCE_TYPE: article, paper]"
13
+ }
14
+ ],
15
+ "beats": [
16
+ {
17
+ "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.]",
18
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"
19
+ },
20
+ {
21
+ "text": "[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]",
22
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"
23
+ },
24
+ {
25
+ "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.]",
26
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"
27
+ },
28
+ {
29
+ "text": "[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]",
30
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"
31
+ },
32
+ {
33
+ "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.]",
34
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"
35
+ },
36
+ {
37
+ "text": "[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]",
38
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"
39
+ }
40
+ ]
41
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "$mulmocast": {
3
+ "version": "1.0",
4
+ "credit": "closing"
5
+ },
6
+ "title": "[TITLE: Brief, engaging title for the topic]",
7
+ "lang": "en",
8
+ "references": [
9
+ {
10
+ "url": "[SOURCE_URL: URL of the source material]",
11
+ "title": "[SOURCE_TITLE: Title of the referenced article, or paper]",
12
+ "type": "[SOURCE_TYPE: article, paper]"
13
+ }
14
+ ],
15
+ "movieParams": {
16
+ "provider": "google"
17
+ },
18
+ "beats": [
19
+ {
20
+ "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.]",
21
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]",
22
+ "moviePrompt": "[MOVIE_PROMPT: A movie prompt for that image.]"
23
+ },
24
+ {
25
+ "text": "[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]",
26
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]",
27
+ "moviePrompt": "[MOVIE_PROMPT: A movie prompt for that image.]"
28
+ },
29
+ {
30
+ "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.]",
31
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]",
32
+ "moviePrompt": "[MOVIE_PROMPT: A movie prompt for that image.]"
33
+ },
34
+ {
35
+ "text": "[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]",
36
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]",
37
+ "moviePrompt": "[MOVIE_PROMPT: A movie prompt for that image.]"
38
+ },
39
+ {
40
+ "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.]",
41
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]",
42
+ "moviePrompt": "[MOVIE_PROMPT: A movie prompt for that image.]"
43
+ },
44
+ {
45
+ "text": "[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]",
46
+ "imagePrompt": "[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]",
47
+ "moviePrompt": "[MOVIE_PROMPT: A movie prompt for that image.]"
48
+ }
49
+ ]
50
+ }
@@ -6,17 +6,6 @@
6
6
  "title": "韓国の戒厳令とその日本への影響",
7
7
  "description": "韓国で最近発令された戒厳令とその可能性のある影響について、また日本の憲法に関する考慮事項との類似点を含めた洞察に満ちた議論。",
8
8
  "lang": "ja",
9
- "imageParams": {
10
- "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>"
11
- },
12
- "speechParams": {
13
- "provider": "nijivoice",
14
- "speakers": {
15
- "Announcer": { "displayName": { "ja": "アナウンサー" }, "voiceId": "afd7df65-0fdc-4d31-ae8b-a29f0f5eed62" },
16
- "Student": { "displayName": { "ja": "太郎" }, "voiceId": "a7619e48-bf6a-4f9f-843f-40485651257f" },
17
- "Teacher": { "displayName": { "ja": "先生" }, "voiceId": "bc06c63f-fef6-43b6-92f7-67f919bd5dae" }
18
- }
19
- },
20
9
  "beats": [
21
10
  {
22
11
  "speaker": "Announcer",
@@ -0,0 +1,35 @@
1
+ {
2
+ "$mulmocast": {
3
+ "version": "1.0",
4
+ "credit": "closing"
5
+ },
6
+ "title": "[TITLE: Brief, engaging title for the topic]",
7
+ "lang": "en",
8
+ "references": [
9
+ {
10
+ "url": "[SOURCE_URL: URL of the source material]",
11
+ "title": "[SOURCE_TITLE: Title of the referenced article, or paper]",
12
+ "type": "[SOURCE_TYPE: article, paper]"
13
+ }
14
+ ],
15
+ "beats": [
16
+ {
17
+ "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.]"
18
+ },
19
+ {
20
+ "text": "[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]"
21
+ },
22
+ {
23
+ "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.]"
24
+ },
25
+ {
26
+ "text": "[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]"
27
+ },
28
+ {
29
+ "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.]"
30
+ },
31
+ {
32
+ "text": "[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]"
33
+ }
34
+ ]
35
+ }
@@ -1,6 +0,0 @@
1
- {
2
- "title": "American Comic Strips",
3
- "description": "Template for Dilbert-style comic strips.",
4
- "systemPrompt": "Generate a script for a presentation of the given topic. 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.",
5
- "scriptName": "ghibli_strips.json"
6
- }
@@ -1,30 +0,0 @@
1
- {
2
- "$mulmocast": {
3
- "version": "1.0",
4
- "credit": "closing"
5
- },
6
- "title": "Sample Title",
7
- "lang": "en",
8
- "canvasSize": {
9
- "width": 1536,
10
- "height": 1024
11
- },
12
- "imageParams": {
13
- "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>"
14
- },
15
- "references": [
16
- {
17
- "url": "https://www.somegreatwebsite.com/article/123",
18
- "title": "Title of the article we are referencing",
19
- "type": "article"
20
- }
21
- ],
22
- "beats": [
23
- {
24
- "text": "Today we're exploring a fascinating concept that has shaped some of the most innovative companies and leaders of our time. This story is based on an Awesome News articled, titled 'The reality distortion field'. This term has become synonymous with visionary leadership and the ability to accomplish seemingly impossible goals."
25
- },
26
- {
27
- "text": "The Reality Distortion Field is a concept that was first introduced by Steve Jobs, the co-founder of Apple. It refers to the ability of a leader to convince people that something is possible, even if it seems impossible."
28
- }
29
- ]
30
- }
@@ -1,30 +0,0 @@
1
- {
2
- "$mulmocast": {
3
- "version": "1.0",
4
- "credit": "closing"
5
- },
6
- "title": "Sample Title",
7
- "lang": "en",
8
- "canvasSize": {
9
- "width": 1536,
10
- "height": 1024
11
- },
12
- "imageParams": {
13
- "style": "<style>A multi panel comic strips. Ghibli style. The presenter is a young woman with a dark short hair with glasses.</style>"
14
- },
15
- "references": [
16
- {
17
- "url": "https://www.somegreatwebsite.com/article/123",
18
- "title": "The Awesome News: The reality distortion field",
19
- "type": "article"
20
- }
21
- ],
22
- "beats": [
23
- {
24
- "text": "Today we're exploring a fascinating concept that has shaped some of the most innovative companies and leaders of our time. This story is based on an Awesome News articled, titled 'The reality distortion field'. This term has become synonymous with visionary leadership and the ability to accomplish seemingly impossible goals."
25
- },
26
- {
27
- "text": "The Reality Distortion Field is a concept that was first introduced by Steve Jobs, the co-founder of Apple. It refers to the ability of a leader to convince people that something is possible, even if it seems impossible."
28
- }
29
- ]
30
- }