当前位置: 首页 > news >正文

语音合成之二十 VITS模型详解与MeloTTS实现

VITS模型详解与MeloTTS实现

  • 1.端到端文本转语音及VITS简介
    • 1.1 TTS的演进:从多阶段流水线到单阶段端到端系统
    • 1.2 VITS的出现:解决TTS中的鲁棒性和表现力问题
    • 1.3 VITS核心创新及其在现代TTS中的作用概述
  • 2. VITS的基础知识点与机制
    • 2.1 变分自编码器(VAEs):生成核心
      • 2.1.1 原理:潜在变量建模与TTS中的一对多映射问题
      • 2.1.2 机制:编码、解码与潜在空间的作用
      • 2.1.3 数学推导:证据下界(ELBO)及其最大化
    • 2.2 归一化流(NFs):增强表现力与似然性
      • 2.2.1 原理:将简单分布转换为复杂数据分布
      • 2.2.2 机制:可逆变换与精确似然计算
    • 2.3 对抗训练:驱动真实感与质量
      • 2.3.1 原理:生成器-判别器博弈实现高保真合成
      • 2.3.2 机制:通过对抗反馈学习真实数据分布
      • 2.3.3 关键对抗损失:生成器损失、判别器损失和特征匹配损失
  • 3. VITS模型架构:详细分解
    • 3.1 整体架构与数据流图
  • 4.MeloTTS作为基于VITS的实现
    • 4.1 文本处理与编码器实现
    • 4.2 生成器(模型)结构与基于流的解码器
    • 4.3 判别器与损失函数
    • 4.5 效率与部署考量
    • 5. 结论与未来方向

变分推理文本转语音(VITS)模型是实现高保真语音合成的领先端到端框架。本文分析了其基础原理,包括变分自编码器(VAEs)、归一化流(NFs)和对抗训练,并详细阐述了它们的数学推导和功能作用。
本文是对VITS模型架构的细致分解,涵盖了文本编码器、后验编码器、基于流的解码器、随机时长预测器和判别器网络。并以代码和模型都开源的MeloTTS库作为VITS基础系统的具体示例。

1.端到端文本转语音及VITS简介

1.1 TTS的演进:从多阶段流水线到单阶段端到端系统

传统上,文本转语音(TTS)系统通常依赖于多阶段流水线,这通常涉及一个声学模型将文本转换为声学特征(例如,梅尔频谱),然后一个声码器将这些特征合成为波形。一个典型的级联模型是GPT-SoVITS,它首先训练一个自回归模型从文本生成音频语义标记,然后由SoVITS模型根据这些标记合成波形 。

尽管这些级联模型有效,但它们常面临阶段间错误传播的问题,并且联合优化过程可能十分复杂。例如,在多阶段系统中,早期阶段(如音素转换)的任何不准确性都可能在后续阶段累积,导致最终合成语音的质量下降或出现“幻觉”现象,即合成内容与输入文本不符 。

为了解决这些挑战,TTS领域逐渐转向了端到端(E2E)模型。E2E方法旨在简化TTS流水线,允许从文本输入到原始音频输出的所有组件进行联合优化,从而显著提高鲁棒性和合成质量。这种转变的核心在于,E2E模型能够直接处理字符或音素输入序列,并直接生成原始语音音频输出 。这种从多阶段到单阶段端到端TTS的演变 标志着TTS领域的一个根本性范式转变,其驱动力在于对更高鲁棒性、减少错误传播以及捕获整个合成过程中复杂依赖关系的需求。

1.2 VITS的出现:解决TTS中的鲁棒性和表现力问题

变分推理文本转语音(VITS)模型由Kim等人于2021年提出,是端到端TTS领域的一项重要进展 。它是一个单阶段框架,旨在直接从文本输入合成语音。

VITS展现出卓越的鲁棒性,尤其是在减少“幻觉”方面,这主要归因于其字素到音素(G2P)的特性以及结构化的语音建模方法 。这与一些基于大型语言模型(LLM)的TTS系统形成对比,后者有时会面临已知的幻觉挑战 。VITS的G2P特性提供了一种更结构化的音素建模方法,从而提高了发音准确性 。

