AI 配音流水线架构:生产环境的经验教训

AI 配音流水线在生产环境中如何运作:四个模型阶段、波斯语的难点,以及一次故障后用服务商回退取代静音的做法。

AI 配音流水线把四个模型阶段串联起来:带说话人检测的语音转写、贴合原片时长的翻译、为每位说话人分配不同的声音,以及时间对齐与最终混音。模型是可以租用的那一部分。配音能否持续交付,取决于模型周围的平台:每家 AI 服务商各有一个带自动回退的网关、持久化队列、崩溃后能够续跑的任务、任务运行前就显示的价格,以及任务失败时的退款。在我担任首席技术官的 Booq,一家语音服务商的故障曾经导致配音在缺失台词的地方只剩下静音。现在语音会沿着一条服务商链依次回退:声音略有不同,也好过一片静默。

AI 配音流水线如何工作:四个阶段

自动配音的研究描述了一条类似的链路。Federico 等人(2020)以一条语音到语音翻译(speech-to-speech translation)流水线为起点,补上了配音所需的环节:

  • 能按期望长度生成译文的机器翻译。

  • 韵律对齐(prosodic alignment):让译文的短语和停顿与原始语音片段相匹配。

  • 语音合成(TTS),并对每段话语的时长进行微调。

  • 音频渲染:加入从原始音频中提取的背景噪声和混响。

如果视频里有好几个人,还得知道是谁在说话。

AI 配音四阶段链路示意图,从源视频到配音后的视频,含渲染前可选的字幕审阅环节,以及每个阶段各自的研究难题。

查看链路示意图大图

下面各阶段的小节讲的是研究成果和设计空间:每个阶段必须解决什么问题,又会在哪里出错。它们不描述任何产品的内部实现,Booq 也不例外。Booq 在这些小节里出现时,写的只是其案例研究中已经写明的内容;波斯语发音一节则取材于我自己的语音合成研究。讲平台的几节是我的亲身经历。

阶段一:语音转写与说话人检测

后续每个阶段都继承转写文本。识别器凭空编出来的词,会和说话人真正说过的词一样,被满怀把握地翻译、配音和对时。就波斯语而言,关于自动语音识别(ASR)会在哪里出错,最有用的公开证据是 2025 年发布的基准 PSRB。

波斯语语音识别在哪里出错

PSRB 评测了 10 个 ASR 系统,既有商业系统,也有开源系统。它的总结是:模型在标准波斯语上总体表现良好,但在地方口音、儿童语音和一些特定的语言难题上力不从心。细看这些发现,读起来就像在描述人们想要配音的那类音频:

  • 口音。在参与评测的 12 种口音中,马什哈德口音和亚兹德口音的识别准确率最低。

  • 儿童。儿童说话人的识别效果最差。

  • 多位说话人。每个模型在多说话人音频上的错误都比在单说话人音频上多。作者指出,尽管该基准已经把语音重叠控制到最低限度,重叠仍是这类音频的主要难题;此外,部分模型有时会在转写文本中漏掉整整一位说话人。

  • 内容类型。有声书的错误率最低。谈话节目、动画和电影里常见即兴对话、语音重叠和背景噪声,得分明显更差。

  • 语体。该基准中 71.3% 的语音是非正式口语。

论文还列出了波斯文书写和波斯语语音特有的几类错误:

  • 词边界。复数形式 درخت‌ها(“树木”)要用零宽不连字(ZWNJ)书写。ZWNJ 被省略或被替换时就会出错,写成 درختها 或 درخت ها。

  • 正式与非正式互换。口语的 می‌خوام برم(“我想走”)可能被转写成书面语的 می‌خواهم بروم,反之亦然。

  • He-Kasreh。表示所属或连接关系的短元音 /e/ 可能被写成字母 he(ه):کتاب او(“他的书”)可能被转写成 کتابه او。这就是被写出来的 ezāfe,也正是阶段三要回过头来处理的那个不写出来的音。

  • 意译。خوش می‌گذره(“很愉快”)可能变成 حال می‌ده(“感觉很好”)。意思保住了,词却变了。

  • 幻觉。流畅、连贯,却完全不是依据音频生成的文本。

普通的词错误率(WER)把每一处替换都算作一个完全错误的词,所以一次 ZWNJ 失误的代价可能和换了一个词一样大,甚至更大:如果 ZWNJ 变成了空格,一个词就裂成两个词,这会被算作一次替换加一次插入。PSRB 提出了一种按替换加权的变体 SW-WER:对每一处替换计算字符错误率,再乘以该对齐中的词数,这样一次空格失误的代价就低于换了一个词。在波斯语文本上做检索,也必须对同样这些字符做规范化,波斯语 RAG 的混合检索一文对此有说明。

