Add AI clip quick scenarios
Some checks failed
CI / main (push) Has been cancelled
CI / release-e2e (push) Has been cancelled

This commit is contained in:
jiam
2026-07-08 02:05:21 +08:00
parent 5119ac0ef8
commit be9e776b10

View File

@@ -39,6 +39,7 @@ import {
Camera, Camera,
CheckCircle2, CheckCircle2,
ChevronRight, ChevronRight,
Clapperboard,
CircleDashed, CircleDashed,
ClipboardList, ClipboardList,
Compass, Compass,
@@ -64,7 +65,9 @@ import {
Mic2, Mic2,
Minus, Minus,
MoreHorizontal, MoreHorizontal,
Music4,
Music2, Music2,
Newspaper,
Moon, Moon,
Plus, Plus,
Play, Play,
@@ -91,6 +94,7 @@ import {
UserRound, UserRound,
Video, Video,
Volume2, Volume2,
AudioWaveform,
Workflow, Workflow,
X, X,
} from 'lucide-react'; } from 'lucide-react';
@@ -11672,6 +11676,10 @@ function FunClipEditingPageContent({
| 'talking-head-clean' | 'talking-head-clean'
| 'broll-brief' | 'broll-brief'
| 'montage-mix' | 'montage-mix'
| 'news-overview'
| 'explainer-remake'
| 'rhythm-cut'
| 'voice-remake'
| 'script-to-video' | 'script-to-video'
| 'batch-factory'; | 'batch-factory';
type ClipOutputOptionId = type ClipOutputOptionId =
@@ -12603,6 +12611,150 @@ function FunClipEditingPageContent({
publishReadyEnabled: true, publishReadyEnabled: true,
}, },
}, },
{
id: 'news-overview',
group: '剪辑',
title: '新闻概览',
description: '把发布会、访谈或行业长视频整理成口语化概览短片。',
icon: <Newspaper size={17} />,
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: <Clapperboard size={17} />,
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: <Music4 size={17} />,
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: <AudioWaveform size={17} />,
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', id: 'script-to-video',
group: '重制', group: '重制',
@@ -12792,6 +12944,10 @@ function FunClipEditingPageContent({
'commerce-live', 'commerce-live',
'broll-brief', 'broll-brief',
'montage-mix', 'montage-mix',
'news-overview',
'explainer-remake',
'rhythm-cut',
'voice-remake',
] as ClipQuickScenarioId[] ] as ClipQuickScenarioId[]
); );
const visibleQuickScenarios = clipQuickScenarios.filter((item) => const visibleQuickScenarios = clipQuickScenarios.filter((item) =>
@@ -13019,7 +13175,7 @@ function FunClipEditingPageContent({
: `${selectedQuickScenario.title} 当前只需要 1 个主素材,多素材会在对应场景开放。` : `${selectedQuickScenario.title} 当前只需要 1 个主素材,多素材会在对应场景开放。`
: `${selectedQuickScenario.title} 只使用 1 个主视频,不会进入多选。`; : `${selectedQuickScenario.title} 只使用 1 个主视频,不会进入多选。`;
const assetPickerButtonText = allowsDirectMultiSelect const assetPickerButtonText = allowsDirectMultiSelect
? '从资产中心多选素材' ? '多选资产素材'
: selectedQuickScenario.acceptedSourceTypes.includes('video') : selectedQuickScenario.acceptedSourceTypes.includes('video')
? '从资产中心选择主视频' ? '从资产中心选择主视频'
: '从资产中心选择素材'; : '从资产中心选择素材';
@@ -13982,6 +14138,9 @@ function FunClipEditingPageContent({
setSubmittedTaskId(''); setSubmittedTaskId('');
try { try {
const createdTask = await onCreateClipTask(title, selectedPreset.mode, { const createdTask = await onCreateClipTask(title, selectedPreset.mode, {
quickScenarioId: selectedQuickScenario.id,
quickScenarioTitle: selectedQuickScenario.title,
quickScenarioGroup: selectedQuickScenario.group,
selectedPlan: { selectedPlan: {
type: selectedPlanType, type: selectedPlanType,
typeLabel: selectedPlan.typeLabel, typeLabel: selectedPlan.typeLabel,
@@ -14740,19 +14899,12 @@ function FunClipEditingPageContent({
</div> </div>
<div className="tg-ai-clip-compose"> <div className="tg-ai-clip-compose">
<label className="tg-ai-clip-goal tg-ai-clip-goal--large">
<span></span>
<textarea
value={targetText}
onChange={(event) => setTargetText(event.target.value)}
placeholder="例如:把这场直播拆成 5 条带货短视频,保留价格优惠、试用反馈和主播强推荐片段。"
/>
</label>
<div className="tg-ai-clip-workflow-section"> <div className="tg-ai-clip-workflow-section">
<div className="tg-ai-clip-section-label"> <div className="tg-ai-clip-section-label">
<span></span> <span></span>
<small></small> <small>
</small>
</div> </div>
<div className="tg-ai-clip-workflow-grid"> <div className="tg-ai-clip-workflow-grid">
{visibleQuickScenarios.map((item) => ( {visibleQuickScenarios.map((item) => (
@@ -14782,6 +14934,15 @@ function FunClipEditingPageContent({
</div> </div>
</div> </div>
<label className="tg-ai-clip-goal tg-ai-clip-goal--large">
<span></span>
<textarea
value={targetText}
onChange={(event) => setTargetText(event.target.value)}
placeholder="例如:裁剪掉视频最后 2 秒,只输出一条可播放成片。"
/>
</label>
<div className="tg-ai-clip-config-panel"> <div className="tg-ai-clip-config-panel">
<div className="tg-ai-clip-section-label"> <div className="tg-ai-clip-section-label">
<span></span> <span></span>