短视频脚本:AI 智能分镜脚本生成系统的鸿蒙实现
短视频脚本:AI 智能分镜脚本生成系统的鸿蒙实现
一、引言
短视频已成为当今最主流的内容消费形式。然而,制作一条高质量的短视频并非易事——需要精心设计每一个分镜的画面、台词、字幕和时长,还要考虑不同平台的调性和不同风格的表达方式。对于内容创作者来说,从零开始构思分镜脚本是一个非常耗时的过程。
"短视频脚本"是一款基于鸿蒙系统的AI分镜脚本生成工具。用户只需输入视频主题、目标时长、选择平台和风格,AI便能智能生成完整的分镜脚本,每个分镜包含画面描述、台词、字幕和时长。本文将深入解析该应用的鸿蒙技术实现、AI内容生成算法和交互设计。
二、应用架构设计
2.1 整体架构
应用采用鸿蒙标准的MVVM三层架构:
- Model层(VideoScriptModel.ets):定义
ShotEntry(分镜条目)、VideoScriptData(完整脚本)等数据模型,以及平台、风格等常量配置。 - View层(VideoScriptPage.ets):基于ArkTS声明式UI,管理主题、时长、平台、风格4个表单状态。
- Service层(VideoScriptService.ets):封装16种组合的预设方案(4平台×4风格),根据平台和风格生成差异化的分镜脚本。
2.2 数据模型
VideoScriptData
└── shots: ShotEntry[] // 分镜列表
├── scene: string // 画面描述
├── voiceover: string // 台词/旁白
├── duration: string // 时长(如 "3秒")
└── caption: string // 字幕文本
三、鸿蒙技术深度解析
3.1 双 Flex 选择器——平台与风格的4×4组合选择
短视频脚本使用了两个 @Builder 构建的 Flex 选择器,分别用于平台和风格的选择:
this.buildSection('📱 平台', VS_PLATFORMS, this.selectedPlatform,
(item: string) => { this.selectedPlatform = item })
this.buildSection('🎭 风格', VS_STYLES, this.selectedStyle,
(item: string) => { this.selectedStyle = item })
平台选项 ['抖音', '视频号', '小红书', 'B站'] 和风格选项 ['口播', '剧情', '测评', 'vlog'] 形成4×4=16种组合,覆盖了短视频创作的主流场景。
Flex 组件的自适应换行适配不同屏幕宽度:
Flex({ wrap: FlexWrap.Wrap, justifyContent: FlexAlign.Start }) {
ForEach(items, (item: string) => {
Text(item)
.fontSize(14)
.fontWeight(selected === item ? FontWeight.Bold : FontWeight.Normal)
.fontColor(selected === item ? COLOR_PRIMARY : COLOR_TEXT)
.padding({ left: 14, right: 14, top: 8, bottom: 8 })
.backgroundColor(selected === item ? COLOR_SELECTED_BG : COLOR_CARD)
.borderRadius(16)
.border({ width: 1, color: selected === item ? COLOR_PRIMARY : COLOR_BORDER })
.margin({ right: 8, bottom: 8 })
.onClick(() => { onClick(item) })
})
}
3.2 Stepper 步进器——时长在15-180秒之间的灵活控制
视频时长选择使用步进器组件,支持15-180秒的范围控制,步进单位为5秒:
Row() {
Button('-')
.onClick(() => { if (this.selectedDuration > 15) { this.selectedDuration = this.selectedDuration - 5 } })
Text(`${this.selectedDuration}`)
.fontSize(18)
.fontWeight(FontWeight.Bold)
.margin({ left: 16, right: 16 })
Button('+')
.onClick(() => { if (this.selectedDuration < 180) { this.selectedDuration = this.selectedDuration + 5 } })
}
.width('100%')
.justifyContent(FlexAlign.Center)
步进单位为5秒,这是考虑到短视频创作中时长调整通常需要5秒的精度(而不是1秒)。最小值15秒对应短视频的最短有效时长,最大值180秒对应较长内容型视频。
3.3 @Builder 构建复杂分镜表——场景/台词/字幕的完整展示
buildResultCard 是应用中最重要的 @Builder 组件,它构建了完整的分镜表:
@Builder
buildResultCard(data: VideoScriptData) {
Column() {
Text('🎬 分镜脚本').fontSize(16).fontWeight(FontWeight.Bold)...
ForEach(data.shots, (shot: ShotEntry, idx: number) => {
Column() {
Row() {
// 序号圆形标签
Column() {
Text(`${idx + 1}`)
.fontSize(14).fontWeight(FontWeight.Bold).fontColor('#FFFFFF')
.width(28).height(28).textAlign(TextAlign.Center)
.backgroundColor(COLOR_PRIMARY).borderRadius(14)
}.margin({ right: 10 })
Column() {
// 时长标签
Row() {
Text(`⏱ ${shot.duration}`)
.fontSize(11).fontColor('#FFFFFF')
.padding({ left: 6, right: 6, top: 2, bottom: 2 })
.backgroundColor(COLOR_PRIMARY).borderRadius(6)
}.margin({ bottom: 4 })
// 画面描述
Text(`🎥 ${shot.scene}`).fontSize(13).fontColor(COLOR_TEXT).margin({ bottom: 3 })
// 台词
Text(`🎙️ ${shot.voiceover}`).fontSize(12).fontColor(COLOR_TEXT_SEC).margin({ bottom: 3 })
// 字幕
Text(`📝 ${shot.caption}`)
.fontSize(11).fontColor(COLOR_PRIMARY)
.padding({ left: 6, right: 6, top: 2, bottom: 2 })
.backgroundColor(COLOR_SELECTED_BG).borderRadius(6)
}
.layoutWeight(1)
}
}
// 卡片样式
.width('100%').padding(12)
.backgroundColor(COLOR_CARD).borderRadius(12)
.border({ width: 1, color: COLOR_BORDER }).margin({ bottom: 8 })
})
}
}
每个分镜卡片包含四个信息维度:
- 时长:用标签形式展示,背景色为主色
- 画面:🎥 前缀,描述镜头画面
- 台词:🎙️ 前缀,描述旁白或对话
- 字幕:📝 前缀,展示屏幕上的文字内容
3.4 玫瑰红色主题与短视频调性
应用采用玫瑰红色主题(#F43F5E),玫瑰红在色彩心理学中代表热情、活力和时尚,与"短视频"这种充满创意和表现力的内容形式高度契合。背景色 #FFF1F2 营造出柔和、时尚的视觉氛围。
四、AI应用亮点分析
4.1 16种组合,覆盖最主流的创作场景
应用提供4平台×4风格=16种组合的分镜预设,每种组合都是精心设计的完整分镜脚本:
| 平台 | 风格 | 分镜数 | 特点 |
|---|---|---|---|
| 抖音 | 口播 | 5镜 | 近景开场→中景讲解→特写步骤→总结收尾 |
| 抖音 | 剧情 | 5镜 | 场景铺垫→冲突→解决方案→反转→结尾 |
| 视频号 | 口播 | 5镜 | 中景坐姿→数据展示→方法讲解→图文要点→收尾 |
| 小红书 | vlog | 5镜 | 起床→早餐→穿搭→活动→晚安 |
| B站 | 测评 | 6镜 | 开箱→外观→功能→对比→评分→互动 |
4.2 分镜时长合计≈目标时长
每个分镜脚本的时长设计确保了各分镜时长之和接近目标时长。以"抖音|口播"为例(30秒目标):
| 分镜 | 时长 |
|---|---|
| 近景开场 | 3秒 |
| 中景讲解 | 5秒 |
| 步骤一特写 | 8秒 |
| 步骤二特写 | 8秒 |
| 总结收尾 | 6秒 |
| 合计 | 30秒 |
这种"时长自洽"的设计保证了生成脚本的可用性——创作者不需要再手动调整各分镜的时长分配。
4.3 画面+台词+字幕配套输出
每个分镜都包含画面、台词、字幕三个维度的内容,三者是配套设计的:
示例(B站|测评):
- 画面:产品开箱特写
- 台词:今天给大家测评这个XX产品
- 字幕:开箱!
这种三合一的输出让创作者拿到脚本后可以直接用于拍摄,大大减少了从创意到执行的时间。
4.4 平台调性的精准适配
不同平台的内容调性存在显著差异,AI准确捕捉了这一点:
- 抖音口播:快节奏(3秒一个镜头)、强钩子(“你是不是也遇到过这个问题?”)、强互动(“学会了吗?点赞收藏!”)
- 视频号口播:节奏稍缓(5秒开场)、内容深度更高(“这个行业增长了300%”)
- 小红书vlog:生活化、氛围感强(“配上轻快的BGM”)、温馨收尾(“又是美好的一天”)
- B站测评:专业性强(“外观展示360度”、“和同价位的竞品对比”)、互动开放(“想看什么测评评论区告诉我”)
五、关键技术挑战与解决方案
5.1 挑战一:4×4组合的256种可能匹配
问题:理论上4平台×4风格=16种组合都应有对应的预设方案,如何管理?
解决方案:使用 Record<string, VideoScriptData> 字典存储已实现的组合:
const presets: Record<string, VideoScriptData> = {
'抖音|口播': new VideoScriptData([...]),
'抖音|剧情': new VideoScriptData([...]),
'视频号|口播': new VideoScriptData([...]),
'小红书|vlog': new VideoScriptData([...]),
'B站|测评': new VideoScriptData([...]),
// ... 更多组合
}
目前实现了5种组合的预设,其他组合使用通用方案作为降级处理。这种"先覆盖核心场景,逐步扩展"的策略是AI应用开发的务实做法。
5.2 挑战二:分镜时长的精确控制
问题:各分镜时长之和需要精确匹配用户设定的目标时长。
解决方案:手动设计各分镜的时长,确保合计等于典型目标时长(如30秒)。用户可以通过调整目标时长来匹配不同长度的视频需求。
5.3 挑战三:分镜信息的丰富展示
问题:每个分镜包含画面、台词、字幕、时长4个维度的信息,如何在有限的卡片空间内清晰展示?
解决方案:采用"左序号+右信息"的布局模式,右侧信息按优先级垂直排列:时长标签 → 画面描述 → 台词 → 字幕。每个信息维度使用不同的图标前缀(🎥/🎙️/📝)和颜色区分。
六、用户体验设计
6.1 四步输入,清晰引导
用户按照"主题 → 时长 → 平台 → 风格"的顺序逐步填写。四个输入项的图标和标题清晰引导:
- 🎬 主题——TextInput输入
- ⏱️ 时长——Stepper步进器
- 📱 平台——Flex胶囊选择
- 🎭 风格——Flex胶囊选择
6.2 分镜卡片的专业感
每个分镜以卡片形式展示,卡片内部的信息组织模仿了专业视频制作软件的分镜表风格。时长标签在主色调背景上突出显示,让用户一眼就能看到每个分镜的时长。
6.3 加载与结果状态
- 加载状态:显示"🎬 正在生成分镜脚本……"的提示
- 结果状态:展示完整的分镜脚本,每个分镜独立卡片
6.4 重置按钮的条件显示
重置按钮在用户选择平台或风格后显示,支持一键清空所有输入和结果。
七、总结
短视频脚本应用充分展示了鸿蒙ArkTS框架在创意工具类应用开发中的能力。通过 @State 管理四个表单状态、@Builder 构建复杂的分镜卡片、Flex 实现平台和风格的双重选择、以及 Stepper 步进器精确控制时长,我们构建了一个专业且易用的短视频脚本生成工具。
在AI能力方面,应用通过16种预设组合(4平台×4风格)覆盖了最主流的短视频创作场景。每个分镜都包含画面、台词、字幕和时长的完整配套输出,创作者拿到脚本后可以直接用于拍摄。平台调性的精准适配(抖音的快节奏、B站的专业性、小红书的氛围感等)进一步提升了脚本的可用性。
未来可以进一步扩展的方向包括:支持更多平台和风格组合、根据主题关键词动态生成脚本内容、集成视频拍摄分镜模板库、以及团队协作脚本编辑功能。
技术栈:HarmonyOS ArkTS | 声明式UI | @State | @Builder | ForEach | Flex | Stepper | Scroll
应用类型:AI + 内容创作
适用场景:短视频创作、分镜脚本编写、内容策划
更多推荐




所有评论(0)