对种子-VC结构的深度解释——将声音分解成"Who, What, and How"在一个四阶结构中

2026年8月6日1 次浏览来源:Dev.to阅读原文

最初发表(日文)于former.workstyle.tech.

理解"声音"——分解组件 当试图将你录制的声音转换成别人的声音时,第一个想到的问题是:什么是"声音"?

即使说出同一种话来,不同的演讲者也会产生不同的声音.

连同名演说家也根据自己在说什么而产生出不同的声音.

加入进化会进一步改变它.

换句话说,语音是一个由多个独立的信息片段相混合而成的信号——至少是:谁在说话(说者身份),正在说话(内容),如何说话(发音).

语音转换的核心挑战就在于此.

如果你天真地处理演讲,只取而代之的是演讲者身份,内容和入声也经常被改变.

在本篇文章中,我们将解释我们为"语音设计"应用软件的后端所采纳的"种子-VC"是如何解决这个问题的——通过使用四个模块分隔和处理信息,同时走过实际模型加载和推论代码.

设计哲学:代表分离信息到专用模块 种子-VC的核心思想是:"不要让一个单一的模型做一切".

取而代之的是,将语音的组件按类型分解,并指定每个组件到一个专用模块,然后再在结尾重接.

启动时的模型加载过程看起来是这样的: 虽然返回了7个组件,但是它们可以被分组为4个功能层: 低语 () —— 提取内容(正在说的话)作为语义特征 campplus () —— 编码扬声器身份(正在发言)为单一的向量嵌入 CFM/DIT () —— 一种传播模型,生成一个在以上两个 BigVGAN () 上标注的分镜条件—— 将分镜回转成可声波 每一个角色——"分镜意义","分镜扬声器","分镜分镜","转换成音.

这种分工是为什么我们只能取代演讲者的身份,同时保持其他一切完整.

每出一出步来.

第1步:低语——只取出"What Is Being Said"的内容取出,我们使用语音识别模型Whisper的编码.

我们不使用解码器(transcription).

相反,我们直接将中间代表(语义特征的序列)视为特征向量.

一个关键点:在处理之前,输入被重印到16kHz.

由于Whisper为16kHz音频所设计,即使主转换模型运行于44.1kHz,在语义取出之前,我们总是将样本降低到16kHz.

由此产生的序列中几乎没有或根本没有关于投出或起伏的信息——它代表着与口语内容一致的表示.

这是允许我们日后自由取代演讲者身份的先决条件。

注:Whisper有限制——每次只能处理长达30秒的音频.

较长的音频需要分块。

这种约束本身是一大陷阱(见我们的另一篇文章:""低调演说"背后的罪状""语音转换中的臭虫""Whisper's 30-second Limit").

第2步: Campplus —— Condense "Who is Speaking"入出192-Dimensional Vector Speator Speaker 身份取自由CAMPPlus处理,一个扬声器嵌入模型.

它需要音频,计算 fbank 特性,并输出一个单一的192维向量. "语音身份=单一载体"对我们的"语音设计"应用至关重要.

因为向量可以被添加,混合,或被插入,所以我们预先从18个扬声器的清洁录音中计算出嵌入物作为"起伏器",然后根据滑动器输入的加权平均值将其混合.

我们定义“年龄”、“pitch”和“huskiness”等可解释轴的滑动器,计算权重,并取一个加权平均锚嵌入。

这种"通过混合声音来设计"操作之所以可能,只是因为扬声器身份被模块化为一个独立的向量.

如果扬声器的身份和内容缠在一起 混合会破坏音标

分享