写这个项目之前,我的状态基本就是“剪辑半小时、选 BGM 半小时、导出审片再花半小时”。尤其是口播类中长视频,素材动不动就是 20 分钟一条,有效金句可能只有 5 分钟,粗剪、去语气词、加字幕、找空镜,每一步都极其消耗时间。
后来我干脆自己写了一个 AI 剪辑客户端,把“素材整理 → 语音转写 → 剪辑决策 → 字幕生成 → 成片合成”串成一条本地流水线。经过几次迭代后,现在从一条原始口播素材到最终成片,智能处理部分只需要约 54 分钟,再加上人工审校与微调,整体在两小时左右就能产出一条质量还不错的 6 到 10 分钟中长视频。
这篇文章会把整个客户端的架构、核心模块、关键代码和完整工作流整理出来。内容偏向工程实战,适合三类读者:
- 想知道“AI 视频自动剪辑到底怎么实现”的开发者;
- 经常做口播、课程、知识类中长视频的内容创作者;
- 打算自己搭一套“素材 → 成片”AI 工作流,但还没找到切入点的技术人员。
下面我们就从项目背景开始拆解。
1. 项目背景与核心思路
1.1 中长视频剪辑的痛点
中长视频通常指时长在 5 到 15 分钟之间的视频,典型的像知识科普、课程讲解、数码评测、项目复盘等。这种视频和短视频最大的区别是:信息密度更高、剪辑点更多、对段落结构的要求更严格。
我做这类视频时经常遇到几个问题:
- 素材冗余太多。一条 20 分钟的口播,真正能用的内容可能只有 40%,剩下都是语气词、重复表述、停顿、离题内容。
- 字幕工作量大。中长视频基本离不开字幕,手动听写、断句、校对非常费时。
- 金句和空镜很难匹配。凭记忆找素材里的关键句子,效率低;或者空镜素材一大堆,真到用的时候不知道选哪段。
- 导出渲染周期长。如果剪辑软件工程很复杂,预览卡顿,导出又得反复调整。
这些痛点如果全部靠人工处理,一条中长视频花 3 到 4 个小时很正常。我想要的不是用 AI 完全替代剪辑师,而是把流水线里最机械、最耗时的环节自动化,让人只做最终的审美判断和风格微调。
1.2 AI 剪辑客户端的定位
在那套方案里,我把“AI 剪辑客户端”定义成一个本地优先的任务引擎,而不是一个新的剪映或 Premiere。也就是说,它不负责复杂的多轨时间线编辑,而是负责完成下面这条流水线:
原始素材入库 ↓ 语音转写(ASR) ↓ 文本结构化:段落、金句、废句识别 ↓ AI 生成剪辑决策:保留内容、剪切范围、字幕文本 ↓ 自动执行剪切与拼接 ↓ 字幕生成与烧录 ↓ 输出成片 + 剪辑报告开发者视角下,它就是一个由多个模块组成的 Python 客户端;用户视角下,它还预留了一个本地操作面板,用来配置任务、查看进度和审阅结果。
1.3 这套方案解决什么问题
这套方案解决的问题是“从素材到粗剪成片”的全自动流程。最终产出的不是复杂特效,而是一个符合逻辑、结构干净、有字幕、有基础 BGM 的“半成品”。创作者拿到这个半成品之后,只需要人工审阅一遍,调整节奏和细节,就能达到可用状态。
所以核心思路不是让 AI 替你创作,而是让 AI 帮你把“脏活累活”全干了,让你把时间花在真正需要审美的环节。
2. 整体架构与核心流程
2.1 客户端总体架构
这个客户端整体分三层:
┌─────────────────────────────────────────┐ │ 操作层:本地面板 / CLI 命令入口 │ │ 任务配置、进度查看、结果审阅 │ └─────────────────────────────────────────┘ ┌─────────────────────────────────────────┐ │ 核心引擎层:Python 模块 │ │ material / transcriber / strategist / │ │ assembler / subtitle │ └─────────────────────────────────────────┘ ┌─────────────────────────────────────────┐ │ 外部能力层:ffmpeg / 本地模型 / LLM API │ └─────────────────────────────────────────┘这样分层的目的是让每个模块可以独立替换。比如今天用 Whisper 做转写,明天换成更强的商用 ASR,只需要替换transcriber模块;今天用某家 LLM 做剪辑决策,明天换另一家,也不会影响其他模块。
2.2 全自动流水线拆解
我习惯把流水线拆成 5 个阶段:
| 阶段 | 负责模块 | 核心产出 |
|---|---|---|
| 素材入库 | material | 标准化素材清单、去重、预检测 |
| 语音转写 | transcriber | 带时间轴的文本、说话人分段 |
| 剪辑决策 | strategist | 保留段落、剪切区间、字幕文本 |
| 成片合成 | assembler | 视频剪切、拼接、粗剪成片 |
| 字幕增强 | subtitle | SRT / ASS 字幕、烧录字幕 |
这 5 个阶段不是完全线性执行的。比如字幕增强可以和成片合成并行准备,素材入库的时候也可以提前启动预检测。
2.3 54 分钟到底花在哪里
很多人看到“54 分钟全自动剪辑”会产生一个疑问:这 54 分钟究竟是在剪视频,还是在等待 AI 转写?
以一条 10 分钟成片、原始口播素材 20 分钟为例,耗时分布大概是这样的:
| 环节 | 耗时 | 说明 |
|---|---|---|
| 素材入库与预检测 | 3 分钟 | 检查音视频格式、时长、可用性 |
| 语音转写 | 8 分钟 | 20 分钟音频的本地转写 |
| 文本结构化与剪辑决策 | 5 分钟 | LLM 分析转写文本,生成剪辑点位 |
| 自动剪切与拼接 | 18 分钟 | ffmpeg 无损剪切后再统一导出 |
| 字幕生成与烧录 | 15 分钟 | 字幕断句、对齐、压制 |
| 日志归集与报告 | 5 分钟 | 生成剪辑报告,供人工审阅 |
这里的耗时取决于机器性能和素材时长。如果你用的是 GPU 机器,转写会快很多;如果只是 CPU,时间会明显上升。后面我会给出更具体的性能建议。
3. 环境准备与项目初始化
3.1 运行环境
这个项目以 Python 为核心语言,外部依赖 ffmpeg。我在开发时用的是:
- 操作系统:macOS,但 Windows / Linux 也兼容;
- Python:3.10 以上;
- ffmpeg:6.x 以上;
- 语音识别:本地 Whisper 模型;
- LLM API:采用 OpenAI 兼容接口,通过配置文件切换服务商。
版本需要根据你的项目实际情况调整,本文示例以常见环境为例,重点演示配置思路。
3.2 依赖清单
核心依赖如下:
# requirements.txt fastapi==0.115.0 uvicorn==0.30.0 faster-whisper==1.0.2 openai==1.40.0 python-dotenv==1.0.1 pydantic==2.8.0 moviepy==1.0.3 yt-dlp==2024.8.6几个依赖的用途:
faster-whisper:本地语音转写,支持 int8 量化,CPU 上也能跑;openai:调用 LLM 接口完成剪辑决策,不是绑定具体厂商,只是使用它提供的兼容 SDK;moviepy:负责视频剪切、拼接、音频合成;yt-dlp:用于某些素材下载场景,本项目不是必须。
安装命令:
pip install -r requirements.txt sudo apt install ffmpeg # Debian/Ubuntu brew install ffmpeg # macOS3.3 项目目录设计
一个好的目录结构能让你后续扩展模块时不用大改代码。我推荐这样组织:
ai_editor/ ├── main.py # CLI 入口 ├── config.yaml # 全局配置 ├── core/ │ ├── __init__.py │ ├── material.py # 素材管理 │ ├── transcriber.py # 语音转写 │ ├── strategist.py # AI 剪辑决策 │ ├── assembler.py # 视频剪切拼接 │ └── subtitle.py # 字幕生成 ├── jobs/ │ └── demo_job.json # 单个任务配置 ├── outputs/ # 成片输出 └── logs/ # 日志与剪辑报告我还是比较建议把每个模块写成独立文件,而不是把所有逻辑堆在main.py里。因为后续你会不断调试单个模块,比如单独跑一次转写、单独看一次剪辑决策,独立模块能省很多重复计算的时间。
4. 核心模块实现
4.1 素材管理模块
素材管理模块解决的是“素材太乱”的问题。它的职责有 4 个:
- 扫描指定目录下的所有音视频文件;
- 读取视频的时长、分辨率、编码信息;
- 过滤掉明显不可用的文件;
- 输出标准化的素材清单。
下面是一个简化版示例:
# 文件路径:core/material.py import json from pathlib import Path import ffmpeg class Material: def __init__(self, path: str): self.path = Path(path) self.duration = 0.0 self.width = 0 self.height = 0 self.codec = "" def probe(self): # 使用 ffmpeg probe 读取元数据 data = ffmpeg.probe(str(self.path)) stream = next( (s for s in data["streams"] if s["codec_type"] == "video"), None, ) if stream: self.codec = stream.get("codec_name", "") self.width = int(stream.get("width", 0)) self.height = int(stream.get("height", 0)) self.duration = float(data.get("format", {}).get("duration", 0)) return self def to_dict(self): return { "path": str(self.path), "duration": round(self.duration, 2), "width": self.width, "height": self.height, "codec": self.codec, } def scan_materials(source_dir: str): source = Path(source_dir) supported = [".mp4", ".mov", ".mkv", ".ts", ".m4a", ".wav"] materials = [] for f in sorted(source.rglob("*")): if f.suffix.lower() in supported: m = Material(str(f)).probe() if m.duration > 1: materials.append(m.to_dict()) return materials if __name__ == "__main__": result = scan_materials("./raw") print(json.dumps(result, ensure_ascii=False, indent=2))这段代码的关键点是:
- 使用
ffmpeg.probe读取视频元数据,不依赖 OpenCV,轻量且准确; - 过滤掉时长小于 1 秒的文件,避免把截图、空文件混入素材库;
- 输出 JSON 格式的素材清单,方便后续模块读取。
4.2 语音转写模块
语音转写是整个流水线最核心的一步。剪辑决策是否准确,很大程度上取决于转写文本是否带正确的时间轴。
我这里选择faster-whisper,因为它在 CPU 上也能跑,并且支持 VAD(语音活动检测),可以跳过静音区域,减少幻觉。
# 文件路径:core/transcriber.py from faster_whisper import WhisperModel def transcribe_audio(audio_path: str, model_size: str = "small"): # 可根据机器性能选择模型:tiny / base / small / medium / large-v3 model = WhisperModel(model_size, device="cpu", compute_type="int8") segments, info = model.transcribe( audio_path, vad_filter=True, language="zh", beam_size=5, ) result = [] for seg in segments: result.append({ "start": round(seg.start, 3), "end": round(seg.end, 3), "text": seg.text.strip(), }) return { "language": info.language, "duration": round(info.duration, 3), "segments": result, }如果你有 NVIDIA GPU,可以把device改成"cuda",compute_type改成"float16",转写速度会提升 5 到 10 倍。
转写结果最终会写成 JSON 文件:
{ "language": "zh", "duration": 1200.5, "segments": [ { "start": 0.0, "end": 3.2, "text": "大家好,今天我们来聊一聊AI视频剪辑" }, { "start": 3.2, "end": 8.1, "text": "很多朋友问,中长视频到底应该怎么剪" } ] }这里的“段”是一个个句子级时间片段,后面 AI 剪辑决策就是基于这些片段做判断的。
4.3 AI 剪辑决策模块
这是项目里最有“AI 感”的模块。它的任务是把转写文本切分成“保留”和“删除”两类,并给出重新组织后的视频脚本。
设计思路:
- 将转写片段拼接成带编号的文本;
- 调用 LLM,让它输出 JSON 结构的剪辑决策;
- 解析 JSON,生成剪辑指令。
这里的提示词非常关键。我一开始的提示词写得太宽泛,AI 经常把重要内容删掉。后来我把提示词改成“面向口播视频的结构化剪辑”,效果才稳定下来。
# 文件路径:core/strategist.py import json import openai SYSTEM_PROMPT = """你是一名资深视频剪辑师,负责口播类中长视频的粗剪。 你会收到带编号的转写片段,请完成以下任务: 1. 删除语气词、重复表述、离题内容; 2. 保留核心观点、案例、数据、总结; 3. 对保留下来的片段重新排序,如果原文顺序合理则保持原顺序; 4. 为每个保留片段生成适合作为字幕的句子,删除括号、标记等杂质。 输出必须是 JSON 格式: { "kept_segments": [ {"segment_ids": [1, 2, 3], "subtitle": "字幕文本"}, ], "summary": "剪辑思路说明" } 不要输出 JSON 之外的任何内容。""" def make_clip_decision(segments: list[dict], api_key: str, base_url: str, model: str): client = openai.OpenAI(api_key=api_key, base_url=base_url) # 把带编号的片段拼成输入文本 lines = [] for idx, seg in enumerate(segments): lines.append(f"[{idx}] {seg['text']}") user_text = "\n".join(lines) response = client.chat.completions.create( model=model, response_format={"type": "json_object"}, messages=[ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": user_text}, ], temperature=0.2, ) content = response.choices[0].message.content decision = json.loads(content) return decision把segment_ids保留下来,是为了让剪辑指令能够直接对应到时间轴。AI 返回的不是“第几秒到第几秒”,而是“哪几个片段要保留”,这样就能避免 AI 编造不精确的时间点。
4.4 成片合成模块
拿到剪辑决策后,下一步就是真正执行剪切和拼接。这里有两种常见做法:
- 基于 moviepy:灵活但速度慢,适合片段不多、需要复杂合成的场景;
- 基于 ffmpeg 命令:速度快,支持无损剪切,适合大量片段裁剪。
我的方案是混合使用:先用 ffmpeg 对原始文件进行无损剪切,再把剪切后的片段用 moviepy 拼接、加转场、混音。下面演示 ffmpeg 无损剪切的核心命令:
ffmpeg -ss 00:00:03.200 -i raw/demo.mp4 -t 4.900 -c copy output/part_000.mp4命令参数说明:
-ss指定起始时间;-t指定片段时长;-c copy表示不重新编码,速度快,保留原始画质。
但如果片段之间需要转场、需要统一分辨率,那么-c copy就不够用了,必须重新编码。下面是一个更完整的 Python 合成示例:
# 文件路径:core/assembler.py import subprocess def cut_segment(input_path, output_path, start, end): duration = round(end - start, 3) cmd = [ "ffmpeg", "-ss", str(round(start, 3)), "-i", input_path, "-t", str(duration), "-c:v", "libx264", "-c:a", "aac", "-preset", "veryfast", "-pix_fmt", "yuv420p", output_path, "-y", ] subprocess.run(cmd, check=True, capture_output=True) def concat_segments(segment_files, output_path): # 先生成 concat 列表文件 list_file = "concat_list.txt" with open(list_file, "w") as f: for item in segment_files: f.write(f"file '{item}'\n") cmd = [ "ffmpeg", "-f", "concat", "-safe", "0", "-i", list_file, "-c:v", "libx264", "-c:a", "aac", "-preset", "veryfast", output_path, "-y", ] subprocess.run(cmd, check=True, capture_output=True)这个模块的性能优化空间很大。如果你有几十个剪切片段,串行执行ffmpeg会慢一些,可以用 Python 的concurrent.futures.ThreadPoolExecutor并行执行前期的剪切任务,最后再统一拼接。
4.5 字幕生成模块
字幕模块的输入是 AI 决策返回的“保留片段 + 字幕文本”。我们需要把字幕文本重新映射到最终成片的时间轴上。
这一步容易踩坑,因为剪切之后,原素材的时间轴和成片的时间轴已经不是一回事了。我的做法是:
- 按照保留片段在成片中的累计时长,计算每一条字幕的起始时间;
- 生成 SRT 或 ASS 字幕文件;
- 使用 ffmpeg 把字幕烧录到视频中。
生成 SRT 的示例:
# 文件路径:core/subtitle.py def seconds_to_srt_time(seconds): ms = int((seconds - int(seconds)) * 1000) h = int(seconds // 3600) m = int((seconds % 3600) // 60) s = int(seconds % 60) return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}" def build_srt(segments): # segments: [{"start": 1.0, "end": 4.0, "text": "..."}] lines = [] for idx, seg in enumerate(segments, start=1): lines.append(str(idx)) lines.append( f"{seconds_to_srt_time(seg['start'])} --> " f"{seconds_to_srt_time(seg['end'])}" ) lines.append(seg["text"]) lines.append("") return "\n".join(lines)生成好 SRT 之后,用 ffmpeg 烧录:
ffmpeg -i output/final.mp4 -vf "subtitles=subtitle.srt:force_style='FontSize=18,PrimaryColour=&HFFFFFF'" -c:a copy output/final_sub.mp4 -y如果你希望字幕更美观,可以考虑生成 ASS 字幕,支持更多的样式和位置控制。这里不再展开。
5. 全流程实录:从原始素材到成片
5.1 输入素材与预期结果
假设我们有一个raw目录,里面是两条视频素材:
demo_talk.mp4,时长 20 分 30 秒,口播画面;demo_broll.mp4,时长 15 分钟,空镜素材。
目标输出是一条 8 分钟左右的知识类口播成片,包含字幕和基础 BGM。
5.2 执行命令与输出日志
整个流水线通过一个main.py入口启动:
python main.py --job jobs/demo_job.jsonjobs/demo_job.json示例:
{ "name": "demo_job", "source_dir": "./raw", "output_dir": "./outputs", "target_duration": 8, "model_size": "small", "llm_model": "your-llm-model", "enable_subtitle": true, "subtitle_style": "default" }执行过程中,控制台会输出阶段日志:
[1/5] 扫描素材目录:发现 2 个有效素材 [2/5] 语音转写:demo_talk.mp4,预计耗时 8 分钟 [2/5] 转写完成:共 240 个片段,总时长 1230.5 秒 [3/5] AI 剪辑决策:正在分析文本结构... [3/5] 决策完成:保留 82 个片段,删除 158 个片段 [4/5] 执行剪切:并行处理 82 个片段 [5/5] 生成字幕并烧录 [完成] 成片输出:outputs/final_sub.mp4 [完成] 剪辑报告:outputs/report.json这里的“删除 158 个片段”听起来很多,但口播素材里确实存在大量重复、停顿、口头语片段,自动删除是正确的。
5.3 两小时的工作时间分配
很多人听说“两小时剪出一条中长视频”时会觉得不现实。这里我要说明:54 分钟是机器处理时间,不是全流程时间。完整的两小时工作流其实是:
| 时间段 | 人工 / 机器 | 工作内容 |
|---|---|---|
| 0:00 - 0:20 | 人工 | 整理素材、命名、放入 raw 目录 |
| 0:20 - 1:14 | 机器 | 流水线自动处理 54 分钟 |
| 1:14 - 1:40 | 人工 | 审阅粗剪成片,提出修改意见 |
| 1:40 - 1:55 | 机器 | 根据修改意见重新渲染 |
| 1:55 - 2:00 | 人工 | 最终检查、导出发布 |
机器处理是主体,但人的判断依然很重要。某些内容 AI 觉得应该删掉,但作为创作者你觉得必须保留,直接改决策配置就行。
6. 常见问题与排查
在开发和使用的过程中,我遇到了不少问题。下面把高频问题整理成一个排查表:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 语音转写结果包含大量重复文本 | 没有开启 VAD 过滤,Whisper 产生幻觉 | 在transcribe中开启vad_filter=True,适当调高beam_size |
| AI 剪辑决策把重要内容删掉 | Prompt 中没有说明哪些内容必须保留 | 优化 SYSTEM_PROMPT,增加“核心观点、案例、数据必须保留”的规则 |
| 生成的字幕和画面不同步 | 重新剪切后没有更新字幕时间轴 | 字幕时间轴应基于成片时间线重新计算,不能直接沿用原始转写时间 |
| 视频中有黑屏或卡顿 | 剪切片段边界不够精准,或片段之间缺少转场 | 对每个片段首尾预留 0.2 秒过渡区间,并在拼接时加淡入淡出 |
| ffmpeg 执行时报“Invalid data found” | 素材编码异常或格式不支持 | 先用ffmpeg -v error -i file检查原始文件,必要时统一转码为 MP4/H.264 |
| 转写速度太慢 | CPU 跑大模型,未量化 | 改用small或base模型,compute_type="int8",有 GPU 时改用"float16" |
| LLM 接口返回非 JSON | 部分模型对response_format支持不稳定 | 在解析 JSON 前做异常捕获,必要时提取文本块中的{...}内容再解析 |
排查工具推荐:
# 检查视频完整性和编码信息 ffmpeg -v error -i demo_talk.mp4 -f null - # 查看视频时长、分辨率 ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1 demo_talk.mp4 # 快速截取 3 秒测试片段验证编码参数 ffmpeg -ss 00:01:00 -i demo_talk.mp4 -t 3 -c:v libx264 -preset veryfast test.mp4 -y遇到转写不准的问题,我的建议是先不要盲目换更大的模型,而是先检查原始音频质量。如果录音有回声、底噪很大,再大的模型也救不回来。先做音频降噪,再转写,效果会好很多。
7. 最佳实践与工程建议
7.1 素材规范化
AI 流程最怕的是“输入不可控”。如果素材一会儿横屏、一会儿竖屏,一会儿 30fps、一会儿 60fps,最终拼接时非常容易出现黑边或卡顿。
建议在素材入库时做一次规范化:
- 统一横屏或竖屏;
- 统一分辨率,比如 1920x1080 或 1080x1920;
- 统一帧率,比如 30fps;
- 音频采样率统一为 44100Hz 或 48000Hz。
你可以在material.py中增加一个normalize方法,在进入流水线之前先把素材转成统一规格。
7.2 保持任务可重跑
剪辑是一个反复迭代的过程。第一次自动生成的结果大概率不是最终版本,你需要能够“改一个参数,重新跑一遍”,而不是每次从零开始。
我的做法是:
- 每个任务一个独立目录,保存中间产物;
- 转写结果缓存,避免重复转写;
- 记录每次 AI 决策的 Prompt 版本和模型版本;
- 输出剪辑报告,方便回溯是哪一步出了问题。
很多人在第一次跑通流水线后就不再优化,结果一换素材就翻车。根本原因是中间产物没有缓存,每次都要重新转写和决策,调试成本极高。
7.3 合规与版权注意
使用 AI 辅助剪辑时,有两类合规风险要特别注意。
第一类是语音克隆和肖像权。如果你的方案里涉及 AI 配音、数字人、声音克隆,必须确保获得了相关授权,并在视频中明确告知观众使用了 AI 合成技术。
第二类是素材版权。自动从网络抓取视频、音乐素材时,要确认素材的授权范围。很多 BGM 和视频素材虽然可以下载,但未必允许商用。我建议在流水线里加入“素材来源与授权状态”字段,作为剪辑报告的固定内容。
7.4 保留人工审阅环节
即使 AI 已经能完成粗剪,也不要跳过人工审阅。当前主流模型在处理“语言逻辑”方面已经不错,但对于“画面节奏”“情绪表达”“品牌一致性”这些层级,判断力还是有限的。
我的做法是:
- 把成片压缩成低分辨率版本供快速预览,比如 720p;
- 人工审阅时只关注结构、语气、字幕错误三类问题;
- 修改意见以 JSON 形式反馈到系统,支持局部重剪。
7.5 API Key 与模型配置管理
不要把 API Key 写死在代码里。使用.env文件或环境变量管理敏感信息:
# .env LLM_API_KEY=your-api-key LLM_BASE_URL=https://your-endpoint.example LLM_MODEL=your-model-name并在config.yaml中只保留非敏感配置:
llm: model: ${LLM_MODEL} base_url: ${LLM_BASE_URL} temperature: 0.2 cut: preset: veryfast pix_fmt: yuv420p subtitle: font_size: 18 font_color: "&HFFFFFF" outline: 2 margin_v: 50这样你可以在不修改核心代码的情况下,切换不同的模型服务商,也方便多台机器部署。
8. 总结与后续学习路线
这个 AI 剪辑客户端的核心价值,不是“一键生成视频”这种魔术式体验,而是把中长视频制作里最耗时、最机械的音频转写、文本理解、片段切分、字幕对轴这些环节自动化,把内容创作者从重复劳动中解放出来。
如果你也想尝试,我的建议是从一个小目标开始,不要一开始就追求完整桌面应用。先写一个针对单一口播素材的 Python 脚本,跑通“转写 → 决策 → 剪切 → 字幕”这条最小链路,再逐步扩展为可配置、可复现的客户端。
接下来的学习路线可以参考:
- 先熟悉
ffmpeg的基本命令,尤其是-ss、-t、-c copy、concat的用法; - 学习
faster-whisper的转写接口和 VAD 参数调优; - 设计一套适合自己内容类型的 Prompt,跑通 AI 剪辑决策;
- 加入视频拼接和字幕压制;
- 最后再考虑做本地操作面板、任务队列、批量处理等高级功能。
实际上,当你把这条链路跑通之后,你会发现它不仅能剪口播视频,换一套“目标结构”,它也能用于课程切片、直播切片、会议纪要视频化等场景。关键是你已经拥有了一个可以不断往上面叠加能力的工程框架。动手做一次,比看十篇教程都管用。