做 AI 自动化短视频变现,最常用的组合是 Claude 负责创意生产,Python + FFmpeg 负责自动化剪辑,Whop 负责数字商品交付。这里说的“自动化”,不是指把剪辑师和运营全部替换掉,而是把选题、文案、配音、字幕、合成视频、商品交付这些重复劳动尽量拆成脚本。爆款无法被一个公式保证,但这套流水线能帮你稳定地产出候选内容,再用数据筛选出真正值得继续投入的方向。
文章面向已经会一点 Python、想尝试 AI 内容生产,但还没有完整跑通过一条链路的开发者。读完以后,你可以得到一条从 Claude 生成脚本、到 FFmpeg 合成竖屏视频、再到 Whop 发布数字商品的最小可运行流程,也知道哪些环节必须保留人工审核。
1. 先理解 Claude、FFmpeg 和 Whop 在短视频链路里的分工
1.1 AI 短视频不是“一键爆款”,而是一条可重复的生产流水线
很多人在短视频变现上卡住的点,不是不会剪辑,而是生产节奏不稳定。今天想到一个选题,写了两小时文案,剪了一下午视频,发布后数据不好又要重新找方向。这种模式很难持续。
AI 自动化的价值,是把“一次性创作”变成“批量测试”。同一个选题,可以让 Claude 生成 5 个不同角度的脚本;同一个脚本,可以快速生成不同背景、不同字幕样式的视频;同一批视频,发布后哪条数据好,就继续往那个方向迭代。自动化解决的不是灵感问题,而是围绕灵感做快速验证的问题。
所以这条链路的正确理解方式,不是“AI 替我爆款”,而是“AI 让我有更多可测试的素材”。
1.2 Claude:不是只写文案,而是批量生成可执行脚本
Claude 在短视频生产里的角色,可以分成三层:
- 第一层是选题和角度。给定一个领域,让它列出受众关心的问题。
- 第二层是口播文案。把选题变成 60 到 90 秒的口播稿,包含开头钩子、中间信息点、结尾行动提示。
- 第三层是发布素材。把口播稿进一步转成标题、简介、话题标签,避免每次发布前还要人工重新整理。
实际使用中,最重要的是让 Claude 输出稳定的 JSON 结构。这样后面的 Python 脚本才能自动解析,不需要每次都清理 Markdown 代码块。
1.3 Whop:把模板和提示词变成可交付的数字商品
Whop 是一个面向数字产品的交易和交付平台,适合卖 Prompt 模板、Notion 模板、课程、付费社区、会员订阅这类虚拟商品。它和短视频生产的关系是:当你积累了一套能跑通的剪辑模板、一套好用的小众 Prompt、一组脚本生成工作流,就可以把这些东西封装成数字商品。
举例来说,你做了一个“用 Claude 批量生成短视频口播稿”的模板,正常卖点不是“保证爆款”,而是“帮你把脚本生产时间从 2 小时缩短到 10 分钟”。在短视频内容里介绍这个模板的使用过程,观看者如果觉得有用,就会通过 Whop 链接购买或订阅。
换句话说,短视频负责获取注意力,Whop 负责承接需求。两者之间靠内容质量和交付体验连接。
2. 环境准备:API、Python、FFmpeg 和目录结构
2.1 环境清单
在开始之前,先确认本机环境是否满足要求。下面的版本只是常见参考,实际项目以你自己的系统版本为准。
| 组件 | 作用 | 常见要求 |
|---|---|---|
| Python | 运行脚本、调用 API、调用 FFmpeg | 3.10 或更高 |
| pip | 安装依赖 | 随 Python 安装 |
| anthropic 包 | 调用 Claude API | 最新稳定版 |
| python-dotenv | 读取本地环境变量 | 最新稳定版 |
| edge-tts | 生成中文语音和音频文件 | 最新稳定版 |
| FFmpeg | 合成视频、处理音频和字幕 | 6.0 或更高 |
| Claude API Key | 身份认证和计费 | 在 Anthropic 控制台创建 |
如果你不想安装 Claude Code,也完全可以跑通本流程。Claude Code 在本方案里是可选项,不是必需项。
2.2 安装依赖
建议先创建虚拟环境,再安装 Python 依赖:
python -m venv .venv source .venv/bin/activateWindows 下激活命令是:
.venv\Scripts\activate然后安装依赖:
pip install anthropic python-dotenv edge-ttsFFmpeg 不是 Python 包,需要单独安装。macOS 可以用 Homebrew:
brew install ffmpegUbuntu/Debian 可以用 apt:
sudo apt update sudo apt install ffmpegWindows 推荐从 FFmpeg 官方站点下载可执行文件,并把ffmpeg.exe、ffprobe.exe所在目录加入系统 PATH。
安装完成后验证:
ffmpeg -version ffprobe -version只要能看到版本号,就说明命令可用。
2.3 准备 Claude API Key 和环境变量
在项目根目录创建.env文件:
ANTHROPIC_API_KEY=你的_API_Key CLAUDE_MODEL=claude-sonnet-4-20250514注意:CLAUDE_MODEL的值要以你当前账号实际可用的模型为准。如果指定的模型不存在,API 会返回模型不可用错误,届时改成账号控制台里看到的模型 ID 即可。
Python 里用dotenv加载配置:
import os from dotenv import load_dotenv load_dotenv() ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY") CLAUDE_MODEL = os.getenv("CLAUDE_MODEL", "claude-sonnet-4-20250514") if not ANTHROPIC_API_KEY: raise RuntimeError("缺少 ANTHROPIC_API_KEY,请检查 .env 文件")不要在代码里硬编码 API Key,也不要提交到 Git 仓库。.env文件应该加入.gitignore。
2.4 目录设计
建议把脚本生成、音频生成、视频合成分成不同目录,避免一个目录塞满中间文件:
short_video_pipeline/ ├── .env ├── .gitignore ├── scripts/ │ ├── generate_script.py │ ├── synthesize_audio.py │ └── build_video.py ├── data/ │ ├── scripts/ │ ├── audio/ │ └── videos/ ├── assets/ │ └── background.jpg └── output/这样的好处是,出问题时可以直接检查某个阶段的产品,不用每次从头跑。
3. 用 Claude 批量生成短视频脚本和发布素材
3.1 为什么必须用结构化输出
如果只用自然语言让 Claude 写文案,返回结果里可能包含标题、解释、代码块标记,后面的程序很难自动处理。更好的做法是明确要求返回 JSON,并且在解析失败时重试一次。
这里说的“结构化”,就是把一条短视频拆成这些固定字段:
title:视频标题hook:前三秒的开场白lines:口播稿的逐句列表caption:发布时的简介hashtags:话题标签列表
固定字段的意义在于,后续无论是生成音频、生成字幕,还是生成发布文案,都能基于同一份数据完成。
3.2 调用 Claude API 生成脚本
下面这段代码用于生成单个短视频脚本。实际项目中,你可以把它放在循环里,一次生成多个备选主题。
import json import os from pathlib import Path import anthropic from dotenv import load_dotenv load_dotenv() client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) MODEL_NAME = os.getenv("CLAUDE_MODEL", "claude-sonnet-4-20250514") def generate_script(topic: str) -> dict: system_prompt = """ 你是一名短视频内容策划。你擅长把复杂知识讲成口语化、有节奏感的短视频文案。 注意: 1. 只输出 JSON,不要输出 Markdown 代码块。 2. 口播稿控制在 60-90 秒。 3. 前三秒要有明确信息点,不要用空洞的“大家好”。 4. 文案要适合中文配音,避免过长从句。 """ user_prompt = f""" 请为主题生成一条短视频脚本,主题是:{topic} 输出 JSON 格式如下: {{ "title": "标题", "hook": "开场三秒的话", "lines": ["第一句口播", "第二句口播", "第三句口播"], "caption": "发布简介", "hashtags": ["话题1", "话题2", "话题3"] }} """ message = client.messages.create( model=MODEL_NAME, max_tokens=2000, temperature=0.8, system=system_prompt, messages=[ {"role": "user", "content": user_prompt} ], ) content = message.content[0].text data = json.loads(content) required_keys = {"title", "hook", "lines", "caption", "hashtags"} if not required_keys.issubset(data.keys()): raise ValueError(f"Claude 返回的 JSON 缺少必要字段: {data}") return data if __name__ == "__main__": script = generate_script("3 个让短视频不枯燥的剪辑习惯") output_dir = Path("data/scripts") output_dir.mkdir(parents=True, exist_ok=True) output_path = output_dir / "script_001.json" output_path.write_text(json.dumps(script, ensure_ascii=False, indent=2), encoding="utf-8") print(f"脚本已保存: {output_path}")这里有几个关键点:
max_tokens是必填参数,不填会直接报错。temperature=0.8是偏保守的设置。如果发现文案太模板化,可以提高到 1;如果发现结构不稳定,可以降到 0.6。json.loads要求模型输出纯 JSON。如果模型偶尔输出带 ````json` 的代码块,可以做一个清理函数,去掉首尾的反引号。
3.3 得到一份可供后续阶段使用的 JSON
一次正常执行的产物类似这样:
{ "title": "3 个让短视频不枯燥的剪辑习惯", "hook": "为什么别人随手剪的视频能留住人?", "lines": [ "第一个习惯,前 3 秒只放一个明确信息。", "第二个习惯,字幕不要铺满全屏,只保留关键信息。", "第三个习惯,结尾一定要给一个行动提示。" ], "caption": "3 个可以直接用的剪辑习惯,尤其适合新手。", "hashtags": ["短视频剪辑", "效率工具", "AI工具"] }后面合成视频时,程序可以把lines转成语义比较完整的一句话音频,再根据每句话的长度生成字幕时间轴。
3.4 人工审核是质量下限
不要把 Claude 生成的内容直接发布。即使模型能力再强,也仍然可能出现事实错误、表达过度夸张、信息过时等问题。
建议在生成脚本后增加一个审核环节:
- 口播稿里有没有事实错误。
- 有没有可能构成误导或夸大承诺。
- 有没有涉及他人隐私或版权内容。
- 标题和封面信息是否和正文一致。
审核方式可以是在脚本目录里打开 JSON 文件逐条确认,也可以做成一个简单的审核记录字段,例如在 JSON 里追加"reviewed": true。
4. 用 Python + FFmpeg 把脚本合成为竖屏视频
4.1 这一阶段要做什么
拿到 JSON 脚本后,视频合成分为四步:
- 把
lines里的每一句话生成独立音频。 - 测量每段音频的时长,生成字幕时间轴。
- 用
ffmpeg把所有音频拼成一条完整口播。 - 把背景图、口播、字幕合成 1080x1920 的竖屏视频。
这里的背景可以先使用自己制作的纯色底图或原创素材。不要直接使用未经授权的影视片段、音乐和他人作品。
4.2 生成音频和字幕时间轴
下面代码使用edge-tts生成中文语音,并用ffprobe获取每段音频时长。edge-tts需要联网调用在线语音合成服务,因此运行时要有正常的网络连接。
import asyncio import json import subprocess from pathlib import Path import edge_tts VOICE = "zh-CN-XiaoxiaoNeural" def srt_time(seconds: float) -> str: hours = int(seconds // 3600) minutes = int(seconds % 3600 // 60) secs = int(seconds % 60) millis = int(round((seconds - int(seconds)) * 1000)) return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}" async def tts_to_file(text: str, output_path: Path) -> None: communicate = edge_tts.Communicate(text, VOICE) await communicate.save(str(output_path)) def get_audio_duration(audio_path: Path) -> float: result = subprocess.check_output( [ "ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", str(audio_path), ], text=True, ) return float(result.strip()) def build_audio_and_srt(script: dict, work_dir: Path) -> None: work_dir.mkdir(parents=True, exist_ok=True) audio_paths = [] srt_entries = [] cursor = 0.0 gap = 0.15 for index, line in enumerate(script["lines"]): audio_path = work_dir / f"line_{index:02d}.mp3" asyncio.run(tts_to_file(line, audio_path)) duration = get_audio_duration(audio_path) start = cursor end = cursor + duration audio_paths.append(audio_path) srt_entries.append((start, end, line)) cursor = end + gap concat_file = work_dir / "concat.txt" concat_file.write_text( "\n".join(f"file '{path}'" for path in audio_paths), encoding="utf-8", ) subprocess.run( [ "ffmpeg", "-y", "-f", "concat", "-safe", "0", "-i", str(concat_file), "-c:a", "aac", str(work_dir / "voiceover.m4a"), ], check=True, ) srt_path = work_dir / "subtitles.srt" with srt_path.open("w", encoding="utf-8") as f: for index, (start, end, line) in enumerate(srt_entries, 1): f.write(f"{index}\n") f.write(f"{srt_time(start)} --> {srt_time(end)}\n") f.write(f"{line}\n\n") print(f"音频已生成: {work_dir / 'voiceover.m4a'}") print(f"字幕已生成: {srt_path}") if __name__ == "__main__": script_path = Path("data/scripts/script_001.json") script = json.loads(script_path.read_text(encoding="utf-8")) build_audio_and_srt(script, Path("data/audio/script_001"))这段代码的关键点是:
- 每句话单独生成音频,而不是整段生成。这样字幕时间可以精确对齐到句子。
gap = 0.15表示句间停顿,避免整段音频听起来太赶。- 字幕文件按标准 SRT 格式写入,FFmpeg 可以直接读取。
4.3 用 FFmpeg 渲染竖屏视频
音频和字幕准备好后,用下面命令合成视频。这里假设background.jpg是一张 1080x1920 的原创背景图。
ffmpeg -y \ -loop 1 -i assets/background.jpg \ -i data/audio/script_001/voiceover.m4a \ -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,subtitles=data/audio/script_001/subtitles.srt:force_style='FontSize=18,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,Outline=2'" \ -c:v libx264 -tune stillimage \ -c:a aac -b:a 192k \ -pix_fmt yuv420p \ -shortest \ output/script_001.mp4参数含义:
-loop 1:让背景图循环,避免视频只有一帧。-vf scale:确保画面适配 1080x1920 竖屏。subtitles:把 SRT 字幕烧录进画面。-tune stillimage:适合图片加音频这类场景。-pix_fmt yuv420p:保证视频能在大多数播放器和平台正常播放。-shortest:在音频结束时停止输出。
如果背景素材是视频,可以把第一行改成:
ffmpeg -y \ -stream_loop -1 -i assets/background.mp4 \ -i data/audio/script_001/voiceover.m4a \ ...4.4 验证合成结果
视频生成后,用ffprobe检查格式:
ffprobe -v error \ -show_entries stream=codec_type,width,height,duration \ -of default=noprint_wrappers=1 \ output/script_001.mp4预期能看到:
- 视频流:
codec_type=video - 音频流:
codec_type=audio - 宽度:
1920,高度:1080
也可以手动播放一遍,重点检查字幕是否有明显错位、音频是否完整、人脸或文字是否被裁切。
5. 用 Whop 搭建交付和收益闭环
5.1 Whop 适合承接哪些数字商品
当你的短视频内容开始有人观看后,需要有一个地方承接流量。Whop 的典型使用方式是:在视频简介或评论区放一个 Whop 商品链接,用户点击后可以查看商品详情并完成支付,支付后自动获得访问权。
适合放在 Whop 上的商品包括:
| 商品类型 | 示例 | 特点 |
|---|---|---|
| 一次性模板 | Claude 短视频脚本生成模板、Notion 选题库 | 门槛低,容易转化 |
| 付费订阅 | 每周脚本包、剪辑模板更新 | 需要持续更新,黏性更高 |
| 素材包 | 原创背景图、字幕样式文件 | 制作一次可重复出售 |
| 小课程 | 从 0 搭建今天这套流水线的录屏 | 价格可以更高,但交付成本也更高 |
这里不推荐卖“保证播放量”“保证涨粉”的服务,因为结果不可控,容易变成虚假承诺,也会给自己带来售后压力。
5.2 最小落地顺序
第一次使用 Whop 时,建议按下面顺序跑通:
- 在 Whop 注册账号并创建商品。
- 商品类型选择“数字交付”,不涉及实体物流。
- 上传图片、定价、填写商品介绍。
- 设置交付方式。常见方式是购买后获得一个包含模板文件或社区加入链接的页面。
- 自己先下单一次,确认支付、自动交付、客服通知全链路正常。
- 把商品链接放进短视频简介、个人主页或内容评论区。
重点不是“做一个看起来很大的店铺”,而是先把一个最小商品跑通。一个能正常支付、正常交付的商品,比十个只上架不维护的商品更有价值。
5.3 不要把 Whop 当成“一夜暴富工具”
短视频流量有波动,商品转化也受价格、评价、内容热度影响。自动化能帮你提高生产效率,但不能替你决定用户是否信任你。
关于收益,更稳妥的理解是:短视频负责让用户知道“有这么一套方法”,Whop 负责让用户付费获取“整理好的方法”。收益来自内容质量、交付体验和持续运营,而不是来自某个关键词或某个平台的“自动分账”。
6. 把流程编排成定时任务,并区分测试和生产环境
6.1 用一段 Python 编排完整流程
前面几段是分散的脚本,实际生产时建议用一个入口脚本把它们串起来。
import json from pathlib import Path from generate_script import generate_script from synthesize_audio import build_audio_and_srt def run_pipeline(topic: str, work_id: str) -> None: script = generate_script(topic) script_dir = Path("data/scripts") script_dir.mkdir(parents=True, exist_ok=True) script_path = script_dir / f"{work_id}.json" script_path.write_text( json.dumps(script, ensure_ascii=False, indent=2), encoding="utf-8", ) audio_dir = Path("data/audio") / work_id build_audio_and_srt(script, audio_dir) print(f"{work_id} 已完成,可以检查后手动渲染视频") if __name__ == "__main__": run_pipeline("3 个让短视频不枯燥的剪辑习惯", "script_001")这个入口脚本只做到音频和字幕,视频渲染可以保留为手动命令。因为视频渲染参数多、背景素材经常要人工挑选,完全无人工的链路不适合作为初始方案。
6.2 定时执行常见配置
如果你已经确定了选题池,想让 Claude 每天自动生成几份候选脚本,可以通过 cron 或系统计划任务定时执行。
Linux/macOS 的 crontab 示例:
0 9 * * * cd /home/user/short_video_pipeline && /home/user/short_video_pipeline/.venv/bin/python scripts/generate_script.py这里只定时生成脚本,不建议定时自动发布。短视频平台的审核规则、内容规范、AI 内容标注要求都可能变化,发布前必须有人工确认。
6.3 生产环境必须补的保障
学习环境里跑通一个视频,和生产环境持续运行是两件事。生产环境至少要考虑:
| 关注点 | 建议 |
|---|---|
| API Key 安全 | 放到环境变量或密钥管理服务,不要写到代码里 |
| 成本控制 | 给 Claude API 和语音合成设置月度预算或调用上限 |
| 日志 | 每个阶段输出日志,至少记录生成了哪个文件、耗时多少 |
| 幂等性 | 每次运行使用独立work_id,避免覆盖上次结果 |
| 素材版权 | 背景图、音乐、字体都要有合法授权 |
| 平台规则 | 发布前确认目标平台对 AI 生成内容的标注要求 |
| 回滚 | 保留脚本 JSON 和音频中间文件,视频不满意可以只重新渲染 |
7. 这条链路最常见的 6 个卡点
7.1 现象、原因、排查和修复
下面的表格整理了我实际使用中遇到比较多的问题。
| 问题现象 | 常见原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| Claude API 返回模型不可用 | CLAUDE_MODEL填了账号不可用的模型 | 打开模型列表接口或控制台确认可用模型 | 换成账号显示的模型 ID |
.env不生效 | 没有安装 python-dotenv,或环境变量已存在 | 打印os.getenv("ANTHROPIC_API_KEY") | 确认已load_dotenv(),并重启终端 |
| edge-tts 生成空文件 | 网络异常或文本包含特殊字符 | 检查 mp3 文件大小是否接近 0 | 增加重试逻辑,过滤无效字符 |
| FFmpeg 找不到命令 | ffmpeg 未安装或未加入 PATH | 执行ffmpeg -version | 安装后重新打开终端 |
| 字幕不显示 | SRT 编码不对,或字体路径无法解析 | 用播放器单独打开 SRT 文件 | 确认文件是 UTF-8,并检查subtitles滤镜路径 |
| Whop 下单后没有收到交付 | 自动交付规则没有配置 | 用测试账号下一笔小额订单 | 检查商品交付方式、邮件通知和自动邀请链接 |
7.2 排查顺序建议
遇到问题时,按下面顺序排查,成本最低:
- 输入是否正确:主题、JSON 字段、脚本目录是否存在。
- 文件路径是否对:相对路径和当前工作目录是否和预期一致。
- 依赖版本是否匹配:pip、Python、FFmpeg 版本是否异常。
- 环境变量是否生效:API Key、模型 ID 是否有拼写问题。
- 中间文件是否生成:音频、字幕、JSON 分别是否完整。
- 日志和报错关键字:往上翻异常堆栈,定位到具体函数。
- 最小化复现:用一句固定文本跑 TTS,用一条固定命令跑 FFmpeg,排除业务代码干扰。
这条链路最容易忽略的是中间产物。只要保留 JSON、音频、字幕这些中间文件,大部分问题都能通过对比“哪一步没有输出”来定位。
8. 最佳实践:哪些能做,哪些要克制
8.1 内容与版权边界
使用 Claude 和自动化剪辑,不代表可以随意使用他人素材。背景图、音乐、影视片段、字体、他人肖像,都可能涉及版权或肖像权。
建议只使用:
- 自己拍摄或制作的素材。
- 原创设计的背景图。
- 明确可商用、有授权说明的字体和音乐。
- 平台提供的天然无版权素材库。
发布 AI 生成内容前,还要确认目标平台是否有 AI 内容标注要求。不要隐瞒 AI 生成身份,也不要发布未经审核的医疗、金融、法律建议类内容。
8.2 工程化习惯
把“能用的脚本”变成“能长期维护的脚本”,建议做到:
- Prompt 不要只写在代码里。可以抽成
prompts/system.md这样的文件,方便版本管理。 - 每次生成的 JSON 保留原始版本,不要覆盖。后续对比不同 Prompt 的效果时很有用。
- 使用独立工作目录存放中间文件,文件名包含日期或主题标识。
- 高频函数做好异常处理和日志,避免一条视频卡住整个流程。
- 不要在高频循环里重复读取
.env,启动时加载一次即可。
8.3 可持续迭代路径
新手完成最小流程后,下一步不要急着做复杂平台,而是按这个顺序进阶:
- 先连续生成 10 个脚本,检查哪类主题和表达方式更适合你的受众。
- 再手工挑选其中 3 个生成视频,对比字幕、语速、背景、时长的体验。
- 发布后记录数据:播放量、完播率、点击链接率、转化率。
- 把数据好的脚本回填到 Prompt 里,让后续生成更贴近已验证的风格。
- 等一个月稳定运行后,再考虑把商品打包成 Whop 订阅制。
这套链路的关键不是找到一个“神秘提示词”,而是把选题、文案、素材、剪辑、交付串成可重复跑的流程。Claude 的价值在批量生成候选,Python 的价值在执行重复剪辑,Whop 的价值在把积累的模板和经验变成可交付产品。真正决定内容能否获得收益的,是对素材的判断、对受众的理解,以及持续运营的耐心。