在我看来,这对设计的启示是:人们想要配音的音频,恰恰是识别最薄弱的地方;而一句出自幻觉或被意译的台词,不会只停留在转写文本里,它会变成一句被言之凿凿地配出来的台词。这就是在渲染之前设置审阅环节的理由。Booq 两种模式都提供:全程无人值守运行,或者在渲染任何内容之前暂停,审阅并编辑字幕。

说话人日志:谁在什么时候说话

Park 等人把说话人日志(speaker diarization)定义为识别“谁在什么时候说话”的任务。在配音中,它决定每句台词由哪个声音来念。第三届 DIHARD 说话人日志挑战赛在 11 个不同领域评测了各个系统,结论是:在其中许多领域,包括网络视频,这个问题“远未解决”。

无论哪条流水线,我都会在说话人日志之后放一项简单的检查:每个检测到的说话人都有台词吗?每句台词都有说话人吗?PSRB 中有些系统在转写文本里漏掉了整整一位说话人,而漏掉的说话人就会变成一条缺失的配音音轨。

阶段二:贴合原片时长的翻译

配音给翻译加了一条约束:新台词要在与原台词差不多的时间内说完。如果随意翻译,合成声音要么只能赶着念,要么这句台词会压到下一句上。

等时性:译文长度与语音时长是同一个问题

研究中把这称为等时性(isochrony)。Chronopoulou 等人(2023)将其描述为新语音与原视频在时间上对齐,“包括口型动作、停顿、手势”。他们训练了一个同时优化译文及其语音时长的模型,并报告说,与以往的工作相比,生成的语音更贴合原始语音的时间节奏,而且架构更简单。

更早的工作是在文本层面控制长度。Isometric MT(Lakew 等人,ICASSP 2022)举的目标示例是:译文的字符数与原文相差在 ±10% 以内。它也坦言了代价:控制输出长度会损失翻译质量,通常的缓解办法是先生成多个候选译文(N-best 假设),再重新排序。这个 ±10% 只是一篇论文里的示例,不是行业规则;而字符数也只是一句台词说出来需要多长时间的近似指标。

语速一旦出问题,听众是听得出来的。YouTube 的自动配音帮助页面把语速列为视频可能不符合条件的原因之一:原始语音太快,“会产生一段被加速、让人听不下去的配音”。

配音的时间对齐要多严格?

说话人在画面内时,要比在画外时更严格;而从专业实践来看,也没有研究中常常认为的那么绝对。Brannon、Virkar 和 Thompson(TACL 2023)研究了人工配音的实际做法,所用素材是来自 54 部专业制作的作品、共 319.57 小时的视频。他们的结果对人工配音和自动配音两类文献中常见的若干假设提出了质疑。他们主张,声音的自然度和翻译质量,比人们通常强调的等长(字符长度)约束和口型同步约束更重要,并主张以更有保留的眼光看待时间约束到底有多重要。

说话人是否出现在画面中,也有影响。Virkar 等人(2022)把他们早先为画面内配音构建的韵律对齐模型扩展到了画外配音。与为嘴部可见的说话人配音相比,画外配音“需要的同步约束没那么严格”。因此,时间预算应当按场景逐一决定,而不是一个全局设置。

关于 Booq,公开的说法是:时间轴与原片对齐。案例研究中关于时间对齐只说了这么多,我在这里也只主张这么多。

阶段三:为每位说话人分配不同的声音

在 Booq 上,每个检测到的说话人都会得到一个不同的声音。任何多说话人配音都要求声音具备两项特性:两位说话人听起来不能相像;同一位说话人从第一句到最后一句都要保持同一个声音。请记住第二项,下文的事后复盘讲的正是它如何败下阵来。

开放的波斯语语音数据很少。ParsVoice 的作者写道,波斯语“在开放的语音-文本资源中仍然严重缺乏代表性”。他们的语料库包含一个 2,200 小时、可直接用于 TTS 的子集,规模是此前最大的开放波斯语 TTS 数据集的 25 倍以上。数据是一重约束。另一重约束在任何音频产生之前就已出现:决定文本该怎么读。

波斯语发音:短元音、ezāfe 结构与同形异义词

