Article
我把声音克隆配音接进了 AI 助手,现在它能直接出视频
上一期说到,把小红书出图接进了 pi,有朋友在评论区留言说:「这个好用,但我更想要的是配音,写完稿直接出视频那种。」
巧了,这期就是。
背景:我在做播客视频
我在做一档科技播客,每期除了音频,还要出一个「口播 + 字幕」的视频版——就是那种黑底白字、主持人声音、字幕一字一字打出来的风格。
以前的流程:写完口播稿,打开配音软件,选声音,合成,等待,再打开字幕工具,对齐时间轴,再用剪辑软件合并……一期内容,光这个环节就要花一两个小时。
我想把它压缩成一句话的事。
目标拆解
「把口播稿变成字幕视频」,听起来简单,实际上是一条完整的流水线:
- 解析口播稿,提取旁白,跳过舞台提示和视频插入标记
- 按段落调用语音合成,生成每段音频
- 把所有音频拼起来,段落之间留自然停顿
- 根据每段音频时长,生成对应的字幕时间轴
- 把字幕渲染成打字机效果(逐字出现)
- 合成黑底字幕视频,输出 MP4
每一步都得自己做。但做完之后,就再也不用手动做了。
声音从哪里来
用的是 VoxCPM,一个本地运行的声音克隆模型。
原理是:给它一段 3-10 秒的参考音频,加上对应的文字,它就能用这个声音来读任意文本。
我提前准备了 50 个参考声音——黄仁勋、Andrej Karpathy、Dario Anthropic、Garry Tan、川普,还有几个粤语声音。每个声音用 SenseVoice(就是上上期接进去的那个工具)自动转录成参考文本。
工具链都在自己机器上,没有上传任何人的声音数据。
口播稿的格式有讲究
我的口播稿长这样:
**Larei:**【情绪=干脆,直接说结论】
以前,数据是稀缺资源,需要人类采集。
现在,数据可以被计算出来。
---
`【插入视频:interlude_04-4.mp4 / 1:04】`
---
**Larei:**【情绪=轻,一划而过】
「带我去我最喜欢的三明治店。」
工具需要识别哪些是要配音的旁白,哪些是要跳过的内容:
**Larei:**【情绪=xxx】— 情绪标注,跳过`【插入视频:xxx.mp4】`— 视频标记,跳过---— 分割线,跳过## 字数统计— 统计部分,全部跳过
真正要配音的,只有 **Larei:** 标签下面的那些段落。
写解析逻辑的时候,第一版直接按段落分割,结果把脚本开头的「风格:快、准、狠」「节奏:口播→视频→口播」也当成旁白读出去了……
最后的方案:先截断统计部分,再按 --- 切成 section,只处理含有 **Larei:** 的 section,提取标签下面的段落。这样无论脚本开头有多少元数据,都不会混进去。
字幕的打字机效果,完整移植
这是耗时最多的部分。
我之前在另一个工具里做过这个效果,代码写得很细——逐字打出、多行换行、超长段落自动分页、末帧停留。
这次迁移过来,三个关键点:
字符宽度计算:中文字符用 unicodedata.east_asian_width() 判断,CJK 算 2 个单位,ASCII 算 1 个单位,这样混排的时候换行才准确。用 ord(ch) > 0xFF 这种简单判断,遇到中英混排的行,换行位置会偏。
换行优先在标点处断:不能在字中间硬断,要优先在 ,。!?; 这些标点,或者空格处断行。这是细节,但影响观感很大。
打字机帧分配:每个字对应一帧 Dialogue,字越多时间越短,但最后有一段固定的停留时间——让读者能看完整行再切换。整体时间根据段落字数按比例分配。
字幕样式:黑底白字,字体 Arial Unicode MS,居中,Alignment=5(ASS 格式的正中间)。字号根据视频规格自动适配——1920×1080 横屏用 144px,1080×1920 竖屏用 102px。
一个我很满意的细节:rerender
第一次配音完成之后,pi 会主动问:
「视频已生成!还需要其他规格吗?竖屏、横屏、小红书版……」
如果我说「再出一个竖版」——它不会重新合成语音。
语音已经生成过了,存在工作目录里。直接复用音频,只重新生成字幕和视频,几十秒出来。
为什么要专门设计这个?
因为语音合成很慢,15 段旁白大概要跑 5-10 分钟。如果每换一个规格都要重新跑一遍,完全没必要。
代码层面的实现:第一次配音时把解析出来的段落文本保存成 segments.json,以后 rerender 直接读这个文件,加上已有的 seg WAV,重新计算时间轴,重新生成 ASS,重新渲染 MP4。
小事,但体验差很多。
现在的实际体验
写完一期口播稿,跟 pi 说:
「帮我用黄仁勋的声音,给 EP2 的口播稿配音,出 1920×1080 的横屏版。」
pi 开始跑:
开始配音 | 声音:黄仁勋 | 规格:1920×1080
使用声音:01-huang-jesen-Nvidia.wav
共 12 个段落
合成 1/12:服务器机房,讲完了。...
合成 2/12:现在回到你的桌子前。...
...
合成音轨...
生成字幕...
渲染视频 (1920x1080)...
视频已生成:~/Documents/podcast/dubbed/dub_xxx-1920x1080.mp4
然后主动问:「还需要生成其他规格吗?」
我说:「再出一个 1080×1920 的竖屏版。」
重新渲染 1080x1920(复用已有音频)
生成字幕 (1080x1920)...
渲染视频 (1080x1920)...
视频已生成:~/Documents/podcast/dubbed/dub_xxx-1080x1920.mp4
全程我没有离开对话窗口,没有打开任何其他软件。
工具越接越多,但核心逻辑没变
现在 pi 里已经有三个自定义工具了:
| 工具 | 做什么 |
|---|---|
transcribe_audio | 本地语音转录(SenseVoice) |
generate_xiaohongshu_card | 小红书配图生成 |
dub_narration | 声音克隆配音 + 字幕视频 |
每一个工具,都是把「以前要切软件手动做的事」变成「在对话里说一句话」。
逻辑很简单:减少切换,减少摩擦,让创作的注意力留在创作本身。
以后还会接更多。下一个候选是视频剪辑——自动插入 B-roll、加片头片尾。做好了再来写。
如果你也在用 pi,或者有想接的工具,评论区见。
本系列持续更新,记录把各种工具接进 AI 助手 pi 的完整过程。
工具均在本地运行,声音克隆仅用于个人内容创作。