☰
用Codex调度DeepSeek:从自动填词到PV合成的工作流实战
2026/10/10 6:32:46 网站建设 项目流程

这次我们来看一个相当有意思的 AI 应用项目:Codex/Deepseek harness 驱动的填词 PV 工作流。标题全称是“【Codex/Deepseek harness】来起舞吧 李文亚教授特供版填词PV”,本质上它不是在讲某个新模型,而是在讲一套“如何把大模型 API 包装成一条自动填词、自动生成分镜、自动合成 PV 的生产链路”。

说得再直白一点:这件事的核心不是“AI 能不能写词”,而是“怎么用 Codex 这类编程 Agent 去调度 DeepSeek 的歌词生成能力,再叠加字幕、分镜、视频合成工具,最终形成一条可复用的批量化产出流程”。如果你平时做音乐类二次创作、PV 剪辑、歌词字幕批量处理,或者想把大模型的生成能力接进自己的自动化流程里,这篇文章可以直接收藏。

文章会拆解三部分内容:第一,给出这套填词 PV 工作流的核心能力和硬件门槛速览;第二,用可复现的方式演示从环境准备、模型 API 调用、歌词生成、字幕脚本生成到 FFmpeg 合成 PV 的完整过程;第三,补充批量任务设计、接口调用示例、性能观察和排错清单。

1. 核心能力速览

先看一张速览表,把项目的关键信息一次性列清楚。因为该项目不是一个固定成品软件,而是“模型 API + 脚本编排 + 视频合成工具”的组合体,所以下面有些参数是配置建议,实际以你的运行环境为准。

能力项说明
项目类型AI 填词 + PV 制作工作流,属于内容生成与自动化编排
核心组件OpenAI Codex(代码化任务编排)、DeepSeek(中文歌词与内容生成)、FFmpeg(视频合成)
模型调用方式API 调用,本地不需要跑大模型推理
本地硬件门槛较低。只需要能运行 Python 脚本的普通电脑,无 GPU 也可
显存占用无本地推理负载,显存占用基本为 0,API 模式不依赖显卡
支持平台Windows / macOS / Linux,只要能装 Python 和 FFmpeg 即可
启动方式命令行 + Python 脚本编排,无 WebUI
是否支持批量任务支持。可以用循环任务或消息队列批量生成歌词、字幕和分镜脚本
是否有接口 API有。DeepSeek 和 Codex 本身都以 API 方式提供,脚本也可包装成 HTTP 服务
主要输出歌词文本、字幕文件(SRT)、PV 分镜脚本、合成后的 MP4 视频
适合场景二次创作填词、歌词字幕批量制作、个人 PV 生产、短视频素材生成

从这张表能得出一个直接判断:这个项目的重头戏并不在显卡和显存上,而在于“工作流设计”和“提示词工程”。只要你有 API 额度,一台普通的家用电脑就能把整条链路跑通。

2. 适用场景与使用边界

2.1 谁适合用这套工作流

第一类人是音乐二次创作者。他们手里有现成的伴奏或原曲,需要快速产出不同风格的填词版本,过去要手动听歌、记节奏、押韵,现在可以用 DeepSeek 先按指定韵律和主题生成歌词草稿,再人工微调。

第二类人是短剧、短视频、混剪作者。批量准备歌词字幕文件是个体力活,尤其是几十首歌混剪成合集时,SRT 字幕文件逐个手打非常痛苦。用脚本生成可以一次性处理全部字幕,再丢给 FFmpeg 烧进视频。

第三类人是自动化流程开发者。他们并不关心写词本身,而是想把“模型生成 → 文件输出 → 视频合成”封装成一条可编程流水线,供内部工具或 Web API 调用。这套框架正好提供了一个最小实现。

2.2 不适合什么场景

这个工作流不适合追求“一次性生成完整商业级 MV”的场景。AI 生成的歌词始终是草稿,需要人工进行押韵修正和语义润色;PV 的分镜脚本也只是一个方向性参考,最终的视觉表现要靠剪辑师和素材质量决定。它更适合做“效率翻倍”而不是“完全替代”。

另外,如果你完全没有 API 访问额度,也没法申请到 Codex 或 DeepSeek 的接口 key,那本地搭建就只能用开源模型替代,效果和稳定度需要重新测试。

2.3 版权、隐私与合规边界

