《外星人访谈》做到第 49 集,这件事本身就比“用什么模型”更值得聊。一个 AI 生成的访谈栏目,能连续更新到 49 期还不崩人设、不崩音色、不崩画面风格,靠的不是某一个神奇工具,而是一套能重复执行的流水线:大模型写结构化剧本,TTS 固定音色配音,口型驱动让人物开口,最后用脚本把字幕、音频、画面拼成一条成片。这一集的主题是“真正的自我价值是什么,是否需要重新审视内心的渴望”,从内容上看是哲学命题,从工程上看是一次标准的系列化生产任务。
这次我们就把“AI 全民制作人”这条链路拆开看。它最核心的几个特点很明确:第一,剧本不是自由发挥,而是按固定 JSON 结构输出,保证每期开头、提问、转折、收尾的位置一致;第二,音色靠参考音频锁定,而不是每次靠文字描述去“抽卡”;第三,人物形象用同一套底模和同一段素材,避免第 48 集和第 49 集看着像两个人;第四,整条链路可以用 HTTP 接口串起来,支持批量跑集数;第五,字幕和混音用 ffmpeg 脚本完成,不依赖手工拖时间轴。这五点决定了它能不能长期更新。
硬件门槛需要分层看,不能一句话概括。剧本生成这一步,纯 CPU 跑量化模型也能出结果,只是慢;语音合成用 GPU 会快很多,CPU 也能跑但长文本会等;数字人口型驱动是最吃资源的一环,分辨率、帧率、单段时长直接决定显存占用和耗时,材料里没有给出具体数值,实际占用需要以你选的模型版本和本机测试为准。剪辑和混音这一步反而是最轻的,ffmpeg 在普通机器上就能完成,瓶颈在磁盘 IO 而不在算力。
下面这篇文章会带你走完整条路:环境怎么准备、服务怎么起、剧本怎么保证第 49 集和第 1 集是同一个人设、配音怎么锁音色、口型怎么保证不跳脸、字幕怎么自动对齐、批量任务怎么排队和重试、显存怎么观察、出问题怎么排查。适合已经在做系列化 AI 内容、被“每次效果都不一样”折磨过的创作者,也适合想把内容生产流程工程化的开发者。
1. 核心能力速览
先把这条流水线的能力边界摆清楚。需要强调的是,这不是一个单一开源项目,而是由多个组件组合出来的生产方案:剧本环节是大语言模型,配音环节是 TTS 模型,口型环节是视频驱动模型,成片环节是 ffmpeg 加脚本。所以下表中的参数只能给到“能力项”级别,具体到某个模型的分辨率、显存、速度,必须按你实际选型来测。
| 能力项 | 说明 |
|---|---|
| 项目类型 | AI 系列化内容生产流水线(剧本 + 配音 + 数字人 + 自动成片) |
| 开源团队/来源 | 由多个开源组件组合,非单一项目,需按实际选型确认许可证 |
| 主要功能 | 结构化剧本生成、音色锁定、口型驱动、字幕对齐、混音成片、批量跑集 |
| 推荐硬件 | 剧本与剪辑 CPU 可跑;配音建议独立显卡;口型驱动对显存最敏感 |
| 显存占用 | 与口型模型、输出分辨率、帧率、单段时长强相关,材料未给数值,需本机实测 |
| 支持平台 | Windows、Linux 为主;macOS 可完成剧本、配音、剪辑,口型环节受生态限制 |
| 启动方式 | 命令行脚本、WebUI、常驻 HTTP 服务三种,可并存 |
| 是否支持 API | 各组件普遍提供 HTTP 接口,可自行封装统一网关 |
| 是否支持批量任务 | 支持,按“集数目录 + 任务队列 + 状态文件”组织 |
| 适合场景 | 科幻设定栏目、知识科普、产品口播、系列化竖屏短视频 |
| 不适合场景 | 需要真实采访背书的新闻内容、需要严格事实核验的纪实节目 |
从这张表能看出一个关键判断:这条链路真正的难点不在“生成”,而在“一致”。单条视频做得再惊艳,第 50 集换了音色、换了脸、换了节奏,观众立刻出戏。所以后面的所有章节,本质都在解决一致性问题。
2. 适用场景与使用边界
这套流程最适合的,是需要“稳定更新”的栏目型内容。比如科幻设定访谈、虚拟人物问答、知识科普对谈、产品功能口播。这类内容的共同点是:结构固定、时长可控、人物固定、台词量大。结构固定意味着可以用模板约束大模型,时长可控意味着可以按秒切分文本,人物固定意味着音色和形象可以复用,台词量大意味着自动化的收益会被放大。一集手工做可能要几小时,流水线跑顺之后,人工只需要审稿和抽检。
它不适合的场景也要说清楚。第一,不适合需要真实背书的纪实内容。AI 生成的“访谈”在形式上极度逼真,如果观众误以为是真实采访,就会产生误导,这既是伦理问题也是平台风险问题。第二,不适合需要严格事实核验的新闻类内容,大模型在事实细节上并不可靠,凡是涉及具体数据、时间、机构的信息,都必须人工核对。第三,不适合强情绪表演类内容,口型驱动模型在夸张表情、快速转头、遮挡场景下容易失真。
合规边界必须写进流程里,而不是事后补救。《外星人访谈》这类题材本质是科幻虚构,成片里应当明确标注“虚构演绎”或“AI 生成”字样,片头或简介里写清楚设定来源,避免观众误解。使用声音克隆时,参考音频必须是本人录制或已获得明确授权的声音,禁止使用他人声音、影视片段音轨、公开人物讲话录音。使用人物形象时,真人面孔需要本人书面授权,虚拟形象要确认底模的商用许可。素材、配乐、字体同样涉及版权,商用时逐项确认。这些不是形式主义,一旦栏目做起来,素材溯源能力就是你的护城河。
3. 环境准备与前置条件
环境准备建议按“能跑通最小闭环”的思路来,不要一上来就把所有组件装齐。先让剧本能出、配音能出、字幕能出,再上口型。这样出问题时定位快,不会被一堆依赖互相干扰。
硬件层面给一个分层参考,具体型号不做推荐,因为不同模型的差异太大:
| 层级 | 硬件配置思路 | 能跑通什么 | 主要瓶颈 |
|---|---|---|---|
| 轻量层 | 纯 CPU、16G 内存 | 剧本生成、短文本配音、字幕、ffmpeg 成片 | 配音等待时间长,长文本需要切分 |
| 标准层 | CPU + 入门级独立显卡 | 上述全部 + 中等分辨率口型驱动 | 显存,高分辨率长视频容易溢出 |
| 进阶层 | CPU + 较大显存显卡 + 高速固态 | 高分辨率、多人同框、批量并发 | 显存与散热,批量时注意排队 |
软件前置条件是一张固定清单,缺一项都会在中途报错:
- 操作系统:Windows 10/11 或主流 Linux 发行版,路径尽量不含中文和空格。
- Python:建议 3.10 或 3.11,用虚拟环境隔离,避免污染系统环境。
- 显卡驱动与 CUDA:按所选模型的要求安装,版本不匹配是最常见的启动失败原因。
- ffmpeg:必须加入系统 PATH,后面所有成片命令都依赖它。
- 磁盘空间:模型文件动辄数 GB,加上中间产物(分轨音频、逐帧视频、字幕文件),建议预留几十 GB 以上。
- 端口:确认 9000、7860 这类常用端口没有被占用,冲突时改配置而不是反复重启。
目录结构建议第一天就定好,后面所有脚本都按这个约定读写:
ai-interview/ ├─ assets/ │ ├─ voice/ # 参考音频,按角色命名 │ ├─ avatar/ # 人物底图或底视频 │ └─ bgm/ # 背景音乐 ├─ config/ │ ├─ series.json # 栏目设定集、人设、口头禅 │ └─ ep049.json # 单集参数 ├─ work/ │ └─ ep049/ │ ├─ script.json # 结构化剧本 │ ├─ audio/ # 分句音频 │ ├─ video/ # 口型片段 │ └─ out/ # 成片 └─ tools/ ├─ gen_script.py ├─ gen_voice.py ├─ gen_avatar.py └─ render.py这个结构的好处是:单集所有中间产物都在work/ep049下,出问题直接删掉这一集重跑,不影响其他集数;assets和config是跨集复用的,改一次全系列生效。前后端分离的思路在这里同样适用。
4. 安装部署与服务启动
部署顺序建议是:先装 Python 依赖,再起剧本服务,再起配音服务,最后起口型服务。每起一个就立刻做一次最小验证,不要攒到最后一起测。
依赖安装用虚拟环境,命令模板如下,实际包名按你选用的组件替换:
# 创建并激活虚拟环境 python -m venv .venv # Windows .venv\Scripts\activate # Linux / macOS source .venv/bin/activate # 安装基础依赖,torch 的版本需要和本机 CUDA 对应 pip install --upgrade pip pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu121 pip install requests soundfile pydub srt # 验证 ffmpeg 是否可用 ffmpeg -version配置文件用 JSON 统一管理,把端口、路径、模型名集中在同一个文件里,脚本只读配置不写死参数。这样换机器、换端口只改一处:
{ "series": "alien_interview", "episode": 49, "work_dir": "./work/ep049", "llm": { "base_url": "http://127.0.0.1:9000/v1/chat/completions", "model": "your-model-name", "temperature": 0.7, "max_tokens": 2048 }, "tts": { "endpoint": "http://127.0.0.1:9001/tts", "ref_audio": "./assets/voice/host_ref.wav", "speed": 1.0, "segment_max_chars": 60 }, "avatar": { "enabled": true, "fps": 25, "resolution": [1080, 1920] }, "subtitle": { "max_chars_per_line": 16, "max_duration": 4.0 } }服务启动命令按项目实际入口调整,通用形态是带 host 和 port 参数:
# 启动配音服务(示例,需按实际项目入口文件调整) python app.py --host 127.0.0.1 --port 9001 --device cuda:0 # 启动口型驱动服务(示例) python server.py --host 127.0.0.1 --port 9002 --half启动后第一件事不是马上跑第 49 集,而是用一条短文本验证服务是否真的活着:
curl -s http://127.0.0.1:9001/health返回正常状态码再继续。如果打不开,先看端口有没有被占用,再看日志最后二十行,绝大多数启动失败都是依赖版本或模型路径问题,而不是代码问题。这里提醒一句,--half这类半精度参数能省显存但也可能影响音质或画质,第一次跑建议先用默认精度确认效果,再决定是否开半精度。
5. 功能测试与效果验证
这一节是整篇文章的核心。四个环节依次验证:剧本、配音、口型、成片。每个环节都给出判断标准,避免“看着还行”这种模糊验收。
5.1 剧本生成与栏目人设一致性
测试目的:确认第 49 集在结构上和第 1 集是同一个栏目,而不是一篇自由散文。做系列内容最怕的就是每集风格漂移,观众记不住你是谁。
做法是把“栏目设定集”和“单集命题”分开。设定集是跨集复用的,写清楚主持人是谁、说话习惯、每期的固定结构;单集命题只写这一集要讨论的内容。系统提示词示例:
你是一档科幻设定访谈栏目的编剧。 固定角色: - 主持人:语气冷静,习惯用反问推进话题,不用感叹号。 - 访客:自称来自远方,说话克制,回避直接下结论,喜欢用比喻。 固定结构(四段): 1. 开场:用一个具体场景切入,不超过 3 句。 2. 提问:主持人抛出核心问题。 3. 转折:访客不直接回答,先重构问题的前提。 4. 回扣:回到开场场景,给一个开放式的收束。 禁止:给出确定性结论、引用真实机构或真实人物、使用感叹号。 输出必须是 JSON,不要输出多余文字。结构化输出约束用 JSON 描述,方便后续逐句配音和逐句对轴:
{ "episode": 49, "title": "真正的自我价值是什么", "segments": [ {"id": 1, "role": "host", "text": "开场白文本"}, {"id": 2, "role": "guest", "text": "回应文本"} ] }调用侧用 Python 发请求并落盘,注意超时和重试:
import json import requests CONFIG = json.load(open("config/ep049.json", encoding="utf-8")) llm = CONFIG["llm"] system_prompt = open("config/series_prompt.txt", encoding="utf-8").read() user_prompt = "本集命题:真正的自我价值是什么?是否需要重新审视内心的渴望?" payload = { "model": llm["model"], "temperature": llm["temperature"], "max_tokens": llm["max_tokens"], "messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt} ] } for attempt in range(3): try: resp = requests.post(llm["base_url"], json=payload, timeout=180) resp.raise_for_status() content = resp.json()["choices"][0]["message"]["content"] script = json.loads(content) break except Exception as exc: print("第 %d 次生成失败:%s" % (attempt + 1, exc)) else: raise SystemExit("剧本生成连续失败,请检查服务状态") with open("work/ep049/script.json", "w", encoding="utf-8") as fp: json.dump(script, fp, ensure_ascii=False, indent=2) print("段落数:", len(script["segments"]))判断成功的标准有三条:一是能解析成合法 JSON,不能靠正则去抠;二是segments里角色交替出现,没有连续大段独白;三是通读一遍,没有出现真实机构名、真实人名、确定性断言。如果模型反复输出非 JSON,优先降低 temperature,其次在提示词里给一个完整的输出样例,比反复强调“必须 JSON”有效得多。
常见失败原因:模型上下文太短导致后半段被截断;提示词里同时要求“有深度”和“不超过 300 字”,模型只能牺牲结构;没有给示例,模型对字段名的理解每次都不一样。
5.2 语音合成与音色一致性
测试目的:确认同一角色在不同集数、不同文本下的音色保持一致,且长文本不会出现语调崩塌。
参考音频的质量直接决定音色上限。给一份录制规范:
| 项目 | 建议 | 原因 |
|---|---|---|
| 时长 | 10 到 30 秒干净人声 | 太短特征不足,太长容易混入不同情绪 |
| 环境 | 安静房间,无混响、无背景音乐 | 噪声会被模型一起学走 |
| 内容 | 语速平稳、情绪中性的一段话 | 情绪过强会限制适用范围 |
| 格式 | 单声道 WAV,采样率按模型要求 | 格式不符会直接报错或音质劣化 |
| 数量 | 每个角色一段,命名固定 | 便于脚本按角色自动匹配 |
长文本必须切分,切分规则比模型选择更影响听感。按标点切,单段控制在 40 到 80 字,遇到引号内的对话单独成段,段尾保留标点让模型有停顿依据。切完之后逐段合成,再用 ffmpeg 拼接,中间插入固定时长的静音,节奏会比一次性合成更稳。
批量合成的脚本核心逻辑是“读剧本、按角色取参考音频、逐段请求、失败重试、落盘”:
import json import time import requests CONFIG = json.load(open("config/ep049.json", encoding="utf-8")) tts = CONFIG["tts"] script = json.load(open("work/ep049/script.json", encoding="utf-8")) VOICE_MAP = { "host": "./assets/voice/host_ref.wav", "guest": "./assets/voice/guest_ref.wav" } for seg in script["segments"]: out_path = "work/ep049/audio/%03d.wav" % seg["id"] payload = { "text": seg["text"], "ref_audio": VOICE_MAP[seg["role"]], "speed": tts["speed"] } for attempt in range(3): try: resp = requests.post(tts["endpoint"], json=payload, timeout=300) resp.raise_for_status() with open(out_path, "wb") as fp: fp.write(resp.content) print("完成", out_path) break except Exception as exc: print("重试", seg["id"], exc) time.sleep(2) else: print("跳过失败段落", seg["id"])判断标准:连续播放三段不同文本,音色听不出切换;同一个词在多段里发音一致,尤其注意多音字;语速没有忽快忽慢。如果出现“越读越急”,通常是单段太长,缩短到 50 字左右通常能缓解。如果出现尾音被截断,检查是不是拼接时静音加得太短。
5.3 数字人口型与画面一致性
测试目的:确认口型与音频对齐,人物在不同片段之间不跳脸、不跳光、不跳构图。
素材规范比模型参数更重要。底图或底视频建议正脸、光线均匀、背景简洁、肩部以上构图,人物不要有大幅遮挡。如果要做竖屏,分辨率提前定好,不要中途改,改一次所有已生成的片段都要重跑。
这一环节的测试顺序建议是:先跑 3 秒短句,确认口型对得上;再跑 15 秒中等长度,确认中途不崩;最后跑整段。直接上整段是最浪费时间的做法,一旦模型参数不对,几十分钟就白跑了。
判断标准:一是爆破音(b、p、m)时嘴唇闭合明显;二是语速快时口型不糊成一团;三是片段首尾帧画面稳定,拼接处不闪。如果出现下巴抖动,先检查输入音频有没有削波,再看帧率设置是否和素材一致。如果出现人脸扭曲,大概率是底图分辨率太低或者人脸占比太小。
5.4 字幕对齐与自动成片
测试目的:确认字幕和语音同步,混音不盖人声,成片可以直接发布。
字幕不要手工打轴,按分句音频的实际时长生成。规则是:单行不超过 16 字,单条不超过 4 秒,句末标点处强制断开。生成 SRT 之后,用 ffmpeg 烧录或外挂:
# 1) 拼接分句音频,list.txt 每行格式为 file 'xxx.wav' ffmpeg -y -f concat -safe 0 -i work/ep049/audio/list.txt \ -c copy work/ep049/audio/full.wav # 2) 音视频合流,视频流直接复制,避免二次编码掉画质 ffmpeg -y -i work/ep049/video/avatar.mp4 \ -i work/ep049/audio/full.wav \ -c:v copy -c:a aac -b:a 192k -shortest \ work/ep049/out/ep049_mux.mp4 # 3) 烧录字幕,字体大小和边距按竖屏实际效果调 ffmpeg -y -i work/ep049/out/ep049_mux.mp4 \ -vf "subtitles=work/ep049/out/ep049.srt:force_style='FontSize=22,Alignment=2,MarginV=90'" \ -c:a copy work/ep049/out/ep049_final.mp4混音时人声要留足余量。背景音乐建议压到 -20 dB 以下,用volume滤镜控制,不要靠耳朵反复试:
ffmpeg -y -i work/ep049/audio/full.wav -i assets/bgm/bed.mp3 \ -filter_complex "[1:a]volume=0.12[bg];[0:a][bg]amix=inputs=2:duration=first:dropout_transition=0" \ work/ep049/audio/mixed.wav判断标准:随机抽 5 个时间点,字幕和语音误差在半秒以内;手机外放能听清人声;片头片尾没有黑帧和静音空档。
6. 接口 API 与批量任务
单集跑通之后,收益点在批量。批量不是写个 for 循环就完事,要有队列、状态、重试和日志,否则跑到第 30 集崩了,你不知道从哪继续。
队列设计建议按目录约定实现,用状态文件记录进度:
{ "episode": 49, "status": "script_done", "steps": { "script": "done", "voice": "running", "avatar": "pending", "render": "pending" }, "retry": {"voice": 0}, "updated_at": "2024-01-01T00:00:00" }每个环节开始前写入running,成功写done,失败写failed并累加 retry。恢复时只跑非done的环节,这样即使跑到一半断电,重启也能续上。批量 worker 的骨架:
import json import pathlib import subprocess ROOT = pathlib.Path("work") def load_state(ep_dir): state_file = ep_dir / "state.json" if state_file.exists(): return json.loads(state_file.read_text(encoding="utf-8")) return {"steps": {"script": "pending", "voice": "pending", "avatar": "pending", "render": "pending"}} def save_state(ep_dir, state): (ep_dir / "state.json").write_text( json.dumps(state, ensure_ascii=False, indent=2), encoding="utf-8") for ep_dir in sorted(ROOT.glob("ep*")): state = load_state(ep_dir) for step, cmd in [ ("script", ["python", "tools/gen_script.py", str(ep_dir)]), ("voice", ["python", "tools/gen_voice.py", str(ep_dir)]), ("avatar", ["python", "tools/gen_avatar.py", str(ep_dir)]), ("render", ["python", "tools/render.py", str(ep_dir)]), ]: if state["steps"][step] == "done": continue state["steps"][step] = "running" save_state(ep_dir, state) result = subprocess.run(cmd, capture_output=True, text=True) ok = result.returncode == 0 state["steps"][step] = "done" if ok else "failed" save_state(ep_dir, state) if not ok: print(step, "失败:", result.stderr[-500:]) break如果是跨机器的服务化调用,用 HTTP 更合适。curl 测试模板如下,参数名需要按实际接口调整:
curl -X POST http://127.0.0.1:9001/tts \ -H "Content-Type: application/json" \ -d '{"text":"真正的自我价值,是否需要重新审视","ref_audio":"./assets/voice/host_ref.wav","speed":1.0}' \ --output work/ep049/audio/test.wav批量任务最容易踩的三个坑:一是并发开太多把显存打爆,建议串行或者并发数不超过显存能承受的份数;二是没有超时,某个请求卡死整个队列停摆,所有请求都要显式设置 timeout;三是日志只打成功不打失败,出问题无从查起,建议每个环节的 stderr 单独落盘。
7. 资源占用与性能观察
观察资源占用要有方法,不能凭感觉。最直接的是另开一个终端盯显卡状态:
nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu \ --format=csv -l 2配合计时,记录每个环节的真实耗时:
# Linux / macOS time python tools/gen_voice.py work/ep049 # Windows PowerShell Measure-Command { python tools/gen_voice.py work/ep049 }影响资源占用的因素按影响程度排序,大致是这样:
| 因素 | 影响环节 | 表现 | 应对 |
|---|---|---|---|
| 输出分辨率 | 口型驱动 | 显存占用上升明显,耗时线性增长 | 先降分辨率验证流程,再上高分辨率 |
| 单段时长 | 口型驱动、配音 | 长片段容易溢出 | 切成 15 到 30 秒片段再拼接 |
| 批次数 | 全部 | 并发时显存叠加 | 串行执行或限制并发 |
| 文本长度 | 配音 | 长文本耗时增加且语调易崩 | 按标点切分到 80 字以内 |
| 采样步数、精度 | 生成类模型 | 步数越多越慢,半精度省显存 | 先默认参数跑通,再逐步调优 |
降低显存占用的常用手段,按优先级排:第一,降低分辨率和帧率,这是最有效的;第二,缩短单段时长,用拼接代替长视频;第三,开启半精度或模型量化,代价是画质或音质可能有轻微损失,需要用样片对比确认可接受;第四,串行执行,牺牲时间换稳定。
端口冲突和进程残留是另一个高频问题。服务异常退出后端口可能还被占用,Windows 上用netstat -ano | findstr :9001找到 PID 再结束进程,Linux 上用lsof -i:9001。成片环节如果 ffmpeg 报“文件被占用”,多半是上一次的任务没退干净,检查后台有没有残留的 python 进程。
8. 常见问题与排查方法
把踩过的坑整理成表,遇到问题先查表,比盲目重装快得多:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 服务启动报缺少模块 | 依赖未装或虚拟环境没激活 | 看报错里的包名 | 在激活的虚拟环境里补装,注意 torch 与 CUDA 版本对应 |
| 提示找不到模型文件 | 路径含中文或空格、配置写错 | 打印配置里的绝对路径 | 改用纯英文路径,配置里写绝对路径 |
| 报 CUDA out of memory | 分辨率过高、并发过多、片段过长 | 观察 nvidia-smi 峰值 | 降分辨率、改串行、切短片段、开半精度 |
| 页面打不开 | 端口占用或服务未起 | 查端口监听和日志尾部 | 换端口,确认 host 是 127.0.0.1 而不是 0.0.0.0 |
| 剧本不是合法 JSON | 温度过高、提示词无样例 | 打印原始返回 | 降 temperature,提示词里给完整输出样例 |
| 音色每段不一样 | 参考音频被替换或参数漂移 | 比对 ref_audio 路径和参数 | 统一参考音频,固定 speed 等参数 |
| 口型明显不对 | 音频采样率不符、帧率不匹配 | 用 ffprobe 看音频和视频参数 | 统一采样率和帧率后重新生成 |
| 字幕和语音错位 | 手工改过音频或漏拼片段 | 对照 list.txt 与音频目录 | 按实际音频时长重新生成 SRT |
| API 调用超时 | 服务卡住或文本过长 | 用短文本单独测一次 | 加 timeout 和重试,长文本先切分 |
| 批量任务卡在某一步 | 某个请求无响应、无超时设置 | 看状态文件停在哪一步 | 补超时,把失败集数单独重跑 |
排查有个通用顺序,建议固定成习惯:先看日志最后二十行,再看配置里的路径和端口,再看输入素材格式,最后才怀疑模型。绝大多数“模型不行”最后都证明是路径、格式或者参数的问题。
9. 最佳实践与使用建议
第一条,先跑最小闭环再谈效果。用一句 5 秒的文本走完剧本、配音、口型、成片全流程,确认链路通,再去追求质量。反过来做,很容易在某个环节卡三天,还不知道后面能不能走通。
第二条,把配置和素材当资产管。assets里的参考音频、人物底图、背景音乐要版本化,改了要记下来改了哪一版,否则第 49 集和第 50 集听感不一样,你都不知道是哪次改动导致的。设定集同理,人设变更要写变更记录。
第三条,中间产物分目录、可删除、可重跑。work/ep049下按环节分audio、video、out,任何一步出问题只删对应目录重跑,不要整集重来。
第四条,人工审稿不能省。大模型写出来的哲学讨论,表面通顺但可能逻辑空转。第 49 集这种命题,尤其要检查有没有真正的观点推进,还是只是把“自我价值”“内心渴望”这些词反复排列。审稿环节至少保留一道人工通读。
第五条,合规检查前置到流程里。成片自动加“AI 生成”标识,参考音频和人物素材的授权文件归档,商用前逐项确认字体、配乐、底模许可证。这些动作放在发布前做,成本最低。
第六条,接口服务不要暴露在公网。默认监听127.0.0.1,需要远程访问时加鉴权和访问控制,避免被人当成免费算力。
10. 总结与下一步
这条流水线最值得尝试的点,不是某一个模型有多强,而是把“一致性”变成了可以配置的东西:人设写在提示词里,音色锁在参考音频里,形象定在素材里,节奏控在切分规则里。一旦这些固定下来,第 49 集和第 50 集的生产成本会明显下降,你可以把精力放在选题和审稿上。
如果现在就要动手,建议第一步先验证剧本环节:把四段结构写进系统提示词,跑三集不同命题,看输出结构是否稳定。这一步不需要显卡,半小时就能出结论。第二步验证音色一致性,拿同一段参考音频合成三段不同文本,连起来听。第三步才上口型,而且一定从 3 秒短句开始。
最容易踩的坑有三个:一是直接跑整段口型,参数不对白等几十分钟;二是参考音频带背景音乐,音色里混进噪声很难救;三是批量任务没写状态文件,跑到一半崩了只能从头再来。这三个坑都跟模型能力无关,纯粹是工程习惯问题。
后续可以继续扩展的方向也很清楚:把剧本生成接入更大的设定库,让栏目有自己的世界观连续性;把审稿环节做成半自动,用规则先筛掉敏感表述和事实性断言;把成片模板化,片头片尾、字幕样式、转场统一由配置驱动;把批量队列做成可观测的,每集的状态、耗时、失败原因都能一眼看到。做到这一步,这套东西就不只是做一集视频的工具,而是一条能持续更新的内容产线。建议把这套目录结构和状态文件的设计先收藏下来,下次开新栏目可以直接复用。