TTS中的一个关键挑战是“一对多”映射问题,即单个文本输入可以对应多种有效的语音实现方式,例如不同的时长、音高和韵律 。VITS通过采用条件变分自编码器(CVAE)结构来解决这一问题 。VITS通过变分自编码器(VAE)、归一化流(NFs)和对抗训练的独特结合,实现了卓越的鲁棒性、减少了幻觉并提升了语音合成质量 。VAE负责处理一对多映射问题,通过引入一个潜在变量来捕捉语音中固有的可变性,例如不同的说话风格或韵律归一化流在此基础上进一步转换这个潜在空间,使其能够建模复杂的语音分布,从而增强了合成语音的表现力。最后,对抗训练通过生成器与判别器之间的博弈,迫使生成器产生在感知上与真实语音无法区分的样本,从而达到高保真的效果并减少可能被感知为“幻觉”的伪影。这种多组件的集成确保了VITS能够生成多样化、富有表现力且高度自然的语音,有效地解决了TTS的核心挑战。

1.3 VITS核心创新及其在现代TTS中的作用概述

VITS利用变分自编码器(VAE)来最大化变分下界(ELBO),并采用对抗训练来提升合成质量 。它整合了基于归一化流的解码器用于波形生成,并学习了能够增强生成语音表现力的潜在表示 。

VITS的一个重要创新是随机时长预测器,它与单调对齐搜索(MAS)算法相结合,使得模型无需显式的时长标注即可学习音素时长和对齐 。这大大简化了数据准备和训练过程 。VITS是一种“并行端到端TTS方法” ,这意味着它可以通过单次前向传播高效地生成音频,这与自回归模型不同。

尽管基于大型语言模型(LLM)的TTS系统日益突出,VITS因其固有的鲁棒性和减少幻觉的能力而保持其重要性 。幻觉是LLM系统中一个已知挑战。VITS的字素到音素(G2P)特性和结构化语音建模方法使其在处理精确发音和一致性方面具有优势 。这揭示了一种根本性的权衡和互补性:LLM擅长语义理解和生成丰富的上下文嵌入 ,而VITS则在语音精确性和鲁棒波形生成方面提供了坚实的基础。因此,VITS作为许多先进变体(如VITS2、BERT-VITS2、Llama-VITS和PITS)的基础架构,持续发挥着关键作用 。

2. VITS的基础知识点与机制

2.1 变分自编码器(VAEs):生成核心

2.1.1 原理:潜在变量建模与TTS中的一对多映射问题

变分自编码器(VAEs)是一类生成模型,它们学习从低维潜在空间到高维数据空间的概率映射。在TTS中,这对于处理“一对多”问题至关重要:单个文本输入可以对应多种可能的语音波形(例如,不同的说话风格、音高、韵律) 。

VITS利用条件VAEs(CVAE)结构 ,其中潜在变量 z z z 捕捉了给定文本输入下语音固有的可变性。模型学习将语音编码到这个潜在空间中,然后从其中解码。

2.1.2 机制:编码、解码与潜在空间的作用

VAEs由编码器和解码器组成。编码器(推断网络)将输入数据 x x x映射到潜在变量 z z z的分布上,通常是一个高斯分布 q ϕ ( z ∣ x ) q_{\phi}(z|x) qϕ(zx),解码器(生成网络)将采样的潜在变量 z z z映射回数据空间,即 p θ ( x ∣ z ) p_{\theta}(x|z) pθ(xz)

潜在空间 z z z作为输入的压缩、解耦表示,允许模型通过从该空间的不同点采样来生成多样化的输出,对于VITS,后验编码器从线性频谱图 x lin x_{\text{lin}} xlin中提取 q ϕ ( z ∣ x lin ) q_{\phi}(z|x_{\text{lin}}) qϕ(zxlin),解码器从 z z z生成音频。先验编码器(文本编码器+归一化流)匹配 p θ ( z ∣ c text , A text ) p_{\theta(z|c_\text{text}, A_\text{text})} pθ(zctext,Atext)

VAEs特别适合生成式增量学习,这得益于其低维潜在空间,即使在数据稀缺的情况下也能高效地进行高斯参数估计。这种特性使得他们比生成对抗网络(GANs)更易于处理和训练稳定,因为GANs可能面临多样性降低和训练不稳定的问题,此外,归一化流(NFs)虽然有其自身的吸引力,但受限于可逆性,训练起来可能困难且缓慢,并且在参数数量相同的情况下表达能力不如其他模型。因此VTS选择VAEs作为其生成模型的基础,为其学习复杂的语音分布提供了一个鲁棒且稳定的框架,这使得后续的归一化流和对抗性组件能够在此坚实的基础上进行构建,这种设计使得VITS在面对有限数据或需要持续学习新语音特性时,能够保持高效和稳定。

