短视频制作通常被拆成策划、文案、配音、素材整理、剪辑、字幕、合成多个环节,每一个环节都需要不同工具和人力。随着大语言模型和语音合成技术的成熟,这些环节可以串联成一条自动化的生产流水线。脚本可以由模型按照指定结构生成,配音可以由TTS引擎批量完成,视频画面可以从素材库中按关键词自动匹配,最后通过合成引擎完成渲染。

接下来把这条流程拆成可落地的技术模块,并给出核心环节的代码实现。整个过程的核心在于数据契约:只要脚本生成阶段输出结构化的JSON,后续音频和画面模块就能稳定消费,减少大量格式转换和人工干预。
一、联动流程的整体架构与数据契约
整套系统可以抽象为四个模块:脚本生成器、语音合成器、素材匹配器、视频合成器。脚本生成器负责根据选题或关键词输出结构化的分镜脚本;语音合成器把每一句旁白转成音频文件,并返回时间戳;素材匹配器根据分镜文本中的关键词从本地或在线素材库中检索合适的视频片段或图片;视频合成器将音频、画面、字幕按照时间轴合并输出。
要让这些模块顺畅协作,必须先定义一份清晰的数据契约。推荐使用JSON作为中间格式,脚本中至少包含旁白文本、预计时长、画面关键词、字幕文本等字段。例如:
{
"title": "AI短视频脚本示例",
"scenes": [
{
"narration": "大家好,今天我们来聊聊如何用AI自动生成短视频。",
"duration": 5,
"keywords": ["AI", "短视频", "自动生成"],
"subtitle": "大家好,今天我们来聊聊如何用AI自动生成短视频。"
}
]
}
上例中的duration字段可以由模型估算,也可以由TTS引擎实际生成后回写。实际项目中更推荐后者,因为语音时长比文本字数估算更准确。数据契约还需要考虑扩展字段,例如背景音乐类型、转场效果、画面比例等,但核心字段保持稳定,后续模块就可以独立开发和替换。
这套架构的好处是解耦。脚本生成器可以替换为不同的大模型,语音合成器也可以从在线API切换到本地模型,素材匹配器从简单的关键词匹配升级为向量检索,都不会影响整体流程。只要各模块遵循同一份JSON规范,就能像搭积木一样自由组合。
二、脚本自动生成:提示词设计与结构化输出
脚本生成是整个流程的起点,产出质量直接决定后续视频的观感。要获得稳定的结构化输出,不能只依赖一句简单的“帮我写个脚本”,而需要在提示词中明确角色、输出格式、语言风格和分镜要求。大语言模型在few-shot示例下的表现通常远好于零样本,因此可以准备一到两个高质量的脚本示例作为参照。
下面是一个可运行的Python示例,调用OpenAI兼容接口生成分镜脚本。为了强制模型输出JSON,可以使用response_format参数并配合详细提示词:
from openai import OpenAI
import json
client = OpenAI(api_key="YOUR_API_KEY")
prompt = """
你是一名短视频编导。请根据用户主题生成一个口播类短视频分镜脚本。
要求:
1. 输出JSON数组,每个元素包含narration、duration、keywords、subtitle四个字段。
2. 总时长控制在60秒以内,分镜数量4到6个。
3. 语言自然口语化,避免书面语。
4. 不要输出任何JSON以外的内容。
主题:如何用AI自动生成短视频
"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "你是一个专业的短视频脚本生成器。"},
{"role": "user", "content": prompt}
],
response_format={"type": "json_object"}
)
content = response.choices[0].message.content
script_data = json.loads(content)
print(json.dumps(script_data, ensure_ascii=False, indent=2))
上面的代码中,response_format配置为json_object可以让部分模型直接返回JSON,减少解析失败的概率。但不同模型对该参数的支持程度不同,如果模型不支持,就需要在提示词中反复强调输出格式,并在解析前做一层容错处理。例如先检查首尾是否有花括号,再尝试json.loads,失败时记录原始文本用于重试。
除了基本格式,脚本质量还可以通过给每个分镜补充情绪标签、语速建议、画面描述等字段来提升。情绪标签可以指导TTS引擎选择不同的音色或语调,画面描述则给素材匹配器提供更精确的检索依据。字段越多,后续模块的自动化程度越高,但对模型的输出稳定性要求也越高,需要在简洁和丰富之间做平衡。
三、语音合成与字幕时间轴生成
脚本生成后会得到若干段旁白文本,下一步是把它们转成音频。这里推荐使用edge_tts这类免费且支持多种音色的TTS库。它的优势是无需额外申请语音服务密钥,适合快速验证和小规模生产使用。下面是一段基于edge_tts的异步合成代码:
import edge_tts
import asyncio
async def synthesize(text, voice, output_path):
communicate = edge_tts.Communicate(text, voice)
await communicate.save(output_path)
async def main():
scenes = [
{"narration": "大家好,今天我们来聊聊如何用AI自动生成短视频。", "output": "scene_0.mp3"},
{"narration": "第一步是让大模型生成结构化脚本。", "output": "scene_1.mp3"}
]
voice = "zh-CN-XiaoxiaoNeural"
tasks = [synthesize(s["narration"], voice, s["output"]) for s in scenes]
await asyncio.gather(*tasks)
asyncio.run(main())
生成音频后,字幕时间轴非常关键。如果只把字幕文本和音频按顺序拼接,很难精确对齐每一句出现的时间。edge_tts本身支持生成字幕文件,可以使用Communicate对象的流式接口获取词级或句级时间戳。将每个分镜的音频时长与其字幕时间轴合并,就能得到完整的SRT或ASS字幕内容。
一个常见的做法是先用TTS引擎生成整段旁白音频,同时输出词边界信息,再根据这些边界生成逐字或逐词高亮的字幕。对于短视频来说,逐句字幕通常更实用,也更容易生成。只需记录每个分镜的开始时间和结束时间,拼接时按顺序累加即可。这样在合成阶段就可以把字幕烧录到画面中,或者输出独立字幕文件供平台上传。
四、视频素材匹配与自动合成渲染
音频和字幕就绪后,需要为每个分镜匹配画面素材。最简单的策略是基于关键词从素材库中检索:脚本中的keywords字段可以作为检索标签,与素材库中的标签做匹配。如果素材库规模不大,直接使用集合交集打分即可;如果素材量大,可以引入文本向量模型,把分镜描述和素材描述分别编码后计算余弦相似度,选出最接近的片段。
画面素材匹配完成后,进入合成阶段。MoviePy是一个适合自动化的Python视频处理库,它支持将图片、视频片段、音频和文字叠加合成。下面是一个拼接多段图片并添加旁白和字幕的示例:
from moviepy.editor import ImageClip, AudioFileClip, CompositeVideoClip, TextClip, concatenate_videoclips
def make_scene(image_path, audio_path, subtitle_text, duration):
image = ImageClip(image_path).set_duration(duration).resize(height=1080)
audio = AudioFileClip(audio_path)
text = TextClip(subtitle_text, fontsize=48, color='white', font='Microsoft-YaHei')
text = text.set_position(('center', 800)).set_duration(duration)
video = CompositeVideoClip([image, text]).set_audio(audio)
return video
clip1 = make_scene("scene0.png", "scene_0.mp3", "大家好,今天我们来聊聊如何用AI自动生成短视频。", 5)
clip2 = make_scene("scene1.png", "scene_1.mp3", "第一步是让大模型生成结构化脚本。", 4)
final = concatenate_videoclips([clip1, clip2])
final.write_videofile("output.mp4", fps=24)
这个示例以图片作为画面,适合知识类或资讯类短视频。如果素材库中存在视频片段,可以将ImageClip替换为VideoFileClip,并统一分辨率、帧率和画面比例。需要注意音频和画面时长必须严格一致,否则会出现画面提前结束或音频被截断。可以在合成前读取每个音频的实际时长,再据此设置画面的duration,而不是依赖脚本中估算的duration。
另外,MoviePy在写入视频时会先输出一个临时音频文件,可以通过设置temp_audiofile参数避免路径冲突。批量生成时,建议为每个任务创建独立的工作目录,避免并发任务之间互相覆盖临时文件。合成完成后,还可以用ffmpeg进行二次压缩,平衡画质和文件体积。
五、工程化落地与批量生成优化
当单条视频可以跑通后,下一步是批量生成和工程化。批量任务通常以队列形式组织,脚本生成、语音合成、素材匹配、视频合成各是一个消费者。可以使用消息队列如Redis或RabbitMQ传递任务状态,每个模块独立扩展实例。任务状态记录到数据库,便于重试和追踪失败原因。
成本控制是批量生产时必须考虑的问题。大模型API调用按token计费,语音合成和视频渲染消耗CPU或GPU资源。可以通过缓存脚本模板、复用音频和素材片段来降低成本。例如某些开头和结尾是固定的,可以直接使用预生成音频;热门选题的脚本可以缓存起来,避免重复请求模型。对于不确定的合成参数,先用低分辨率快速验证,再输出高清成片。
另一个容易踩坑的地方是字幕和音频的同步。不同TTS引擎返回的时长精度不同,网络延迟也会影响音频文件的完整性。在拼接前一定要用ffprobe读取实际音频时长,并按照实际时长生成字幕时间轴,而不是完全信任模型估算的duration。对于在线TTS服务,还需要处理超时重试和限流,否则并发量一上来,失败率会明显上升。
最后,整套系统的效果高度依赖脚本质量和素材库覆盖度。脚本生成环节可以加入人工审核步骤,在自动流程中增加一道确认关卡,既能保证内容质量,也能积累更多优质样本用于后续的提示词优化。素材库则需要持续维护标签体系,随着数据量增加逐步替换为向量检索,让画面匹配更接近人工挑选的效果。