2021 年 6 月至 2022 年 9 月,我从事波斯语语音合成研究。这项研究由伊朗最大的移动运营商 MCI(Hamrah-e Aval)委托并监督,由国家精英基金会通过其沙希德·艾哈迈迪·罗尚计划进行管理。难点在语言本身。在那条流水线中,书面文本先经过字素到音素的转换(G2P),由它决定文本怎么读;随后由语音合成模型和声码器生成语音,声码器是把模型的声学输出转换成音频波形的组件。波斯文从三个方面让第一步产生歧义:

  • 短元音不写出来,因此仅凭文本无法确定读音。

  • ezāfe 结构同样不写出来,只能靠推断。

  • 同形异义词让不同的词共用同一种拼写,没有上下文就无法区分。

已发表的研究也是这么说的。GE2PE(Findings of EMNLP 2024)的作者把 ezāfe 描述为连接名词与形容词、描述性名词的 /e/ 音,并给出一个同形异义词的例子:/kerm/、/kerem/ 和 /karam/ 的书面形式完全相同,都写作 کرم。他们的结论是,波斯语 G2P 需要短语级或句子级的输入,才能得到可以接受的结果。Doostmohammadi 等人(2020)补充说,ezāfe 在波斯文中几乎从不标出,导致复杂句子被读错,语言处理也会出错。这个项目的详情见波斯语语音合成案例研究。

下面这条设计启示是我的推断,并非这些论文的发现:不要把字幕轨切出来的片段喂给波斯语 TTS。字幕断句可能把一串 ezāfe 结构从中拆开,或者把同形异义词和用来消除其歧义的词分开。如果 ketāb-e dust-e man(“我朋友的书”)被拆进两条字幕,而第一段结束在 ketāb,那么这一段里再没有任何成分能说明 ketāb 要带上 ezāfe 的 /e/。应当按整句合成,再把音频放进时间轴。

阶段四:时间对齐与最终混音

最后一个阶段把一段段音频片段变成真正属于这段视频的音轨。在 Federico 的流水线中,渲染会加入从原始音频中提取的背景噪声和混响,让新的声音和画面处在同一个声学场景里。

在 Booq 上,成品可以包含为竖屏和宽屏视频生成的带样式内嵌硬字幕,并在配音之下以较低音量保留原声或背景音乐。内嵌硬字幕是画面的一部分,所以必须在渲染之前按画面比例确定排版;之后任何播放器都无法再修正。

这个阶段有两个设计问题。第一个是:翻译之后,某句台词合成出来的音频仍然超长,该怎么办。研究与实践给出了三个抓手,在它们之间做选择是设计决策,而不是研究发现:

  • 在翻译时把台词缩短。Isometric MT 以及同时优化译文和时长的模型,正是在这一步发力。

  • 在 TTS 中调整每段话语的时长。Federico 的流水线会逐段微调时长。

  • 在限度之内加快语速。这个抓手来自实践而非研究,而且只在一定程度内有效:YouTube 的帮助页面提醒,被加速的配音可能让人听不下去。

第二个问题是:台词缺失的地方,听众会听到什么。事实证明,这是一个架构问题,而不是音频问题。

模型周围的平台

上面所讲的,都是可以读到的研究和可以租用的模型。在 Booq 上,每一项能力都依赖外部 AI 服务商,而每家服务商都可能各自出故障或发生变化。作为首席技术官,我制定了 Booq 的架构,并把它从第一次代码提交推进到生产环境;Booq 案例研究介绍了这个平台。其事后复盘中的每一条教训,都出在模型周围,而不是模型内部。

Booq 上模型周围的平台示意图,共四行:围绕任务的保障;经由各服务商网关的语音回退链;后台内容审核与退款;发布与备份运维。

查看平台示意图大图

每家 AI 服务商一个网关

Booq 由一组相互独立的服务组成,统一通过一个网页应用对外提供,每家 AI 服务商都有各自独立的网关。正是这一个决定,让切换模型、轮换密钥或自动绕开出故障的服务商成为可能,而不必改动产品的其余部分。模型和服务商密钥在管理后台更换,无需重新部署。案例研究把每个网关与自动回退放在一起介绍,而下文的事后复盘说明了语音为什么需要它。

持久化优先级队列与检查点

为一段长视频配音,不该放在网页请求里完成。在 Booq 上,繁重的处理任务改为在持久化的优先级队列中排队,并为每项服务分别设定上限。正是按服务设定的上限,才不会让一项繁忙的服务把其他服务饿死。

翻译任务会保存检查点,崩溃后从中断处继续。如果没有检查点,在一份长转写文本快要处理完时发生崩溃,此前发往服务商的每一次调用都要重做一遍,而每一次调用都要再付一次费。

网络不稳定时的断点续传

大体积视频文件要经由质量参差不齐的网络传到 Booq。上传在网络不佳时可以从断点继续,而不必从头开始,数 GB 的大文件也是如此。