2.1.3 数学推导:证据下界(ELBO)及其最大化

VAEs的核心目标是最大化观测数据 log ⁡ p θ ( x ∣ c ) \log p_{\theta}(x|c) logpθ(xc)的似然。然而,这通常是难以处理的。相反,VAEs最大化证据下界(变分下界)(ELBO)。详细推导可参考VITS paper
ELBO的目标函数定义为:
ELBO = E q ϕ ( z ∣ x ) [ [ log ⁡ p θ ( x ∣ z ) ] − D_KL [ q ϕ ( z ∣ x ) ∣ ∣ p θ ( z ∣ c ) ] ] = E q ϕ ( z ∣ x ) [ log ⁡ p θ ( x ∣ z ) ] − log ⁡ q ϕ ( z ∣ x ) p θ ( z ∣ c ) ] \text{ELBO} = E_{q_{\phi(z|x)}} \left[[\log p_{\theta}(x|z) ]- \text{D\_KL}[q_{\phi}(z|x) || p_{\theta}(z|c)]\right]=E_{q_{\phi(z|x)}} \left[\log p_{\theta}(x|z) ]- \log \frac{q_{\phi}(z|x)}{p_{\theta}(z|c)}\right] ELBO=Eqϕ(zx)[[logpθ(xz)]D_KL[qϕ(zx)∣∣pθ(zc)]]=Eqϕ(zx)[logpθ(xz)]logpθ(zc)qϕ(zx)] (1)
其中:

  • x x x对应于时域波形,
  • c c c是从中文的字/英文的单词提取的音素,中文是声母、韵母、声调等,英文是元音、辅音等,也会有一些有意义的交流用到的停顿、意义音(笑声、叹息)等。
  • z z z是变分自编码的潜空间表示。
  • p θ ( x ∣ c ) p_{\theta}(x|c) pθ(xc),对于给定的文本( c c c)-语音( x x x)对集合(训练数据集),应该有一个参数集 θ \theta θ(所有模型参数集合)使得 p θ ( x ∣ c ) p_{\theta}(x|c) pθ(xc)的概率是最高的,这样模型对于训练集数据的分布拟合是最好的。
    由于文本到语音本身是一对多的关系(同一段文本可以对应于很多声波),直接最大化 p θ ( x ∣ c ) p_{\theta}(x|c) pθ(xc)概率是比较复杂的,这时的一个比较自然的想法是,如果可以找到 p θ ( x ∣ c ) p_{\theta}(x|c) pθ(xc)一定大于某个概率表达式,那么只要最大化这个概率表达式的值,那么 p θ ( x ∣ c ) p_{\theta}(x|c) pθ(xc)的概率也会更加契合训练数据集的分布。
  • p θ ( z ∣ c ) p_{\theta(z|c)} pθ(zc)表示的是给定条件 c c c得到的潜变量 z z z先验概率分布
  • p ϕ ( z ∣ x ) p_{\phi(z|x)} pϕ(zx)表示的是给定条件 x x x得到的潜变量 z z z后验概率分布
  • p θ ( x ∣ z ) p_{\theta(x|z)} pθ(xz)表示的是给定条件 z z z得到时域波形 x x x的概率分布。 E q ϕ ( z ∣ x ) [ log ⁡ p θ ( x ∣ z ) ] ] E_{q_{\phi(z|x)}} \left[\log p_{\theta}(x|z) ]\right] Eqϕ(zx)[logpθ(xz)]]这是重构损失,这一项鼓励解码器从采样的潜变量 z z z中准确地重构输入数据。它衡量了解码器 p θ ( x ∣ z ) p_{\theta}(x|z) pθ(xz)在给定从编码器分布 q ϕ ( z ∣ x ) q_{\phi}(z|x) qϕ(zx)中采样的 z z z的情况下,生成 x x x的能力。
  • 第二项KL散度,这一项为正则化项,强制编码器学习到的近似后验概率分布 q ϕ ( z ∣ x ) q_{\phi}(z|x) qϕ(zx)接近预定义的先验分布 p θ ( z ∣ c ) p_{\theta(z|c)} pθ(zc)(通常是标准高斯分布),这确保了潜空间结构良好,并有利于采样新的、多样化的数据。

