feat: MiniMax TTS集成、口播批量剪辑流水线、执黑先行二号账号

- 新增 minimax-tts.js 和 minimax-voice-clone.js 脚本
- 新增口播批量剪辑流水线 (口播_assemble.js, 口播_pipeline.js)
- 更新 video-from-script 各阶段脚本 (kling, images, tts, videos)
- 新增执黑先行二号-风格延伸账号
- 更新执黑先行 account.json 配置
- 替换 ugc_product_seeding 参考图
- 更新 CLAUDE.md 和依赖配置

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
lc
2026-05-24 20:05:56 +08:00
parent 817c181cb5
commit 1e110219ff
31 changed files with 5098 additions and 34 deletions

View File

@@ -87,7 +87,8 @@ async function phaseTts(manifest, manifestPath, options = {}) {
const audioDir = path.join(dir, 'audio')
ensureDir(audioDir)
const { synthesize } = require('../qwen-tts')
const engine = manifest.ttsEngine || 'qwen'
const { synthesize } = engine === 'minimax' ? require('../minimax-tts') : require('../qwen-tts')
const videoDur = manifest.estimatedVideoDuration || 6
const ttsRate = manifest.ttsRate || 1.15
@@ -95,7 +96,22 @@ async function phaseTts(manifest, manifestPath, options = {}) {
const items = manifest.items.filter(it =>
(it.script || it.text) && !it.audio
)
if (items.length === 0) { log('tts', '无待处理 item已合成跳过'); return }
if (items.length === 0) {
const total = manifest.items.length
const withAudio = manifest.items.filter(it => it.audio).length
const withScript = manifest.items.filter(it => it.script || it.text).length
if (withAudio === 0) {
console.error("\n" + "=".repeat(60))
console.error("❌ [tts] 严重错误:没有任何待处理的配音项,且 manifest 中也没有已生成的音频!")
console.error("=".repeat(60))
console.error(` 总数: ${total} | 有script: ${withScript} | 已有audio: ${withAudio}`)
if (withScript === 0) console.error(" 根因: 所有 item 都缺少 script 文本 — 分镜文件有问题")
console.error("=".repeat(60) + "\n")
throw new Error(`TTS 阶段中断: ${total} 个 item 均无音频且无待处理项 (script=${withScript}/${total})`)
}
log('tts', '所有音频已合成,跳过')
return
}
log('tts', `${items.length} 段, 视频固定时长=${videoDur}s, TTS语速=${ttsRate}x`)
@@ -131,6 +147,9 @@ async function phaseTts(manifest, manifestPath, options = {}) {
model: manifest.ttsModel || undefined,
instruction: manifest.ttsInstruction || undefined,
rate: ttsRate,
emotion: manifest.ttsEmotion || undefined,
languageBoost: manifest.ttsLanguageBoost || undefined,
pitch: manifest.ttsPitch ?? undefined,
})
break
} catch (e) {