同一个分离模型,处理一首棚里录的歌,人声出来干净得像单独录的;处理一段直播录屏,人声闷、飘、带着一层怎么也去不掉的环境嗡鸣,背景音乐里还漏着主播的说话尾音。你以为是录像码率太低,换了一段高码率的重试,结果差不多。素材看起来没问题,分离结果就是不行。
先破除一个误解:难点不在音质,在于声源不可枚举
很多人把直播录像分离失败归因于"音质差"——码率低、采样率不够、经过了平台压缩。于是解决思路就变成找更高画质的源。
这条路走不通,因为真正的障碍是声源类型,不是信号质量。
主流分离模型的训练目标是一组预先定义好的声源类别:人声、鼓、贝斯、其他乐器。模型学到的是"如何把混合能量分配给这几个已知类别"。它输出的掩码之和约等于 1,也就是说——它假设输入里的每一份能量都属于某个已知类别。
直播录像里有什么?主播人声、背景音乐、游戏音效、观众语音、麦克风底噪、房间混响、平台推流的编码痕迹。除了前两类,其余全部不在模型的类别表里。模型不会说"这个我不认识",它只能把这些能量强行摊派给已知的几路。
这就是难度的本质:不是信号脏,是问题本身超出了模型的建模范围。音乐分离之所以简单,是因为一首歌的声源恰好就是模型定义的那几类。
底层原理:掩码分配是一个封闭集合假设
回顾分离的标准流程:短时傅里叶变换(STFT,Short-Time Fourier Transform)→ 掩码预测 → 逆变换重建。
波形 → STFT → 复数谱图 → 模型预测掩码 M(f,t) → M × 谱图 → iSTFT → 各路输出
关键在掩码的约束条件。理想比值掩码(IRM,Ideal Ratio Mask)的定义是:
M_vocal(f,t) = E_vocal(f,t) / E_total(f,t)
分母是该时频点的总能量。训练时数据都是干净的多轨混音,`E_total` 严格等于各已知声源能量之和。所以模型习得的是一个封闭集合(Closed-Set)映射:所有能量必有归属。
五大干扰源逐一拆解
第一类:游戏音效与拟音
为什么难:音效的时频特征与人声高度重叠。爆炸声是宽带瞬态,和爆破音(p、t、k)的频谱包络相似;技能音效常带人声采样或类语音的共振峰结构;UI 提示音是窄带纯音,落在人声基频区间。
对策:无解,只能规避。如果录制端可控,让游戏音效走独立音轨(OBS 等推流软件支持多轨录制)。事后处理的话,只能接受人声轨里有音效残留,或者用多轨分离把音效尽量归到"其他"轨。
第二类:观众语音与连麦
为什么难:这是五类里唯一在模型类别表内却仍然失败的一类。观众语音和主播人声属于同一类别,模型无法区分"哪个人声是你要的那个"。
分离模型做的是按类别分离(Source Separation),不是按说话人分离(Speaker Separation)。后者需要完全不同的技术路线——说话人嵌入向量(Speaker Embedding)、声纹聚类、或者提供一段目标说话人的参考音频做条件输入。
对策:技术路线要换。普通人声分离对此无效,需要说话人分离类工具。如果只是偶尔串入,人工剪掉那几段比调参快。
第三类:房间混响
为什么难:混响是你自己声音的延迟拷贝,它和干声属于同一个声源。模型的掩码把它判为人声——这在类别上完全正确,所以混响会跟着人声一起被分出来。
问题在于混响破坏了后续可用性:带混响的人声无法重新混音,因为你没法给它加上新的空间感(旧混响还在里面)。
对策:需要去混响(Dereverberation)模型,这是独立于分离的另一类技术。顺序上应该先去混响再分离——混响会让分离模型看到的谐波结构变模糊,降低掩码精度。
直播场景的混响通常比棚录严重得多:小房间、硬质墙面、麦克风离嘴远。这是直播录像分离结果"发闷发飘"最主要的成因。
第四类:麦克风底噪与自动增益
为什么难:底噪不属于任何已知类别,被强行分摊(第一段讲的封闭集合问题)。更麻烦的是自动增益控制(AGC,Automatic Gain Control)——直播软件会在主播停止说话时猛提增益、开口时压回去。
这让同一个人的声音在不同段落有不同的电平包络,模型看到的是一个统计特性不稳定的信号。掩码估算的稳定性因此下降,表现为人声轨忽大忽小、安静段落有抽气感。
对策:先降噪再分离(底噪属于降噪的舒适区)。AGC 造成的抽气感无法后期修复——增益包络已经写进波形了,那不是噪声。
第五类:平台推流的编码损伤
为什么难:直播推流为了低延迟,通常用较激进的编码参数。有损编码器会丢弃"听不见"的频率成分(心理声学模型),并引入量化噪声。
这对分离的影响是双重的:高频信息缺失让模型少了判断依据;量化噪声作为未知声源又被分摊进各路。二次转录(录屏再压一次)会让损伤翻倍。
对策:尽可能拿原始录制文件而不是二次转录版。码率低于 96kbps 的音频,分离结果基本不可用于正式交付。
处理链:直接抄
三步判断你遇到的是哪一类:
- 人声发闷、发飘、像隔着墙→ 第三类混响,先去混响
- 人声忽大忽小、安静段抽气→ 第四类 AGC,无法修复,只能重录
- 人声轨里混着音效或别人说话→ 第一/二类,需换技术路线或规避
能力边界:四件做不到的事
未知声源无法被正确剥离。这是封闭集合假设的直接后果,不是模型不够强。类别表外的声音必然被摊派进已知输出——除非模型专门为"其他/噪声"这一类做过训练,而多数音乐分离模型没有。
同类别的两个声源分不开。主播和观众都是人声,普通分离模型在原理上无法区分。这需要说话人分离,是另一条技术路线。
AGC 的增益包络不可复原。它不是叠加上去的噪声,而是对原信号的乘性调制,且调制曲线未知。任何后期处理都无法还原原始动态。
编码器丢弃的高频回不来。提升 10kHz 只能放大已有成分。低码率素材那个频段只有量化噪声,放大它只是放大噪声。
落地:按干扰源类型选处理路径
判断逻辑说清了,剩下是执行。如果只是处理一次素材、不想为此配本地环境,网页端工具能覆盖这条链,以 AIFooler 这类在线音频分离工具为例说明对应关系。
第一步,先拿到尽量干净的音频源。素材在平台视频里的话,保存视频后提取音频。
第二步,按干扰源排顺序,别直接上分离。底噪明显先走一键降噪,衰减保守给;素材脏到人声都不清楚,走深度分离——它本身是先降噪再分离的两步串联。想把音效尽量剥出去的话,用多音轨分离而不是普通人声分离,让未知能量有更多归属选择。
第三步,用试听定位问题层级,而不是盲目重跑。处理完对比听:发闷发飘是混响层的问题,加强度没用;混着别人说话是类别层的问题,换工具也没用,只能剪。
实际条件是网页端直接用、不装客户端、支持 MP3 / WAV 等常见格式、上传文件 24 小时后自动删除。对"临时处理一段录像音频"这种需求,省下的环境配置时间通常比处理时间本身长。
最后
直播录像分离难,难在问题的定义超出了工具的设计范围。音乐分离是一个封闭集合问题——声源就那么几类,模型见过;直播录像是开放集合问题——什么声音都可能进来,而模型必须给每一份能量找个归属。
认清这一点,努力方向就会变:从"找更强的模型"转向"减少未知声源"。录制端多配置五分钟,比后期折腾五小时有效得多。工具能做的是把损失降到最低,不是把损失消掉。