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.
Files changed (38) hide show
  1. package/assets/templates/akira_comic.json +1 -1
  2. package/assets/templates/ani.json +1 -1
  3. package/assets/templates/business.json +1 -1
  4. package/assets/templates/characters.json +1 -1
  5. package/assets/templates/children_book.json +1 -1
  6. package/assets/templates/coding.json +1 -1
  7. package/assets/templates/comic_strips.json +1 -1
  8. package/assets/templates/drslump_comic.json +1 -1
  9. package/assets/templates/ghibli_comic.json +1 -1
  10. package/assets/templates/ghibli_image_only.json +1 -1
  11. package/assets/templates/ghibli_shorts.json +1 -1
  12. package/assets/templates/ghost_comic.json +1 -1
  13. package/assets/templates/html.json +1 -1
  14. package/assets/templates/onepiece_comic.json +1 -1
  15. package/assets/templates/portrait_movie.json +1 -1
  16. package/assets/templates/realistic_movie.json +1 -1
  17. package/assets/templates/sensei_and_taro.json +1 -1
  18. package/assets/templates/shorts.json +1 -1
  19. package/assets/templates/trailer.json +1 -1
  20. package/lib/actions/movie.js +2 -2
  21. package/lib/agents/add_bgm_agent.js +2 -1
  22. package/lib/agents/image_openai_agent.js +1 -0
  23. package/lib/cli/commands/tool/prompt/handler.js +1 -1
  24. package/lib/methods/mulmo_presentation_style.js +1 -1
  25. package/lib/methods/mulmo_studio_context.d.ts +1 -0
  26. package/lib/methods/mulmo_studio_context.js +7 -0
  27. package/lib/tools/dump_prompt.d.ts +2 -1
  28. package/lib/tools/dump_prompt.js +3 -2
  29. package/lib/types/agent.d.ts +1 -0
  30. package/lib/utils/utils.d.ts +0 -1
  31. package/lib/utils/utils.js +0 -3
  32. package/package.json +2 -3
  33. package/assets/templates/ani_ja.json +0 -44
  34. package/assets/templates/podcast_standard.json +0 -5
  35. package/assets/templates/text_and_image.json +0 -6
  36. package/assets/templates/text_only.json +0 -6
  37. package/scripts/test/test_hello_bgm_0.json +0 -21
  38. 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": "Generate a script for a presentation of the given topic. 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.",
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": "Generate a 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.",
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": "Generate a script for a business presentation of the given topic. 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",
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": "Generate a script for a the given story with multiple characters. Generate image prompts for each character, and make references to them in the beats. Use the JSON below as a template.",
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": "Please generate a script for a children book on the topic provided by the user. Each page (=beat) must haven an image prompt appropriate for the text.",
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": "Generate a script for a technical presentation of the given topic. 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.",
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": "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.",
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": "Generate a script for a presentation of the given topic. 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.",
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": "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.",
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": "Generate a script for a presentation of the given topic. Another AI will generate an image for each beat based on the text description of that beat. Use the JSON below as a template.",
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": "Generate a Japanese script for a Youtube shorts 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.",
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": "Generate a script for a presentation of the given topic. 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.",
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": "Generate a script for a business presentation of the given topic. 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.",
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": "Generate a script for a presentation of the given topic. 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.",
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": "Generate a script for a presentation of the given topic. 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.",
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": "Generate a script for a presentation of the given topic. 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.",
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": "この件について、内容全てを高校生にも分かるように、太郎くん(Student)と先生(Teacher)の会話、という形の台本をArtifactとして作って。ただし要点はしっかりと押さえて。以下に別のトピックに関するサンプルを貼り付けます。このJSONフォーマットに従って。",
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": "Generate a script for a Youtube shorts of the given topic. 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.",
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": "Generate a script for a movie trailer of the given story. Another AI will generate images for each beat based on the image prompt of that beat. Movie prompts must be written in English.",
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"
@@ -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.presentationStyle.audioParams.introPadding;
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.presentationStyle.audioParams.introPadding;
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.presentationStyle.audioParams.introPadding;
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);
@@ -39,6 +39,7 @@ export const imageOpenaiAgent = async ({ namedInputs, params, config, }) => {
39
39
  prompt,
40
40
  n: 1,
41
41
  size,
42
+ background: "opaque",
42
43
  };
43
44
  if (model === "gpt-image-1") {
44
45
  imageOptions.moderation = moderation || "auto";
@@ -10,5 +10,5 @@ export const handler = async (argv) => {
10
10
  setGraphAILogger(verbose, {
11
11
  template,
12
12
  });
13
- await dumpPromptFromTemplate({ templateName: template });
13
+ await dumpPromptFromTemplate({ templateName: template, suppressFirstStatement: false });
14
14
  };
@@ -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
  };
@@ -1,3 +1,4 @@
1
- export declare const dumpPromptFromTemplate: ({ templateName }: {
1
+ export declare const dumpPromptFromTemplate: ({ templateName, suppressFirstStatement }: {
2
2
  templateName: string;
3
+ suppressFirstStatement?: boolean;
3
4
  }) => Promise<void>;
@@ -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
- export const dumpPromptFromTemplate = async ({ templateName }) => {
5
- const prompt = readTemplatePrompt(templateName);
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
  };
@@ -8,6 +8,7 @@ export type OpenAIImageOptions = {
8
8
  size: OpenAIImageSize;
9
9
  moderation?: OpenAIImageModeration;
10
10
  quality?: OpenAIImageQuality;
11
+ background?: "opaque" | "transparent" | "auto";
11
12
  };
12
13
  export type AgentBufferResult = {
13
14
  buffer?: Buffer;
@@ -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;
@@ -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.0",
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.32.0",
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,5 +0,0 @@
1
- {
2
- "title": "Generic",
3
- "description": "Generic. No template.",
4
- "systemPrompt": "Please generate a podcast script based on the topic provided by the user."
5
- }
@@ -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
- }