AI-Native游戏开发(3):角色声音生产链
0. 系列文章导航
3句话,AI给我生成了一个galgame
AI-Native游戏开发(1):为什么选择图数据库
AI-Native游戏开发(2):角色美术生产链
AI-Native游戏开发(3):角色声音生产链
AI-Native游戏开发(4):场景与BGM生产链
AI-Native游戏开发(5):剧情台词生产链
AI-Native游戏开发(6):叙事图自增长
1. 为什么声音是最繁琐的一条链
美术链的验收至少是可并排比对的:新图和三视图摆在一起,像不像一目了然。声音的麻烦在于漂移难命名、难复现:两句配音「感觉不太像」,到底是音高差了、音色闷了、还是语速变了?人说得出「不对」,说不出「哪里不对」,更给不出可执行的修正指令。
如果每句台词独立生成,每句都是一个新掷的骰子——即使提示词完全相同,音色也会在句与句之间漂移。全配音游戏对一致性的要求恰好与此相反:几十句台词必须共享同一个稳定的声音身份。
我们的解法是把「声音」拆成两个性质完全不同的阶段:
阶段一锚住「他是谁」(音色身份,一次性),阶段二只解决「他这句话怎么说的」(演绎,逐句)。身份问题被从每天的生产里剥离出来,一次性解决、固化成资产;此后所有台词生成都以它为参考,不再重新掷骰子。
先交代一个与概念稿的偏差:原始概念稿里这条链有 VoiceDesign → VoiceClone → DialogueAudio 三个节点,设想「先设计、再克隆、再逐句生成」。落地后发现 VoiceClone 不是一个图节点,而是一个动作——固化参考音频的过程就发生在 VoiceDesign 的审批里;逐句产物也不是独立的 DialogueAudio 节点,而是剧本行的属性(第 5 篇的 LineAudio 节点,每行台词一个节点,音频是它的一等产物)。图上的节点应该是「需要独立调度与审批的对象」:音色设计需要(它有独立的多候选审批流程),「克隆」这个动作不需要,台词行天然已经是节点。这条经验后来成了建模的通用判据。
2. 从人设到 instruct:音色也讲「措辞学」
阶段一的输入不是空想,是图上已有的角色数据:Character 的基础属性、LanguageStyle(他怎么说话——用词、句式、语速、口头禅)、以及 Info / Event 里关于他的事实。输出是一段音色描述(instruct)——一到两句话、不超过 60 字的自然语言。
比如伊芙——序章里在灵魂夹缝交付试炼规则的角色,图上人设是天然呆——推导出的 instruct 大致是「年轻女性,音色清亮柔软,语速偏慢,尾音常带迟疑」这个方向。(实际措辞依图上设定生成。)
两个设计约束值得展开。
其一,措辞遵循声音设计模型的官方原则:简洁、具体、客观,禁止比喻修辞。 「声音像一杯温热的拿铁」是人类互相意会的写法,模型听不懂——「偏软偏暗、语速中等」才是指令。写提示词时最容易犯的错就是把给编辑看的文案习惯带进来;声音描述是一份给模型的规格,不是一段给读者的散文。
其二,同场角色的频谱避让。 音色描述不是每个角色独立生成就完事——几个女性角色天然落在相近频段时(序章里顾盈、小夏、伊芙三个年轻女声同章出场),必须在质感、节奏、尾音上显式拉开,否则玩家在快节奏对话里分不清谁在说话。所以设计动作里包含「读同场角色的已有设计」,在频谱上互相避让。这是图数据库的又一个红利:角色与角色的关系(同场出现)本身就是图上可查询的信息,避让不需要人脑记账。
这里也有一个真实的返工教训,主角正是伊芙:她的图上人设是天然呆,而章节设计简报给她的导演意图是「以近乎官僚的平静交付规则」——两个信号打架时,instruct 错跟了简报。图上的 Character 与 LanguageStyle 才是人设的唯一依据,导演意图是「希望演出达到的效果」,不是「这个人声音本来什么样」:一个声音形象与角色基本面冲突的设计,再贴切的导演意图也救不回来。返工后规则固化为:instruct 必须从图上的人设数据推导,简报只提供场景语境。
还有一个统一的小设计:参考文本(ref_text)全角色统一为同一个 54 字长句。候选采样和试听都用同一句话,意味着候选之间的差异只能来自音色本身,不会被文本内容干扰——把变量控制住,比较才成立。
3. 多候选:把审美问题变成可比选项
instruct 写好后,不做「直接生成然后审」,而是同一份描述做三次随机采样,得到三个候选;每个候选再合成三种情绪的试听(平静、高兴、愤怒各一句固定文本)——情绪试听的目的,是提前听到这个音色在演绎波动台词时的表现,避免「平静句很好、激动句崩掉」的隐患。
于是人工审批面对的不是一段描述加一段音频,而是三组、每组四条的候选矩阵:逐候选试听,采用其一。被采用的候选固化为这个角色的参考音频(ref.wav),成为此后所有台词合成的音色锚点;VoiceDesign 节点随之走完审批。
为什么不让模型自动打分选优?和第 1 篇的验收立场一致:音色审美今天仍然只有人选得准。而且多候选流程把「审美」的成本压到了最低——人只需要听、比较、点一下采用,不需要在任何一段不满意时描述「哪里不满意」(那个我们说不出的问题)。生成便宜、选择便宜,判断贵——那就把全部流程设计成「为判断服务」。
三个情绪试听句本身也是设计过的固定文本——平静句、高兴句、愤怒句各一句,全部候选共用。固定,是为了把「音色」与「演绎」拆开验收:同一句文本在不同候选嘴里念,差异只剩音色;同一候选的三种情绪,展示的是这个音色的演绎弹性。如果试听句随候选变化,人听到的差异就混入了文本内容的影响,比较失去基准——和 ref_text 全角色统一是同一个道理的两面:控制变量,让「选择」这个动作只对「被选的对象」敏感。
固化下来的参考音频由此成为角色的声音资产,生命周期与图片资产同构:落盘归档、图节点挂路径、被下游反复引用。阶段二每次开工前有一个固定动作——核对该角色的参考音频是否就位,在则直接复用,不在则从设计产物重新固化。这句轻描淡写的检查背后是整条链的经济学:音色设计做一次,之后成百上千句台词全部白嫖这次设计;反过来,如果 ref 有任何变更,全部已产台词的「像」都失效——所以 ref 从不轻动,动则视为音色重设计,波及范围由人评估。
流程纪律上,这里执行着第 2 篇的铁律先产物后写图:九段音频全部落盘、逐一验证可读之后,才允许把候选路径写进图、置 status=10。声音合成是异步且可能部分失败的操作,如果先写状态再等音频,图就会撒谎。
例外情况也值得一提:怪物类敌人角色跳过整条声音设计——它们没有台词。流水线里的「不做」和「怎么做」一样是设计决定:没有下游消费,就没有生产必要,图上不建节点、不占审批位。
4. 逐句配音期:LLM 当导演
阶段二是剧本进入配音的时刻(剧本怎么来的,第 5 篇详述,这里只看声音侧)。此时图上已经有逐句的台词行节点,配音 skill 挑出全部待配的说话行,由 LLM 对每一句做四个判断。
判别的输入不只是这一句台词。「逐句判别」的「句」是产出粒度,不是理解粒度——模型读的是整节的语境:这句的前后句(同一句「哦」在承接玩笑和回应噩耗时情绪天差地别)、说话人在本节的轨迹(情绪是爬升还是坠落)、说话人的语言风格节点(口头禅与语气习惯)、场景块的氛围(深夜的桥边还是白天的直播间)。判断结果再落回每一行。这个设计的潜在原则在第 5 篇还会出现:理解要全局,执行要逐句——用整节语境保证判别的连贯,用逐句粒度保证审批与重做的精细。
四个判断里,第 ④ 个(选立绘)属于演出层,第 5 篇展开;本篇看前三个——它们共同回答一个问题:在没有「情绪旋钮」的克隆模型上,怎么让一句话带上情绪。
5. 情绪的工程化:标点变体,而不是声学标签
我们用的克隆模型有一个关键特性:它没有独立的情绪控制参数(克隆通道不带指令输入),情绪信息只能藏进要念的文本本身。
第一个尝试是业界常见的声学标签——在文本里插入 [叹气]、[轻笑] 这类标记,指示模型在对应位置做出声学行为。试验结果不支持:标签时灵时不灵,且标签本身会被字面化污染合成。这条路被完整回滚,并在规则里注明「勿再建议」。
最终方案朴素得近乎简陋,但稳定:只做标点和语气符号级的修饰。原文「我没救了」→ 变体「我没救了……」;原文「你认真的吗」→ 变体「你认真的吗?!」。省略号拖慢并压低语势,叹号拉高力度,问号带疑问弧度——模型对标点携带的语气信号的响应远比对标签可靠,因为这是它在海量自然文本里天天见到的模式。
一条硬约束划住了它的边界:禁止增删或替换任何汉字。字幕显示的是原文,音频念的是变体——两者必须字面一致,否则玩家看见「我没救了」听见「我真的没救了」,就是明显的合成感破绽。标点修饰只动「怎么说」,不动「说什么」。
由此,情绪判别的产物分工也清晰了:12 个词的受控情绪词表是标注,不是参数——它写进图行,供审批人快速理解这句话的预期演绎,也供后续统计与返查;真正驱动合成的是 tts_text 变体。受控词表的价值在于把开放式的情绪描述约束到可检索、可聚合的有限集合(「这句是自嘲式的轻」与「这句是疲惫的轻」在审批里没必要区分)。
6. 演绎通道:同一句台词的两种「像」
标点变体解决了文本侧的情绪信号,但克隆还有一个更隐蔽的自由度:参考音频的韵律会迁移。用 ref.wav 做参考克隆新句子时,参考句的节奏、停顿习惯会渗进产出——我们的参考句是刻意选的平静中性长句,于是出现了试验里清晰复现的现象:平静参考的韵律迁移会压制文本本身的语气信号。「你认真的吗?!」被平静的韵律框架拖着念出来,激动不起来。
对策不是找一个「激动的 ref」(那等于为每种情绪维护一套参考音频,一致性立刻瓦解),而是给每句两个可选的演绎通道:
| 通道 | 参考方式 | 效果特征 | 适用 |
|---|---|---|---|
| icl(缺省) | 完整参考音频:音色 + 韵律迁移 | 最「像本人」,但文本语气被参考韵律约束 | 平静陈述、日常对话 |
| xvec | 只提取说话人音色向量,韵律由文本主导 | 情绪表达更放开,代价是与基准韵律略有偏移 | 激动、崩溃、欢呼等强情绪句 |
通道选择和情绪判别、标点变体一样,由 LLM 逐句决定。这个设计的本质是承认了一个物理事实:「像他」和「他此刻的情绪」之间存在张力,与其寻找完美解,不如把张力显式化成可逐句调节的旋钮——由读了整句语境的 LLM 来拧,而不是全局二选一。
一个操作层面的细节让这套机制对审批者也友好:通道选择与情绪标注一起写进图行,审批界面的逐句卡片上,听的人同时看得到「这句判的是愤怒、走的是文本主导通道」——听感不对时,驳回批注可以直接指向「换通道重配」或「变体再轻一点」,重配的动作因此有明确的旋钮可调,而不是笼统的「再自然一点」。给审批者暴露可操作的参数,等于把返工从「重新掷骰子」变成「定向修正」。
7. 行身份与产物寻址:voice key 的结构
每句音频需要一个稳定的名字。我们的命名结构是四段式:
<角色>-<章>-<场景块>-<行节点id>
例:陆择-chapter00_序章-s00_酒店-PxH5yKwcv2(序章的真实母带文件名)
最有分量的是最后一段:行节点 id 是这段音频的身份。行节点用雪花算法生成、全局唯一,于是——剧本在第 10 句和第 11 句之间插入一句新台词,原有每行的 id 与音频映射纹丝不动;删掉一句,也只有那一句的音频作废。如果用行号做 key,任何一次插删都会引起整段音频的错位重配(行号 11 变 12,11 的音频配给了 12……)。用稳定身份做 key、用可变位置做排序,是第 5 篇「幂等对齐」能成立的前提。
母带归档同样按图结构走:章节/场景块/ 两级目录,与剧情链的场景划分一一对应。与第 2 篇同构的原则再次出现:母带区与运行时分离——审批试听直接读母带,运行时目录只在全章发布时收录已批准的音频。审批中的半成品永远不会漏进游戏。
一段音频的完整生命周期因此清晰分成三站:生成落盘(母带区,配着行节点 status=10)→ 审批试听(人工直接读母带,通过置 11)→ 发布收录(全章就绪时,11 的音频才进运行时)。每一站只认图上的 status,谁都不需要「拷一份过去看看」——治理后台的审批界面按节聚合待审行、逐句试听,读的就是归档母带本身。对比一下「每次审批先拷到临时目录」的做法:三站模型少了两份随时可能过期的副本,也少了两类「文件在、状态不对」的漂移事故。
两个节点的状态机并排看,声音链的节奏一目了然:
注意 VoiceDesign 的 10 有两个子阶段(候选待选、ref 待审),靠节点上是否已有固化参考音频区分——同值不同义,用附加属性消歧,而不是加第七个状态值。状态机宁可复用值+属性注记,也不膨胀枚举。
最后,台词行到立绘的引用边(uses)被固定为不参与级联:一句台词换了配图,不该作废那张立绘——立绘是多句共享的资产,行级的演出变更没有资格作废资产级产物。级联是利器,但每条边的级联资格都要单独论证,这是第 1 篇 sync 语义在声音链的又一次落地。
8. 踩坑与演进
坑一:双引擎的伪需求。 项目早期声音链同时挂着两个合成引擎,设想「互为备份、各取所长」。实际运行下来,这个设计只在制造成本:两套环境、两套参数调优、两边的音色互不可迁移(参考音频在引擎 A 固化,引擎 B 用不了)——「备份」在音色资产不可迁移的前提下根本不成立。最终砍掉一个,收敛为单引擎、单环境。教训可以推广:流水线里的「冗余备份」如果备份的是不可迁移的资产,那不是冗余,是两倍的维护负担。
坑二:音频自动验收为什么至今没做。 概念稿里设想过频率分析、音量 RMS、削波静音检测的自动验收流水线。技术上全可行,但落不了地,原因不在技术而在问题错位:技术指标全绿与「这句配得好」之间隔着巨大的鸿沟——削波没发生不代表情绪对,时长正常不代表节奏舒服。而真正需要拦的问题(音色漂移、情绪不到位、怪异断句),恰恰没有可靠的自动判据。人工逐句试听卡因此成为固定工序:按节聚合、逐句通过或驳回。我们给验收立的规矩和第 1 篇一致:机器验「有没有做错」,人验「够不够好」——音频侧连「有没有做错」的可靠判据都还稀缺,那就诚实地说还没有。
坑三:声学标签的弯路。 第 5 节已详述。[叹气] 式标签的诱惑在于它看起来「更精确」,但它要求模型学会一套产品私有约定,而标点是模型母语里现成的语气系统。优先用模型已经充分理解的信号通道,而不是发明新信号——这条经验后来也影响了提示词工程的整体取向。
/*=============================================================*/
作者:CrazyJinn
本文版权归作者所有,欢迎转载.但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
如果看完这篇文章让您有所收获,请点击右下角"推荐".
如果这篇文章让您觉得不知所云,或者通篇谬误,请点击右下角"反对".并且欢迎您留言给我提出宝贵的意见.
如果您想获知我最新的动态,可以在绿色通道中点击"关注我".
/*=============================================================*/

浙公网安备 33010602011771号