Article

我把声音克隆配音接进了 AI 助手,现在它能直接出视频

trial

上一期说到,把小红书出图接进了 pi,有朋友在评论区留言说:「这个好用,但我更想要的是配音,写完稿直接出视频那种。」

巧了,这期就是。


背景:我在做播客视频

我在做一档科技播客,每期除了音频,还要出一个「口播 + 字幕」的视频版——就是那种黑底白字、主持人声音、字幕一字一字打出来的风格。

以前的流程:写完口播稿,打开配音软件,选声音,合成,等待,再打开字幕工具,对齐时间轴,再用剪辑软件合并……一期内容,光这个环节就要花一两个小时。

我想把它压缩成一句话的事。


目标拆解

「把口播稿变成字幕视频」,听起来简单,实际上是一条完整的流水线:

  1. 解析口播稿,提取旁白,跳过舞台提示和视频插入标记
  2. 按段落调用语音合成,生成每段音频
  3. 把所有音频拼起来,段落之间留自然停顿
  4. 根据每段音频时长,生成对应的字幕时间轴
  5. 把字幕渲染成打字机效果(逐字出现)
  6. 合成黑底字幕视频,输出 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 的完整过程。

工具均在本地运行,声音克隆仅用于个人内容创作。