AI自动化短视频变现:Claude+Python+FFmpeg+Whop全流程
2026/9/7 3:58:22 网站建设 项目流程

做 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、调用 FFmpeg3.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/activate

Windows 下激活命令是:

.venv\Scripts\activate

然后安装依赖:

pip install anthropic python-dotenv edge-tts

FFmpeg 不是 Python 包,需要单独安装。macOS 可以用 Homebrew:

brew install ffmpeg

Ubuntu/Debian 可以用 apt:

sudo apt update sudo apt install ffmpeg

Windows 推荐从 FFmpeg 官方站点下载可执行文件,并把ffmpeg.exeffprobe.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 脚本后,视频合成分为四步:

  1. lines里的每一句话生成独立音频。
  2. 测量每段音频的时长,生成字幕时间轴。
  3. ffmpeg把所有音频拼成一条完整口播。
  4. 把背景图、口播、字幕合成 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 时,建议按下面顺序跑通:

  1. 在 Whop 注册账号并创建商品。
  2. 商品类型选择“数字交付”,不涉及实体物流。
  3. 上传图片、定价、填写商品介绍。
  4. 设置交付方式。常见方式是购买后获得一个包含模板文件或社区加入链接的页面。
  5. 自己先下单一次,确认支付、自动交付、客服通知全链路正常。
  6. 把商品链接放进短视频简介、个人主页或内容评论区。

重点不是“做一个看起来很大的店铺”,而是先把一个最小商品跑通。一个能正常支付、正常交付的商品,比十个只上架不维护的商品更有价值。

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 排查顺序建议

遇到问题时,按下面顺序排查,成本最低:

  1. 输入是否正确:主题、JSON 字段、脚本目录是否存在。
  2. 文件路径是否对:相对路径和当前工作目录是否和预期一致。
  3. 依赖版本是否匹配:pip、Python、FFmpeg 版本是否异常。
  4. 环境变量是否生效:API Key、模型 ID 是否有拼写问题。
  5. 中间文件是否生成:音频、字幕、JSON 分别是否完整。
  6. 日志和报错关键字:往上翻异常堆栈,定位到具体函数。
  7. 最小化复现:用一句固定文本跑 TTS,用一条固定命令跑 FFmpeg,排除业务代码干扰。

这条链路最容易忽略的是中间产物。只要保留 JSON、音频、字幕这些中间文件,大部分问题都能通过对比“哪一步没有输出”来定位。

8. 最佳实践:哪些能做,哪些要克制

8.1 内容与版权边界

使用 Claude 和自动化剪辑,不代表可以随意使用他人素材。背景图、音乐、影视片段、字体、他人肖像,都可能涉及版权或肖像权。

建议只使用:

  • 自己拍摄或制作的素材。
  • 原创设计的背景图。
  • 明确可商用、有授权说明的字体和音乐。
  • 平台提供的天然无版权素材库。

发布 AI 生成内容前,还要确认目标平台是否有 AI 内容标注要求。不要隐瞒 AI 生成身份,也不要发布未经审核的医疗、金融、法律建议类内容。

8.2 工程化习惯

把“能用的脚本”变成“能长期维护的脚本”,建议做到:

  • Prompt 不要只写在代码里。可以抽成prompts/system.md这样的文件,方便版本管理。
  • 每次生成的 JSON 保留原始版本,不要覆盖。后续对比不同 Prompt 的效果时很有用。
  • 使用独立工作目录存放中间文件,文件名包含日期或主题标识。
  • 高频函数做好异常处理和日志,避免一条视频卡住整个流程。
  • 不要在高频循环里重复读取.env,启动时加载一次即可。

8.3 可持续迭代路径

新手完成最小流程后,下一步不要急着做复杂平台,而是按这个顺序进阶:

  1. 先连续生成 10 个脚本,检查哪类主题和表达方式更适合你的受众。
  2. 再手工挑选其中 3 个生成视频,对比字幕、语速、背景、时长的体验。
  3. 发布后记录数据:播放量、完播率、点击链接率、转化率。
  4. 把数据好的脚本回填到 Prompt 里,让后续生成更贴近已验证的风格。
  5. 等一个月稳定运行后,再考虑把商品打包成 Whop 订阅制。

这套链路的关键不是找到一个“神秘提示词”,而是把选题、文案、素材、剪辑、交付串成可重复跑的流程。Claude 的价值在批量生成候选,Python 的价值在执行重复剪辑,Whop 的价值在把积累的模板和经验变成可交付产品。真正决定内容能否获得收益的,是对素材的判断、对受众的理解,以及持续运营的耐心。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询