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.
- package/assets/templates/akira_comic.json +28 -0
- package/assets/templates/children_book.json +13 -0
- package/assets/templates/comic_strips.json +14 -1
- package/assets/templates/drslump_comic.json +28 -0
- package/assets/templates/ghibli_comic.json +28 -0
- package/assets/templates/ghost_comic.json +35 -0
- package/assets/templates/onepiece_comic.json +28 -0
- package/assets/templates/portrait_movie.json +28 -0
- package/assets/templates/realistic_movie.json +28 -0
- package/assets/templates/sensei_and_taro.json +21 -0
- package/lib/actions/audio.js +1 -1
- package/lib/actions/captions.js +1 -1
- package/lib/actions/images.js +98 -13
- package/lib/actions/movie.d.ts +1 -1
- package/lib/actions/movie.js +13 -11
- package/lib/actions/pdf.js +6 -4
- package/lib/actions/translate.js +1 -1
- package/lib/agents/image_openai_agent.d.ts +1 -0
- package/lib/agents/image_openai_agent.js +16 -4
- package/lib/agents/movie_google_agent.d.ts +17 -0
- package/lib/agents/movie_google_agent.js +114 -0
- package/lib/cli/bin.js +19 -0
- package/lib/cli/helpers.js +2 -1
- package/lib/methods/mulmo_studio.d.ts +1 -1
- package/lib/tools/create_mulmo_script_from_url.js +1 -1
- package/lib/tools/create_mulmo_script_interactively.js +1 -1
- package/lib/tools/story_to_script.js +1 -1
- package/lib/types/schema.d.ts +1966 -322
- package/lib/types/schema.js +21 -3
- package/lib/types/type.d.ts +3 -1
- package/lib/utils/file.js +20 -9
- package/lib/utils/pdf.d.ts +1 -0
- package/lib/utils/pdf.js +5 -3
- package/lib/utils/preprocess.d.ts +57 -16
- package/lib/utils/utils.d.ts +1 -0
- package/lib/utils/utils.js +3 -0
- package/package.json +9 -9
- package/scripts/templates/children_book.json +0 -7
- package/scripts/templates/image_prompts_template.json +41 -0
- package/scripts/templates/movie_prompts_template.json +50 -0
- package/scripts/templates/sensei_and_taro.json +0 -11
- package/scripts/templates/text_only_template.json +35 -0
- package/assets/templates/ghibli_strips.json +0 -6
- package/scripts/templates/comic_strips.json +0 -30
- package/scripts/templates/ghibli_strips.json +0 -30
package/lib/types/schema.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/lib/types/type.d.ts
CHANGED
|
@@ -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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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
|
-
|
|
136
|
+
const script = readScriptTemplateFile(template.scriptName);
|
|
137
|
+
return { ...script, ...(template.presentationStyle ?? {}) };
|
|
127
138
|
}
|
|
128
139
|
return undefined;
|
|
129
140
|
})();
|
package/lib/utils/pdf.d.ts
CHANGED
|
@@ -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 &&
|
|
42
|
+
if (width > maxWidth && line) {
|
|
41
43
|
lines.push(line);
|
|
42
|
-
line =
|
|
43
|
-
buffer =
|
|
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>;
|
package/lib/utils/utils.d.ts
CHANGED
|
@@ -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>;
|
package/lib/utils/utils.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mulmocast",
|
|
3
|
-
"version": "0.0.
|
|
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.
|
|
55
|
+
"@graphai/anthropic_agent": "^2.0.2",
|
|
56
56
|
"@graphai/browserless_agent": "^2.0.0",
|
|
57
|
-
"@graphai/gemini_agent": "^
|
|
58
|
-
"@graphai/groq_agent": "^
|
|
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.
|
|
61
|
-
"@graphai/stream_agent_filter": "^2.0.
|
|
62
|
-
"@graphai/vanilla": "^2.0.
|
|
63
|
-
"@graphai/vanilla_node_agents": "^2.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.
|
|
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
|
-
}
|