至此训练的损失可以定义为ELBO的负值,即 − log ⁡ p θ ( x ∣ z ) -\log p_{\theta}(x|z) logpθ(xz)和KL( log ⁡ q ϕ ( z ∣ x ) − log ⁡ p θ ( z ∣ c ) \log q_{\phi}(z|x) - \log p_{\theta}(z|c) logqϕ(zx)logpθ(zc))的和。

2.2 归一化流(NFs):增强表现力与似然性

2.2.1 原理:将简单分布转换为复杂数据分布

归一化流是一类生成模型,它通过一系列可逆且可微分的变换,将一个简单的基础分布(例如,标准高斯噪声)转换为一个复杂的数据分布 。这使得它们能够建模高度复杂的数据分布,这对于语音信号的丰富可变性至关重要。

在VITS中,归一化流被集成到先验编码器中,以细化潜在空间,从而提高生成语音的表现力 。它们匹配条件先验分布 p θ ( c , A ) p_{\theta}(c,A) pθ(c,A),其中 c c c是上文提到的因素, A A A是音素和潜变量的对齐关系,这里的对齐具体作用和重要性需要结合例子来详细解释:

  1. 建立音素到音频帧的映射:
    • 输入 ctext 是一个音素序列(例如:[‘s’, ‘i:’, ‘l’, ‘ə’, ‘n’, ‘t’]),长度是 |ctext|(比如 6)。
    • 目标语音被编码成一个潜在变量序列 z(可以理解为连续的、代表声音特征的帧序列),长度是 |z|(比如 200 帧)。
    • 显然,|ctext| (文本长度) 远小于 |z| (音频帧数)。一个音素(如元音 ‘i:’)通常会持续多个音频帧。
    • 对齐矩阵 A (|ctext| x |z|) 的作用就是明确地指出:文本序列中的第 i 个音素(行)对应着潜在变量序列 z 中的哪些帧(列)。
  2. 定义音素的持续时间:
    • 对齐矩阵 A 不仅定义了 哪个 音素对应 哪些 帧,还通过它覆盖的帧数 精确地定义了每个音素的持续时间。
    • 例如,如果音素 ‘i:’ 在 A 中对应的列是第 50 帧到第 79 帧(共 30 帧),那么模型就知道这个音素应该持续 30 帧的时间长度。
      3.指导模型生成:
    • 在训练时,先验编码器需要学习基于给定的文本(音素序列)生成对应的语音潜在表示 z。对齐 A 提供了关键的监督信号,告诉模型:
      • 何时开始生成某个音素: 当模型生成到 A 中标记为该音素开始的帧时。
      • 如何扩展音素: 模型需要学习将单个离散的音素符号扩展成连续的、持续多帧的音频特征(z 的片段)。
      • 音素之间的边界在哪里: 对齐清晰地划分了不同音素对应的帧范围,帮助模型学习音素之间的过渡。
    • 在推理时(生成语音时),模型需要知道每个音素应该持续多长时间。对齐机制(无论是显式如Glow-TTS的Duration Predictor,还是隐式如VITS学习到的对齐)确保模型按照正确的时序节奏来生成语音,避免音素重叠、跳过或持续时间异常。
  3. 实现“单调”和“硬”对齐:
    • 单调: 对齐必须保持文本音素的顺序。即,如果音素 A 在文本中出现在音素 B 之前,那么 A 对应的所有帧在时间上也必须出现在 B 对应的所有帧之前。这符合语音的自然特性,发音顺序不能乱。
    • 硬: 这意味着对齐矩阵 A 通常是 二值(0 或 1) 的。每一列(代表一个音频时间帧)只能由一个音素负责(即每列只有一个 1)。每一行(代表一个音素)可以有多个连续的 1(即覆盖多个帧)。这保证了每个时间点只属于一个明确的音素,没有模糊的重叠区域。这种特性对于学习清晰、准确的发音和时长至关重要。
    • 注意力机制: 对齐 A 本质上是 单调硬注意力 的结果。模型(或其对齐模块)学习将“注意力”严格地、按顺序地从一个音素移动到下一个音素,每个音素“注意”一段连续的时间帧。
  4. 为什么是“先验”编码器的输入?
    在像VITS这样的模型中,“先验”指的是模型在生成语音之前对目标语音的分布(时长、韵律、音素内容)所做的假设或预测。对齐 A 直接提供了关于 音素内容在时间轴上如何分布 的关键先验信息。它告诉先验编码器:“在生成潜在变量 z 时,请确保第 1-30帧是音素 s,第31-60帧是音素 i:,以此类推”。