这种通用机制正在标准化。Resumable Uploads for HTTP 是 IETF HTTP 工作组中一份仍在推进的互联网草案(Internet-Draft),尚未成为 RFC:如果服务器能告知在中断之前处理了多少数据,客户端就从那个位置继续,而不是把所有数据重新发送一遍。它仍在制定之中,也不是对 Booq 实现方式的描述。

运行前显示价格,失败自动退款

计费也是流水线的一部分。Booq 上的每个任务在运行之前都会显示价格,或预估起价。钱包以托曼预付,增值税预先列明;每笔交易都记入永久账本,任务失败时自动退款。退款有防止重复打款的保护。

最后这项特性最值得下狠功夫测试:超时之后的重试,恰恰就是一个天真的退款实现会付两次钱的时刻。

靠开关,而非发布新版本

Booq 的产品模块无需发布新版本即可开启或关闭。按照 Pete Hodgson 对功能开关(feature toggles)的分类,这接近运维开关(ops toggle):让运维人员能在生产环境中快速停用某项功能或将其降级的开关。

访问权限也按同样的思路分隔开来。客户、管理员和支持人员各自使用独立部署的应用,一个应用中的登录在另一个应用中无效;各控制台均要求二次验证,并采用基于角色的权限控制。

事后复盘:当声音一致性输给了静音

Booq 的语音最初被刻意固定在单一服务商上,因为换一家服务商就意味着换一种声音。在配音里,一致性看起来正是需要保护的特性。后来这家服务商发生故障,合成出的配音在缺失台词的地方只剩下静音。

现在语音会沿着一条服务商链依次回退,所依据的原则是:声音略有不同,也好过一片静默。

有意识地设计回退链

最初的选择并不草率,它保护的是一项真实存在的特性。案例研究总结了平台在生产环境中运行后促成的几次方向调整:每一次都是“放弃一个看似稳妥的假设,换来一个更安全的默认做法”。教训是:在故障替你做决定之前,先决定你接受哪一种失败。当首选的语音服务商不可用时,流水线可以留下空白,可以让任务失败并退款,也可以换用另一个声音。只有留下空白这一种,会把一段满是窟窿的配音交到听众手里。

接下来还有第二个决定,以下是我的分析,而不是对 Booq 的描述:回退时要替换多大范围。如果只有缺失的那句台词换了服务商,这位说话人的声音就会在一场戏的中途变掉。如果这位说话人的整条音轨都换掉,配音会保持一致,但要重做的工作更多。

Google 的 SRE 书针对过载的服务描述过一个相关的思路,即优雅降级(graceful degradation):通过降低响应质量来减少要做的工作。可以借鉴过来的,是书中的警告,“从来不用的代码路径,就是(往往)不能用的代码路径”,以及定期演练降级模式的建议。我会给任何语音回退链补上一条做法,这是建议,而不是对 Booq 的描述:用内部片段定时运行测试任务,让回退链中的每一家服务商都跑一遍,这样在故障真正需要回退之前,就已经确认它能用。

哪种失败才是对的,取决于产品。本站的助手恰恰相反:站内没有任何内容能支撑一个问题时,它会用固定文案拒答,而不是去猜;如果它不认为这个问题与我有关,语言模型根本不会被调用。在问答中,什么都不说才是安全的失败,因为言之凿凿的错误回答比没有回答更糟。这套设计见 RAG 幻觉护栏,实验室里的“有检索 vs 没检索”页面也基于同一条规则。而在配音中,静音本身就是失败。哪种失败可以接受,是产品决策,而不是模型决策。

不让用户等待的内容审核

Booq 的内容筛查过去在创建项目的流程中同步执行,用户在上传完成之后,要等上一段时间才能进入项目页面。现在筛查改在后台运行。图像、视频、音频和文本都要接受筛查,并提供申诉渠道;已完成的结果会停留在“内容审核中”状态,直到审核结束。审核仍在进行时,输出不会被呈现为已就绪。

这个模式适用于媒体流水线中任何耗时的检查:把它移出请求路径,并把中间状态明确地呈现出来。

发布关卡,以及有人真正读过的备份

Booq 的生产环境部署从自动执行改为人工审批,且只有在预发布环境检查通过后才会开放审批。每次发布都要依次通过构建、测试、预发布环境部署和冒烟测试,再由人工批准上线生产环境;紧急情况下,还可以手动触发回滚到上一个版本。平台运行在以代码定义的容器集群上。

