cang-ying/video-ai-system/tools/run_storyboard.js
鉴影 ICE-GL-CA001 8c164dd6f7 D181 · 耳耳蛋全天经验归档 · 深海迷航EP01①~⑩完成+m01+m02视频
铁律:
- ④重写为白名单/黑名单机制 (今日4次违规)
- ⑤新增 BREAKDOWN回验协议
- ⑥新增 管线不容跳步

核心经验:
- 图片+视频混合管线路线验证
- ENV底板法 (i2i→i2v)
- 提示词工程: 工业术语+禁人称词+负面约束
- CHAR真人检测绕过 (blur公式)
- FFmpeg xfade拼接方法
- Seedance 2.0 参数 (9:16, 4-15s)

新增文件:
- eererdan/experience/EED-EXPER-001~010
- protocols/BREAKDOWN-VERIFY.hdlp
- deep-sea-voyage/STORYBOARD-EP01.hdlp (Pro版26→10镜)
- deep-sea-voyage/PROMPTS-EP01.hdlp
- deep-sea-voyage/DIRECTOR-ENCODING-EP01.hdlp
- tools/jimeng3-gen.js, run_storyboard.js, run_prompts.js, run_adapt.js, run_gen.js, crop_watermark.py
- lib/seedream.py (支持 Seedream 3/4/5)
- outputs/ENV-*-v5, PROP-* (6张定稿资产)
- outputs/videos/M01-v2.mp4, M02.mp4

下次继续: M03~M10 (9:16竖屏)
2026-07-10 21:18:49 +08:00

72 lines
2.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 步骤⑦ storyboard: doubao lite 模型拆解剧本
const https = require('https');
const fs = require('fs');
const path = require('path');
const ENV_PATH = path.join(__dirname, '..', '..', '.env');
const ARK_KEY = fs.readFileSync(ENV_PATH, 'utf-8').match(/ARK_API_KEY=(.+)/)[1].trim();
const SCRIPT_PATH = path.join(__dirname, '..', 'projects', 'deep-sea-voyage', 'EP01-SCRIPT-LOCK.hdlp');
const script = fs.readFileSync(SCRIPT_PATH, 'utf-8');
const prompt = `请将以下短剧剧本第1集拆解为结构化分镜严格输出JSON格式。
要求:
- 按镜头拆分,每个镜头对应一个动作/反应/信息增量
- 每镜包含shot_number(S01-SXX), description(中文50字内), camera(特写/近景/中景/全景/POV), duration(秒), type(establishing/action/reaction/closeup/transition), characters(角色列表), scenes(场景列表), props(道具列表)
输出示例:
{"episode":1,"shots":[{"shot_number":"S01","description":"画面漆黑,警报声滴滴","camera":"POV","duration":3,"type":"establishing","characters":[],"scenes":["船员宿舍"],"props":[],"dialogue":"滴滴滴滴..."}]}
剧本:
${script}`;
const payload = JSON.stringify({
model: 'doubao-seed-2-0-lite-260215',
messages: [
{ role: 'user', content: prompt }
],
temperature: 0.2,
max_tokens: 4096
});
const options = {
hostname: 'ark.cn-beijing.volces.com',
path: '/api/v3/chat/completions',
method: 'POST',
headers: {
'Authorization': 'Bearer ' + ARK_KEY,
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(payload, 'utf-8')
}
};
console.log('豆包 lite 拆解剧本...');
const t0 = Date.now();
const req = https.request(options, (res) => {
let body = '';
res.on('data', (chunk) => { body += chunk; });
res.on('end', () => {
var elapsed = ((Date.now() - t0) / 1000).toFixed(1);
console.log('elapsed: ' + elapsed + 's');
try {
const data = JSON.parse(body);
if (data.error) { console.error('ERROR:', data.error); process.exit(1); }
const content = data.choices?.[0]?.message?.content || '';
console.log('tokens:', JSON.stringify(data.usage));
let json = content;
const m = json.match(/```(?:json)?\s*([\s\S]*?)```/);
if (m) json = m[1].trim();
const outPath = path.join(__dirname, '..', 'projects', 'deep-sea-voyage', 'STORYBOARD-AI.json');
fs.writeFileSync(outPath, json, 'utf-8');
console.log('SAVED:', outPath);
console.log('---\n' + json);
} catch(e) { console.error(e.message); }
});
});
req.on('error', (e) => console.error(e.message));
req.write(payload);
req.end();