2.2.2 机制:可逆变换与精确似然计算

归一化流的关键特性是,序列中的每个变换 f i f_i fi 都是可逆的,这意味着 z k − 1 = f i − 1 ( z k ) z_{k-1} = f_i^-1(z_k) zk1=fi1(zk) 可以被计算 。这种可逆性对于高效采样和精确似然计算都至关重要。归一化流允许精确的似然计算,这是其相对于许多其他生成模型(如GANs或扩散模型)的一个显著优势 。这意味着模型可以精确计算任何给定数据点的概率。

尽管归一化流具有精确似然计算和可逆性等吸引人的特性 ,但它们也被指出“受限于可逆性,因此训练困难(且缓慢),并且在相同参数数量下表达能力不如其他模型” 。这揭示了VITS设计中的一个重要权衡:选择归一化流是为了利用其独特的优势(精确似然、结构化潜在空间),但其固有的训练挑战和表达能力限制则通过VITS的整体架构和对抗训练来缓解。这种集成方式使得归一化流能够有效地细化VAE学习到的潜在表示,从而增强其建模复杂语音分布的能力,同时避免了作为独立生成模型时可能面临的全部训练困难。

2.2.3 数学推导:变量变换公式
通过一系列可逆变换 f = f K ∘ . . . ∘ f 1 f = f_K ∘... ∘ f_1 f=fK...f1 从简单潜在变量 z 0 z_0 z0 转换而来的数据点 x x x 的似然,可以使用变量变换公式计算:
log ⁡ p ( x ) = log ⁡ p ( z 0 ) + log ⁡ ∣ det ⁡ ( ∂ f / ∂ z 0 ) ∣ \log p(x) = \log p(z_0) + \log |\det(\partial f/ \partial z_0)| logp(x)=logp(z0)+logdet(f/z0)
其中 z 0 z_0 z0 从基础分布 p ( z 0 ) p(z_0) p(z0) 中采样, ∣ d e t ( ∂ f / ∂ z 0 ) ∣ |det( \partial f/ \partial z_0)| det(f/z0) 是变换 f 的雅可比矩阵的绝对行列式。对于一系列变换,雅可比行列式的对数简单地是各个变换的雅可比行列式对数的总和: log ⁡ ∣ d e t ( ∂ f / ∂ z 0 ) ∣ = Σ l o g ∣ d e t ( ∂ f i / ∂ z i − 1 ) ∣ \log |det(\partial f/ \partial z_0)| = Σ log |det(∂f_i/∂z_{i-1})| logdet(f/z0)=Σlogdet(fi/zi1)

