逍遥派小无相功,无形无相,催动天下武学。 在视频创作里:以「乾坤大挪移」拆解参考视频的内力(叙事结构、节奏、形式语言), 以小无相功催动之,复刻重生为全新主题的成片。
小无相功是一个 AI Agent Skill(工作技能包),构建于 qiankun-video-shift(乾坤大挪移) 的拆解能力之上,覆盖从参考视频到成片交付的完整流水线:
拆解参考视频(乾坤大挪移前三式)
→ 原创同构稿件
→ 配音(真人实录 / 火山引擎 TTS 二选一)
→ 可选数字人出镜(授权肖像 + 最终配音)
→ 词级对齐字幕(原稿文本 + 真实语音时间,绝不用 ASR 原文)
→ Remotion 成片(1080×1920 竖屏,主渲染器)
→ 可选音效混音
→ 技术验收 + AI/人工画面复核
→ 交付
在支持 Skill 的 AI Agent(如 WorkBuddy / Claude Code)中安装后,直接说:
- "用小无相功流程做一条 XX 主题的视频"
- "复刻这条参考视频,主题换成 XX"
- "拆解这条爆款并仿拍一条"
首次使用会先跑安装预检,并向你一次性索取所需的凭据(见下)。
新机器装完 skill 后,先跑预检再开工。 预检是只读的——不安装任何软件、不写入任何文件:
python3 scripts/preflight.py --project-root . # 两条路线都按必需校验
python3 scripts/preflight.py --project-root . --route A # 已定真人实录:不要求 TTS 凭据
python3 scripts/preflight.py --project-root . --route B # 已定火山 TTS:凭据缺失即失败
python3 scripts/preflight.py --project-root . --route B --avatar # TTS + 火山数字人
python3 scripts/preflight.py --project-root . --json # 机器可读它盘四类前置:运行时(Python / Node / npm / git / faster-whisper / Chrome)、媒体工具链
(复用乾坤大挪移的 check_environment.py)、依赖仓库、网络可达性;再按路线校验凭据。
未通过时会把「需要用户提供的凭据」单独列出来,便于一次性索取。
乾坤大挪移的媒体工具链会一路找到 ~/.codex/skills/*/node_modules 里 ffmpeg-static
之类的捆绑二进制。在没有系统 ffmpeg 的机器上那样确实能跑通,但那个 skill 一卸载或更新,
抽帧与分镜就会静默失效,而报错不会指向真正原因。
预检因此会单独盯一件事:媒体二进制来源是否稳固。没过就跑这个脚本,装一份独立的:
bash scripts/install_ffmpeg.sh # 默认装到 ~/.local/bin
bash scripts/install_ffmpeg.sh --check # 只体检,看当前来源是否独立
bash scripts/install_ffmpeg.sh --proxy http://127.0.0.1:7890
bash scripts/install_ffmpeg.sh --force # 同版本也重装macOS 原生 arm64/amd64 静态构建,强制 SHA-256 校验(不通过即中止、绝不安装), 免 Homebrew、免 sudo,装完自动清 quarantine 扩展属性。幂等:版本一致时直接跳过。
预检报告头会给出「流水线解释器」,后续所有 Python 脚本都用它跑:
流水线解释器:/Users/…/python/envs/default/bin/python
faster-whisper 等依赖装在隔离 venv 里,而 PATH 中 python3 往往先解析到没有依赖的
那个解释器——直接 python3 scripts/align_subtitles.py 会 ImportError,跑预检也会
误报"缺 faster-whisper"(依赖其实装着)。
预检因此不假定当前解释器,而是按 当前解释器 → envs/default → .venv → venv → env
的顺序,找一个实跑 import faster_whisper 成功的解释器。只看目录存在是不够的——
目录在而依赖没装很常见。
| 凭据 | 环境变量 | 何时必需 | 从哪里拿 |
|---|---|---|---|
| 火山引擎 AppID | VOLC_TTS_APPID |
路线 B | 火山引擎控制台 → 语音技术 → 语音合成 → 应用管理 |
| 火山引擎 Access Token | VOLC_TTS_ACCESS_TOKEN |
路线 B | 同上(与 AppID 同页) |
| 火山引擎音色 voice_type | VOLC_TTS_VOICE |
路线 B | 控制台音色列表;须已下单/授权 |
| 业务集群 | VOLC_TTS_CLUSTER |
一般不用 | 默认 volcano_tts |
| 火山视觉 API AK/SK | VOLC_ACCESSKEY / VOLC_SECRETKEY |
选择火山数字人时 | 火山引擎控制台 → 访问控制 → 访问密钥;需有视觉智能 CV 权限 |
| TOS 桶 | VOLC_TOS_BUCKET / VOLC_TOS_REGION / VOLC_TOS_ENDPOINT |
本地肖像/音频自动上传时 | 单独开通对象存储并创建 Bucket;语音合成不会自动分配 |
| GitHub 凭据 | GITHUB_TOKEN |
仅私有仓库 / 发布产物 | classic PAT(repo scope) |
取值优先级:命令行参数 > --config creds.json > 环境变量。模板见 scripts/creds.example.json。
凭据不入源码、不入仓库、不进报告——.gitignore 已预置 creds.json / *.env。
SKILL.md 技能主文档(预检 + 六段流水线 + 决策点 + 避坑清单)
.gitignore 预置凭据与生成物忽略规则
requirements-digital-human.txt 本地 TOS 上传 SDK(数字人本地文件模式按需安装)
scripts/
├── preflight.py 安装预检:凭据 / 运行时 / 媒体工具链 / 依赖仓库 / 网络(只读)
├── install_ffmpeg.sh 装独立 ffmpeg/ffprobe(SHA-256 校验,免 sudo / 免 Homebrew)
├── creds.example.json 凭据模板(复制为 creds.json 并填入)
├── align_subtitles.py 字幕对齐器:原稿 + faster-whisper 词级时间戳 → SRT
├── volcano_tts_batch.py 火山引擎 TTS 批量配音 + 主音轨拼接 + 音量归一
├── volcano_digital_human.py 火山 OmniHuman 1.5 数字人片段生成(可选)
├── sfx_mix.py 音效混音、口播侧链压低与峰值限制(可选)
├── media_qc.py 成片技术验收报告
└── render_remotion.sh Remotion 一键渲染(系统 Chrome,免 Headless 下载)
- qiankun-video-shift(拆解前三式)
- video-talkcraft(Remotion 剪辑)
- Python 3 + Node 22+
- ffmpeg / ffprobe —— 用
scripts/install_ffmpeg.sh装一份独立的(不要依赖其他 skill 的捆绑件) - faster-whisper(词级转写)
- 路线 B 另需火山引擎语音合成凭据(AppID / Access Token / 音色),纯 HTTPS 调用、无额外 pip 依赖
- 数字人可选:火山 OmniHuman 1.5 需要视觉服务 AK/SK;本地文件上传 TOS 时另装 requirements-digital-human.txt,并使用自有 Bucket
一条视频的声音来源仍二选一:真人实录,或火山引擎 TTS。是否使用数字人是另一个选择:可以不出镜、使用授权真人视频,或用授权肖像和已完成的配音生成火山数字人。数字人可驱动真人录音或 TTS 音频。
模型用单张图片和音频生成一段出镜视频。火山语音合成服务不附带 TOS 桶;TOS 是要单独开通、由用户创建的对象存储。接口要求图片和音频可通过 HTTPS 访问。
本地文件模式会由脚本自动上传到私有 TOS,生成限时读取链接;任务完成后尝试删除输入对象。需要设置:
export VOLC_ACCESSKEY=...
export VOLC_SECRETKEY=...
export VOLC_TOS_BUCKET=...
export VOLC_TOS_REGION=cn-beijing
export VOLC_TOS_ENDPOINT=tos-cn-beijing.volces.com
python3 -m pip install -r requirements-digital-human.txt
python3 scripts/preflight.py --route B --avatar
python3 scripts/volcano_digital_human.py \
--portrait assets/avatar.png \
--audio tts/output/master_norm.mp3 \
--timeline timeline.json \
--out out/digital-human \
--resolution 1080每条 API 音频必须严格短于 35 秒。达到或超过 35 秒的本地配音需提供 align_subtitles.py 生成的 timeline.json;脚本默认按时间线切成最长 30 秒的段,并对超过 30 秒的单句或无法安全切分的尾部静音报错,需先拆短或裁剪。30–35 秒(不含 35 秒)的单段可以直接提交。脚本输出 avatar-001.mp4 等无声画面片段和 avatar_manifest.json,Remotion 按清单编排;最终配音只在 Remotion 音轨中放一次。已有公网 HTTPS 文件可传 --image-url、--audio-url 和 --duration-s;该模式仅支持小于 35 秒的单段音频。
火山数字人 API 使用 AK/SK,和 TTS 的 AppID/Access Token 是两套凭据。不要把密钥写入脚本或仓库。数字人输入图必须有使用授权。API 服务开通、计费和接口字段以火山 OmniHuman 1.5 官方 API Explorer为准。
Remotion 先用单独的最终配音轨渲染干净成片(数字人画面片段保持静音),再用有使用权的音效素材做后期混音。不要把音效嵌进 Remotion 场景音轨,也不附带来源不明的素材库。
音效计划示例,文件路径相对 JSON 文件:
{
"events": [
{
"id": "hook",
"file": "assets/sfx/hit.wav",
"start_s": 0.2,
"gain_db": -16,
"purpose": "hook"
}
]
}python3 scripts/sfx_mix.py \
--video out/render.mp4 \
--plan sfx_plan.json \
--timeline timeline.json \
--out out/final.mp4脚本会把音效压在配音之下,限制混合峰值至约 -3 dBFS,并写出 .sfx.json 混音记录。音效库缺失或没有合适落点时,跳过音效,不造占位音。
python3 scripts/media_qc.py out/final.mp4 --report qc/final.json检查画幅、帧率、音视频时长差和音轨峰值。此技术报告不代表视觉验收通过;画面内容需另做 AI/人工抽帧复核。若任务超时中断,上传对象可能仍被数字人任务读取;给私有 TOS 桶配置生命周期清理规则。
- 先预检再开工:新机器装完先跑
preflight.py,凭据一次要齐——走到阶段 3 才发现没有 配音凭据,是最大的返工来源。 - 第〇步先锁决策:声音来源(真人实录 / 火山引擎 TTS,二选一,不混用)、是否需要数字人出镜、肖像授权及证据边界,开工前定好。
- 自动切镜不可信:每 2 秒补抽帧,按叙事人工细分 8–10 段。
- 字幕铁律:字幕 = 原稿文本 + 真实语音词级时间,绝不直接用 ASR 原文 (生造词必被转写错)。
- 真实原则:演示素材用本项目真实拆解产物,不虚构功能、数据、评价。
- 凭据纪律:凭据只走环境变量 /
--config,不入源码、不入仓库、不进报告。
38s 参考视频 → 77s 成片,约 2.5–4 小时;详见 SKILL.md。
MIT