
简介这是一套基于n8n构建全自动短视频生产线的开源项目代码包面向具备基础Docker与API调用能力的开发者及AI内容创作者解决短视频从文案生成、视频合成到YouTube自动发布的端到端自动化难题。资源共11个文件含2个核心Python脚本驱动MoneyPrinterTurbo视频生成与API对接、2个Markdown文档README与TODO说明项目结构与待优化项、1个docker-compose.yml定义n8n服务及依赖、1个Shell部署脚本、1个.env配置模板、1个JSON格式n8n工作流定义辅以HTML入口页与.gitignore等工程规范文件整体仅17KB轻量易部署。已有120人学习下载。用户可直接导入工作流、复用已调试的Gemini文案生成链路与YouTube Data API上传逻辑获得跨平台Ubuntu/Debian/macOS/WSL2可运行的完整自动化骨架并参考内建的排错提示与扩展建议快速适配自有内容策略。1. n8n自动短视频工厂用低代码工作流把剪辑、配音、发布全链路串起来适合不想写重复胶水代码的运营/产品/小团队开发者你有没有试过每天手动导出10条短视频素材挨个贴字幕、调音量、加片头片尾再分别上传到抖音、视频号、B站某高校新媒体实验室做过统计单条视频从成片到发布平均耗时22分钟其中76%是机械性操作。而这个「n8n自动短视频工厂」项目不是又一个UI花哨但跑不起来的Demo它是一套经过3轮真实业务压测的可落地源码包——核心用n8n作为调度中枢串联FFmpeg做批量转码、Edge-TTS或本地VITS模型做语音合成、Pillow/PIL做动态字幕渲染、Selenium或官方API做多平台发布。它不替代专业剪辑师但能把“人盯流程”的环节压缩到5分钟以内。适合三类人运营同学想摆脱重复劳动、产品同学要快速验证短视频分发策略、小团队开发者需要可维护、可审计、不黑盒的自动化底座。项目代码结构清晰模块解耦所有外部依赖都做了版本锁和fallback机制不是那种“npm install完就报错”的玩具工程。2. 架构拆解与核心模块选型为什么用n8n而不是Airflow、Node-RED或自研调度器2.1 短视频流水线的四个刚性约束决定了n8n是当前最优解短视频自动化不是简单“下载→转码→上传”它有四个硬性特征异步等待强如TTS生成需秒级响应、状态分支多不同脚本类型走不同配音逻辑、人工卡点频审核通过才触发发布、失败需可溯哪条视频在哪个节点挂了必须一眼看清。我们对比过主流方案Airflow调度能力强但DAG定义重、Web UI对非工程师不友好、单次任务粒度粗最小单位是task难做到“每帧字幕渲染失败就重试”且缺乏开箱即用的HTTP/Webhook/Telegram等轻量集成节点Node-RED可视化强但流程复杂后调试困难错误堆栈不直观无原生重试策略与死信队列多人协作时JSON Flow文件易冲突自研调度器某公司曾用KoaRedis实现半年后发现90%代码在补日志埋点、重试兜底、权限隔离——纯属重复造轮子。n8n胜在平衡点精准它用JSON描述流程可Git管理每个节点自带重试/错误分支/超时控制Web UI支持实时查看每条执行记录的输入输出、耗时、错误详情原生支持150服务接入含抖音开放平台、微信视频号API、B站OAuth2且所有节点源码开源可审计。这不是“因为新就用”而是“在交付周期、可维护性、排错效率三角中它撑住了”。2.2 四大核心模块如何协同从原始脚本到全平台发布的数据流整个工厂按职责划分为四个可插拔模块全部封装为n8n独立Workflow通过webhook或manual trigger串联模块名触发方式核心能力关键依赖script-parser接收Markdown脚本提取分镜、时间轴、角色、台词生成结构化JSONmarkdown-it,regex规则库media-processor接收解析后JSON调用FFmpeg切片/缩放/降噪调用TTS生成音频用PIL合成带字幕MP4ffmpeg-python,edge-tts,PILplatform-publisher接收成品MP4路径按平台要求生成封面图、标题、标签调用各平台API发布requests-oauthlib,selenium-base备用notify-center所有流程结束时触发钉钉/企微机器人推送成功/失败摘要含链接直达n8n执行日志dingtalk-robot,wechat-work-bot提示所有模块均采用“输入-处理-输出”纯函数式设计输入为JSON对象输出为标准n8nitems数组。这意味着你可以单独测试media-processor给它一段含{ audio_url: ..., subtitle: [...] }的JSON它就返回{ output_path: /data/final/xxx.mp4 }不依赖其他模块。2.3 为什么TTS选Edge-TTS而非gTTS或VITS本地部署TTS是短视频工厂的“声带”选型直接决定生成质量与稳定性。我们实测过三种方案gTTS免费、简单但无中文情感控制、无语速调节、无静音段落识别生成的配音像复读机且Google接口在国内偶发超时VITS本地部署效果最好支持音色克隆但显存占用高至少8GB VRAM、启动慢加载模型30s、推理延迟不稳定10s文本需2~8s生成无法满足“每小时百条”的吞吐需求Edge-TTS微软Edge浏览器内置引擎通过edge-tts命令行工具调用中文支持完善含粤语/四川话、语速/音调/停顿可编程控制、单次请求1.5s、无需GPU。我们封装了edge-tts --voice zh-CN-YunxiNeural --rate20% --pitch-5Hz作为默认参数并在media-processor中加入fallback逻辑若Edge-TTS超时则自动切到本地缓存的预录通用配音片段如“接下来为您介绍…”保证流程不中断。实际部署时我们把Edge-TTS封装成Docker服务docker run -p 5000:5000 ghcr.io/coqui-ai/tts-server:edgen8n通过HTTP节点调用彻底解耦。3. 快速上手从零部署n8n短视频工厂的六步实操指南3.1 环境准备Docker Compose一键拉起基础服务项目采用Docker优先部署避免Python环境、FFmpeg版本、字体路径等琐碎问题。以下docker-compose.yml已预置所有依赖# docker-compose.yml version: 3.8 services: n8n: image: n8nio/n8n:latest restart: unless-stopped ports: - 5678:5678 environment: - N8N_BASIC_AUTH_ACTIVEtrue - N8N_BASIC_AUTH_USERvideo-admin - N8N_BASIC_AUTH_PASSWORDyour_strong_password - DB_TYPEsqlite - WEBHOOK_TUNNEL_URLhttps://your-domain.com # 若需公网Webhook volumes: - ./n8n-data:/home/node/.n8n - ./workflows:/home/node/.n8n/workflows # 存放本项目Workflow - ./media:/home/node/media # 媒体文件根目录 networks: - video-net ffmpeg: image: jrottenberg/ffmpeg:4.4-alpine restart: unless-stopped volumes: - ./media:/workspace networks: - video-net tts-server: image: ghcr.io/coqui-ai/tts-server:edge restart: unless-stopped ports: - 5000:5000 networks: - video-net networks: video-net: driver: bridge说明n8n-data卷持久化所有节点配置与执行日志workflows卷用于存放本项目的4个核心Workflow JSON文件media卷是所有输入/输出媒体文件的统一挂载点确保n8n、FFmpeg、TTS服务能共享同一份文件路径。tts-server端口映射为5000后续n8n HTTP节点将调用http://tts-server:5000/v1/tts。3.2 导入Workflow四步完成全流程配置n8n本身不提供“一键导入项目”功能需手动操作。但本项目已将全部逻辑导出为标准JSON步骤极简启动容器docker-compose up -d访问http://localhost:5678用video-admin/your_strong_password登录点击左下角 ⚙️Settings → Credentials → Create new credential创建两项凭证DingTalk Bot填入Webhook地址格式https://oapi.dingtalk.com/robot/send?access_tokenxxxWeChat Work Bot填入企业微信机器人Key格式https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyxxx点击顶部Workflows → Import from file依次上传项目包中的四个JSON文件script-parser.json→media-processor.json→platform-publisher.json→notify-center.json参数说明每个Workflow的Webhook节点已预设路径如/webhook/script你只需在script-parser的Webhook节点中确认URL为http://localhost:5678/webhook/script即可。所有路径、超时、重试次数均已按生产环境调优如FFmpeg节点超时设为300秒TTS节点重试3次间隔1秒。3.3 测试首条视频用curl触发完整流水线别急着传100条脚本先用一条最简Markdown验证端到端是否通畅# 保存为 test-script.md # 标题AI办公小技巧 ## 分镜1 - 时间0:00-0:05 - 角色旁白 - 台词今天教大家一个提升效率的冷知识。 ## 分镜2 - 时间0:05-0:12 - 角色旁白 - 台词在Excel里按CtrlT就能一键把数据变成智能表格。执行触发命令curl -X POST http://localhost:5678/webhook/script \ -H Content-Type: text/markdown \ -d test-script.md逻辑说明该请求会进入script-parserWorkflow解析出2个分镜JSON自动触发media-processor生成/media/output/20240520_142345_final.mp4再触发platform-publisher模拟发布到抖音实际需配置API Key最后notify-center推送成功消息到钉钉。整个过程可在n8n UI右上角“Executions”中实时追踪点击任一执行记录能看到每个节点的输入/输出/耗时/错误详情——这是比日志文件直观10倍的排错方式。4. 避坑指南生产环境踩过的五个真实坑及血泪解决方案4.1 现象FFmpeg节点偶尔卡死n8n执行记录显示“Timeout”但宿主机top看CPU空闲原因Docker默认对容器无内存限制当批量处理高清视频时FFmpeg进程因内存不足被Linux OOM Killer强制终止但n8n只收到SIGKILL信号误判为网络超时。解决在docker-compose.yml的ffmpeg服务下添加内存限制ffmpeg: # ... 其他配置 mem_limit: 2g mem_reservation: 1g并修改media-processor中FFmpeg节点的timeout参数为300秒同时在FFmpeg命令末尾加-v error减少日志体积避免I/O阻塞。4.2 现象Edge-TTS生成的音频开头有0.3秒杂音导致合成视频前几帧无声原因Edge-TTS返回的WAV文件包含前端静音pre-roll这是微软服务固有行为非bug。解决在media-processor的FFmpeg节点中对TTS输出音频做静音切除ffmpeg -i input.wav -af silenceremovestart_periods1:detectionpeak:duration0.1:threshold-50dB -c:a libmp3lame output.mp3该命令检测开头峰值低于-50dB的静音段切除最长0.1秒实测消除99%杂音。4.3 现象抖音API发布时返回{code:10001,message:invalid access_token}但凭证明明刚刷新过原因抖音开放平台access_token有效期2小时n8n的Credential不支持自动续期手动更新后需重启n8n服务才能生效。解决在platform-publisher中移除对Credential的直接引用改用HTTP Request节点调用自建Token刷新服务项目包含token-refresher.py每90分钟调用抖音/oauth/access_token接口并写入SQLite。发布前先查数据库获取最新token彻底解耦。4.4 现象PIL渲染中文字幕时报错OSError: cannot open resource提示找不到字体文件原因n8n容器内无中文字体media-processor中指定的/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc路径在Alpine镜像中不存在。解决在Dockerfile.n8n中增加字体安装步骤项目包已提供FROM n8nio/n8n:latest RUN apk add --no-cache ttf-dejavu ttf-droid \ mkdir -p /usr/share/fonts/truetype \ ln -sf /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf /usr/share/fonts/truetype/wqy-zenhei.ttc然后在docker-compose.yml中改用此镜像并在PIL代码中强制指定字体路径ImageFont.truetype(/usr/share/fonts/truetype/wqy-zenhei.ttc, size48)。4.5 现象多用户同时触发Webhookmedia-processor生成的文件名冲突如都叫final.mp4原因原始脚本未做唯一ID注入所有流程共用同一输出路径变量。解决在script-parser的最后一步用n8n内置表达式生成时间戳随机字符串{ output_path: /media/output/{{$now.format(YYYYMMDD_HHmmss)}}_{{$randomString(6)}}_final.mp4 }并将该output_path作为$input.item.json的字段透传给下游确保每条视频有独立路径彻底规避覆盖风险。5. 进阶技巧用n8n表达式自定义Function节点实现动态分镜与AB测试分发5.1 动态分镜根据脚本关键词自动插入品牌片头/片尾纯靠人工写“片头3秒→正文→片尾5秒”太累。我们在script-parser中嵌入一个Function节点用正则动态注入// n8n Function节点代码 const script $input.item.json.script; // 原始Markdown字符串 let output script; // 若脚本含【品牌】则在开头插入片头指令 if (script.includes(【品牌】)) { output ## 片头\n- 时间0:00-0:03\n- 类型logo动画\n- 资源/media/assets/brand-intro.mp4\n\n${script}; } // 若含【行动号召】则在结尾插入CTA片尾 if (script.includes(【行动号召】)) { output \n\n## 片尾\n- 时间0:00-0:05\n- 类型二维码文字\n- 文字扫码领取《AI办公手册》\n- 资源/media/assets/cta-qr.png; } return [ { json: { parsed_script: output, has_brand: script.includes(【品牌】), has_cta: script.includes(【行动号召】) } } ];说明这段JS直接运行在n8n沙箱中无需额外依赖。它让运营同学只需在Markdown里写【品牌】系统就自动拼接片头写【行动号召】就追加片尾。所有分镜仍走标准解析流程无缝接入后续TTS/渲染。我们测试过2000条脚本正则匹配耗时稳定在3ms内。5.2 AB测试分发按脚本标签分流到不同发布策略短视频常需测试“带字幕版 vs 无字幕版”、“快节奏 vs 慢节奏”效果。传统做法是人工分组而n8n可用IF节点表达式实现全自动分流分流条件目标Workflow作用{{$input.item.json.has_subtitles true}}platform-publisher-subtitle调用带OCR字幕的发布逻辑{{$input.item.json.script.includes(【快节奏】)}}platform-publisher-fast发布时设置抖音“加速播放”参数{{$input.item.json.script.match(/【A组】/g)?.length 0}}platform-publisher-group-a仅推送到抖音视频号具体操作在script-parser输出后加一个IF节点条件栏填{{$input.item.json.has_subtitles true}}True分支连platform-publisher-subtitleFalse分支连platform-publisher-normal。所有发布Workflow共享同一套凭证仅在HTTP Request节点中微调body参数如subtitle_enabled: true。5.3 效果验证用n8n内置WebhookPostgreSQL做闭环数据回传自动化不能只管“发出去”更要“看得见效果”。我们在platform-publisher末尾加了一个HTTP Request节点向自建PostgreSQL服务写入发布记录{ method: POST, url: http://db-service:5432/api/publish-log, body: { video_id: {{$input.item.json.output_path.split(/).pop().replace(_final.mp4,)}}, platform: douyin, publish_time: {{$now.toISOString()}}, script_hash: {{$input.item.json.script_hash}} } }配套的db-service是一个轻量FastAPI服务项目包含api/db_service.py接收后存入publish_logs表。再用n8n的Schedule Trigger每天凌晨2点触发analytics-reportWorkflow查询昨日数据生成Markdown报告通过notify-center推送到钉钉——真正形成“发布→数据采集→分析→反馈”闭环。从那以后我每次上线新功能都强制走一遍curl -X POST http://localhost:5678/webhook/script -d # 标题测试再立刻去n8n Executions里点开最新记录逐节点核对输入输出。不是信不过代码而是信不过自己漏掉的边界条件。这套短视频工厂跑在某公司内容中台已满3个月日均处理视频187条故障率0.3%所有异常均有明确日志定位。希望帮到你。本文还有配套的精品资源点击获取