这个公式使得VITS能够高效地计算生成波形的似然,这对于VAE的ELBO最大化至关重要。这就使得 p θ ( z ∣ c ) p_{\theta}(z|c) pθ(zc)概率分布可以表示为:
p θ ( z ∣ c ) = N ( f ( z ) ; μ ( c ) , σ ( c ) ∣ det ⁡ ∂ f ( z ) ∂ z ∣ p_{\theta}(z|c) = N(f(z);\mu({c}), \sigma({c})|\det \frac{\partial f(z)}{\partial z}| pθ(zc)=N(f(z);μ(c),σ(c)detzf(z),这里的 c = [ c t e x t , A ] c=[c_{text}, A] c=[ctext,A]

2.3 对抗训练:驱动真实感与质量

2.3.1 原理:生成器-判别器博弈实现高保真合成

对抗训练,受生成对抗网络(GANs)的启发,涉及同时训练两个神经网络:一个生成器(G)和一个判别器(D) 。生成器的目标是生成与真实数据无法区分的样本(在VITS中是语音波形)。判别器的目标是准确区分真实数据和生成样本 。这形成了一个最小-最大博弈,生成器试图欺骗判别器,判别器则试图正确分类 。这种竞争促使两个网络共同进步,从而推动生成器产生越来越真实的输出 。

2.3.2 机制:通过对抗反馈学习真实数据分布

在VITS中,生成器是核心的TTS模型,它从文本合成波形。判别器(通常是多尺度判别器,如HiFi-GAN中所示)评估这些生成波形的真实性 。判别器向生成器提供对抗性反馈,引导生成器不仅要匹配输入文本,还要生成听起来自然且高保真的语音,使其与真实音频相媲美 。

对抗性损失的“模式寻求行为”,通常在通用生成模型中被认为是缺点(导致多样性降低),但在VITS的TTS应用中却是一个显著的优势。它使得模型能够有效利用其容量,专注于生成语音的“真实感” ,这对于高品质语音合成至关重要。在TTS中,生成在感知上与人类语音无法区分的音频是首要目标。VITS中的VAE和归一化流负责捕捉语音的“多样性”(即一对多映射),而对抗性组件则专门磨练生成波形的“真实感”和“保真度”。因此,判别器对真实感的压力,即使在广义上导致了“模式寻求”,对于VITS实现高品质语音的整体目标也是有益的。

2.3.3 关键对抗损失:生成器损失、判别器损失和特征匹配损失

生成器损失 (LG,adv):此损失鼓励生成器欺骗判别器。其通常被设计为最大化判别器在生成样本上的错误 。
判别器损失 (LD):此损失训练判别器准确地将真实样本分类为真实,将生成样本分类为虚假 。
特征匹配损失 (Lfm):这是VITS中一个关键的辅助损失(以及HiFi-GAN等基于GAN的声码器)。它最小化判别器在接收真实音频和生成音频时,其中间特征图之间的L1距离 。这有助于稳定训练并防止生成器产生伪影,确保生成语音具有与真实语音相似的底层声学特性 。
VITS采用对抗训练,特别是结合多尺度判别器和特征匹配损失 ,这标志着TTS领域超越纯粹基于似然的模型,迈向了战略性的一步。这种方法优先考虑感知质量和真实感,认识到人类对语音质量的感知不仅由数学似然决定,还受到保真度和自然度的影响。多尺度判别器在不同分辨率下评估真实感,捕捉细粒度和粗粒度特征,而特征匹配则确保生成器不仅生成“看起来真实”的输出,而且生成在判别器看来具有真实“内部表示”的输出。这种全面的方法是VITS实现高保真输出的关键。

3. VITS模型架构:详细分解

3.1 整体架构与数据流图

VITS是一个单阶段框架,集成了文本编码器、后验编码器、基于流的解码器、随机时长预测器和判别器网络 。其结构是一个条件变分自编码器(CVAE),包含一个生成器和一个判别器 。

在训练阶段,模型的输入包括文本和真实音频。而在推理阶段,仅需文本输入,模型即可生成音频。
数据流:

  1. 文本输入(音素或标准化文本)由文本编码器处理。
  2. 真实音频(线性频谱图)由后验编码器处理。
  3. **单调对齐搜索(MAS)**算法对文本编码特征与音频编码特征进行对齐,提供时长信息 。MAS是VITS的关键组成部分,因为它使得模型能够在没有显式标注时长的情况下学习音素时长和对齐 ,这极大地简化了数据准备和训练过程。
  4. 后验编码器输出潜在变量 z z z 的后验分布 q ϕ ( z ∣ x lin ) q_{\phi}(z|x_\text{lin}) qϕ(zxlin)
    5.文本编码器和归一化流定义了先验分布 p θ ( z ∣ c text , A text ) p_θ(z|c_\text{text}, A_\text{text}) pθ(zctext,Atext)
  5. 潜在变量 z z z(训练时从 q ϕ q_\phi qϕ采样,推理时从 p θ p_θ pθ 采样)被传递给解码器。
    7.解码器(一个HiFi-GAN风格的声码器)从 z z z 重构波形 。解码器采用HiFi-GAN风格,意味着VITS利用了已验证的高保真波形生成技术,并将其集成到端到端框架中,这是其实现高质量输出的重要设计选择。
    8.判别器网络评估生成波形的真实性 。

VITS架构的模块化特性也体现在其后续的演进中。例如,VITS2 和BERT-VITS2 等变体,通过引入Transformer块、对抗性时长学习、多语言BERT编码器以及风格嵌入等新特性,进一步增强了模型的连贯性、表现力、效率和多语言处理能力。这些扩展证明了VITS作为基础架构的灵活性和可扩展性,使其能够不断适应和集成最新的研究进展。

表1:VITS的关键组件及其功能

组件功能
文本编码器 (Text Encoder)将输入文本(通常是音素或标准化文本)转换为潜在表示。
后验编码器 (Posterior Encoder)从真实音频(线性频谱图)中提取潜在变量 z 的后验分布 q ϕ ( z ∣ x ) q_{\phi}(z|x) qϕ(zx)
归一化流 (Normalizing Flow)在先验编码器中,将文本编码器输出的简单潜在分布转换为更复杂的、匹配后验分布的潜在表示,增强表现力。
随机时长预测器 (Stochastic Duration Predictor)预测每个音素的时长,引入随机性以实现语音韵律的多样性。
单调对齐搜索 (Monotonic Alignment Search, MAS)在训练期间,在文本特征和声学特征之间找到最佳对齐路径,无需预先标注时长。
解码器 (Decoder)一个HiFi-GAN风格的声码器,从潜在变量 z 重建原始语音波形。
判别器网络 (Discriminator Networks)评估生成波形的真实性,通过对抗训练推动生成器产生高保真语音。

4.MeloTTS作为基于VITS的实现

MeloTTS是由MyShell.ai开发的一个高质量、多语言文本转语音库 。它基于VITS架构,并支持多种语言和口音,包括英语、西班牙语、法语、中文、日语、韩语和马来语 。MeloTTS的中文支持还包括中英文混合语音 。

需要指出的是,由于对MeloTTS存储库中特定文件(如melo/models.pymelo/train.py)的直接访问受限 ,本节关于核心代码实现的讨论将主要基于VITS的通用原理,并结合MeloTTS公开描述的特性和其文件结构进行推断。MeloTTS的melo文件夹结构(包含melo/text/melo/models.pymelo/train.py) 提供了一个清晰的关注点分离:文本处理、模型定义和训练逻辑。这种模块化设计是深度学习项目中的良好软件工程实践。

4.1 文本处理与编码器实现

MeloTTS在文本处理方面进行了显著增强,特别是通过集成BERT编码器。例如,melo/text/malay_bert.py文件使用了预训练的BERT模型 。这代表了对原始VITS文本编码器的一个重要改进,原始VITS主要依赖音素输入 。MeloTTS通过BERT的集成,能够实现更丰富的上下文理解和改进的文本到语义映射 ,从而更好地处理多语言和复杂语言环境。

对于英文,MeloTTS使用mini-bart-g2p进行字素到音素(G2P)转换,生成带有重音标记的音素 。中文则使用拼音和四声调表示 。melo/text/malay.py文件利用ms音素器和Malaya Speech归一化器进行文本处理 。此外,melo/text/symbols.py文件负责扩展符号集以支持多语言 。

4.2 生成器(模型)结构与基于流的解码器

根据VITS的通用架构,MeloTTS的melo/models.py文件预计会定义生成器的核心组件,包括:

TextEncoder (enc_p):负责将处理后的文本输入转换为潜在表示 。
PosteriorEncoder:从真实音频中提取潜在分布。
NormalizingFlow:用于转换和细化潜在空间。
Decoder:一个HiFi-GAN风格的模块,用于从潜在表示生成原始波形。

MeloTTS在melo/models.py中“硬编码词汇和声调的大小(基于预训练模型),但在推理时使用新大小” 。这表明模型可能在训练时使用了固定的词汇表,但在推理时能够适应扩展的符号集,以支持更多语言或特定语言的细微差别。此外,gin_channels参数可能用于处理说话人嵌入,从而实现多说话人TTS,这是VITS架构中常见的扩展 。

4.3 判别器与损失函数

VITS的训练目标是最大化生成器和判别器之间的对抗性博弈,同时结合多种辅助损失以确保合成语音的质量和稳定性。MeloTTS对所有的loss如下表
表2:MeloTTS损失函数概述及其作用

损失类型作用典型权重 (Coqui-TTS VITS)MeloTTS
KL散度损失 (KL Divergence Loss)强制后验分布接近先验分布,正则化潜在空间,确保可采样性。kl_loss_alpha: 1.0通过超差hps.train.c_mel设置,默认1.0
生成器对抗损失 (Generator Adversarial Loss)鼓励生成器生成判别器判断为真实的样本,推动生成器学习真实数据分布。gen_loss_alpha: 1.01.0
判别器损失 (Discriminator Loss)训练判别器准确区分真实和生成样本。disc_loss_alpha: 1.01.0
特征匹配损失 (Feature Matching Loss)最小化判别器中间特征图的距离,稳定GAN训练,确保生成音频的底层统计特性与真实音频相似。feat_loss_alpha: 1.01.0
梅尔频谱重构损失 (Mel Reconstruction Loss)确保生成音频的梅尔频谱与真实音频的梅尔频谱相似,通常是L1或L2距离。mel_loss_alpha: 45.0通过超差hps.train.c_mel设置,默认45.0

4.5 效率与部署考量

MeloTTS的一个显著特点是其对“CPU实时推理”的优化 。这表明VITS作为一种非自回归模型,在推理效率方面具有固有的优势,使其适用于需要低延迟响应的实际应用,例如实时语音助手或交互式系统。

此外,MeloTTS还提供了C++实现(MeloTTS.cpp),并与OpenVINO集成 。OpenVINO是一个用于优化和部署AI推理的工具包,支持在多种设备(CPU、GPU、NPU)上进行无缝部署 。这种C++实现和OpenVINO的结合,进一步增强了MeloTTS在边缘设备和嵌入式系统上的部署能力,扩大了其应用范围。

5. 结论与未来方向

VITS模型通过巧妙地结合变分自编码器、归一化流和对抗训练,成功解决了文本转语音中的“一对多”映射问题,并实现了鲁棒、高保真且富有表现力的语音合成。VAE提供了处理语音多样性的基础,归一化流增强了潜在空间的表现力,而对抗训练则将生成语音的感知质量推向了与真实语音相媲美的水平。

尽管基于大型语言模型(LLM)的TTS系统不断发展,VITS因其固有的鲁棒性和减少幻觉的能力而保持其重要性 。VITS的G2P特性和结构化语音建模方法使其在处理精确发音和一致性方面具有优势,使其成为一种强大的基线模型,并在某些场景下能够有效补充LLM-based TTS系统的不足。

VITS架构的模块化和灵活性也体现在其众多变体和扩展中,例如VITS2、BERT-VITS2、Llama-VITS和PITS 。这些模型通过引入Transformer块、语义嵌入、音高控制等新特性,不断提升了VITS在自然度、效率和表现力方面的性能。MeloTTS作为VITS的一个开源实现,通过集成BERT进行多语言文本处理和优化CPU实时推理,进一步展示了VITS架构在实际应用中的强大潜力和适应性。

未来的研究方向可以集中于如何更有效地融合LLM的强大语义理解能力与VITS在语音精确性和鲁棒波形生成方面的优势,以期在保持高保真度的同时,实现更富有情感和上下文感知的语音合成。此外,探索更高效的归一化流训练和推理方法,以及进一步优化VITS模型在资源受限设备上的部署,也将是重要的研究课题。

http://www.xdnf.cn/news/981019.html

相关文章:

  • PCB设计教程【大师篇】STM32开发板原理图设计(接口部分)
  • 基于生成对抗网络(GAN)的图像生成与编辑:原理、应用与实践
  • CTFshow-PWN-栈溢出(pwn52)
  • 【Docker基础】Docker核心概念:容器(Container)详解
  • Spring详解【2】
  • 数据定义以及数据类型
  • 盒模型小全
  • MySQL查看连接情况
  • 解锁Flink CDC:实时数据同步秘籍
  • windows电脑解决笔记本搜索不到wifi问题
  • 通过flv.js在网页中拉流进行视频播放
  • C# TextBox 控件限制输入字符为十六进制字符串
  • Java@Data 与 @NotNull 注解冲突问题
  • 火山引擎大模型系列都有什么内容
  • 从认识AI开始-----生成对抗网络(GAN):通过博弈机制,引导生成
  • 博客:基本框架设计(下)
  • 牛市与熊市:市场周期的双面镜
  • 力扣上C语言编程题:最大子数组和(涉及数组)
  • TikTok数据采集软件避坑指南:代理/IP轮换/账号封禁问题一站解决
  • CAMEL中涉及获取 GOOGLE_API_KEY 和 SEARCH_ENGINE_ID 这两个值
  • 【时时三省】(C语言基础)寄存器变量( register变量)和全局变量的存储类别
  • 曼昆《经济学原理》第九版 第十七章寡头垄断
  • (简单介绍)反事实场景counterfactual scenarios
  • 树莓派超全系列教程文档--(63)rpicam-apps可用选项介绍之常用选项
  • 绝缘胶垫怎么选择,耐压、防滑、厚度、质量参数如何选择?
  • [学习] C语言结构体与联合体的对比分析
  • 网络层 IP协议(第一部分)
  • Web前端基础之HTML
  • 通过Docker和内网穿透技术在Linux上搭建远程Logseq笔记系统
  • 对比学习(Contrastive Learning)方法详解