mulmocast 1.2.0 → 1.2.1
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 +1 -1
- package/assets/templates/ani.json +1 -1
- package/assets/templates/business.json +1 -1
- package/assets/templates/characters.json +1 -1
- package/assets/templates/children_book.json +1 -1
- package/assets/templates/coding.json +1 -1
- package/assets/templates/comic_strips.json +1 -1
- package/assets/templates/drslump_comic.json +1 -1
- package/assets/templates/ghibli_comic.json +1 -1
- package/assets/templates/ghibli_image_only.json +1 -1
- package/assets/templates/ghibli_shorts.json +1 -1
- package/assets/templates/ghost_comic.json +1 -1
- package/assets/templates/html.json +1 -1
- package/assets/templates/onepiece_comic.json +1 -1
- package/assets/templates/portrait_movie.json +1 -1
- package/assets/templates/realistic_movie.json +1 -1
- package/assets/templates/sensei_and_taro.json +1 -1
- package/assets/templates/shorts.json +1 -1
- package/assets/templates/trailer.json +1 -1
- package/lib/actions/movie.js +2 -2
- package/lib/agents/add_bgm_agent.js +2 -1
- package/lib/agents/image_openai_agent.js +1 -0
- package/lib/cli/commands/tool/prompt/handler.js +1 -1
- package/lib/methods/mulmo_presentation_style.js +1 -1
- package/lib/methods/mulmo_studio_context.d.ts +1 -0
- package/lib/methods/mulmo_studio_context.js +7 -0
- package/lib/tools/dump_prompt.d.ts +2 -1
- package/lib/tools/dump_prompt.js +3 -2
- package/lib/types/agent.d.ts +1 -0
- package/lib/utils/utils.d.ts +0 -1
- package/lib/utils/utils.js +0 -3
- package/package.json +2 -3
- package/assets/templates/ani_ja.json +0 -44
- package/assets/templates/podcast_standard.json +0 -5
- package/assets/templates/text_and_image.json +0 -6
- package/assets/templates/text_only.json +0 -6
- package/scripts/test/test_hello_bgm_0.json +0 -21
- package/scripts/test/test_media_mock.json +0 -245
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Akira style",
|
|
3
3
|
"description": "Template for Akira style comic presentation.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "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.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Presentation with Ani",
|
|
3
3
|
"description": "Template for presentation with Ani.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "言葉づかいは思いっきりツンデレにして。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.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Business presentation",
|
|
3
3
|
"description": "Template for business presentation.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "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",
|
|
5
5
|
"scriptName": "business.json"
|
|
6
6
|
}
|
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
"height": 1024
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
-
"systemPrompt": "
|
|
14
|
+
"systemPrompt": "Use multiple characters. Generate image prompts for each character, and make references to them in the beats. Use the JSON below as a template.",
|
|
15
15
|
"scriptName": "image_refs.json"
|
|
16
16
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Children Book",
|
|
3
3
|
"description": "Template for children book.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "This script is for a children book. Each page (=beat) must haven an image prompt appropriate for the text.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Coding presentation",
|
|
3
3
|
"description": "Template for software and coding presentation.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "Use markdown with a code block to show some code on a slide. Avoid long coding examples, which may not fit in a single slide. Mention the reference in one of beats, if it exists. Use the JSON below as a template.",
|
|
5
5
|
"scriptName": "coding.json"
|
|
6
6
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "American Comic Strips",
|
|
3
3
|
"description": "Template for Dilbert-style comic strips.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "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
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Dr. Slump Style",
|
|
3
3
|
"description": "Template for Dr. Slump style comic presentation.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "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.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Ghibli comic style",
|
|
3
3
|
"description": "Template for Ghibli-style comic presentation.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "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
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Ghibli comic image-only",
|
|
3
3
|
"description": "Template for Ghibli-style image-only comic presentation.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "Another AI will generate an image for each beat based on the text description of that beat. Use the JSON below as a template.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Ghibli style for YouTube Shorts",
|
|
3
3
|
"description": "Template for Ghibli-style comic presentation.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "This script is for YouTube shorts. 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
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Ghost in the shell style",
|
|
3
3
|
"description": "Template for Ghost in the shell style comic presentation.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "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.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Business presentation in HTML",
|
|
3
3
|
"description": "Template for business presentation in HTML.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "Another LLM will generate actual slides from the prompt and data for each beat. Adding optional data would help it to generate more compelling slide. Mention the reference in one of beats, if it exists. The valid type of reference is 'article', 'paper', 'image', 'video', 'audio'. Use the JSON below as a template.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "One Piece style",
|
|
3
3
|
"description": "Template for One Piece style comic presentation.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "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.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Photo realistic movie (portrait)",
|
|
3
3
|
"description": "Template for photo realistic movie in portrait mode.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"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.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Photo realistic movie template",
|
|
3
3
|
"description": "Template for photo realistic movie.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"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.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Student and Teacher",
|
|
3
3
|
"description": "Interactive discussion between a student and teacher",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "全てを高校生にも分かるように、太郎くん(Student)と先生(Teacher)の会話、という形の台本にして。ただし要点はしっかりと押さえて。以下に別のトピックに関するサンプルを貼り付けます。このJSONフォーマットに従って。",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Short movie template",
|
|
3
3
|
"description": "Template for Youtube shorts.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "This script is for YouTube shorts. The first beat should be a hook, which describes the topic. Another AI will generate images for each beat based on the image prompt of that beat. Movie prompts must be written in English.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Movie Trailer template",
|
|
3
3
|
"description": "Template for A Movie Trailer.",
|
|
4
|
-
"systemPrompt": "
|
|
4
|
+
"systemPrompt": "This script is for a movie trailer. Another AI will generate images for each beat based on the image prompt of that beat. Movie prompts must be written in English.",
|
|
5
5
|
"presentationStyle": {
|
|
6
6
|
"$mulmocast": {
|
|
7
7
|
"version": "1.1"
|
package/lib/actions/movie.js
CHANGED
|
@@ -80,7 +80,7 @@ const getOutputOption = (audioId, videoId) => {
|
|
|
80
80
|
const addCaptions = (ffmpegContext, concatVideoId, context, caption) => {
|
|
81
81
|
const beatsWithCaptions = context.studio.beats.filter(({ captionFile }) => captionFile);
|
|
82
82
|
if (caption && beatsWithCaptions.length > 0) {
|
|
83
|
-
const introPadding = context
|
|
83
|
+
const introPadding = MulmoStudioContextMethods.getIntroPadding(context);
|
|
84
84
|
return beatsWithCaptions.reduce((acc, beat, index) => {
|
|
85
85
|
const { startAt, duration, captionFile } = beat;
|
|
86
86
|
if (startAt !== undefined && duration !== undefined && captionFile !== undefined) {
|
|
@@ -168,7 +168,7 @@ const createVideo = async (audioArtifactFilePath, outputVideoPath, context) => {
|
|
|
168
168
|
const extraPadding = (() => {
|
|
169
169
|
// We need to consider only intro and outro padding because the other paddings were already added to the beat.duration
|
|
170
170
|
if (index === 0) {
|
|
171
|
-
return context
|
|
171
|
+
return MulmoStudioContextMethods.getIntroPadding(context);
|
|
172
172
|
}
|
|
173
173
|
else if (index === context.studio.beats.length - 1) {
|
|
174
174
|
return context.presentationStyle.audioParams.outroPadding;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import { GraphAILogger } from "graphai";
|
|
3
3
|
import { FfmpegContextAddInput, FfmpegContextInit, FfmpegContextGenerateOutput, ffmpegGetMediaDuration } from "../utils/ffmpeg_utils.js";
|
|
4
|
+
import { MulmoStudioContextMethods } from "../methods/mulmo_studio_context.js";
|
|
4
5
|
const addBGMAgent = async ({ namedInputs, params, }) => {
|
|
5
6
|
const { voiceFile, outputFile, context } = namedInputs;
|
|
6
7
|
const { musicFile } = params;
|
|
@@ -11,7 +12,7 @@ const addBGMAgent = async ({ namedInputs, params, }) => {
|
|
|
11
12
|
throw new Error(`AddBGMAgent musicFile not exist: ${musicFile}`);
|
|
12
13
|
}
|
|
13
14
|
const { duration: speechDuration } = await ffmpegGetMediaDuration(voiceFile);
|
|
14
|
-
const introPadding = context
|
|
15
|
+
const introPadding = MulmoStudioContextMethods.getIntroPadding(context);
|
|
15
16
|
const outroPadding = context.presentationStyle.audioParams.outroPadding;
|
|
16
17
|
const totalDuration = speechDuration + introPadding + outroPadding;
|
|
17
18
|
GraphAILogger.log("totalDucation:", speechDuration, totalDuration);
|
|
@@ -71,7 +71,7 @@ export const MulmoPresentationStyleMethods = {
|
|
|
71
71
|
// Notice that we copy imageParams from presentationStyle and update
|
|
72
72
|
// provider and model appropriately.
|
|
73
73
|
const imageParams = { ...presentationStyle.imageParams, ...beat?.imageParams };
|
|
74
|
-
const provider = MulmoPresentationStyleMethods.getText2ImageProvider(imageParams?.provider);
|
|
74
|
+
const provider = MulmoPresentationStyleMethods.getText2ImageProvider(imageParams?.provider) ?? defaultProviders.text2image;
|
|
75
75
|
const agentInfo = provider2ImageAgent[provider];
|
|
76
76
|
// The default text2image model is gpt-image-1 from OpenAI, and to use it you must have an OpenAI account and have verified your identity. If this is not possible, please specify dall-e-3 as the model.
|
|
77
77
|
const defaultImageParams = {
|
|
@@ -12,4 +12,5 @@ export declare const MulmoStudioContextMethods: {
|
|
|
12
12
|
setSessionState(context: MulmoStudioContext, sessionType: SessionType, value: boolean): void;
|
|
13
13
|
setBeatSessionState(context: MulmoStudioContext, sessionType: BeatSessionType, index: number, value: boolean): void;
|
|
14
14
|
needTranslate(context: MulmoStudioContext, includeCaption?: boolean): boolean | "" | undefined;
|
|
15
|
+
getIntroPadding(context: MulmoStudioContext): number;
|
|
15
16
|
};
|
|
@@ -71,4 +71,11 @@ export const MulmoStudioContextMethods = {
|
|
|
71
71
|
}
|
|
72
72
|
return context.studio.script.lang !== context.lang;
|
|
73
73
|
},
|
|
74
|
+
getIntroPadding(context) {
|
|
75
|
+
if (context.studio.script.beats[0].enableLipSync) {
|
|
76
|
+
// NOTE: We must set introPadding to 0 when enableLipSync is true. Otherwise, the lipsync will be out of sync.
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
return context.presentationStyle.audioParams.introPadding;
|
|
80
|
+
},
|
|
74
81
|
};
|
package/lib/tools/dump_prompt.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { GraphAILogger } from "graphai";
|
|
2
2
|
import { readTemplatePrompt } from "../utils/file.js";
|
|
3
3
|
import clipboardy from "clipboardy";
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
const firstStatement = "Generate a script for a presentation of the given topic. ";
|
|
5
|
+
export const dumpPromptFromTemplate = async ({ templateName, suppressFirstStatement }) => {
|
|
6
|
+
const prompt = suppressFirstStatement ? "" : firstStatement + readTemplatePrompt(templateName);
|
|
6
7
|
GraphAILogger.info(prompt);
|
|
7
8
|
clipboardy.write(prompt);
|
|
8
9
|
};
|
package/lib/types/agent.d.ts
CHANGED
package/lib/utils/utils.d.ts
CHANGED
|
@@ -10,7 +10,6 @@ export declare const chunkArray: <T>(array: T[], size?: number) => T[][];
|
|
|
10
10
|
export declare const isHttp: (fileOrUrl: string) => boolean;
|
|
11
11
|
export declare const text2hash: (input: string) => string;
|
|
12
12
|
export declare const localizedText: (beat: MulmoBeat, multiLingualData?: MulmoStudioMultiLingualData, targetLang?: string, defaultLang?: string) => string;
|
|
13
|
-
export declare const sleep: (milliseconds: number) => Promise<unknown>;
|
|
14
13
|
export declare function userAssert(condition: boolean, message: string): asserts condition;
|
|
15
14
|
export declare const settings2GraphAIConfig: (settings?: Record<string, string>, env?: Record<string, string | undefined>) => ConfigDataDictionary<DefaultConfigData>;
|
|
16
15
|
export declare const getExtention: (contentType: string | null, url: string) => string;
|
package/lib/utils/utils.js
CHANGED
|
@@ -29,9 +29,6 @@ export const localizedText = (beat, multiLingualData, targetLang, defaultLang) =
|
|
|
29
29
|
}
|
|
30
30
|
return beat.text;
|
|
31
31
|
};
|
|
32
|
-
export const sleep = async (milliseconds) => {
|
|
33
|
-
return await new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
34
|
-
};
|
|
35
32
|
export function userAssert(condition, message) {
|
|
36
33
|
if (!condition) {
|
|
37
34
|
throw new Error(message);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mulmocast",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.node.js",
|
|
@@ -84,7 +84,6 @@
|
|
|
84
84
|
"clipboardy": "^4.0.0",
|
|
85
85
|
"dotenv": "^17.2.1",
|
|
86
86
|
"fluent-ffmpeg": "^2.1.3",
|
|
87
|
-
"google-auth-library": "^10.1.0",
|
|
88
87
|
"graphai": "^2.0.13",
|
|
89
88
|
"marked": "^16.1.2",
|
|
90
89
|
"ora": "^8.2.0",
|
|
@@ -101,7 +100,7 @@
|
|
|
101
100
|
"@receptron/test_utils": "^2.0.0",
|
|
102
101
|
"@types/fluent-ffmpeg": "^2.1.26",
|
|
103
102
|
"@types/yargs": "^17.0.33",
|
|
104
|
-
"eslint": "^9.
|
|
103
|
+
"eslint": "^9.33.0",
|
|
105
104
|
"eslint-config-prettier": "^10.1.8",
|
|
106
105
|
"eslint-plugin-prettier": "^5.5.4",
|
|
107
106
|
"eslint-plugin-sonarjs": "^3.0.4",
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"title": "Presentation with Ani in Japanese",
|
|
3
|
-
"description": "Template for presentation with Ani in Japanese.",
|
|
4
|
-
"systemPrompt": "Generate a Japanese script for a presentation of the given topic. 言葉づかいは少しツンデレにして。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.",
|
|
5
|
-
"presentationStyle": {
|
|
6
|
-
"$mulmocast": {
|
|
7
|
-
"version": "1.1",
|
|
8
|
-
"credit": "closing"
|
|
9
|
-
},
|
|
10
|
-
"movieParams": {
|
|
11
|
-
"provider": "replicate",
|
|
12
|
-
"model": "bytedance/seedance-1-lite"
|
|
13
|
-
},
|
|
14
|
-
"audioParams": {
|
|
15
|
-
"bgm": {
|
|
16
|
-
"kind": "url",
|
|
17
|
-
"url": "https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/morning001.mp3"
|
|
18
|
-
}
|
|
19
|
-
},
|
|
20
|
-
"lang": "ja",
|
|
21
|
-
"canvasSize": {
|
|
22
|
-
"width": 1024,
|
|
23
|
-
"height": 1536
|
|
24
|
-
},
|
|
25
|
-
"speechParams": {
|
|
26
|
-
"speakers": {
|
|
27
|
-
"Presenter": { "provider": "nijivoice", "voiceId": "9d9ed276-49ee-443a-bc19-26e6136d05f0" }
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
"imageParams": {
|
|
31
|
-
"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>",
|
|
32
|
-
"images": {
|
|
33
|
-
"ani": {
|
|
34
|
-
"type": "image",
|
|
35
|
-
"source": {
|
|
36
|
-
"kind": "url",
|
|
37
|
-
"url": "https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/ani.png"
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
"scriptName": "image_prompts_template.json"
|
|
44
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"title": "Text and Image",
|
|
3
|
-
"description": "Template for Text and Image Script.",
|
|
4
|
-
"systemPrompt": "Generate a script for a presentation of the given topic. Another AI will generate comic strips for each beat based on the imagePrompt of that beat. Mention the reference in one of beats, if it exists. Use the JSON below as a template.",
|
|
5
|
-
"scriptName": "image_prompts_template.json"
|
|
6
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"title": "Text Only",
|
|
3
|
-
"description": "Template for Text Only Script.",
|
|
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": "text_only_template.json"
|
|
6
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$mulmocast": {
|
|
3
|
-
"version": "1.1"
|
|
4
|
-
},
|
|
5
|
-
"audioParams": {
|
|
6
|
-
"bgmVolume": 0
|
|
7
|
-
},
|
|
8
|
-
"lang": "en",
|
|
9
|
-
"beats": [
|
|
10
|
-
{
|
|
11
|
-
"text": "Hello World",
|
|
12
|
-
"image": {
|
|
13
|
-
"type": "textSlide",
|
|
14
|
-
"slide": {
|
|
15
|
-
"title": "Hello World",
|
|
16
|
-
"bullets": ["Hello", "World"]
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
]
|
|
21
|
-
}
|
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$mulmocast": {
|
|
3
|
-
"version": "1.1"
|
|
4
|
-
},
|
|
5
|
-
"lang": "en",
|
|
6
|
-
"title": "Media Test",
|
|
7
|
-
"references": [
|
|
8
|
-
{
|
|
9
|
-
"url": "https://www.mulmocast.com",
|
|
10
|
-
"title": "Mulmocast",
|
|
11
|
-
"type": "article"
|
|
12
|
-
}
|
|
13
|
-
],
|
|
14
|
-
"speechParams": {
|
|
15
|
-
"speakers": {
|
|
16
|
-
"Presenter": {
|
|
17
|
-
"voiceId": "shimmer",
|
|
18
|
-
"displayName": {
|
|
19
|
-
"en": "Presenter"
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"beats": [
|
|
25
|
-
{
|
|
26
|
-
"id": "first",
|
|
27
|
-
"speaker": "Presenter",
|
|
28
|
-
"text": "This is a local image.",
|
|
29
|
-
"image": {
|
|
30
|
-
"type": "image",
|
|
31
|
-
"source": {
|
|
32
|
-
"kind": "path",
|
|
33
|
-
"path": "../../assets/images/mulmocast_credit.png"
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"speaker": "Presenter",
|
|
39
|
-
"text": "This is a reference beat.",
|
|
40
|
-
"duration": 0.5,
|
|
41
|
-
"image": {
|
|
42
|
-
"type": "beat",
|
|
43
|
-
"id": "first"
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
"speaker": "Presenter",
|
|
48
|
-
"text": "",
|
|
49
|
-
"duration": 0.5,
|
|
50
|
-
"id": "{1A57B3F5-B6CB-4948-96BB-6F018DCCBBD4}",
|
|
51
|
-
"image": {
|
|
52
|
-
"type": "textSlide",
|
|
53
|
-
"slide": {
|
|
54
|
-
"title": "No Audio",
|
|
55
|
-
"bullets": ["0.5 seconds"]
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
"speaker": "Presenter",
|
|
61
|
-
"text": "This is a remote image.",
|
|
62
|
-
"image": {
|
|
63
|
-
"type": "image",
|
|
64
|
-
"source": {
|
|
65
|
-
"kind": "url",
|
|
66
|
-
"url": "https://raw.githubusercontent.com/receptron/mulmocast-cli/refs/heads/main/assets/images/mulmocast_credit.png"
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
"speaker": "Presenter",
|
|
72
|
-
"text": "",
|
|
73
|
-
"duration": 2,
|
|
74
|
-
"image": {
|
|
75
|
-
"type": "textSlide",
|
|
76
|
-
"slide": {
|
|
77
|
-
"title": "No Audio",
|
|
78
|
-
"bullets": ["2 seconds"]
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
"speaker": "Presenter",
|
|
84
|
-
"text": "This is a local movie with audio.",
|
|
85
|
-
"image": {
|
|
86
|
-
"type": "movie",
|
|
87
|
-
"source": {
|
|
88
|
-
"kind": "url",
|
|
89
|
-
"url": "https://github.com/receptron/mulmocast-media/raw/refs/heads/main/test/pingpong.mov"
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
"speaker": "Presenter",
|
|
95
|
-
"text": "",
|
|
96
|
-
"image": {
|
|
97
|
-
"type": "textSlide",
|
|
98
|
-
"slide": {
|
|
99
|
-
"title": "Local Audio Test",
|
|
100
|
-
"bullets": ["Something"]
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
"audio": {
|
|
104
|
-
"type": "audio",
|
|
105
|
-
"source": {
|
|
106
|
-
"kind": "path",
|
|
107
|
-
"path": "../../assets/audio/local_voice.mp3"
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
"speaker": "Presenter",
|
|
113
|
-
"text": "This is a bulleted list in text slide format.",
|
|
114
|
-
"image": {
|
|
115
|
-
"type": "textSlide",
|
|
116
|
-
"slide": {
|
|
117
|
-
"title": "Human Evolution",
|
|
118
|
-
"bullets": [
|
|
119
|
-
"Early Primates",
|
|
120
|
-
"Hominids and Hominins",
|
|
121
|
-
"Australopithecus",
|
|
122
|
-
"Genus Homo Emerges",
|
|
123
|
-
"Homo erectus and Migration",
|
|
124
|
-
"Neanderthals and Other Archaic Humans",
|
|
125
|
-
"Homo sapiens"
|
|
126
|
-
]
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
"speaker": "Presenter",
|
|
132
|
-
"text": "This is a table in markdown format.",
|
|
133
|
-
"image": {
|
|
134
|
-
"type": "markdown",
|
|
135
|
-
"markdown": [
|
|
136
|
-
"# Markdown Table Example",
|
|
137
|
-
"### Table",
|
|
138
|
-
"| Item | In Stock | Price |",
|
|
139
|
-
"| :---------------- | :------: | ----: |",
|
|
140
|
-
"| Python Hat | True | 23.99 |",
|
|
141
|
-
"| SQL Hat | True | 23.99 |",
|
|
142
|
-
"| Codecademy Tee | False | 19.99 |",
|
|
143
|
-
"| Codecademy Hoodie | False | 42.99 |",
|
|
144
|
-
"### Paragraph",
|
|
145
|
-
"This is a paragraph."
|
|
146
|
-
]
|
|
147
|
-
}
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
"speaker": "Presenter",
|
|
151
|
-
"text": "This is a chart in chart format.",
|
|
152
|
-
"image": {
|
|
153
|
-
"type": "chart",
|
|
154
|
-
"title": "Sales and Profits (from Jan to June)",
|
|
155
|
-
"chartData": {
|
|
156
|
-
"type": "bar",
|
|
157
|
-
"data": {
|
|
158
|
-
"labels": ["January", "February", "March", "April", "May", "June"],
|
|
159
|
-
"datasets": [
|
|
160
|
-
{
|
|
161
|
-
"label": "Revenue ($1000s)",
|
|
162
|
-
"data": [120, 135, 180, 155, 170, 190],
|
|
163
|
-
"backgroundColor": "rgba(54, 162, 235, 0.5)",
|
|
164
|
-
"borderColor": "rgba(54, 162, 235, 1)",
|
|
165
|
-
"borderWidth": 1
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
"label": "Profit ($1000s)",
|
|
169
|
-
"data": [45, 52, 68, 53, 61, 73],
|
|
170
|
-
"backgroundColor": "rgba(75, 192, 192, 0.5)",
|
|
171
|
-
"borderColor": "rgba(75, 192, 192, 1)",
|
|
172
|
-
"borderWidth": 1
|
|
173
|
-
}
|
|
174
|
-
]
|
|
175
|
-
},
|
|
176
|
-
"options": {
|
|
177
|
-
"responsive": true,
|
|
178
|
-
"animation": false
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
},
|
|
183
|
-
{
|
|
184
|
-
"speaker": "Presenter",
|
|
185
|
-
"text": "This is a diagram in mermaid format.",
|
|
186
|
-
"image": {
|
|
187
|
-
"type": "mermaid",
|
|
188
|
-
"title": "Business Process Flow",
|
|
189
|
-
"code": {
|
|
190
|
-
"kind": "text",
|
|
191
|
-
"text": "graph LR\n A[Market Research] --> B[Product Planning]\n B --> C[Development]\n C --> D[Testing]\n D --> E[Manufacturing]\n E --> F[Marketing]\n F --> G[Sales]\n G --> H[Customer Support]\n H --> A"
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
},
|
|
195
|
-
{
|
|
196
|
-
"speaker": "Presenter",
|
|
197
|
-
"text": "This is a tailwind html format.",
|
|
198
|
-
"image": {
|
|
199
|
-
"type": "html_tailwind",
|
|
200
|
-
"html": [
|
|
201
|
-
"<main class=\"flex-grow\">",
|
|
202
|
-
" <!-- Hero Section -->",
|
|
203
|
-
" <section class=\"bg-blue-600 text-white py-20\">",
|
|
204
|
-
" <div class=\"container mx-auto px-6 text-center\">",
|
|
205
|
-
" <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">Welcome to Mulmocast</h1>",
|
|
206
|
-
" <p class=\"text-lg md:text-xl mb-8\">A modern web experience powered by Tailwind CSS</p>",
|
|
207
|
-
" <a href=\"#features\" class=\"bg-white text-blue-600 px-6 py-3 rounded-lg font-semibold shadow hover:bg-gray-100 transition\">",
|
|
208
|
-
" Learn More",
|
|
209
|
-
" </a>",
|
|
210
|
-
" </div>",
|
|
211
|
-
" </section>",
|
|
212
|
-
"",
|
|
213
|
-
" <!-- Features Section -->",
|
|
214
|
-
" <section id=\"features\" class=\"py-16 bg-gray-100\">",
|
|
215
|
-
" <div class=\"container mx-auto px-6\">",
|
|
216
|
-
" <div class=\"grid grid-cols-1 md:grid-cols-3 gap-8 text-center\">",
|
|
217
|
-
" <div>",
|
|
218
|
-
" <div class=\"text-blue-600 text-4xl mb-2\">⚡</div>",
|
|
219
|
-
" <h3 class=\"text-xl font-semibold mb-2\">Fast</h3>",
|
|
220
|
-
" <p class=\"text-gray-600\">Built with performance in mind using modern tools.</p>",
|
|
221
|
-
" </div>",
|
|
222
|
-
" <div>",
|
|
223
|
-
" <div class=\"text-blue-600 text-4xl mb-2\">🎨</div>",
|
|
224
|
-
" <h3 class=\"text-xl font-semibold mb-2\">Beautiful</h3>",
|
|
225
|
-
" <p class=\"text-gray-600\">Styled with Tailwind CSS for clean, responsive design.</p>",
|
|
226
|
-
" </div>",
|
|
227
|
-
" <div>",
|
|
228
|
-
" <div class=\"text-blue-600 text-4xl mb-2\">🚀</div>",
|
|
229
|
-
" <h3 class=\"text-xl font-semibold mb-2\">Launch Ready</h3>",
|
|
230
|
-
" <p class=\"text-gray-600\">Easy to deploy and extend for your next big idea.</p>",
|
|
231
|
-
" </div>",
|
|
232
|
-
" </div>",
|
|
233
|
-
" </div>",
|
|
234
|
-
" </section>",
|
|
235
|
-
"</main>",
|
|
236
|
-
"",
|
|
237
|
-
"<!-- Footer -->",
|
|
238
|
-
"<footer class=\"bg-white text-gray-500 text-center py-6 border-t\">",
|
|
239
|
-
" 2025 Mulmocast.",
|
|
240
|
-
"</footer>"
|
|
241
|
-
]
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
]
|
|
245
|
-
}
|