这里要单独提醒三点:

  • 填词对象如果是已公开的歌曲,请确认原曲的授权范围和二次创作许可。不要拿商业化歌曲的伴奏直接做成商业 PV 分发。
  • 如果填词内容涉及真人姓名、肖像、声音,必须获得对方授权。“李文亚教授特供版”这类标题指向明确个人时,发布前一定要确认本人知情并同意。
  • 调用 API 时,不要在提示词中上传未公开的隐私数据。DeepSeek、Codex 的 API 调用记录会保留一段时间,敏感内容不要走模型生成链路。

3. 环境准备与前置条件

这套工作流的本地依赖不复杂,但每一样都建议提前装好。下面是通用检查清单,具体版本可以按你本机的实际情况调整。

3.1 基础软件清单

软件用途版本建议
Python运行填词脚本、字幕脚本3.9 以上
FFmpeg视频合成、烧录字幕、压制输出6.0 以上
Git拉取官方 SDK 和示例代码最新稳定版
Curl快速调试 API 接口系统自带或额外安装
Node.js如果后续要跑 Codex CLI 或 TS 脚本18 以上

3.2 API Key 准备

调用 DeepSeek API 之前,先到开放平台申请 API Key,把密钥保存好,不要写死在公开仓库里。推荐的方式是写入环境变量:

export DEEPSEEK_API_KEY="sk-xxxxxx" export CODEX_API_KEY="sk-xxxxxx"

Windows PowerShell 下则是:

$env:DEEPSEEK_API_KEY="sk-xxxxxx" $env:CODEX_API_KEY="sk-xxxxxx"

然后测试一下密钥能不能正常连通:

curl https://api.deepseek.com/models \ -H "Authorization: Bearer $DEEPSEEK_API_KEY"

如果能返回模型列表,说明 API 配置完成。

3.3 安装 FFmpeg

FFmpeg 是后面合成 PV 的关键。Windows 用户可以直接下载已编译好的 release 包,把bin目录加入 PATH;macOS 用户用 Homebrew:

brew install ffmpeg

Ubuntu/Debian 用户:

sudo apt update sudo apt install ffmpeg

装完后验证:

ffmpeg -version

看到版本号输出就算成功。

3.4 创建项目目录

推荐把所有工作内容按目录隔离,方便后续批量任务管理:

mkdir -p ai-fill-lyric-pv/{lyrics,scripts,srt,music,output}

lyrics放生成歌词,scripts放分镜脚本,srt放字幕文件,music放伴奏或原曲素材,output放最终合成视频。

4. 填词 PV 工作流:从歌词到成片的链路设计

在写代码之前,先把整条链路拆清楚。一个完整的 AI 填词 PV 工作流包含五个阶段:

  1. 主题解析阶段:确定填词主题、风格、韵脚、篇幅、歌曲段落结构。
  2. 歌词生成阶段:调用 DeepSeek 模型生成歌词,支持多轮修改和局部重写。
  3. 字幕生成阶段:把歌词按时间轴拆成字幕片段,生成 SRT 文件。
  4. 分镜脚本阶段:用 Codex 生成每句歌词对应的视觉画面描述。
  5. 视频合成阶段:使用 FFmpeg 把背景图/视频素材和字幕合成最终 PV。

整个链路可以用一个主控脚本串起来。下面给出一个 Python 调度的伪代码示例,展示核心调度思路:

import subprocess from pathlib import Path def run_lyric_generation(topic, style): # 调用 DeepSeek 生成歌词 # 返回原始歌词文本 pass def run_subtitle_generation(lyrics): # 把歌词按行转成 SRT 字幕 pass def run_storyboard_generation(lyrics): # 调用 Codex 生成分镜描述 pass def run_video_assembly(music_path, srt_path, output_path): # 调用 ffmpeg 生成 PV pass def main(): topic = "起舞" style = "现代流行" lyrics = run_lyric_generation(topic, style) subprocess.run(["python", "generate_srt.py", lyrics]) run_storyboard_generation(lyrics) run_video_assembly("music/input.mp3", "srt/lyrics.srt", "output/pv.mp4") if __name__ == "__main__": main()

流水线设计的关键是“每个阶段只输出标准文件格式”:歌词输出为纯文本或 JSON,字幕输出为 SRT,分镜输出为 Markdown,最后合成阶段只消费这些中间产物。这样任意一步出问题,都不需要重新跑全流程。

5. 本地调用 DeepSeek 模型进行自动填词

进入实践环节。首先演示怎么调 DeepSeek API 生成一段歌词。这里使用openaiPython SDK,因为 DeepSeek 的接口兼容 OpenAI 格式,只需要修改base_url。

