28 KiB
28 KiB
美家卡智剪 — 产品技术方案
基于「美家卡智影」架构的 AI 辅助短视频剪辑产品方案 版本: v2.0 | 日期: 2026-04-20
一、产品定位
| 维度 | 美家卡智影(现有) | 美家卡智剪(新项目) |
|---|---|---|
| 核心能力 | AI 数字人视频生成 | AI 音色克隆 + 语音合成 + 素材智能剪辑 |
| 视频来源 | KlingAI 生成数字人视频 | 用户导入长视频素材 |
| 声音来源 | KlingAI 预设/自定义音色 + 数字人 | 用户克隆音色 / 预设音色 + TTS |
| 目标场景 | 口播视频、营销视频从无到有 | 已有长素材快速剪辑成片、声音克隆配音 |
| 核心差异 | 「生成式」创作 | 「剪辑式」创作 + AI 声音 |
一句话定义
美家卡智剪 = 导入长视频 + AI 文案分镜 + 自动切割 + 音色克隆 + 语音合成 + 字幕压制 + 封面合成 + 视频导出
二、核心流程设计(6 步)
┌─────────────────────────────────────────────────────────────────────┐
│ │
│ Step 1 → Step 2 → Step 3 → Step 4 → S5 → S6 │
│ 脚本生成 → 视频剪辑 → 音色配音 → 字幕压制 → 封面 → 合成 │
│ │
│ ├─ AI文案 ├─ 导入长视频 ├─ 音色克隆 ├─ 自动打轴 │
│ ├─ 粘贴文案 ├─ 自动切割 ├─ 预设音色 ├─ ASS字幕 │
│ ├─ 智能分镜 │ (按分镜时长) ├─ 分镜TTS ├─ FFmpeg压制 │
│ │ │ ├─ 试听/调整 │
│ │ │ │ │
│ [改造] [全新] [全新] [复用] [复用] │
│ │
└─────────────────────────────────────────────────────────────────────┘
各步骤详细说明
Step 1 — 脚本生成(Script Generation)
文案输入(3 种方式):
- AI 生成:输入主题/关键词,LLM 生成短视频文案
- 直接粘贴:用户粘贴已准备好的文案,系统自动分镜
- 导入文件:支持
.txt/.docx/.srt导入
智能分镜:
- 按句子/段落自动拆分分镜
- 每个分镜含:
voiceover(旁白文案)、duration(预估时长) - 支持拖拽调整分镜顺序、合并、拆分
- 文案字数根据目标时长自动约束(15s≈40字 / 30s≈80字 / 60s≈160字)
输出:
segments[]:分镜列表,每个分镜含文案和预估时长- 此步骤与智影 Step 1 基本一致,Prompt 调整为生成纯旁白文案(不含场景描述)
Step 2 — 视频剪辑(Video Editing)
核心逻辑:导入一个长视频,按分镜时长自动切割。
流程:
- 用户导入一个长视频文件(
.mp4/.mov) - 系统提取视频总时长
- 按分镜数量和预估时长自动计算切割点
- 调用 FFmpeg 将长视频切割为 N 个片段
- 每个片段自动绑定到对应分镜
自动切割算法:
总视频时长 = T
分镜数 = N
分镜预估时长 = [d1, d2, ..., dN]
预估总时长 = D = d1 + d2 + ... + dN
如果 D <= T:
按比例分配: 每个分镜实际时长 = di * (T / D)
切割点: cumsum([d1*T/D, d2*T/D, ...])
如果 D > T:
提示用户: 文案预估总时长超过视频时长,建议缩短文案或导入更长视频
界面示意:
┌────────────────────────────────────────────┐
│ 分镜列表 │ 素材导入 │
│ ├─ 分镜1 (5s) │ ├─ 📁 点击导入 │
│ ├─ 分镜2 (8s) │ │ 或拖拽视频 │
│ ├─ 分镜3 (7s) │ │ │
│ └─ 分镜4 (5s) │ │ 🎬 素材.mp4 │
│ │ │ 时长: 25s │
│ 预估总时长: 25s │ │ 分辨率: 1080p │
│ │ └────────────────│
│ [自动切割] │ │
└────────────────────────────────────────────┘
切割结果预览:
┌────────────────────────────────────────────┐
│ 分镜1 ←→ 🎬 [00:00 - 00:05] (5s) │
│ 分镜2 ←→ 🎬 [00:05 - 00:13] (8s) │
│ 分镜3 ←→ 🎬 [00:13 - 00:20] (7s) │
│ 分镜4 ←→ 🎬 [00:20 - 00:25] (5s) │
└────────────────────────────────────────────┘
技术实现:
- 前端:文件选择 → 调用 Rust IPC
import_media→ 保存到项目media/目录 - Rust:
split_video命令使用 FFmpeg-ss+-t截取片段 - 每个片段保存为
shot_{index}.mp4,路径写入segment.mediaPath
Step 3 — 音色配音(Voice & Dubbing)
音色管理:
- 预设音色:接入 KlingAI 官方预设音色(温柔女声、播报男声等)
- 我的音色:用户克隆的音色列表
- 克隆方式:录音(10-20 秒)或上传音频文件
- 克隆状态:处理中 / 完成 / 失败
- 支持预览、重命名、删除
语音合成(TTS):
- 为每个分镜独立选择音色
- 支持统一设置(一键应用到全部分镜)
- 可调节语速(0.8x - 2.0x)
- 实时试听、重新生成
批量合成:
- 一键合成所有分镜音频
- 后台 Async Engine 并行处理(受槽位限制)
- 实时进度显示
Step 4 — 字幕压制(Subtitle Burning)
基本复用智影现有逻辑,数据源变化:
- 原:基于数字人视频的音频流进行自动打轴
- 新:基于 TTS 合成的音频文件进行自动打轴
流程:
- 提交
subtitle任务(mode: auto_align) - 参数:
audioUrl(TTS 音频)+audioText(分镜文案) - 返回
alignmentResult(utterances 时间轴) - 用户选择字幕样式(颜色/字号/描边/位置)
- 调用 Rust IPC
burn_subtitle压制 ASS 字幕到视频
输出:
- 每个分镜生成
burnedVideoPath(素材视频 + TTS 音频 + ASS 字幕)
Step 5 — 封面制作(Cover Design)
完全复用智影现有逻辑:
- 提取第一个分镜视频的首帧作为背景
- 用户输入封面标题
- 选择字体样式(抖音美好体等)
- 调用 Rust IPC
generate_cover_image合成封面
Step 6 — 视频合成(Video Composite)
完全复用智影现有逻辑:
- 收集所有分镜的
burnedVideoPath - 如有封面图,先转为 0.5s 封面视频
- 调用 Rust IPC
video_composite_synthesis拼接所有片段 - 输出最终成品到
~/Documents/Meijiaka/products/
三、功能模块对比矩阵
| 模块 | 智影(现有) | 智剪(新) | 复用度 |
|---|---|---|---|
| 脚本生成 | AI 生成脚本 | AI 生成文案 + 粘贴/导入 | 🔶 改造 |
| 视频生成 | KlingAI 数字人 | 素材导入 + 自动切割 | 🔴 新增 |
| 音色管理 | KlingAI Element 绑定音色 | 独立音色克隆 + 预设库 | 🔶 改造 |
| 语音合成 | 数字人自带口播 | TTS 独立合成音频 | 🔴 新增 |
| 字幕压制 | 自动打轴+FFmpeg | 完全复用 | 🟢 复用 |
| 封面制作 | 首帧+标题+FFmpeg | 完全复用 | 🟢 复用 |
| 视频合成 | FFmpeg concat | 完全复用 | 🟢 复用 |
| 本地存储 | meta.json + segments.json | 扩展字段 | 🔶 改造 |
| 任务调度 | 6 个 Handler | 新增 TTS Handler | 🔶 改造 |
| 用户认证 | JWT + 手机号 | 完全复用 | 🟢 复用 |
| 形象克隆 | Avatar 完整流程 | 简化为音色克隆 | 🔶 改造 |
🟢 完全复用 | 🔶 需要改造 | 🔴 全新开发
四、前端架构方案
4.1 页面结构
tauri-app/src/pages/
├── VideoCreation/
│ ├── index.tsx # 6步流程容器(复用,调整步骤名)
│ ├── ScriptCreation.tsx # Step 1: 脚本生成(复用改造)
│ ├── VideoEditing.tsx # Step 2: 视频剪辑(全新)
│ ├── VoiceDubbing.tsx # Step 3: 音色配音(全新)
│ ├── SubtitleBurning.tsx # Step 4: 字幕压制(复用)
│ ├── CoverDesign.tsx # Step 5: 封面制作(复用)
│ └── VideoComposite.tsx # Step 6: 视频合成(复用)
4.2 Store 设计
projectStore(改造)
interface SmartCutState {
// === Step 1: 脚本与分镜 ===
segments: SmartCutShot[];
topic?: string;
scriptType?: string;
// === Step 3: 音色配音 ===
defaultVoiceId?: string; // 默认音色
// === Step 5+6: 封面与合成 ===
coverPath?: string;
coverConfig?: CoverConfig;
finalVideoPath?: string;
exportedAt?: string;
// === 流程状态 ===
currentStep: number; // 1-6
}
interface SmartCutShot {
id: string;
type: 'segment' | 'empty_shot';
voiceover: string; // 旁白文案
duration: number; // 预估/实际时长
// === Step 2: 视频剪辑后绑定 ===
mediaPath?: string; // 切割后的视频片段路径
mediaStartTime?: number; // 在原视频中的起始时间(秒)
mediaEndTime?: number; // 在原视频中的结束时间(秒)
// === Step 3: 配音配置 ===
ttsConfig?: TTSConfig;
audioPath?: string; // TTS 合成音频本地路径
audioUrl?: string; // TTS 音频远程 URL
// === Step 4: 字幕与后期 ===
alignmentResult?: AlignmentResult;
burnedVideoPath?: string;
burnedAt?: string;
}
interface TTSConfig {
voiceId: string;
voiceName: string;
speed: number; // 0.8 - 2.0
}
voiceStore(新增)
interface VoiceState {
// 预设音色
presetVoices: PresetVoice[];
presetVoicesLoading: boolean;
// 用户克隆音色
clonedVoices: ClonedVoice[];
clonedVoicesLoading: boolean;
// 当前选中的默认音色
selectedVoiceId?: string;
}
interface PresetVoice {
voiceId: string;
voiceName: string;
previewUrl?: string;
provider: string;
}
interface ClonedVoice {
id: string; // vc_xxx
name: string;
providerVoiceId: string; // KlingAI 返回的 voice_id
provider: string;
status: 'processing' | 'succeed' | 'failed';
previewUrl?: string;
createdAt: string;
}
4.3 新增 Hooks
| Hook | 职责 |
|---|---|
useVoiceClone.ts |
音色克隆:提交克隆、轮询状态、管理列表 |
useTTSGeneration.ts |
TTS 批量合成:提交任务、轮询、更新 segment |
useMediaImport.ts |
素材导入:文件选择、调用 Rust IPC |
useAutoSplit.ts |
自动切割:计算切割点、调用 split_video、绑定分镜 |
4.4 API 模块
tauri-app/src/api/modules/
├── voice.ts # 音色克隆 / 预设音色 / 查询 / 删除
├── tts.ts # TTS 提交 / 查询 / 批量
├── script.ts # 复用,文案生成
├── caption.ts # 复用,字幕相关
└── videoComposite.ts # 复用,视频合成
五、后端架构方案
5.1 新增 API 路由
# python-api/app/api/v1/voice.py
@router.post("/voice/clone") # 提交音色克隆任务
@router.get("/voice/clones") # 查询用户克隆音色列表
@router.get("/voice/clones/{id}") # 查询单个克隆任务
@router.delete("/voice/clones/{id}") # 删除克隆音色
@router.get("/voice/presets") # 查询预设音色列表
# python-api/app/api/v1/tts.py
@router.post("/tts") # 提交 TTS 任务
@router.get("/tts/{job_id}") # 查询 TTS 任务状态
@router.post("/tts/batch") # 批量提交 TTS 任务
5.2 新增 Async Engine Handler
新增 tts 任务类型:
# app/scheduler/handlers/tts_handler.py
class TTSHandler(AsyncHandler):
"""TTS 语音合成 Handler
为每个分镜的文案生成语音音频。
"""
job_type = "tts"
slot_key = "kling:tts_slots"
max_slots = 10
async def handle(self, job: JobRecord) -> list[StateChange]:
"""处理流程:
1. 从 job.payload 提取 text, voice_id, voice_speed
2. 调用 KlingAI TTS API 生成音频
3. 轮询任务完成
4. 下载音频文件到本地项目目录
5. (可选)上传七牛云持久化
6. 返回结果含 audio_path, audio_url, duration
"""
Redis 配置:
槽位 Key: kling:tts_slots
槽位数: 10
5.3 新增 Service 层
# app/services/tts_service.py
class TTSService:
"""TTS 语音合成服务"""
async def generate_audio(
self,
text: str,
voice_id: str,
voice_speed: float = 1.0,
output_dir: str | None = None,
) -> TTSResult:
"""生成单条 TTS 音频"""
async def batch_generate(
self,
items: list[TTSRequest],
user_id: str,
) -> list[str]:
"""批量提交 TTS 任务到 Async Engine"""
# app/services/voice_clone_service.py
class VoiceCloneService:
"""音色克隆服务"""
async def create_clone(
self,
voice_name: str,
audio_url: str, # 七牛云音频URL
user_id: str,
) -> VoiceCloneJob:
"""提交音色克隆任务到 KlingAI"""
async def sync_clone_status(
self,
job_id: str,
) -> VoiceCloneStatus:
"""同步查询克隆任务状态(轻量操作,不走Async Engine)"""
async def list_clones(self, user_id: str) -> list[ClonedVoice]:
"""查询用户所有克隆音色"""
5.4 新增数据库模型
# app/models/voice_clone.py
class VoiceClone(Base):
"""用户克隆音色元数据(云端备份)"""
__tablename__ = "voice_clones"
id: Mapped[str] = mapped_column(String(32), primary_key=True) # vc_xxx
user_id: Mapped[UUID] = mapped_column(ForeignKey("users.id"))
name: Mapped[str] = mapped_column(String(100))
provider: Mapped[str] = mapped_column(String(50), default="klingai")
provider_voice_id: Mapped[str] = mapped_column(String(100))
status: Mapped[str] = mapped_column(String(20)) # processing/succeed/failed
preview_url: Mapped[str | None] = mapped_column(String(500))
fail_reason: Mapped[str | None] = mapped_column(Text)
deleted_at: Mapped[datetime | None]
created_at: Mapped[datetime]
updated_at: Mapped[datetime]
注:智剪中不需要 Element(形象主体),只需要 Voice(音色),因此独立建表更简洁。
5.5 复用已有能力
| 已有能力 | 复用方式 |
|---|---|
KlingAIProvider.generate_tts() |
直接调用,封装到 Service 层 |
KlingAIProvider.create_custom_voice() |
直接调用,封装到 VoiceCloneService |
KlingAIProvider.list_preset_voices() |
直接调用 |
VolcengineCaptionService |
完全复用,传入 TTS 音频 URL |
SlotManager + JobRegistry |
完全复用 |
TokenManager + JWTTokenStrategy |
完全复用 |
qiniu_service.upload() |
复用,支持 audio 类型 |
| 七牛云上传凭证 | 复用 |
六、Rust 层改造方案
6.1 新增 IPC 命令
// commands/media.rs
#[tauri::command]
async fn import_media(
app: AppHandle,
project_id: String,
source_path: String,
) -> Result<MediaInfo, String>
// commands/video_edit.rs
#[tauri::command]
async fn split_video(
app: AppHandle,
input_path: String,
segments: Vec<SplitSegment>, // [{start, end, output_name}]
) -> Result<Vec<String>, String> // 返回切割后的文件路径列表
6.2 新增 FFmpeg 命令封装
在 ffmpeg_cmd.rs 中新增:
/// 按时间范围批量截取视频片段
///
/// 输入一个长视频,按多个时间范围切割为独立文件
pub async fn split_video_segments(
app: &AppHandle,
input: &str,
segments: &[(f64, f64, &str)], // (start, end, output_path)
) -> Result<Vec<String>, FFmpegError>
/// 提取视频元信息(时长、分辨率、码率等)
pub async fn probe_media_info(
input: &str,
) -> Result<MediaInfo, FFmpegError>
6.3 本地存储路径扩展
// storage/paths.rs
/// 项目素材目录:~/Documents/Meijiaka/projects/{id}/media/
pub fn get_project_media_dir(project_id: &str) -> PathBuf
/// 项目音频目录:~/Documents/Meijiaka/projects/{id}/audio/
pub fn get_project_audio_dir(project_id: &str) -> PathBuf
/// 项目分镜视频目录:~/Documents/Meijiaka/projects/{id}/shots/
pub fn get_project_shots_dir(project_id: &str) -> PathBuf
存储结构:
~/Documents/Meijiaka/
├── projects/{project_id}/
│ ├── meta.json
│ ├── segments.json
│ ├── media/ # 导入的原始素材
│ │ └── source.mp4 # 原始长视频
│ ├── shots/ # 自动切割后的分镜视频
│ │ ├── shot_001.mp4
│ │ └── shot_002.mp4
│ ├── audio/ # TTS 生成的音频
│ │ ├── tts_001.mp3
│ │ └── tts_002.mp3
│ └── assets/ # 封面等成品资源
│ └── cover_xxx.png
七、AI 能力集成
7.1 音色克隆
Provider: KlingAI(已具备能力)
API: POST /v1/general/custom-voices
参数:
- voice_name: 音色名称
- voice_url: 音频文件URL(5-30秒,干净人声)
限制:
- 音频时长: 5-30 秒
- 格式: MP3 / WAV
- 要求: 单一人声、无杂音、无背景音乐
前端录音方案:
- 使用 Web Audio API 录制麦克风音频
- 实时波形可视化
- 录制时长控制(10-20 秒最佳)
- 录制完成后上传至七牛云 → 后端提交克隆任务
状态流转:
用户录音/上传 → 前端上传七牛云 → 后端调用 KlingAI 创建音色
↓
[processing] ← 前端轮询
↓
[succeed] → 保存到 DB → 加入"我的音色"
↓
[failed] → 提示用户重新录制
7.2 语音合成(TTS)
Provider: KlingAI(已具备能力,需上层封装)
API: POST /v1/audio/tts
参数:
- text: 要合成的文本(旁白文案)
- voice_id: 音色ID(预设或自定义)
- voice_language: zh / en
- voice_speed: 0.8 - 2.0(默认 1.0)
返回:
- task_id: 任务ID
- 轮询 GET /v1/audio/tts/{task_id} 获取音频URL
批量处理策略:
- 每个分镜一个 TTS 任务
- Async Engine 并行处理(最多 10 个并发)
- 前端显示总体进度(已完成 N / 总分镜数 M)
7.3 文案生成
复用现有 ScriptService,但调整 Prompt:
- 原:生成「场景描述 + 旁白 + 时长」的营销脚本
- 新:生成「旁白文案 + 预估时长」的短视频文案
- 支持根据目标时长(15s / 30s / 60s)控制字数
八、独立新仓库初始化方案
8.1 仓库创建
# 在本地创建新仓库目录
mkdir meijiaka-zj
cd meijiaka-zj
git init
# 复制智影代码(排除依赖和构建产物)
rsync -av \
--exclude='.git' \
--exclude='node_modules' \
--exclude='.venv' \
--exclude='__pycache__' \
--exclude='.mypy_cache' \
--exclude='.ruff_cache' \
--exclude='.pytest_cache' \
--exclude='dist' \
--exclude='target' \
--exclude='*.lock' \
--exclude='.DS_Store' \
../ai-meijiaka/ .
# 初始化提交
git add -A
git commit -m "init: fork from meijiaka-zy"
8.2 品牌配置修改清单
| 文件 | 修改项 |
|---|---|
tauri-app/src-tauri/tauri.conf.json |
productName: 美家卡智影 → 美家卡智剪;identifier: cn.meijiaka.ai-video → cn.meijiaka.ai-video-editor;title: 美家卡 智影 → 美家卡 智剪 |
tauri-app/package.json |
name: 可保持不变(内部包名) |
python-api/app/main.py |
FastAPI 文档标题、描述更新 |
AGENTS.md |
全文替换「智影」→「智剪」,更新产品描述 |
README.md |
更新为智剪的产品说明 |
8.3 项目结构
meijiaka-zj/ # 新仓库根目录
├── python-api/ # FastAPI 后端(从智影复制后改造)
│ ├── app/
│ │ ├── api/v1/ # 新增 voice.py, tts.py 路由
│ │ ├── ai/providers/ # 复用 KlingAIProvider
│ │ ├── scheduler/handlers/ # 新增 tts_handler.py
│ │ ├── services/ # 新增 tts_service.py, voice_clone_service.py
│ │ ├── models/ # 新增 voice_clone.py
│ │ └── schemas/ # 新增 voice.py, tts.py
│ ├── config/
│ ├── alembic/
│ ├── pyproject.toml
│ └── ...
│
├── tauri-app/ # Tauri 前端(从智影复制后改造)
│ ├── src/
│ │ ├── pages/VideoCreation/
│ │ │ ├── ScriptCreation.tsx # Step 1(改造)
│ │ │ ├── VideoEditing.tsx # Step 2(新增)
│ │ │ ├── VoiceDubbing.tsx # Step 3(新增)
│ │ │ ├── SubtitleBurning.tsx # Step 4(复用)
│ │ │ ├── CoverDesign.tsx # Step 5(复用)
│ │ │ └── VideoComposite.tsx # Step 6(复用)
│ │ ├── store/
│ │ │ ├── projectStore.ts # 改造
│ │ │ └── voiceStore.ts # 新增
│ │ ├── api/modules/
│ │ │ ├── voice.ts # 新增
│ │ │ └── tts.ts # 新增
│ │ └── hooks/
│ │ ├── useVoiceClone.ts # 新增
│ │ ├── useTTSGeneration.ts # 新增
│ │ └── useAutoSplit.ts # 新增
│ ├── src-tauri/src/
│ │ ├── commands/media.rs # 新增
│ │ ├── ffmpeg_cmd.rs # 新增函数
│ │ └── storage/paths.rs # 新增路径
│ └── ...
│
├── docs/ # 文档
│ └── meijiaka-zhijian-proposal.md
│
└── scripts/ # 工具脚本
九、实施路线图
Phase 1: 基础架构(2 周)
目标:搭建新项目骨架,打通基础能力
| 任务 | 说明 |
|---|---|
| ① 仓库初始化 | 复制智影代码,修改品牌配置,建立独立仓库 |
| ② 数据模型改造 | 新增 voice_clones 表,改造 segments Schema |
| ③ TTS API 封装 | 新增 tts_service.py、voice.py / tts.py 路由 |
| ④ 音色克隆 API | 新增 voice_clone_service.py |
| ⑤ 前端 Store 改造 | 改造 projectStore,新增 voiceStore |
| ⑥ 素材导入 IPC | 新增 import_media、split_video Rust 命令 |
Phase 2: 核心流程(2 周)
目标:完成 6 步核心流程 MVP
| 任务 | 说明 |
|---|---|
| ⑦ Step 1 脚本生成 | 复用现有逻辑,Prompt 调整为纯旁白文案 |
| ⑧ Step 2 视频剪辑 | 素材导入 UI + 自动切割逻辑 + 分镜绑定 |
| ⑨ Step 3 音色配音 | 音色克隆 UI + TTS 合成 UI + 批量任务 |
| ⑩ TTS Async Handler | 实现 TTSHandler,接入 Async Engine |
| ⑪ 字幕压制适配 | 基于 TTS 音频的自动打轴 + 字幕压制 |
| ⑫ 封面+合成 | 复用现有逻辑,验证端到端流程 |
Phase 3: 打磨优化(1 周)
目标:提升用户体验,修复问题
| 任务 | 说明 |
|---|---|
| ⑬ 切割算法优化 | 智能检测场景切换点,避免在人物说话中间切割 |
| ⑭ 批量操作优化 | 统一音色、批量重新合成 |
| ⑮ 错误处理 | 视频格式不支持、TTS 失败、文案超长等异常 |
| ⑯ 性能优化 | 大视频导入、多任务并发 |
| ⑰ 测试验收 | 全流程测试,修复 bug |
总工期预估:5 周
Week 1-2: Phase 1 — 基础架构
Week 3-4: Phase 2 — 核心流程 MVP
Week 5: Phase 3 — 打磨优化 + 测试
十、技术风险与应对
| 风险 | 影响 | 应对方案 |
|---|---|---|
| KlingAI TTS 并发限制 | 批量合成慢 | Async Engine 槽位控制 + 前端进度管理 |
| KlingAI 音色克隆失败率高 | 用户体验差 | 前端引导用户录制规范音频(安静环境、清晰人声) |
| 文案总时长 > 视频时长 | 无法完整配音 | Step 2 导入时校验,超长则提示用户调整文案或换视频 |
| 自动切割点落在不自然位置 | 画面割裂 | V2 引入场景切换检测,在关键帧处切割 |
| 大视频文件导入卡顿 | 前端无响应 | Tauri 后端异步处理导入,前端仅显示进度 |
| 视频格式兼容性 | 某些格式无法处理 | FFmpeg 统一标准化转码,支持主流格式 |
| TTS 文本过长 | KlingAI 限制 | 分镜文案字数控制(建议单分镜 < 200 字) |
十一、长期演进方向
| 版本 | 功能 |
|---|---|
| V1.0(MVP) | 长视频导入 + 自动切割 + 音色克隆 + TTS + 字幕 + 封面 + 合成 |
| V1.5 | 智能切割(基于场景切换检测) |
| V2.0 | 多轨道编辑(背景音乐、音效、转场) |
| V2.5 | AI 视频摘要(长视频自动提取精彩片段) |
| V3.0 | 多音色对话(支持多人配音、角色音色) |
附录
A. 关键术语对照
| 智影术语 | 智剪对应 | 说明 |
|---|---|---|
elementId |
voiceId |
从数字人形象ID变为音色ID |
videoUrl |
mediaPath |
从AI生成视频变为切割后的素材片段 |
Avatar |
VoiceClone |
从形象克隆简化为音色克隆 |
humanId |
— | 移除,不再需要 |
scene |
— | 可选保留,用于V2智能匹配 |
B. 需要改造的文件清单
后端(python-api):
新增:
app/api/v1/voice.py
app/api/v1/tts.py
app/services/tts_service.py
app/services/voice_clone_service.py
app/scheduler/handlers/tts_handler.py
app/models/voice_clone.py
app/schemas/voice.py
app/schemas/tts.py
改造:
app/scheduler/main.py # 注册 TTSHandler
app/api/v1/router.py # 添加 voice/tts 路由
app/schemas/segment.py # 扩展 Segment Schema
app/ai/prompts/script/*.txt # 调整 Prompt 为纯旁白文案
前端(tauri-app):
新增:
src/pages/VideoCreation/VideoEditing.tsx
src/pages/VideoCreation/VoiceDubbing.tsx
src/store/voiceStore.ts
src/api/modules/voice.ts
src/api/modules/tts.ts
src/hooks/useVoiceClone.ts
src/hooks/useTTSGeneration.ts
src/hooks/useAutoSplit.ts
改造:
src/pages/VideoCreation/index.tsx # 调整为6步
src/pages/VideoCreation/ScriptCreation.tsx # 移除场景描述字段
src/store/projectStore.ts # 扩展数据模型
src/api/types.ts # 更新类型定义
Rust(src-tauri):
新增:
src/commands/media.rs
src/ffmpeg_cmd.rs 中的 split_video_segments / probe_media_info
src/storage/paths.rs 中的 media/audio/shots 路径
改造:
src/lib.rs # 注册新命令
本方案基于「美家卡智影」现有架构设计,最大化复用已有能力,降低开发成本与风险。