备份频率改为一小时一次,最新的一份备份被从头到尾完整读取过一遍,因为从来没人读过的备份,算不上备份。Google 的 SRE 书说得更直白:“没有人真的想做备份;人们真正想要的是恢复。”书中还设了一道更高的门槛:只有真正恢复过,你才知道自己能恢复到最近的状态,因此恢复测试应当尽可能自动化,并持续运行。从头到尾读一遍备份只是底线,而不是终点。

自建还是采购:AI 配音流水线检查清单

故障与回退

  • 语音服务商在任务中途出故障时,听众得到的是什么:静音、另一个声音,还是任务失败并退款?要在故障替你决定之前做出决定。

  • 回退真正触发时,替换的是一句台词,还是这位说话人的整条音轨?

  • 回退路径是否通过定时测试任务被有意演练,还是只在故障时才会走到?

平台与计费

  • 每家 AI 服务商是否都在各自的网关之后,使得换模型、轮换密钥或绕开服务商都不需要发布新版本?

  • 繁重的工作是否在网页请求之外,从按服务设定上限的持久化队列中运行?

  • 长篇翻译能否从检查点继续?大文件上传能否在连接中断后续传?

  • 任务运行前是否显示价格或预估价?能否保证退款绝不会重复打款?

  • 内容审核是否已移出请求路径,并有明确的“审核中”状态?

识别、时间与声音

  • 语音识别是否用你自己的音频测试过:口音、儿童、非正式口语、多位说话人、电影和谈话节目的声音,而不只是有声书?

  • 你的 WER 评分是否把一次 ZWNJ 空格失误算作一个完全错误的词?先做规范化,或者使用 SW-WER 这类加权指标。

  • 完成说话人日志之后,每个检测到的说话人是否都有台词和声音?

  • 渲染之前是否有审阅和编辑字幕的环节?

  • 对这类内容,时间对齐要多严格:人脸在画面内,还是画外旁白?

  • 波斯语 TTS 收到的是整句,而不是会切断 ezāfe 结构的字幕片段吗?

发布与恢复

  • 通过预发布和冒烟检查之后,是否由人来批准上线生产环境?能否手动回滚?

  • 有没有人把一份备份从头到尾读过?

常见问题

AI 配音是如何工作的?

AI 配音流水线先转写原始语音并识别谁在说话,再把每句台词翻译成能在与原来差不多的时间内说完的译文,为每位说话人分配一个不同的合成声音,最后对齐时间,并把新语音与原始背景声混合。在生产环境中,这些阶段运行在一个平台之内:有队列、带回退的服务商网关,最好还有一个渲染前的审阅环节。

AI 能把英文视频配音成波斯语吗?

从技术上说,可以:对任何语言对,这条链路都是一样的。配音成波斯语,会在声音阶段多出一个语言特有的问题:波斯文不写出短元音和 ezāfe 结构,所以读音必须依据上下文推断。主流平台的支持并不均衡:截至 2026 年 9 月,YouTube 的自动配音帮助页面把波斯语(Farsi)列为可配音成英语的源语言,而英语视频并未被列为可以配音成波斯语。

AI 配音能对上口型吗?

不一定,而且也未必总有这个必要。等时性研究设定的正是这个目标:新语音与原视频在时间上对齐,包括口型动作、停顿和手势。要对得多紧,是一个设计选择。画外配音对同步的要求,不如为嘴部可见的说话人配音那么严格;一项针对专业人工配音的大规模研究认为,声音的自然度和翻译质量,比通常被强调的口型同步约束更重要。

为什么 AI 配音里有时会出现静音或换了一个声音?

原因之一是语音服务商在任务中途出了故障。固定使用一家服务商的流水线能让声音保持一致,但在故障期间可能留下空白;带回退链的流水线则会用一个略有不同的声音补上这句台词。一次故障导致配音在缺失台词的地方只剩下静音之后,Booq 从第一种设计转向了第二种。静音也可能源自上游:语音识别漏掉了一位说话人,结果没有任何内容可供翻译。

应该如何评估波斯语语音识别?

用你自己的音频来评估,而不能只用干净的朗读语音。测试集要包括地方口音、儿童的声音、多位说话人,以及电影或谈话节目的声音,这些都是 PSRB 发现错误更多的情形;此外还要加上非正式口语。评分之前,先对 ZWNJ 以及字母 yeh 和 kaf 的阿拉伯语、波斯语字形做规范化,或者使用 SW-WER 这类按替换加权的指标;除了看错误率,还要逐条阅读错误本身:单凭一个数字,分不清一次空格失误和一句说话人从没说过的流畅句子。

如果你正在权衡是否构建语音或配音系统,语音 AI 服务涵盖 TTS、ASR 和配音流水线,包括波斯语中的疑难情形。

参考来源