5.1 安装依赖

pip install openai python-dotenv

5.2 编写填词脚本

import os from openai import OpenAI client = OpenAI( api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com/v1" ) def generate_lyrics(topic: str, style: str, structure: str = "主歌-副歌-主歌-副歌-桥段-副歌"): system_prompt = ( "你是一名中文作词人,擅长现代流行歌词创作。" "歌词要押韵,要有画面感,避免空洞套话。" f"歌曲结构为:{structure}。" ) user_prompt = f"请围绕主题《{topic}》写一首{style}风格的歌词。" response = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt} ], temperature=0.9, max_tokens=1024 ) return response.choices[0].message.content if __name__ == "__main__": result = generate_lyrics("起舞", "动感流行") print(result)

输出格式为完整歌词文本。从实际体验看,DeepSeek 对中文歌词的韵律把握不错,但同一段歌词里偶尔会出现“不提起舞却偏要硬塞起舞”的语义重复现象。解决方案是添加负面提示词或指定韵脚,例如要求句尾落在“ang”韵上:

user_prompt = ( f"请围绕主题《{topic}》写一首{style}风格的歌词。" "要求:副歌部分句尾统一押 ang 韵。" )

这样生成结果更可控。

5.3 判断生成质量

填词任务是否成功的判断标准有三个:

  • 结构完整:主歌、副歌、桥段都存在,且长度合理。
  • 押韵自然:可接受“近似韵”而非“死韵”。
  • 语义一致:内容紧扣主题,没有离题发挥。

如果生成结果连续多次不满意,优先调整temperature。想要稳定可复用的输出,建议调到0.7~0.9;想要多样化的灵感草稿,可以上调到1.1。

6. Codex/脚本层:分镜、字幕与任务编排

Codex 在这个工作流里的角色不是“作词”,而是“代码生成与任务编排”。你可以让 Codex 帮你生成分镜脚本、字幕处理代码,或者直接用 Codex CLI 批量执行脚本。

6.1 用 Codex 生成分镜脚本

下面是一个通过 Codex 生成每句歌词画面描述的示例思路。假设歌词文本保存在lyrics/lyrics.txt中,Codex 的任务是读取歌词并输出storyboard.md。

codex exec \ --input lyrics/lyrics.txt \ --prompt "读取歌词文件,为每一句歌词生成对应的PV分镜画面描述,要求语言简洁、画面感强、每句画面描述不超过50字" \ --output storyboard.md

输出示例:

歌词分镜画面
夜风穿过霓虹的脉搏城市夜景延时摄影,霓虹灯光流动
脚步踩碎沉默的轮廓人物剪影在空旷街道逆光行走
来起舞吧 别问结果拉远景,人群在广场开始旋转

分镜脚本的作用主要是给剪辑阶段提供镜头方向,不需要生成具体图像素材。想进一步自动化,可以让 Codex 生成 Python 脚本,再次调用 FFmpeg 把对应背景视频片段拼接起来。

6.2 生成 SRT 字幕文件

歌词要变成 PV 上的字幕,需要转成带时间轴的 SRT 格式。可以用一段 Python 脚本处理,按每句歌词的预计时间分配时间轴:

import re from pathlib import Path lyrics = Path("lyrics/lyrics.txt").read_text(encoding="utf-8").splitlines() line_duration = 4.0 # 每句歌词显示4秒 start_time = 0.0 def format_time(seconds): millis = int((seconds - int(seconds)) * 1000) sec = int(seconds) % 60 minute = int(seconds) // 60 % 60 hour = int(seconds) // 3600 return f"{hour:02d}:{minute:02d}:{sec:02d},{millis:03d}" srt_lines = [] for idx, line in enumerate(lyrics, start=1): if not line.strip(): continue end_time = start_time + line_duration srt_lines.append(str(idx)) srt_lines.append(f"{format_time(start_time)} --> {format_time(end_time)}") srt_lines.append(line.strip()) srt_lines.append("") start_time = end_time Path("srt/lyrics.srt").write_text("\n".join(srt_lines), encoding="utf-8") print("生成完成:srt/lyrics.srt")

这只是最简版本。实际项目中如果知道每一句的实际起止时间,最好从剪辑时间线导出,而不是靠估算,否则字幕和音频会对不上。

7. FFmpeg 合成视频:从素材到 PV 成片

视频合成是整条链路的收尾阶段。假设你有一张静态封面图cover.jpg、一段背景视频bg.mp4、伴奏音轨music.mp3和字幕文件srt/lyrics.srt,可以分两步完成合成。

7.1 生成带画面的基础视频

先把背景合成到音频时长:

ffmpeg -loop 1 -i cover.jpg -i music.mp3 -c:v libx264 -tune stillimage \ -c:a aac -b:a 192k -pix_fmt yuv420p -shortest output/base.mp4

如果是动态背景视频,则直接作为视频输入:

ffmpeg -i bg.mp4 -i music.mp3 -c:v libx264 -c:a aac \ -pix_fmt yuv420p -shortest output/base_with_audio.mp4

7.2 烧录字幕

将生成的 SRT 字幕烧录到视频中:

ffmpeg -i output/base.mp4 -vf "subtitles=srt/lyrics.srt:force_style='FontSize=20,PrimaryColour=&HFFFFFF,OutlineColour=&H000000'" \ -c:v libx264 -c:a copy output/pv_packed.mp4

如果你的字幕文件路径包含中文或特殊字符,FFmpeg 的subtitles滤镜有时识别不了,更稳妥的做法是把 SRT 文件重命名为纯英文路径后再执行。

7.3 验证输出

ffprobe output/pv_packed.mp4

检查输出是否有视频流、音频流和时间长度。确认字幕逐句显示,音画同步,整个流程就算跑通。

8. 批量生产与接口 API 调用示例

单首歌词生成只是起步,真正能发挥这套流程价值的是批量任务。

8.1 批量生成歌词

假设有一个topics.json文件,里面定义了多首歌曲的主题和风格:

[ { "topic": "起舞", "style": "动感流行", "output": "lyrics/dance_lyrics.txt" }, { "topic": "晨光", "style": "清新民谣", "output": "lyrics/morning_lyrics.txt" }, { "topic": "远行", "style": "摇滚", "output": "lyrics/journey_lyrics.txt" } ]

Python 批量调用片段:

import json from pathlib import Path tasks = json.loads(Path("topics.json").read_text(encoding="utf-8")) for task in tasks: lyric = generate_lyrics(task["topic"], task["style"]) out_path = Path(task["output"]) out_path.write_text(lyric, encoding="utf-8") print(f"完成:{task['topic']} -> {out_path}")

批量场景中建议加入time.sleep(1)做请求间隔,避免触发 API 限流。

8.2 打包成 HTTP 接口

如果要把填词能力开放给其他服务调用,可以用 FastAPI 包一层 HTTP 接口。示例:

from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class LyricRequest(BaseModel): topic: str style: str @app.post("/generate_lyrics") def generate_lyrics_api(req: LyricRequest): lyric = generate_lyrics(req.topic, req.style) return {"topic": req.topic, "style": req.style, "lyrics": lyric}

启动服务:

uvicorn api_server:app --host 127.0.0.1 --port 8000

调用测试:

curl -X POST http://127.0.0.1:8000/generate_lyrics \ -H "Content-Type: application/json" \ -d '{"topic": "起舞", "style": "动感流行"}'

接口能跑通,后面就可以接到自己的编辑工具或个人网站上。按标题里的 “harness” 思路,甚至可以再挂一层调度器,把多首歌词、多个字幕任务、多个 FFmpeg 任务排队执行。

8.3 失败重试设计

批量任务最容易踩的坑是“某个任务失败,整个流程中断”。推荐每个任务包一层重试:

import time def with_retry(func, retries=3, delay=2): for attempt in range(retries): try: return func() except Exception as e: print(f"第{attempt + 1}次失败:{e}") time.sleep(delay) raise RuntimeError("重试多次仍失败") result = with_retry(lambda: generate_lyrics("起舞", "动感流行"))

日志也要加上,输出到文件而不是只打印在控制台,方便排查卡住的任务。

9. 资源占用与性能观察

9.1 本地资源占用

因为核心生成逻辑全部走 API,本地不加载大模型权重,所以 CPU、内存、显存占用都很低。日常运行只是 Python 进程 + FFmpeg 进程,内存占用通常在几百 MB 级别。唯一消耗资源的是 FFmpeg 合成视频时的编码过程,如果视频分辨率高,CPU 占用会明显上升。

观察方式:

top

或者 Windows 任务管理器里查看 Python、ffmpeg 两个进程的 CPU 和内存占用。

9.2 延迟构成

整条链路的延迟主要来自三个部分:

  • DeepSeek 或 Codex 的 API 响应时间,通常在 3~10 秒之间,取决于输入长度和模型负载。
  • 批量请求的排队时间,如果连续快速请求,可能触发限流导致响应变慢。
  • FFmpeg 视频编码耗时,和视频分辨率、时长、编码器设置直接相关。libx264默认设置下,5 分钟左右的 1080P 视频编码耗时约 2~5 分钟。

9.3 降低耗时方向

优先调整 API 请求参数,例如减少max_tokens,把一次生成的歌词长度控制在合理范围;字幕和分镜脚本用并发请求处理而不是串行调用;视频合成时使用 GPU 加速编码(h264_nvenc或h264_videotoolbox),前提是本机有对应显卡并装好驱动。

10. 常见问题与排查方法

问题现象可能原因排查方式解决方案
API 返回 401 错误API Key 无效或未设置环境变量检查环境变量是否已加载重新配置DEEPSEEK_API_KEY或CODEX_API_KEY
请求超时或一直转圈网络不通或 API 服务不稳定curl 单独测试接口切换网络环境,或加大请求超时时间
歌词输出结构混乱提示词未给出明确段落结构检查 system prompt 是否包含结构要求显式指定“主歌-副歌-桥段”结构
歌词押韵生硬temperature 过高,模型自由发挥过度检查生成参数降低 temperature 到 0.7~0.8
字幕显示不同步SRT 时间轴是估算的用播放器检查字幕时间根据实际音频节奏手动调整时间轴
FFmpeg 找不到字幕文件文件名含中文或特殊字符检查路径改成纯英文路径后重试
合成视频没有声音输入的音频流编码异常用 ffprobe 检查输入文件先转码为 AAC 再合成
批量任务中途失败未加重试机制查看任务日志给请求增加重试和间隔
合成视频画质模糊静态图拉伸分辨率不足检查封面图分辨率使用更高分辨率输入图,或加分倍率处理

11. 最佳实践与合规提醒

11.1 从最小可运行配置开始

第一次跑通不要追求完整效果。先用一首短歌词、一张静态封面、一段 30 秒音频,验证 API 调用、字幕生成、FFmpeg 合成三个核心环节。确认每个环节输出正确后再扩展到批量任务。

11.2 文件目录分层管理

建议按下面的目录结构管理所有中间产物:

project/ ├── lyrics/ # 原始歌词文本 ├── srt/ # 字幕文件 ├── storyboard/ # 分镜脚本 ├── music/ # 音频素材 ├── assets/ # 背景视频或图片 ├── output/ # 最终成片 ├── logs/ # 运行日志 └── scripts/ # Python 脚本

这样跑批量任务时,每个任务只要写入独立子目录,就不会出现文件互相覆盖的问题。

11.3 合规使用提醒

再强调一次,这套工具生成的内容是草稿和辅助素材,不是最终可发布的成品。发布之前必须确认:

  • 原曲素材的授权是否允许二次创作。
  • 歌词内容没有违反平台内容规范。
  • 涉及到真实人物的名称、肖像、声音时,已获得对方授权。
  • 没有把未公开的隐私信息送入 API。

尤其像标题中“李文亚教授特供版”这种明确指向个人的创作,发布前必须经过本人确认,否则极易引发肖像权和名誉权纠纷。

11.4 保留人工审核环节

AI 生成的歌词、分镜、字幕都只能作为初稿。商业发布或正式传播前,至少要做一遍人工校对。重点检查语义是否通顺、有没有政治敏感内容、韵脚是不是自然。

12. 下一步可以怎么玩

这套 harness 工作流的潜力不止步于填词。后续可以从几个方向扩展:

  • 把 DeepSeek 换成其他中文模型,对比不同模型在同一提示词下的填词风格差异。
  • 接入 TTS 引擎,让 AI 生成的歌词直接变成演唱 Demo。
  • 把分镜脚本接入图像生成模型,用 Midjourney 或 Stable Diffusion 批量生成 PV 画面素材。
  • 用 Codex 自动生成更多 FFmpeg 滤镜组合,比如转场、特效、动态字幕样式。
  • 把 HTTP 接口挂到内部工具上,做一个公司内部或社团内部的“歌词 + PV 素材一键生成面板”。

先跑通最小闭环,再按需扩展。最容易踩的坑有三个:API 密钥配置错误、SRT 时间轴偏移、批量任务无日志导致失败难定位。把这三个问题先解决,后续所有功能扩展都会顺畅很多。

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

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

立即咨询