From be9e776b10022a2a7846782ef2bc2a627435df66 Mon Sep 17 00:00:00 2001 From: jiam <> Date: Wed, 8 Jul 2026 02:05:21 +0800 Subject: [PATCH] Add AI clip quick scenarios --- apps/web/src/workbench/WorkbenchShell.tsx | 183 ++++++++++++++++++++-- 1 file changed, 172 insertions(+), 11 deletions(-) diff --git a/apps/web/src/workbench/WorkbenchShell.tsx b/apps/web/src/workbench/WorkbenchShell.tsx index 575cf83..5081c47 100644 --- a/apps/web/src/workbench/WorkbenchShell.tsx +++ b/apps/web/src/workbench/WorkbenchShell.tsx @@ -39,6 +39,7 @@ import { Camera, CheckCircle2, ChevronRight, + Clapperboard, CircleDashed, ClipboardList, Compass, @@ -64,7 +65,9 @@ import { Mic2, Minus, MoreHorizontal, + Music4, Music2, + Newspaper, Moon, Plus, Play, @@ -91,6 +94,7 @@ import { UserRound, Video, Volume2, + AudioWaveform, Workflow, X, } from 'lucide-react'; @@ -11672,6 +11676,10 @@ function FunClipEditingPageContent({ | 'talking-head-clean' | 'broll-brief' | 'montage-mix' + | 'news-overview' + | 'explainer-remake' + | 'rhythm-cut' + | 'voice-remake' | 'script-to-video' | 'batch-factory'; type ClipOutputOptionId = @@ -12603,6 +12611,150 @@ function FunClipEditingPageContent({ publishReadyEnabled: true, }, }, + { + id: 'news-overview', + group: '剪辑', + title: '新闻概览', + description: '把发布会、访谈或行业长视频整理成口语化概览短片。', + icon: , + presetId: 'highlight', + planType: 'capability', + sceneId: 'ip-matrix', + polishId: 'founder', + prompt: + '把这段长视频做成一条新闻概览短片:先转写并提取人物、事件、关键术语和结论,再生成 250 字以内的口语化解说脚本、镜头顺序、字幕、封面标题和发布文案。事实和专有名词必须准确,不确定的内容标记为待确认。', + businessParams: + '场景:科技新闻/产品发布/行业资讯/活动复盘\n目标:一条概览短片 + 可校对事实清单\n要求:口语化、信息准确、不要编造', + output: '概览脚本 / 镜头顺序 / 字幕标题 / 发布文案', + tags: ['概览', '新闻', '事实校对'], + sourceMode: 'primary-with-references', + sourceHint: '选择 1 个主视频,可追加产品图、截图或品牌素材作为参考。', + acceptedSourceTypes: ['video', 'image', 'audio'], + minSources: 1, + maxSources: 12, + outputOptionIds: ['subtitle', 'title', 'publishCopy', 'context', 'timeline'], + options: { + clipCount: 1, + durationRange: '60-180', + intensity: 'standard', + platform: 'bilibili', + keepContext: true, + speakerEnabled: false, + subtitleEnabled: true, + batchEnabled: false, + crossSegmentEnabled: true, + titleSummaryEnabled: true, + publishReadyEnabled: true, + }, + }, + { + id: 'explainer-remake', + group: '重制', + title: '解说重制', + description: '把文案、课程或长视频改造成解说视频分镜。', + icon: , + presetId: 'custom', + planType: 'capability', + sceneId: 'none', + polishId: 'none', + prompt: + '根据我的素材和目标生成解说视频方案:改写成自然口播脚本,拆分分镜,匹配主视频片段和参考图片/视频,补充需要 AI 图片或 AI 视频生成的 B-roll 提示词,并给出字幕、配音、封面和发布文案。', + businessParams: + '场景:产品解说/课程复盘/公众号转视频/知识短片\n素材:可使用主视频、图片、参考视频和脚本\n目标:先生成可编辑分镜和时间线', + output: '解说脚本 / 分镜表 / B-roll 提示词 / 时间线', + tags: ['解说', '分镜', 'B-roll'], + sourceMode: 'script-to-video', + sourceHint: '可只写文案,也可多选图片、视频和音频作为画面素材。', + acceptedSourceTypes: ['video', 'image', 'audio'], + minSources: 0, + maxSources: 30, + outputOptionIds: ['subtitle', 'title', 'publishCopy', 'timeline'], + options: { + clipCount: 1, + durationRange: '60-180', + intensity: 'standard', + platform: 'xiaohongshu', + keepContext: true, + speakerEnabled: false, + subtitleEnabled: true, + batchEnabled: false, + crossSegmentEnabled: true, + titleSummaryEnabled: true, + publishReadyEnabled: true, + }, + }, + { + id: 'rhythm-cut', + group: '剪辑', + title: '节奏卡点', + description: '多素材按音乐节奏、情绪点和镜头动作生成混剪方案。', + icon: , + presetId: 'merge', + planType: 'capability', + sceneId: 'local-business', + polishId: 'commerce', + prompt: + '把这些视频、图片和 BGM 做成节奏卡点短片。先识别可用动作镜头、视觉强点、情绪转折和音乐节拍,再生成开场、铺垫、高潮、收束的镜头顺序;图片需要给出推拉摇移动效建议。', + businessParams: + '场景:活动回顾/产品氛围/门店探访/品牌宣传\n目标:30-60 秒节奏混剪\n要求:按 BGM 情绪和节拍组织镜头', + output: '卡点时间线 / 镜头顺序 / 字幕标题 / 发布文案', + tags: ['卡点', 'BGM', '混剪'], + sourceMode: 'multi-montage', + sourceHint: '多选图片、视频和 BGM;第一项会作为主素材。', + acceptedSourceTypes: ['video', 'image', 'audio'], + minSources: 2, + maxSources: 30, + outputOptionIds: ['title', 'publishCopy', 'timeline'], + options: { + clipCount: 1, + durationRange: '30-90', + intensity: 'aggressive', + platform: 'douyin', + keepContext: false, + speakerEnabled: false, + subtitleEnabled: false, + batchEnabled: false, + crossSegmentEnabled: true, + titleSummaryEnabled: true, + publishReadyEnabled: true, + }, + }, + { + id: 'voice-remake', + group: '重制', + title: '声音改编', + description: '先生成改词、配音和对齐方案,声音重制按模型中心解锁。', + icon: , + presetId: 'custom', + planType: 'polish', + sceneId: 'none', + polishId: 'clean', + prompt: + '把这段视频做成声音改编方案:先转写原文,按目标语气改写口播文案,保持句长接近原表达,输出分段配音脚本、字幕、音画对齐点和需要使用的声音能力。当前先生成方案,真正换声或保声线重制需要在模型中心完成声音能力初始化后执行。', + businessParams: + '场景:用户自有素材的配音重制/数字人口播精修\n目标:改写文案、配音脚本、对齐点\n限制:不承诺直接换声,需模型中心声音能力', + output: '改词脚本 / 配音方案 / 对齐点 / 字幕', + tags: ['声音', '配音', '待解锁'], + sourceMode: 'primary-audio-video', + sourceHint: '选择 1 个自有口播视频或音频,先生成声音改编方案。', + acceptedSourceTypes: ['video', 'audio'], + minSources: 1, + maxSources: 1, + outputOptionIds: ['subtitle', 'title', 'context', 'timeline'], + options: { + clipCount: 1, + durationRange: '60-180', + intensity: 'conservative', + platform: 'douyin', + keepContext: true, + speakerEnabled: false, + subtitleEnabled: true, + batchEnabled: false, + crossSegmentEnabled: true, + titleSummaryEnabled: true, + publishReadyEnabled: false, + }, + }, { id: 'script-to-video', group: '重制', @@ -12792,6 +12944,10 @@ function FunClipEditingPageContent({ 'commerce-live', 'broll-brief', 'montage-mix', + 'news-overview', + 'explainer-remake', + 'rhythm-cut', + 'voice-remake', ] as ClipQuickScenarioId[] ); const visibleQuickScenarios = clipQuickScenarios.filter((item) => @@ -13019,7 +13175,7 @@ function FunClipEditingPageContent({ : `${selectedQuickScenario.title} 当前只需要 1 个主素材,多素材会在对应场景开放。` : `${selectedQuickScenario.title} 只使用 1 个主视频,不会进入多选。`; const assetPickerButtonText = allowsDirectMultiSelect - ? '从资产中心多选素材' + ? '多选资产素材' : selectedQuickScenario.acceptedSourceTypes.includes('video') ? '从资产中心选择主视频' : '从资产中心选择素材'; @@ -13982,6 +14138,9 @@ function FunClipEditingPageContent({ setSubmittedTaskId(''); try { const createdTask = await onCreateClipTask(title, selectedPreset.mode, { + quickScenarioId: selectedQuickScenario.id, + quickScenarioTitle: selectedQuickScenario.title, + quickScenarioGroup: selectedQuickScenario.group, selectedPlan: { type: selectedPlanType, typeLabel: selectedPlan.typeLabel, @@ -14740,19 +14899,12 @@ function FunClipEditingPageContent({
-