video-maker-mcp 0.1.0 → 0.1.2
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/README.md +32 -7
- package/dist/cli/configure-tts.d.ts +20 -0
- package/dist/cli/configure-tts.js +142 -0
- package/dist/cli/configure-tts.js.map +1 -0
- package/dist/cli/index.js +35 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/load-env.d.ts +1 -1
- package/dist/cli/load-env.js +13 -5
- package/dist/cli/load-env.js.map +1 -1
- package/dist/core/assets.d.ts +14 -0
- package/dist/core/assets.js +72 -1
- package/dist/core/assets.js.map +1 -1
- package/dist/core/env.js +1 -1
- package/dist/core/env.js.map +1 -1
- package/dist/core/paths.d.ts +1 -0
- package/dist/core/paths.js +3 -0
- package/dist/core/paths.js.map +1 -1
- package/dist/mcp/server.js +12 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/providers/tts/volcengine.d.ts +3 -0
- package/dist/providers/tts/volcengine.js +6 -3
- package/dist/providers/tts/volcengine.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -15,6 +15,9 @@ npx -y video-maker-mcp@latest install --host codex
|
|
|
15
15
|
如果提示缺少 ffmpeg,请按提示安装 ffmpeg,然后重新运行:
|
|
16
16
|
npx -y video-maker-mcp@latest doctor
|
|
17
17
|
|
|
18
|
+
如果提示缺少 TTS 配置,请执行:
|
|
19
|
+
npx -y video-maker-mcp@latest configure-tts
|
|
20
|
+
|
|
18
21
|
最后确认 Codex 能看到 video-maker MCP server。
|
|
19
22
|
```
|
|
20
23
|
|
|
@@ -22,6 +25,8 @@ Manual command:
|
|
|
22
25
|
|
|
23
26
|
```bash
|
|
24
27
|
npx -y video-maker-mcp@latest install --host codex
|
|
28
|
+
npx -y video-maker-mcp@latest configure-tts
|
|
29
|
+
npx -y video-maker-mcp@latest doctor
|
|
25
30
|
```
|
|
26
31
|
|
|
27
32
|
The installer configures Codex with:
|
|
@@ -54,15 +59,26 @@ winget install Gyan.FFmpeg
|
|
|
54
59
|
|
|
55
60
|
## TTS Environment
|
|
56
61
|
|
|
57
|
-
|
|
62
|
+
Narrated video generation requires Doubao/Volcengine TTS credentials before `generate_audio` can work.
|
|
63
|
+
|
|
64
|
+
Recommended setup:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npx -y video-maker-mcp@latest configure-tts
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
The command prompts for the API key locally, does not require pasting the key into an LLM chat, writes the configuration to `~/.video-maker/.env`, and runs a short MP3 smoke test.
|
|
71
|
+
|
|
72
|
+
It writes:
|
|
58
73
|
|
|
59
74
|
```env
|
|
60
75
|
VIDEO_MAKER_TTS_API_KEY=your-api-key
|
|
61
76
|
VIDEO_MAKER_TTS_VOICE_ID=zh_female_vv_uranus_bigtts
|
|
62
77
|
VIDEO_MAKER_TTS_RESOURCE_ID=seed-tts-2.0
|
|
78
|
+
VIDEO_MAKER_TTS_ENDPOINT=https://openspeech.bytedance.com/api/v3/tts/unidirectional
|
|
63
79
|
```
|
|
64
80
|
|
|
65
|
-
For local development, put these values in a project-root `.env` file. The CLI loads `.env`
|
|
81
|
+
For local development, you can also put these values in a project-root `.env` file. The CLI loads the project `.env` first, then fills missing values from `~/.video-maker/.env`. To load another env file, set `VIDEO_MAKER_ENV_FILE=/path/to/file`.
|
|
66
82
|
|
|
67
83
|
The default TTS integration uses the current Doubao/Volcengine V3 HTTP unidirectional API with `X-Api-Key`. This matches the new console API Key page.
|
|
68
84
|
|
|
@@ -71,7 +87,6 @@ Legacy V1 `AppID + Access Token` is still accepted as a fallback when `VIDEO_MAK
|
|
|
71
87
|
Optional:
|
|
72
88
|
|
|
73
89
|
```env
|
|
74
|
-
VIDEO_MAKER_TTS_ENDPOINT=https://openspeech.bytedance.com/api/v3/tts/unidirectional
|
|
75
90
|
VIDEO_MAKER_WORKSPACE=$HOME/.video-maker
|
|
76
91
|
VIDEO_MAKER_EXPORT_DIR=$HOME/Downloads/video-maker
|
|
77
92
|
```
|
|
@@ -106,11 +121,21 @@ The MCP workflow is:
|
|
|
106
121
|
3. `get_video_plan_schema`
|
|
107
122
|
4. `save_video_plan`
|
|
108
123
|
5. `list_required_assets`
|
|
109
|
-
6. Codex generates images into the exact returned paths
|
|
124
|
+
6. Codex generates real host-generated images into the exact returned paths
|
|
110
125
|
7. `verify_assets`
|
|
111
|
-
8. `
|
|
112
|
-
9. `
|
|
113
|
-
10.
|
|
126
|
+
8. Optional: `create_asset_contact_sheet`
|
|
127
|
+
9. `generate_audio`
|
|
128
|
+
10. `render_video`
|
|
129
|
+
11. Optional: `export_video`
|
|
130
|
+
|
|
131
|
+
Important asset contract:
|
|
132
|
+
|
|
133
|
+
- `list_required_assets` returns the only image paths the renderer will use, for example `assets/scene_001.png`.
|
|
134
|
+
- Codex must save the actual generated scene image to each returned `absolutePath`.
|
|
135
|
+
- Do not substitute SVGs, chart screenshots, CSS drawings, preview strips, or manually created placeholder graphics.
|
|
136
|
+
- `verify_assets` rejects missing files, unreadable files, wrong aspect ratios, tiny files, and suspicious placeholder-sized images.
|
|
137
|
+
- `create_asset_contact_sheet` creates `output/asset_contact_sheet.png` from the exact image files that `render_video` will use. Check this if the preview does not match the intended generated images.
|
|
138
|
+
- If you intentionally use very small stylized images, override the size threshold with `VIDEO_MAKER_MIN_ASSET_BYTES`.
|
|
114
139
|
|
|
115
140
|
## Output
|
|
116
141
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ConfigureTtsOptions {
|
|
2
|
+
apiKey?: string;
|
|
3
|
+
voiceId?: string;
|
|
4
|
+
resourceId?: string;
|
|
5
|
+
endpoint?: string;
|
|
6
|
+
envFile?: string;
|
|
7
|
+
skipTest?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ConfigureTtsResult {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
envFile: string;
|
|
12
|
+
wroteKeys: string[];
|
|
13
|
+
test?: {
|
|
14
|
+
ok: boolean;
|
|
15
|
+
outputPath?: string;
|
|
16
|
+
bytes?: number;
|
|
17
|
+
error?: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function configureTts(options?: ConfigureTtsOptions): Promise<ConfigureTtsResult>;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import readline from "node:readline/promises";
|
|
4
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
5
|
+
import { defaultEnvFile, exportDir, resolveUserPath } from "../core/paths.js";
|
|
6
|
+
import { DEFAULT_VOLCENGINE_TTS_ENDPOINT, DEFAULT_VOLCENGINE_TTS_RESOURCE_ID, DEFAULT_VOLCENGINE_TTS_VOICE_ID, synthesizeVolcengineSpeech } from "../providers/tts/volcengine.js";
|
|
7
|
+
const CONFIG_KEYS = [
|
|
8
|
+
"VIDEO_MAKER_TTS_API_KEY",
|
|
9
|
+
"VIDEO_MAKER_TTS_VOICE_ID",
|
|
10
|
+
"VIDEO_MAKER_TTS_RESOURCE_ID",
|
|
11
|
+
"VIDEO_MAKER_TTS_ENDPOINT"
|
|
12
|
+
];
|
|
13
|
+
export async function configureTts(options = {}) {
|
|
14
|
+
const envFile = options.envFile ? resolveUserPath(options.envFile) : defaultEnvFile();
|
|
15
|
+
const apiKey = (options.apiKey ?? await promptHidden("Doubao/Volcengine TTS API Key (hidden): ")).trim();
|
|
16
|
+
if (!apiKey) {
|
|
17
|
+
throw new Error("VIDEO_MAKER_TTS_API_KEY cannot be empty.");
|
|
18
|
+
}
|
|
19
|
+
const voiceId = options.voiceId ?? await promptWithDefault("Voice ID", process.env.VIDEO_MAKER_TTS_VOICE_ID ?? DEFAULT_VOLCENGINE_TTS_VOICE_ID);
|
|
20
|
+
const resourceId = options.resourceId ?? await promptWithDefault("Resource ID", process.env.VIDEO_MAKER_TTS_RESOURCE_ID ?? DEFAULT_VOLCENGINE_TTS_RESOURCE_ID);
|
|
21
|
+
const endpoint = options.endpoint ?? await promptWithDefault("TTS endpoint", process.env.VIDEO_MAKER_TTS_ENDPOINT ?? DEFAULT_VOLCENGINE_TTS_ENDPOINT);
|
|
22
|
+
await upsertEnvFile(envFile, {
|
|
23
|
+
VIDEO_MAKER_TTS_API_KEY: apiKey,
|
|
24
|
+
VIDEO_MAKER_TTS_VOICE_ID: voiceId,
|
|
25
|
+
VIDEO_MAKER_TTS_RESOURCE_ID: resourceId,
|
|
26
|
+
VIDEO_MAKER_TTS_ENDPOINT: endpoint
|
|
27
|
+
});
|
|
28
|
+
process.env.VIDEO_MAKER_TTS_API_KEY = apiKey;
|
|
29
|
+
process.env.VIDEO_MAKER_TTS_VOICE_ID = voiceId;
|
|
30
|
+
process.env.VIDEO_MAKER_TTS_RESOURCE_ID = resourceId;
|
|
31
|
+
process.env.VIDEO_MAKER_TTS_ENDPOINT = endpoint;
|
|
32
|
+
const result = {
|
|
33
|
+
ok: true,
|
|
34
|
+
envFile,
|
|
35
|
+
wroteKeys: CONFIG_KEYS
|
|
36
|
+
};
|
|
37
|
+
if (!options.skipTest) {
|
|
38
|
+
const outputPath = path.join(exportDir(), "doubao-tts-test.mp3");
|
|
39
|
+
try {
|
|
40
|
+
await fs.mkdir(path.dirname(outputPath), { recursive: true });
|
|
41
|
+
const audio = await synthesizeVolcengineSpeech("你好,这是一段 video-maker-mcp 的豆包语音合成本地测试。");
|
|
42
|
+
await fs.writeFile(outputPath, audio);
|
|
43
|
+
result.test = {
|
|
44
|
+
ok: true,
|
|
45
|
+
outputPath,
|
|
46
|
+
bytes: audio.length
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
result.ok = false;
|
|
51
|
+
result.test = {
|
|
52
|
+
ok: false,
|
|
53
|
+
error: error instanceof Error ? error.message : String(error)
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
async function promptWithDefault(label, defaultValue) {
|
|
60
|
+
const answer = await promptVisible(`${label} [${defaultValue}]: `);
|
|
61
|
+
return answer.trim() || defaultValue;
|
|
62
|
+
}
|
|
63
|
+
async function promptVisible(question) {
|
|
64
|
+
const rl = readline.createInterface({ input, output });
|
|
65
|
+
try {
|
|
66
|
+
return await rl.question(question);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
rl.close();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function promptHidden(question) {
|
|
73
|
+
if (!input.isTTY || !output.isTTY) {
|
|
74
|
+
return promptVisible(question);
|
|
75
|
+
}
|
|
76
|
+
return new Promise((resolve, reject) => {
|
|
77
|
+
let value = "";
|
|
78
|
+
const onData = (buffer) => {
|
|
79
|
+
const char = buffer.toString("utf8");
|
|
80
|
+
if (char === "\u0003") {
|
|
81
|
+
cleanup();
|
|
82
|
+
reject(new Error("Canceled."));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (char === "\r" || char === "\n") {
|
|
86
|
+
cleanup();
|
|
87
|
+
output.write("\n");
|
|
88
|
+
resolve(value);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (char === "\u007f" || char === "\b") {
|
|
92
|
+
value = value.slice(0, -1);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
value += char;
|
|
96
|
+
};
|
|
97
|
+
const cleanup = () => {
|
|
98
|
+
input.off("data", onData);
|
|
99
|
+
input.setRawMode(false);
|
|
100
|
+
input.pause();
|
|
101
|
+
};
|
|
102
|
+
output.write(question);
|
|
103
|
+
input.setRawMode(true);
|
|
104
|
+
input.resume();
|
|
105
|
+
input.on("data", onData);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async function upsertEnvFile(envFile, values) {
|
|
109
|
+
await fs.mkdir(path.dirname(envFile), { recursive: true });
|
|
110
|
+
let existing = "";
|
|
111
|
+
try {
|
|
112
|
+
existing = await fs.readFile(envFile, "utf8");
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (error.code !== "ENOENT")
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
const seen = new Set();
|
|
119
|
+
const lines = existing.length > 0 ? existing.split(/\r?\n/) : [];
|
|
120
|
+
const nextLines = lines.map((line) => {
|
|
121
|
+
const match = /^([A-Za-z_][A-Za-z0-9_]*)\s*=/.exec(line);
|
|
122
|
+
if (!match)
|
|
123
|
+
return line;
|
|
124
|
+
const key = match[1];
|
|
125
|
+
if (!(key in values))
|
|
126
|
+
return line;
|
|
127
|
+
seen.add(key);
|
|
128
|
+
return `${key}=${formatEnvValue(values[key])}`;
|
|
129
|
+
});
|
|
130
|
+
for (const [key, value] of Object.entries(values)) {
|
|
131
|
+
if (!seen.has(key)) {
|
|
132
|
+
nextLines.push(`${key}=${formatEnvValue(value)}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const content = `${nextLines.filter((line, index, all) => line.length > 0 || index < all.length - 1).join("\n")}\n`;
|
|
136
|
+
await fs.writeFile(envFile, content, { mode: 0o600 });
|
|
137
|
+
await fs.chmod(envFile, 0o600).catch(() => undefined);
|
|
138
|
+
}
|
|
139
|
+
function formatEnvValue(value) {
|
|
140
|
+
return JSON.stringify(value);
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=configure-tts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure-tts.js","sourceRoot":"","sources":["../../src/cli/configure-tts.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { Command } from "commander";
|
|
2
|
+
import { Command, Option } from "commander";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
3
4
|
import fs from "node:fs/promises";
|
|
4
5
|
import path from "node:path";
|
|
5
6
|
import { serveMcp } from "../mcp/server.js";
|
|
@@ -7,8 +8,18 @@ import { installCodex, runDoctor } from "./install.js";
|
|
|
7
8
|
import { synthesizeVolcengineSpeech } from "../providers/tts/volcengine.js";
|
|
8
9
|
import { loadCliEnv } from "./load-env.js";
|
|
9
10
|
import { DEFAULT_EXPORT_DIR, resolveUserPath } from "../core/paths.js";
|
|
11
|
+
import { configureTts } from "./configure-tts.js";
|
|
10
12
|
loadCliEnv();
|
|
11
13
|
const program = new Command();
|
|
14
|
+
function readPackageVersion() {
|
|
15
|
+
try {
|
|
16
|
+
const packageJson = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8"));
|
|
17
|
+
return packageJson.version ?? "0.0.0";
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return "0.0.0";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
12
23
|
function defaultTtsTestPath() {
|
|
13
24
|
return path.join(DEFAULT_EXPORT_DIR, "doubao-tts-test.mp3");
|
|
14
25
|
}
|
|
@@ -24,7 +35,7 @@ async function resolveOutputPath(output) {
|
|
|
24
35
|
program
|
|
25
36
|
.name("video-maker-mcp")
|
|
26
37
|
.description("Local MCP storyboard video renderer for Codex.")
|
|
27
|
-
.version(
|
|
38
|
+
.version(readPackageVersion());
|
|
28
39
|
program
|
|
29
40
|
.command("serve")
|
|
30
41
|
.description("Start the stdio MCP server.")
|
|
@@ -56,6 +67,28 @@ program
|
|
|
56
67
|
if (!result.ok)
|
|
57
68
|
process.exitCode = 1;
|
|
58
69
|
});
|
|
70
|
+
program
|
|
71
|
+
.command("configure-tts")
|
|
72
|
+
.description("Configure Doubao/Volcengine TTS credentials in the local video-maker env file.")
|
|
73
|
+
.option("--voice-id <id>", "Voice ID", undefined)
|
|
74
|
+
.option("--resource-id <id>", "Resource ID", undefined)
|
|
75
|
+
.option("--endpoint <url>", "TTS endpoint", undefined)
|
|
76
|
+
.option("--config-file <path>", "Env file to write; defaults to ~/.video-maker/.env")
|
|
77
|
+
.option("--skip-test", "Only write configuration; do not synthesize a test MP3.")
|
|
78
|
+
.addOption(new Option("--api-key <key>", "TTS API key").hideHelp())
|
|
79
|
+
.action(async (opts) => {
|
|
80
|
+
const result = await configureTts({
|
|
81
|
+
apiKey: opts.apiKey,
|
|
82
|
+
voiceId: opts.voiceId,
|
|
83
|
+
resourceId: opts.resourceId,
|
|
84
|
+
endpoint: opts.endpoint,
|
|
85
|
+
envFile: opts.configFile,
|
|
86
|
+
skipTest: opts.skipTest
|
|
87
|
+
});
|
|
88
|
+
console.log(JSON.stringify(result, null, 2));
|
|
89
|
+
if (!result.ok)
|
|
90
|
+
process.exitCode = 1;
|
|
91
|
+
});
|
|
59
92
|
program
|
|
60
93
|
.command("tts-test")
|
|
61
94
|
.description("Generate a short MP3 with the configured Doubao/Volcengine TTS credentials.")
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/load-env.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function loadCliEnv(): string
|
|
1
|
+
export declare function loadCliEnv(): string[];
|
package/dist/cli/load-env.js
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import dotenv from "dotenv";
|
|
4
|
+
import { defaultEnvFile } from "../core/paths.js";
|
|
4
5
|
export function loadCliEnv() {
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
const explicitEnvFile = process.env.VIDEO_MAKER_ENV_FILE;
|
|
7
|
+
const candidates = explicitEnvFile
|
|
8
|
+
? [explicitEnvFile]
|
|
9
|
+
: [path.join(process.cwd(), ".env"), defaultEnvFile()];
|
|
10
|
+
const loaded = [];
|
|
11
|
+
for (const envFile of candidates) {
|
|
12
|
+
if (!fs.existsSync(envFile))
|
|
13
|
+
continue;
|
|
14
|
+
dotenv.config({ path: envFile, quiet: true });
|
|
15
|
+
loaded.push(envFile);
|
|
16
|
+
}
|
|
17
|
+
return loaded;
|
|
10
18
|
}
|
|
11
19
|
//# sourceMappingURL=load-env.js.map
|
package/dist/cli/load-env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../src/cli/load-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../src/cli/load-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,UAAU,UAAU;IACxB,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACzD,MAAM,UAAU,GAAG,eAAe;QAChC,CAAC,CAAC,CAAC,eAAe,CAAC;QACnB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/core/assets.d.ts
CHANGED
|
@@ -4,6 +4,13 @@ export interface RequiredAsset {
|
|
|
4
4
|
absolutePath: string;
|
|
5
5
|
prompt: string;
|
|
6
6
|
durationSec: number;
|
|
7
|
+
requirements: {
|
|
8
|
+
minWidth: number;
|
|
9
|
+
minHeight: number;
|
|
10
|
+
aspectRatio: "9:16";
|
|
11
|
+
minBytes: number;
|
|
12
|
+
note: string;
|
|
13
|
+
};
|
|
7
14
|
}
|
|
8
15
|
export interface AssetIssue {
|
|
9
16
|
sceneId: string;
|
|
@@ -19,10 +26,17 @@ export interface VerifiedAsset {
|
|
|
19
26
|
ok: true;
|
|
20
27
|
width: number;
|
|
21
28
|
height: number;
|
|
29
|
+
bytes: number;
|
|
22
30
|
format?: string;
|
|
23
31
|
}
|
|
32
|
+
export interface AssetContactSheetResult {
|
|
33
|
+
projectId: string;
|
|
34
|
+
contactSheetPath: string;
|
|
35
|
+
absolutePath: string;
|
|
36
|
+
}
|
|
24
37
|
export declare function listRequiredAssets(projectId: string): Promise<RequiredAsset[]>;
|
|
25
38
|
export declare function verifyAssets(projectId: string): Promise<{
|
|
26
39
|
ok: boolean;
|
|
27
40
|
assets: Array<VerifiedAsset | AssetIssue>;
|
|
28
41
|
}>;
|
|
42
|
+
export declare function createAssetContactSheet(projectId: string): Promise<AssetContactSheetResult>;
|
package/dist/core/assets.js
CHANGED
|
@@ -2,6 +2,18 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import sharp from "sharp";
|
|
3
3
|
import { readVideoPlan, markStatus } from "./project.js";
|
|
4
4
|
import { toProjectPath } from "./paths.js";
|
|
5
|
+
const DEFAULT_MIN_ASSET_BYTES = 150 * 1024;
|
|
6
|
+
const MIN_ASSET_WIDTH = 720;
|
|
7
|
+
const MIN_ASSET_HEIGHT = 1280;
|
|
8
|
+
const TARGET_ASPECT_RATIO = 9 / 16;
|
|
9
|
+
const ASPECT_RATIO_TOLERANCE = 0.04;
|
|
10
|
+
function minAssetBytes() {
|
|
11
|
+
const raw = process.env.VIDEO_MAKER_MIN_ASSET_BYTES;
|
|
12
|
+
if (!raw)
|
|
13
|
+
return DEFAULT_MIN_ASSET_BYTES;
|
|
14
|
+
const parsed = Number(raw);
|
|
15
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_MIN_ASSET_BYTES;
|
|
16
|
+
}
|
|
5
17
|
export async function listRequiredAssets(projectId) {
|
|
6
18
|
const plan = await readVideoPlan(projectId);
|
|
7
19
|
return plan.scenes.map((scene) => ({
|
|
@@ -9,7 +21,14 @@ export async function listRequiredAssets(projectId) {
|
|
|
9
21
|
assetPath: scene.assetPath,
|
|
10
22
|
absolutePath: toProjectPath(projectId, scene.assetPath),
|
|
11
23
|
prompt: scene.visualPrompt,
|
|
12
|
-
durationSec: scene.durationSec
|
|
24
|
+
durationSec: scene.durationSec,
|
|
25
|
+
requirements: {
|
|
26
|
+
minWidth: MIN_ASSET_WIDTH,
|
|
27
|
+
minHeight: MIN_ASSET_HEIGHT,
|
|
28
|
+
aspectRatio: "9:16",
|
|
29
|
+
minBytes: minAssetBytes(),
|
|
30
|
+
note: "Use a real host-generated image saved exactly to this path. Do not create placeholder SVGs, charts, CSS screenshots, preview strips, or manually drawn fallback graphics."
|
|
31
|
+
}
|
|
13
32
|
}));
|
|
14
33
|
}
|
|
15
34
|
export async function verifyAssets(projectId) {
|
|
@@ -17,10 +36,22 @@ export async function verifyAssets(projectId) {
|
|
|
17
36
|
const assets = await Promise.all(required.map(async (asset) => {
|
|
18
37
|
try {
|
|
19
38
|
await fs.access(asset.absolutePath);
|
|
39
|
+
const stat = await fs.stat(asset.absolutePath);
|
|
20
40
|
const metadata = await sharp(asset.absolutePath).metadata();
|
|
21
41
|
if (!metadata.width || !metadata.height) {
|
|
22
42
|
throw new Error("Image dimensions could not be read");
|
|
23
43
|
}
|
|
44
|
+
if (metadata.width < MIN_ASSET_WIDTH || metadata.height < MIN_ASSET_HEIGHT) {
|
|
45
|
+
throw new Error(`Image is too small: ${metadata.width}x${metadata.height}; expected at least ${MIN_ASSET_WIDTH}x${MIN_ASSET_HEIGHT}`);
|
|
46
|
+
}
|
|
47
|
+
const aspectRatio = metadata.width / metadata.height;
|
|
48
|
+
if (Math.abs(aspectRatio - TARGET_ASPECT_RATIO) > ASPECT_RATIO_TOLERANCE) {
|
|
49
|
+
throw new Error(`Image aspect ratio is ${metadata.width}:${metadata.height}; expected 9:16 vertical imagery`);
|
|
50
|
+
}
|
|
51
|
+
const minimumBytes = minAssetBytes();
|
|
52
|
+
if (stat.size < minimumBytes) {
|
|
53
|
+
throw new Error(`Image file is suspiciously small: ${stat.size} bytes; expected at least ${minimumBytes} bytes. This often means a placeholder graphic was saved instead of a host-generated image.`);
|
|
54
|
+
}
|
|
24
55
|
return {
|
|
25
56
|
sceneId: asset.sceneId,
|
|
26
57
|
assetPath: asset.assetPath,
|
|
@@ -28,6 +59,7 @@ export async function verifyAssets(projectId) {
|
|
|
28
59
|
ok: true,
|
|
29
60
|
width: metadata.width,
|
|
30
61
|
height: metadata.height,
|
|
62
|
+
bytes: stat.size,
|
|
31
63
|
format: metadata.format
|
|
32
64
|
};
|
|
33
65
|
}
|
|
@@ -47,4 +79,43 @@ export async function verifyAssets(projectId) {
|
|
|
47
79
|
}
|
|
48
80
|
return { ok, assets };
|
|
49
81
|
}
|
|
82
|
+
export async function createAssetContactSheet(projectId) {
|
|
83
|
+
const required = await listRequiredAssets(projectId);
|
|
84
|
+
if (required.length === 0) {
|
|
85
|
+
throw new Error("Project has no required assets.");
|
|
86
|
+
}
|
|
87
|
+
const thumbWidth = 216;
|
|
88
|
+
const thumbHeight = 384;
|
|
89
|
+
const gap = 12;
|
|
90
|
+
const outputPath = "output/asset_contact_sheet.png";
|
|
91
|
+
const absolutePath = toProjectPath(projectId, outputPath);
|
|
92
|
+
const composites = await Promise.all(required.map(async (asset, index) => {
|
|
93
|
+
const buffer = await sharp(asset.absolutePath)
|
|
94
|
+
.resize(thumbWidth, thumbHeight, { fit: "cover", position: "center" })
|
|
95
|
+
.png()
|
|
96
|
+
.toBuffer();
|
|
97
|
+
return {
|
|
98
|
+
input: buffer,
|
|
99
|
+
left: index * (thumbWidth + gap),
|
|
100
|
+
top: 0
|
|
101
|
+
};
|
|
102
|
+
}));
|
|
103
|
+
await fs.mkdir(toProjectPath(projectId, "output"), { recursive: true });
|
|
104
|
+
await sharp({
|
|
105
|
+
create: {
|
|
106
|
+
width: required.length * thumbWidth + (required.length - 1) * gap,
|
|
107
|
+
height: thumbHeight,
|
|
108
|
+
channels: 4,
|
|
109
|
+
background: "#111111"
|
|
110
|
+
}
|
|
111
|
+
})
|
|
112
|
+
.composite(composites)
|
|
113
|
+
.png()
|
|
114
|
+
.toFile(absolutePath);
|
|
115
|
+
return {
|
|
116
|
+
projectId,
|
|
117
|
+
contactSheetPath: outputPath,
|
|
118
|
+
absolutePath
|
|
119
|
+
};
|
|
120
|
+
}
|
|
50
121
|
//# sourceMappingURL=assets.js.map
|
package/dist/core/assets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/core/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/core/assets.ts"],"names":[],"mappings":"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"}
|
package/dist/core/env.js
CHANGED
|
@@ -64,7 +64,7 @@ export async function checkEnvironment() {
|
|
|
64
64
|
nextActions.push("Install Codex CLI before using the Codex installer integration.");
|
|
65
65
|
}
|
|
66
66
|
if (missingEnv.length > 0) {
|
|
67
|
-
nextActions.push(`
|
|
67
|
+
nextActions.push(`Configure TTS credentials: npx -y video-maker-mcp@latest configure-tts (missing: ${missingEnv.join(", ")})`);
|
|
68
68
|
}
|
|
69
69
|
if (nodeMajor < 20) {
|
|
70
70
|
nextActions.push("Install Node.js 20 or newer.");
|
package/dist/core/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"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"}
|
package/dist/core/paths.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export declare const DEFAULT_WORKSPACE_DIR: string;
|
|
|
2
2
|
export declare const DEFAULT_EXPORT_DIR: string;
|
|
3
3
|
export declare const PROJECTS_DIR = "projects";
|
|
4
4
|
export declare function workspaceDir(): string;
|
|
5
|
+
export declare function defaultEnvFile(): string;
|
|
5
6
|
export declare function exportDir(): string;
|
|
6
7
|
export declare function resolveUserPath(input: string): string;
|
|
7
8
|
export declare function projectsDir(): string;
|
package/dist/core/paths.js
CHANGED
|
@@ -6,6 +6,9 @@ export const PROJECTS_DIR = "projects";
|
|
|
6
6
|
export function workspaceDir() {
|
|
7
7
|
return process.env.VIDEO_MAKER_WORKSPACE ?? DEFAULT_WORKSPACE_DIR;
|
|
8
8
|
}
|
|
9
|
+
export function defaultEnvFile() {
|
|
10
|
+
return path.join(workspaceDir(), ".env");
|
|
11
|
+
}
|
|
9
12
|
export function exportDir() {
|
|
10
13
|
return process.env.VIDEO_MAKER_EXPORT_DIR ? resolveUserPath(process.env.VIDEO_MAKER_EXPORT_DIR) : DEFAULT_EXPORT_DIR;
|
|
11
14
|
}
|
package/dist/core/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -2,7 +2,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
3
|
import * as z from "zod/v4";
|
|
4
4
|
import { checkEnvironment } from "../core/env.js";
|
|
5
|
-
import { listRequiredAssets, verifyAssets } from "../core/assets.js";
|
|
5
|
+
import { createAssetContactSheet, listRequiredAssets, verifyAssets } from "../core/assets.js";
|
|
6
6
|
import { createVideoProject, saveVideoPlan } from "../core/project.js";
|
|
7
7
|
import { videoPlanJsonSchema } from "../core/plan-schema.js";
|
|
8
8
|
import { generateProjectAudio } from "../providers/tts/volcengine.js";
|
|
@@ -10,11 +10,11 @@ import { renderProjectVideo } from "../core/render.js";
|
|
|
10
10
|
import { exportProjectVideo } from "../core/export.js";
|
|
11
11
|
const SERVER_INSTRUCTIONS = [
|
|
12
12
|
"video-maker-mcp turns Codex-authored storyboards into local vertical MP4 videos.",
|
|
13
|
-
"Workflow: call create_video_project, get_video_plan_schema, save_video_plan, list_required_assets, generate every scene image with Codex image generation into the exact assetPath, verify_assets, generate_audio, then render_video.",
|
|
14
|
-
"The server does not generate images. Codex must
|
|
13
|
+
"Workflow: call create_video_project, get_video_plan_schema, save_video_plan, list_required_assets, generate every scene image with Codex image generation into the exact assetPath, verify_assets, optionally create_asset_contact_sheet for visual confirmation, generate_audio, then render_video.",
|
|
14
|
+
"The server does not generate images. Codex must use host image generation and save those generated images locally at the requested project asset paths. Do not substitute SVGs, charts, screenshots, CSS drawings, preview strips, or manually created placeholder graphics.",
|
|
15
15
|
"Videos are 9:16, 1080x1920, zh-CN subtitles, one image per scene, 30-90 seconds total.",
|
|
16
16
|
"Rendered project files stay in ~/.video-maker. If the user wants an easy-to-find copy, pass outputDir to render_video or call export_video; default export location is ~/Downloads/video-maker/<projectId>.",
|
|
17
|
-
"Run check_environment first when setup is uncertain."
|
|
17
|
+
"Run check_environment first when setup is uncertain. If TTS credentials are missing, tell the user to run: npx -y video-maker-mcp@latest configure-tts."
|
|
18
18
|
].join("\n");
|
|
19
19
|
function result(structuredContent) {
|
|
20
20
|
return {
|
|
@@ -76,7 +76,7 @@ export function createMcpServer() {
|
|
|
76
76
|
}, async ({ projectId }) => result({
|
|
77
77
|
projectId,
|
|
78
78
|
assets: await listRequiredAssets(projectId),
|
|
79
|
-
instruction: "Generate one image for each prompt and save it exactly to absolutePath before calling verify_assets."
|
|
79
|
+
instruction: "Generate one real image for each prompt with host image generation and save it exactly to absolutePath before calling verify_assets. Do not create placeholder charts, SVGs, screenshots, CSS drawings, preview strips, or any fallback graphic."
|
|
80
80
|
}));
|
|
81
81
|
server.registerTool("verify_assets", {
|
|
82
82
|
title: "Verify scene assets",
|
|
@@ -88,6 +88,13 @@ export function createMcpServer() {
|
|
|
88
88
|
projectId,
|
|
89
89
|
...(await verifyAssets(projectId))
|
|
90
90
|
}));
|
|
91
|
+
server.registerTool("create_asset_contact_sheet", {
|
|
92
|
+
title: "Create actual asset contact sheet",
|
|
93
|
+
description: "Creates a PNG contact sheet from the exact scene image files that render_video will use, so the host can visually confirm the real renderer inputs.",
|
|
94
|
+
inputSchema: {
|
|
95
|
+
projectId: z.string().min(1)
|
|
96
|
+
}
|
|
97
|
+
}, async ({ projectId }) => result(await createAssetContactSheet(projectId)));
|
|
91
98
|
server.registerTool("generate_audio", {
|
|
92
99
|
title: "Generate narration audio",
|
|
93
100
|
description: "Generates narration audio with Volcengine/Doubao TTS from the saved video plan.",
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,9 @@ export interface VolcengineTtsConfig {
|
|
|
9
9
|
endpoint: string;
|
|
10
10
|
protocol: "v3" | "v1";
|
|
11
11
|
}
|
|
12
|
+
export declare const DEFAULT_VOLCENGINE_TTS_VOICE_ID = "zh_female_vv_uranus_bigtts";
|
|
13
|
+
export declare const DEFAULT_VOLCENGINE_TTS_RESOURCE_ID = "seed-tts-2.0";
|
|
14
|
+
export declare const DEFAULT_VOLCENGINE_TTS_ENDPOINT = "https://openspeech.bytedance.com/api/v3/tts/unidirectional";
|
|
12
15
|
export interface TtsResult {
|
|
13
16
|
audioPath: string;
|
|
14
17
|
absolutePath: string;
|
|
@@ -2,6 +2,9 @@ import crypto from "node:crypto";
|
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import { markStatus, readVideoPlan } from "../../core/project.js";
|
|
4
4
|
import { toProjectPath } from "../../core/paths.js";
|
|
5
|
+
export const DEFAULT_VOLCENGINE_TTS_VOICE_ID = "zh_female_vv_uranus_bigtts";
|
|
6
|
+
export const DEFAULT_VOLCENGINE_TTS_RESOURCE_ID = "seed-tts-2.0";
|
|
7
|
+
export const DEFAULT_VOLCENGINE_TTS_ENDPOINT = "https://openspeech.bytedance.com/api/v3/tts/unidirectional";
|
|
5
8
|
export function volcengineConfigFromEnv(env = process.env) {
|
|
6
9
|
const apiKey = env.VIDEO_MAKER_TTS_API_KEY;
|
|
7
10
|
const appId = env.VIDEO_MAKER_TTS_APP_ID;
|
|
@@ -14,8 +17,8 @@ export function volcengineConfigFromEnv(env = process.env) {
|
|
|
14
17
|
return {
|
|
15
18
|
apiKey,
|
|
16
19
|
voiceId,
|
|
17
|
-
resourceId: env.VIDEO_MAKER_TTS_RESOURCE_ID ??
|
|
18
|
-
endpoint: env.VIDEO_MAKER_TTS_ENDPOINT ??
|
|
20
|
+
resourceId: env.VIDEO_MAKER_TTS_RESOURCE_ID ?? DEFAULT_VOLCENGINE_TTS_RESOURCE_ID,
|
|
21
|
+
endpoint: env.VIDEO_MAKER_TTS_ENDPOINT ?? DEFAULT_VOLCENGINE_TTS_ENDPOINT,
|
|
19
22
|
protocol: "v3"
|
|
20
23
|
};
|
|
21
24
|
}
|
|
@@ -34,7 +37,7 @@ export function volcengineConfigFromEnv(env = process.env) {
|
|
|
34
37
|
appToken: env.VIDEO_MAKER_TTS_APP_TOKEN ?? "access_token",
|
|
35
38
|
voiceId,
|
|
36
39
|
cluster: env.VIDEO_MAKER_TTS_CLUSTER ?? "volcano_tts",
|
|
37
|
-
resourceId: env.VIDEO_MAKER_TTS_RESOURCE_ID ??
|
|
40
|
+
resourceId: env.VIDEO_MAKER_TTS_RESOURCE_ID ?? DEFAULT_VOLCENGINE_TTS_RESOURCE_ID,
|
|
38
41
|
endpoint: env.VIDEO_MAKER_TTS_ENDPOINT ?? "https://openspeech.bytedance.com/api/v1/tts",
|
|
39
42
|
protocol: "v1"
|
|
40
43
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"volcengine.js","sourceRoot":"","sources":["../../../src/providers/tts/volcengine.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"volcengine.js","sourceRoot":"","sources":["../../../src/providers/tts/volcengine.ts"],"names":[],"mappings":"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"}
|