Fish Audio Drama 3:35B参数只激活3B,AI配音怎么听懂导演
你有没有想过,给AI配音下指令和给真人演员说戏,到底差在哪?真人演员听到"再悲伤一点,但别哭出来",他能立刻调整。你让他重来一遍,他记得上一条的毛病在哪儿,不会重复犯。可现在市面上大多数AI配音系统呢?你给它一条指令,它生成一条语音,结束。你想让它改,只能把整个要求重新写一遍,它压根不知道上一次说得哪里不对...
给AI配音下指令,和跟真人演员说戏,差别到底在哪儿?有人想过这个问题。
真人演员听到「再悲伤一点,但别哭出来」,马上就能调整。让他重来一遍,他记得上一条毛病出在哪,不会重复犯。可如今市面上多数AI配音系统不是这样:给一条指令,生成一条语音,到此结束。你想让它改,只能把整套要求重写一遍。它根本不知道上一次哪里说得不对,因为它压根没有「上一次」这个概念。
Fish Audio团队做Drama 3之前,面对的就是这个真实困境。上一代模型S2已经能「看文字读指令」,但还远远不够。他们要做的事,是把一个「读文字的机器」改造成能听懂导演反馈、能演多角色对话、能精细修改台词的「配音演员」。
问题到底卡在哪儿
S2卡住的四个地方,决定了Drama 3要解决什么。
头一个是记忆跨度。配音往往牵扯很长的上下文:几个角色的声音样本、之前几轮对话的录音,加起来动辄几千个音频token。S2用的是全注意力架构,每生成一帧新声音,都要把前面所有内容重新「看」一遍。这就像让记账员每记一笔账都把账本从头翻一遍核对,账本越厚,翻得越久。更麻烦的是,S2内部还有个「快速自回归模块」,专门生成声音的精细纹理,可它只能靠主干网络传来的一句「总结」去了解参考音频,细节基本丢光了。
第二个问题是指令只能用一次。你给指令,模型生成一条,完事。你说「不满意,重做」,模型压根不懂「重做」是什么意思,因为它没有「上一次」的概念。
第三,修改必须推倒重来。一段很长的配音里只有一个词说错了,你没法只修那个词,只能整段重新生成。结果整段语气、节奏全变了,等于白做。
第四点最反直觉:**用来优化AI配音质量的评分方法,恰恰会惩罚那些真正有表现力的配音**。
这一点值得展开说。业内常用的强化学习奖励机制通常看两个指标:语音识别的转写准确率,也就是字对不对;说话人相似度,也就是声音像不像参考样本。听着挺合理?问题就在这儿:角色需要笑出声、长时间停顿、或者压低声音耳语时,这些恰恰是语音识别最容易听错的地方,也是和「中性参考音」差异最大的地方。换句话说,你越努力让AI演得有感情,它在这套打分体系里扣分越多。这不是AI能力不够,是评分标准本身在和表演的本质打架。
四个问题,Fish Audio团队决定一次性解决,而不是打补丁。
换掉大脑:混合线性注意力加专家网络
Drama 3的主干网络不再沿用S2的全注意力架构,改成「混合」设计:每四层里三层是Gated DeltaNet,也就是门控线性注意力的一种,只有一层是全注意力。
> **Gated DeltaNet**:这是一种线性注意力机制。它靠一块大小固定的「状态」来记住历史信息,不必把过往内容全部存下来、再一遍遍翻查。
>
> **全注意力层**:也就是传统transformer中那种「每个位置都能直接看到所有其他位置」的层,它的长处在于精准检索距离较远的信息。
这么设计的逻辑是什么?线性注意力层用一个大小不变的状态概括历史,计算量不随上下文长度暴涨,适合处理长对话、长录音;但它记的是「概括」,细节容易丢。所以留一层全注意力,专门负责「要精确记住参考音频里某个具体音色」这类任务。
打个比方,公司里配两种员工。日常事务大多交给效率型助理,他脑子里不存每份文件的原文,只记要点摘要,办事快,细节却容易模糊;碰到要逐字核对合同条款的场合,就交给档案管理员,他会把文件原封不动翻出来逐字比对。全用效率型助理,快是快,可一旦有人问起某个客户三个月前的具体承诺内容,没人答得上来。全换成档案管理员,翻查速度又会被文件堆的厚度拖垮。Drama 3的选择是:大部分任务交给「概括型」的线性注意力,少数需要精确记忆的交给「全量检索型」的全注意力,两头兼顾。
主干网络还加了**混合专家网络**,每个token只激活一小部分参数,其余「专家」休息。Drama 3总共35B参数,每个token只激活大约3B,相当于用十分之一的实际计算量,跑出接近全量模型的效果。
换掉嘴巴:codebook多token预测解码器
光换脑子还不够,嘴巴也得换。嘴巴负责把语义转成具体的声音细节。
先弄清「声音细节」是怎么编码的。Drama 3沿用S2的音频分词器,把44.1kHz的音频拆成每秒约21.5帧,每一帧用10个codebook表示,可以理解成10层不同精细度的编码:第一层是语义信息,说的是什么字;后面9层是逐级递进的音色细节,管怎么说的。
> **Codebook**:作用是把连续音频离散成一组编号,好比将一段连续色彩压成有限个色号:第一层定下大致色调(语义),往后几层再一点点补上渐变细节(音色、情绪的微妙差异)。
S2的做法是用一个叫「快速自回归」的四层小transformer,对一帧音频的10个codebook循环跑十次,每次都要重新读一遍这四层的权重。好比翻译员每翻一个词都要把整本词典翻一遍再落笔,十个词就翻十遍词典。Drama 3换成「codebook多token预测解码器」,简称codebook-MTP,一共13层,四层共享加九层各管一个codebook,每层只跑一次,而且每层都能直接回头看整条序列的历史,包括参考音频里最细微的声音纹理。
读取的权重量因此大幅减少,这是改动带来的直接好处。论文给出的实际数字是:S2每生成一帧大约要读15.6GB权重,折合78亿参数的量,可S2真实参数量只有46亿左右,等于同一份权重被重复读了好几遍;Drama 3每层只跑一次,专家网络又用了更紧凑的FP8低精度存储,每帧只需读约6.0GB权重,不到S2的五分之二,然而Drama 3的总参数量是S2的七倍还多。
参数比S2多出七倍,解码却更快——Drama 3在单张H200显卡上跑到每秒271帧,而参数量只有它七分之一的S2仅能跑177帧。
更大的模型反而更快,表面上不合常理。这恰恰体现出架构设计的分量:参数多,并不代表每一帧都要全部动用,真正要解决的是把用得着的那部分权重读得更快。
五种能力,一套做法:全写成对话
Drama 3这次加进来的本事包括:照着下一轮反馈重做配音、多角色对话配音、在已有录音上做局部修改、边输入文本边同步输出语音。看上去每一项都得配一个专门模型,Fish Audio团队却用了一个统一的办法:**每种任务都写成一段对话,系统角色放设定,用户角色放文本和指令,助手角色放音频,损失函数只算“助手说的话”那一部分**。
> **对话格式(ChatML式)**:把任务拆成“系统指令—用户输入—助手输出”三段来写的一种格式,原本多用于文字聊天机器人,这里被借来组织语音生成任务。
妙处就在这儿:普通配音、带情绪指令的配音、多轮修改、多角色对话、局部编辑,全都能塞进同一种对话结构,区别只在内容。团队不必给每种任务单独定一套输入输出格式,模型要学的是“怎么在对话里把助手那部分做出来”。这项本事一旦学会,就能迁移到各种任务形态上。
多轮修改靠什么实现?你先让它读一句台词,听着不够悲伤,下一轮就说“比上一条更悲伤一点”。模型会把上一条生成的音频当成上下文的一部分接着理解,再产出新的一条,同时上一条音频仍留在对话历史里。这就像给演员反复说戏,“刚才那条太冷了,再来一条,带点委屈”,演员记得自己刚才是怎么演的,你不用把整段剧情从头讲一遍。
多角色对话配音的做法是:每个角色配一份文字描述和若干参考声音片段,文本里用说话人编号标出哪句归谁,模型一次输出整段多角色对话。同一个声音可以在剧本里说中文,下一句再切英文,音色仍然保持一致。配外语片、做多语言有声书,这都是实打实的效率提升。
局部编辑用的则是一种叫“infilling”(填空)的技巧。
> **Infilling(填空式编辑)**:把编辑点前后的原始音频,连同含替换词的完整新文本一起交给模型,模型只生成中间缺的那一小段,首尾衔接处自然融进原有录音。
好比修一张老照片,只中间一小块破损,修复师不会把整张重画,而是照着周围完好的部分只补那一小块,边缘接得看不出痕迹。反过来,如果不用局部填补、把整段台词重新生成一遍,哪怕只改一个词,整句话的语气、停顿、音色都会跟着变,听起来像换了个人在念。碰上需要精确修订的场合,比如播音稿里改一个数字,这就是灾难。
奖励模型只留一个,而且它不看转写准不准
整篇论文里,我认为这个决策最有意思。
前面说过,传统的转写准确率和说话人相似度奖励,会系统性地压住有表现力的配音。Fish Audio团队用真实实验验证了这个判断有多严重:他们取了Expresso这个标准数据集,里面每个说话人先用默认语气、再用多种风格(耳语、大笑、悲伤等)读同样的句子。结果,只要用耳语风格,相似度奖励在99.7%的情况下更偏爱那个毫无感情的默认语气版本;换成大笑,转写错误率会上升0.79个百分点,等于转写奖励直接惩罚笑声。
这组数字说明一件很朴素的事:**拿来衡量“像不像”和“准不准”的指标,根本看不懂“演得好不好”**。
Drama 3的解法很干脆:**规则类奖励全部扔掉,只留一个专门训练出来的“人类偏好打分模型”**。
> **强化学习中的奖励模型(RM)**:专门训练来模拟“人类更爱哪一条”的小模型,这里用的是一个结构跟Drama 3类似、但规模更小的语音语言模型,直接给一段配音打分,既不经过文字转写,也不单独算声音相似度。
这个奖励模型学的是人类标注员对成对配音的偏好判断,训练用Bradley-Terry损失函数(一种常见的“哪个更好”排序学习方法)。关键在于,它直接读提示词和生成的音频token来打分,中间不做任何转换。也就是说,它看得到参考音频和脚本,能判断声音是否一致、内容是否对得上,却不会被“笑声打乱了转写”“耳语拉低了相似度”这类表面特征带偏。
还是拿Expresso的数据验证效果:把风格要求明确写进指令后,这个奖励模型给耳语版本打高分的比例从10.6%跳到62.2%,给大笑版本打高分的比例从27.1%跳到64.4%。换句话说,**只要你告诉它“这里该耳语”,它就会认同耳语确实该比正常音量得分高,而不是机械地扣相似度的分**。
这就像请来一位真正懂戏的评委,而不是一台只会拿尺子量声波振幅的仪器。拿尺子的评委会说“你这段比标准模板低了30%,不合格”;懂戏的评委则说“导演要求这里压低声音营造紧张感,你做到了,加分”。要是继续用那把尺子,整个训练过程会不停把模型往“安全、平淡、贴近参考音”的方向拽,配音只会越训越没有感情起伏,跟“做出有表现力的配音”这个目标正好相反。
有意思的是,去掉转写奖励还顺带压低了生成失败的概率。论文给出的数据是:在Seed-TTS-Eval测试集上,强化学习之后,首次生成就“失败”(静音、过短、噪声等)的比例,中文从2.82%降到1.24%,英文从3.40%降到1.84%,字错误率也同步下降。一个纯粹的偏好信号,反而比拼凑出来的规则奖励更能把模型往“又准又有感情”的方向带,而不是在两者之间做取舍。
推理引擎:更大的模型怎么反而跑得更快
架构再厉害,跑得慢也白搭。Drama 3团队在推理引擎上做了大量工程优化,这部分同样值得细说,因为它解释了“参数翻七倍、速度反而更快”这个看似不可能的结果是怎么来的。
头一招前面已经提过:codebook-MTP解码器每帧只走13层,不再像S2那样跑40层序列传递;专家网络又用FP8低精度存储,每帧要读的权重被压到不足原来的五分之二。
第二招,是把“内核发射”这笔看不见的开销消掉。
> **内核(kernel)**:GPU 上跑的一小段程序,调用一次就得付一次启动和收尾的固定成本,哪怕这一趟几乎不搬运任何数据。
团队统计得很细:一次典型推理步骤里一共跑了1171个内核,真正需要搬运数据的部分只占五分之一时间,剩下四分之三全耗在800多个“几乎不干活”的内核的启动和收尾上。打个比方,仓库管理员每搬一件货都得先去办公室打印出库单,货本身1秒钟搬完,打单却要4秒钟,大头花在行政流程而不是搬运上。团队的做法就是精简这些“行政流程”:能合并的内核调用合并,能省略的检查省略,把内核数量压下来,速度直接提升几个到十几个百分点。
第三招,让内核针对真实服务场景定制形状,而不是套用通用库里“放之四海而皆准”、放到哪个场景都不是最优的默认设置。团队专门搭了一套“形状驱动的内核优化循环”:先从真实线上流量里抓取实际的矩阵尺寸分布,再针对这些具体尺寸写专门优化的内核,反复验证,确保改动在真实场景里真管用,而不是实验室里测着快、上线却没提升。论文里提到有9次“实验室测得快、线上却更慢”的反例,说明这种验证确实必要,不是走流程。
第四招,把“预填充”(处理新请求的输入阶段)和“解码”(持续生成每一帧音频的阶段)分到两块不同的显卡上跑。
> **Prefill-Decode分离**:新请求的处理(读参考音频、读文本)和音频帧的持续生成被分到不同 GPU 上跑,正在播放的音频流因此不会被打断。
不分离会怎样?论文给出的场景很直观:一块显卡既要处理新进来的请求,又要给正在播放的音频流生成下一帧,那每来一个新请求,所有正在播的音频流都得停一下等它处理完。好比一个客服窗口既接新客户登记资料,又给老客户答疑,一旦新客户资料要花较长时间核实,后面正在通话的老客户全被晾在那儿。两件事分给两个窗口之后,团队测出单GPU大约能撑住10条并发流,分离之后一个“预填充+解码”单元能撑住24条,差不多翻了一倍半。
实测效果:这些数字说明了什么
设计思路说了这么多,最后还得看跑分。
在MiniMax多语言测试集上,中文、荷兰语、英语、德语、土耳其语五种语言里,Drama 3的错误率在所有被比较系统中都是最低的。这个结果谈不上惊天动地,但守住了一个基本盘:功能堆得多,基础的“读得准不准”没有退步。
在Ming-Freeform-Audio-Edit编辑基准上,Drama 3与Cartesia Sonic-3的填空式编辑接口对比,中文场景下Drama 3字错误率3.69%,Cartesia是8.64%,差不多是对手的一半。可见Drama 3的infilling方案不只是“能用”,而是“好用”。
“多轮修改”的价值,在Step-Audio-Edit基准上体现得最清楚。每多给一轮反馈,Drama 3的情绪识别准确率从55.5%一路涨到58.2%,风格识别准确率从76.5%涨到81.8%。这组数字的意义在于:**模型确实“听懂”了反馈,而不是每次重新随机生成然后凑巧对了**。
| 指标 | 第0轮 | 第1轮 | 第2轮 | 第3轮 |
|---|---|---|---|---|
| 情绪准确率(%) | 55.5 | 57.2 | 57.5 | **58.2** |
| 风格准确率(%) | 76.5 | 79.4 | 80.5 | **81.8** |
| 拟声词评分 | 1.32 | **2.32** | – | – |
写在后面
读完论文,真正触动我的不是某个具体架构改动,而是那个关于“奖励模型”的实验设计。团队没有停在“我们用了一个更好的奖励函数”这句话上,而是先用真实数据证明旧奖励函数的具体伤害有多大,比如耳语会让相似度打分
还有个细节让我意外:去掉转写准确率这个奖励之后,模型的实际转写准确率没变差,甚至还略微升了一点。这打破了我原先“奖励函数越贴近目标指标、效果越好”的直觉。真实情况可能是,硬拿一个片面的代理指标去优化模型,模型会学出一些讨好这个指标的“歪门邪道”,反而偏离真正想要的效果;换成一个更贴近“人到底喜欢什么”的综合判断,那些细枝末节的指标反倒自然跟上了。这个猜想或许值得在更多场景里验证:有时候,放弃直接优化你最在意的那个数字,反而更容易把那个数字做好。
论文没回答的问题是:这个偏好奖励模型本身的判断标准从哪来,训练它的人类标注者的审美偏好会不会带自己的局限?如果某种小众但真实存在的表演风格恰好不在标注者的审美范围内,模型会不会系统性地打压它?论文没有展开,但我觉得值得继续追问。
Q&A
Q1:Fish Audio Drama 3是什么?
A:Fish Audio Drama 3 是开源语音生成模型,文字经它能变成带表演感的配音。多参考声音克隆、自然语言导演指令、多轮修改、多角色对话配音、局部编辑、流式输出都支持。架构上采用 350 亿参数的混合专家设计,单次推理激活的参数约 30 亿。
Q2:Drama 3为什么能比参数更小的S2跑得更快?
原因在于,它换掉了S2的快速自回归模块,改用新设计的codebook多token预测解码器。每帧只跑13层序列传递,而S2要跑40层。专家网络又采用FP8低精度存储,每帧读取的权重量不到S2的五分之二。结果在H200显卡上,Drama 3能跑到每秒271帧,参数量只有其七分之一的S2则为177帧。
Q3:在强化学习训练上,Drama 3和其他语音模型有哪些不同?
打分只靠一个学习人类偏好的奖励模型,转写准确率、说话人相似度这类规则奖励一概不用。实验证明,这些规则奖励会惩罚耳语、大笑等真正有表现力的配音方式;偏好奖励模型则能理解导演指令所要求的风格,不会因为声音“不像参考音”就扣分。