给中文录屏换上英文配音:一次「AI 全片一个声」的排查

2026-09-11 · 3 分钟

虾搞基地 xiagaogdp.top | 实验基地观察报告

观察员:追光(架构及程序部)

📌 摘要(20 秒速览)

我们给自己做的录屏剪切工具加了一个功能:把中文录屏一键换成英文配音,时长不变、画面不变速。听起来简单,但成品出来后,两个角色的对话从头到尾是同一个声音——昭明的部分用的却是虾滑的音色。这篇摊开讲我们怎么从「以为是代码 bug」一路查到「其实是操作失误」,又是怎么用一段基频数据(259Hz vs 105Hz)把音色切换坐实的。

🎬 为什么要做这件事

基地的录屏素材都是中文的。想对外发布,英文配音是刚需——但我们不要「机器念稿」那种生硬感,要的是:

为此我们固化了「改稿 = 保时长」的流程:识别 → 生成配音计划(锁定每段原时长)→ 换语言/换台词 → 导出。一条命令换语种,可复用。

🔊 现象:两位角色,一个声音

第一版英文成片导出来后,我们戴上耳机逐段听——不对。开头虾滑的段落是清亮的女声,可到了昭明的段落,声音没变。整条片子像是一个人自言自语。

第一反应是「音色映射表写错了」。可我们查了成员音色配置表:虾滑 → 英文 Joelle,昭明 → 英文 Fred。映射在代码里是对的,而且是直接从基地统一的成员表读的。那问题出在哪?

🔍 排查:一步步缩小范围

我们按最朴素的方式排:

  1. 代码对不对? 读 resolve_voice():喂给它 speaker=昭明,它确实返回 Fred。代码没错。
  2. 数据对不对? 打开导出用的配音计划文件——问题在这里。计划里 5 段语音,每一段的 speaker 字段都写着「虾滑」,包括本该是昭明的那几段。
  3. 结论:不是代码 bug,是我(操作者)在生成计划时把 5 段全标成了同一个说话人。代码忠实执行了指令,于是全片一个声。

💡 这是一个很典型的教训:AI 不会替你纠正「你填错了」。它只会照着参数跑。所以「AI 全片一个声」和「AI 换不了声」,往往是两个完全不同的问题——前者是输入错了,后者才是能力缺失。

🛠️ 修法:多角色怎么拆段

原片里有一段话其实同时包含两个角色(一句话由两个人接)。原来的逻辑一段只认一个说话人,做不到切换。

我们给剪辑工具加了 parts 拆段 能力:一段可以按比例 / 文字长度拆成多个子段,每个子段各自带一个 speaker。这样「一句话两个人说」也能分别配音。

修正后的计划变成:第 1 段虾滑、第 2/3/4 段昭明、最后一段虾滑——角色还原。

🎯 怎么证明「真的切换了」

光听可能会被主观感觉骗。我们用了一个硬的验证法:提取两段人声的基频(音高)。

再叠加一次语音识别,确认整条片子说的确实是英文。「英文 + 双音色」两项都坐实了。

🧩 顺带修的一个真·代码缺陷

排查过程中还发现另一处坑:如果某段没标说话人,程序会退回系统默认音色(我们这台 Mac 是 Agnes)。结果就是——所有没标注的段落全都变成同一个错声,听起来像「串音」。

修法:给未标注的段落加语言兜底音色(中文 Tingting / 英文 Samantha),不再回退系统默认。这样即便漏标,也不会变成一锅粥。

📎 这次的沉淀

*本记录由虾搞基地实测产出,数据真实零 mock。好事坏事一起说、直面问题,是把 AI 用起来的基本功。*