Speech | 语音中的风格迁移论文,总结及核心代码详解[20240103更新版]

 本文主要是集中总结了一些语音中的风格迁移方法及论文,可用于语音合成(Text-to-Speech),声音转换(Voice Conversion),声音克隆(Voice Cloning),等领域。

目录

1.语音合成(TTS)

1.1.2018_样式标记:端到端语音合成中的无监督样式建模、控制和传输

摘要

实现代码

1.2.2018_从端到端语音合成中的文本预测富有表现力的说话风格

1.3.2022_语音合成中基于风格和说话人成分解耦的风格迁移

 1.4.2023_PromptStyle

1.5.2023_StyleTTS & StyleTTS2

StyleTTS摘要

StyleTTS 2 摘要

2.声音转换(VC)

3.声音克隆(VC)

参考文献

References


1.语音合成(TTS)

1.1.2018_样式标记:端到端语音合成中的无监督样式建模、控制和传输

2018_Style Tokens: Unsupervised Style Modeling, Control and Transfer in End-to-End Speech Synthesis

paper:Style Tokens: Unsupervised Style Modeling, Control and Transfer in End-to-End Speech Synthesis (arxiv.org)

code:jinhan/tacotron2-gst: Tacotron2 with Global Style Tokens (github.com)

摘要

在这项工作中,我们提出了“全局风格迁移”(GST),这是一个在Tacotron(最先进的端到端语音合成系统)中联合训练的嵌入库。嵌入在没有明确标签的情况下进行训练,但学会了对大范围的声学表现力进行建模。商品及服务税会带来一系列丰富的重要结果。它们生成的软可解释“标签”可用于以新颖的方式控制合成,例如改变速度和说话风格 - 独立于文本内容。它们还可用于风格转换,在整个长格式文本语料库中复制单个音频剪辑的说话风格。当对嘈杂的、未标记的发现数据进行训练时,GST 学会分解噪声和说话人身份,为高度可扩展但强大的语音合成提供了一条途径。

GST model包含了一个 reference encoder, style attention, style embedding, and sequence-to-sequence (Tacotron) model.

在训练时

Skerry-Ryan等人提出的参考编码器能将可变长度音频信号的前音压缩成固定长度的向量,我们称之为参考嵌入。在训练过程中

- 参考嵌入被传递到风格标记层,将其作为注意力模块的查询向量。在这里,注意力不是用来学习对齐。相反,它学习的是之间的相似性度量。随机初始化嵌入库中的每个标记之间的相似度量。这组嵌入库,我们也称之为全局样式标记、GST 或标记嵌入,在所有训练序列中共享。
- 注意力模块会输出一组组合权重,它代表了每种风格标记对编码参考嵌入的贡献。加权之和,我们称之为风格嵌入、在每个时间步传递给文本编码器进行调节。
- 风格标记层与模型的其他部分共同训练,仅由重建驱动。
模型的其他部分共同训练,只受来自 Tacotron 解码器的重构损失的驱动。因此,GST 不需要任何
明确的风格或韵律标签。

推理时

GST 架构旨在实现强大而灵活的在推理模式下进行控制。

在这种模式下,信息可以以两种方式之一流过模型:
1. 我们可以直接将文本编码器设定为某些标记的条件,如图 1 中推理模式图的右侧所示("以某些标记为条件")。这样就可以在没有参考信号的情况下进行样式控制和操作。
2. 我们可以输入不同的音频信号(其转录本不需要与要合成的文本相匹配)来实现风格转移。
图 1 中推理模式图的左侧描述了这一点(以音频信号为条件")。

风格前一类语音合成中大多使用了全局风格迁移(GST)。

其中GST由一个推理编码和风格编码组成,代码如下

实现代码

# source from https://github.com/KinglittleQ/GST-Tacotron/blob/master/GST.py

import torch
import torch.nn as nn
import torch.nn.init as init
import torch.nn.functional as F


class ReferenceEncoder(nn.Module):
    '''
    inputs --- [N, Ty/r, n_mels*r]  mels
    outputs --- [N, ref_enc_gru_size]
    '''

    def __init__(self, hp):

        super().__init__()
        K = len(hp.ref_enc_filters)
        filters = [1] + hp.ref_enc_filters

        convs = [nn.Conv2d(in_channels=filters[i],
                           out_channels=filters[i + 1],
                           kernel_size=(3, 3),
                           stride=(2, 2),
                           padding=(1, 1)) for i in range(K)]
        self.convs = nn.ModuleList(convs)
        self.bns = nn.ModuleList([nn.BatchNorm2d(num_features=hp.ref_enc_filters[i]) for i in range(K)])

        out_channels = self.calculate_channels(hp.n_mels, 3, 2, 1, K)
        self.gru = nn.GRU(input_size=hp.ref_enc_filters[-1] * out_channels,
                          hidden_size=hp.E // 2,
                          batch_first=True)
        self.n_mels = hp.n_mels

    def forward(self, inputs):
        N = inputs.size(0)
        out = inputs.view(N, 1, -1, self.n_mels)  # [N, 1, Ty, n_mels]
        for conv, bn in zip(self.convs, self.bns):
            out = conv(out)
            out = bn(out)
            out = F.relu(out)  # [N, 128, Ty//2^K, n_mels//2^K]

        out = out.transpose(1, 2)  # [N, Ty//2^K, 128, n_mels//2^K]
        T = out.size(1)
        N = out.size(0)
        out = out.contiguous().view(N, T, -1)  # [N, Ty//2^K, 128*n_mels//2^K]

        _, out = self.gru(out)  # out --- [1, N, E//2]

        return out.squeeze(0)

    def calculate_channels(self, L, kernel_size, stride, pad, n_convs):
        for _ in range(n_convs):
            L = (L - kernel_size + 2 * pad) // stride + 1
        return L


class STL(nn.Module):
    '''
    inputs --- [N, E//2]
    '''
    def __init__(self, hp):
        super().__init__()
        self.embed = nn.Parameter(torch.FloatTensor(hp.token_num, hp.E // hp.num_heads))
        d_q = hp.E // 2
        d_k = hp.E // hp.num_heads
        self.attention = MultiHeadAttention(query_dim=d_q, key_dim=d_k, num_units=hp.E, num_heads=hp.num_heads)

        init.normal_(self.embed, mean=0, std=0.5)

    def forward(self, inputs):
        N = inputs.size(0)
        query = inputs.unsqueeze(1)  # [N, 1, E//2]
        keys = F.tanh(self.embed).unsqueeze(0).expand(N, -1, -1)  # [N, token_num, E // num_heads]
        style_embed = self.attention(query, keys)

        return style_embed


class MultiHeadAttention(nn.Module):
    '''
    input:
        query --- [N, T_q, query_dim]
        key --- [N, T_k, key_dim]
    output:
        out --- [N, T_q, num_units]
    '''
    def __init__(self, query_dim, key_dim, num_units, num_heads):
        super().__init__()
        self.num_units = num_units
        self.num_heads = num_heads
        self.key_dim = key_dim

        self.W_query = nn.Linear(in_features=query_dim, out_features=num_units, bias=False)
        self.W_key = nn.Linear(in_features=key_dim, out_features=num_units, bias=False)
        self.W_value = nn.Linear(in_features=key_dim, out_features=num_units, bias=False)

    def forward(self, query, key):
        querys = self.W_query(query)  # [N, T_q, num_units]
        keys = self.W_key(key)  # [N, T_k, num_units]
        values = self.W_value(key)

        split_size = self.num_units // self.num_heads
        querys = torch.stack(torch.split(querys, split_size, dim=2), dim=0)  # [h, N, T_q, num_units/h]
        keys = torch.stack(torch.split(keys, split_size, dim=2), dim=0)  # [h, N, T_k, num_units/h]
        values = torch.stack(torch.split(values, split_size, dim=2), dim=0)  # [h, N, T_k, num_units/h]

        # score = softmax(QK^T / (d_k ** 0.5))
        scores = torch.matmul(querys, keys.transpose(2, 3))  # [h, N, T_q, T_k]
        scores = scores / (self.key_dim ** 0.5)
        scores = F.softmax(scores, dim=3)

        # out = score * V
        out = torch.matmul(scores, values)  # [h, N, T_q, num_units/h]
        out = torch.cat(torch.split(out, 1, dim=0), dim=3).squeeze(0)  # [N, T_q, num_units]

        return out


class GST(nn.Module):
    def __init__(self, hp):
        super().__init__()
        self.encoder = ReferenceEncoder(hp)
        self.stl = STL(hp)

    def forward(self, inputs):
        enc_out = self.encoder(inputs)
        style_embed = self.stl(enc_out)

        return style_embed

1.2.2018_从端到端语音合成中的文本预测富有表现力的说话风格

2018_Text-Predicted Global Style Token (TP-GST):PREDICTING EXPRESSIVE SPEAKING STYLE FROM TEXT IN END-TO-END SPEECH SYNTHESIS

paper:1808.01410.pdf (arxiv.org)

 摘要

全局样式令牌 (GST) 是最近提出的一种学习高维数据的潜在解开表示的方法。GST可以在Tacotron中使用,Tacotron是一种最先进的端到端文本到语音合成系统,以发现说话风格变化的表现因素。在这项工作中,我们介绍了文本预测全局风格令牌(TP-GST)架构,该架构将GST组合权重或风格嵌入视为Tacotron中的“虚拟”说话风格标签。TP-GST仅从文本中学习预测文体渲染,在训练期间既不需要明确的标签,也不需要辅助输入进行推理。我们表明,当在表达性语音数据集上进行训练时,我们的系统会生成的音频比两个最先进的基线模型具有更多的音高和能量变化。我们进一步证明,TP-GST可以在去除背景噪声的情况下合成语音,并在人类评估的听众偏好有声读物任务上以积极的结果证实这些分析。最后,我们证明了多说话人TP-GST模型成功地分解了说话人的身份和说话风格。我们提供了一个网站,其中包含每个发现的音频样本。

1.3.2022_语音合成中基于风格和说话人成分解耦的风格迁移

2022_Disentangling style and speaker attributes for TTS style transfer

[2201.09472] Disentangling Style and Speaker Attributes for TTS Style Transfer (arxiv.org)

 摘要

端到端神经 TTS 在语音风格转换方面表现出改进的性能。但是,改进仍然受到目标风格和说话人的可用训练数据的限制。此外,当经过训练的 TTS 尝试将语音从具有未知任意风格的新说话人转移到目标风格时,会观察到性能下降。在本文中,我们提出了一种在不相交的多风格数据集上进行可见和看不见的风格迁移训练的新方法,即记录不同风格的数据集,一个说话者在多个话语中记录一个单独的风格。首先引入了逆自回归流(IAF)技术,以改进学习表达风格表示的变分推理。然后开发一个说话人编码器网络来学习判别性说话人嵌入,该网络与其他神经TTS模块联合训练。所提出的看得见和看不见的风格迁移方法经过了六个专门设计的目标的有效训练:重建损失、对抗性损失、风格失真损失、周期一致性损失、风格分类损失和说话人分类损失。实验客观和主观地证明了所提出的方法对看得见和看不见的风格迁移任务的有效性。我们的方法的性能优于现有技术的其他四个参考系统,并且比该方法更强大。

 1.4.2023_PromptStyle

 2023_PromptStyle

论文题目:2023-PromptStyle: Controllable Style Transfer for Text-to-Speech with Natural Language Descriptions

论文地址https://arxiv.org/abs/2305.1952

截止20231107无公开代码

1.5.2023_StyleTTS & StyleTTS2

StyleTTS:StyleTTS:基于风格的生成模型,用于自然和多样化的文本到语音合成

 StyleTTS: A Style-Based Generative Model for Natural and Diverse Text-to-Speech Synthesis

论文地址:https://arxiv.org/abs/2107.10394

代码地址: yl4579/StyleTTS: Official Implementation of StyleTTS (github.com)

Demo:Audio Samples from StyleTTS

StyleTTS摘要

由于并行 TTS 系统的快速发展,文本转语音 (TTS) 最近在合成高质量语音方面取得了巨大进展,但产生具有自然韵律变化、说话风格和情感语气的语音仍然具有挑战性。此外,由于持续时间和语音是分开生成的,因此并行 TTS 模型仍然难以找到对自然语音合成至关重要的最佳单调对齐。在这里,我们提出了 StyleTTS,这是一种基于风格的并行 TTS 生成模型,可以从参考语音话语中合成具有自然韵律的不同语音。通过新颖的可转移单调对齐器(TMA)和持续时间不变的数据增强方案,我们的方法在语音自然性和说话人相似度的主观测试中,在单人和多说话人数据集上都明显优于最先进的模型。通过对说话风格的自监督学习,我们的模型可以合成与任何给定参考语音相同的韵律和情感语气的语音,而无需明确标记这些类别。

2023_StyleTTS 2:通过大型语音语言模型的风格扩散和对抗训练实现人类水平的文本转语音

Towards Human-Level Text-to-Speech through Style Diffusion and Adversarial Training with Large Speech Language Models

论文地址​​​​​​https://arxiv.org/abs/2305.1952

Demo:Audio Samples from StyleTTS 2

StyleTTS 2 摘要

在本文中,论文介绍了 StyleTTS 2,这是一种文本转语音 (TTS) 模型,它利用风格扩散和对抗训练与大型语音语言模型 (SLM) 来实现人类水平的 TTS 合成。StyleTTS 2 与前代产品的不同之处在于,通过扩散模型将风格建模为潜在随机变量,以生成最适合文本的风格,而无需参考语音,在实现高效潜在扩散的同时受益于扩散模型提供的多样化语音合成。此外,我们采用大型预训练SLM(如WavLM)作为判别器,采用我们新颖的可微分持续时间建模进行端到端训练,从而提高语音自然度。StyleTTS 2 超越了单说话人 LJSpeech 数据集上的人工录音,并在多说话人 VCTK 数据集上与之匹配,由以英语为母语的人判断。此外,当在 LibriTTS 数据集上训练时,我们的模型在零样本说话人适应方面优于以前公开可用的模型。这项工作首次在单人和多说话人数据集上实现了人类水平的 TTS 合成,展示了使用大型 SLM 进行风格扩散和对抗训练的潜力。

1.6.PROMPTTTS系列

2022.11.27_ PromptTTS: controllable text-to-speech with text descriptions

论文地址

Demo:PromptTTS: controllable text-to-speech with text descriptions - Speech Research

截止20240103无公开代码

用文本描述作为提示来指导文本或图像的生成(例如,GPT-3 或 DALLE-2)最近引起了广泛关注。除了文本和图像生成之外,在这项工作中,我们还探索了利用文本描述来指导语音合成的可能性。因此,我们开发了一个文本转语音 (TTS) 系统(称为 PromptTTS),该系统将具有样式和内容描述的提示作为输入来合成相应的语音。具体来说,PromptTTS 由样式编码器和内容编码器组成,用于从提示中提取相应的表示,以及语音解码器,用于根据提取的样式和内容表示合成语音。与以往的可控TTS作品相比,PromptTTS需要用户具备声学知识才能理解韵律和音高等风格因素,因此更加人性化,因为文本描述是一种更自然的表达语音风格的方式(例如,“一位女士慢慢地对她的朋友耳语”)。鉴于没有带有提示的 TTS 数据集,为了对 PromptTTS 的任务进行基准测试,我们构建并发布了一个包含带有样式和内容信息以及相应语音的提示的数据集。实验表明,PromptTTS可以生成具有精确风格控制和高语音质量的语音。音频样本和我们的数据集是公开的。

2023.10.12_PROMPTTTS 2: DESCRIBING AND GENERATING VOICES WITH TEXT PROMPT

论文地址:2309.02285.pdf (arxiv.org)

 语音传达的信息比文本多,因为同一个词可以用不同的声音说出来传达不同的信息。与传统的文本转语音 (TTS) 方法相比,依靠语音提示(参考语音)来实现语音可变性,使用文本提示(描述)更加用户友好,因为语音提示可能很难找到或根本不存在。基于文本提示的 TTS 方法面临两个主要挑战:1) 一对多问题,其中并非所有关于语音可变性的细节都可以在文本提示中描述,以及 2) 文本提示数据集的可用性有限,其中需要供应商和大量数据标记成本来编写语音文本提示。在这项工作中,我们引入了 PromptTTS 2 来应对这些挑战,通过变体网络提供文本提示未捕获的语音可变性信息,以及利用大型语言模型 (LLM) 撰写高质量文本提示的提示生成管道。具体来说,变异网络根据文本提示表示来预测从参考语音中提取的表示(其中包含有关语音变异性的完整信息)。对于提示生成管道,它使用语音语言理解模型生成语音文本提示,以识别语音中的语音属性(例如,性别、速度),并使用大型语言模型根据识别结果制定文本提示。在大规模(44K 小时)语音数据集上的实验表明,与以往的作品相比,PromptTTS 2 生成的语音与文本提示更加一致,并支持对不同语音变异性的采样,从而为用户提供了更多的语音生成选择。此外,提示生成管道可生成高质量的文本提示,从而消除了高昂的标记成本。PromptTTS 2 的演示页面可在线获取。

2023.12.27_ PROMPTTTS++: CONTROLLING SPEAKER IDENTITY IN PROMPT-BASED TEXT-TO-SPEECH USING NATURAL LANGUAGE DESCRIPTIONS

论文地址2309.08140.pdf (arxiv.org)

Demo:https://reppy4620.github.io/demo.promptttspp/

截止20240103无公开代码

2.声音转换(VC)

是指从一个人的声音到另外一个人的声音。一般语音中,VC简写都指的是声音转换,

3.声音克隆(VC)

指的是学习一个人的声音!

参考文献

【1】论文推介:语音合成中基于风格和说话人成分解耦的风格迁移 - 知乎 (zhihu.com)

References

Y. Wang, D. Stanton, Y. Zhang, R. Skerry-Ryan, E. Battenberg, J. Shor, Y. Xiao, F. Ren, Y. Jia, and R. A. Saurous, “Style tokens: Unsupervised style modeling, control and transfer in end-to-end speech synthesis,” International Conference on Machine Learning, 2018. [Online]. Available: https://arxiv.org/abs/1803.09017

H.-S. Choi, J. Lee, W. Kim, J. Lee, H. Heo, and K. Lee, “Neural analysis and synthesis: Reconstructing speech from self-supervised representations,” Advances in Neural Information Processing Systems, vol. 34, pp. 16 251–16 265, 2021.

[2] Y. Ren et al., “Fastspeech 2: Fast and high-quality end-to-end text to speech,” in Proc. Int. Conf. Learn. Representations, 2020.

[3] Y. Ren, Y. Ruan, X. Tan, T. Qin, S. Zhao, Z. Zhao, and T.-Y. Liu, “Fast-speech: Fast, robust and controllable text to speech,” The International Conference on Neural Information Processing Systems (NeurIPS), pp. 3165–3174, 2019.

[4] Y. Wang, D. Stanton, Y. Zhang, R.-S. Ryan, E. Battenberg, J. Shor, Y. Xiao, Y. Jia, F. Ren, and R. A. Saurous, “Style tokens: Unsupervised style modeling, control and transfer in end-to-end speech synthesis,” in the International Conference on Machine Learning (ICML). PMLR, 2018, pp. 5180–5189.

[5] K. Akuzawa, Y. Iwasawa, and Y. Matsuo, “Expressive Speech Synthesis via Modeling Expressions with Variational Autoencoder,” in The Annual Conference of the International Speech Communication Association (Interspeech), 2018, pp. 3067–3071.

[6] S. Pan and L. He, “Cross-Speaker Style Transfer with Prosody Bottleneck in Neural Speech Synthesis,” in The Annual Conference of the International Speech Communication Association (Interspeech), 2021, pp. 4678–4682.

[7] Y. Wang, R. Skerry-Ryan, D. Stanton, Y. Wu, R. J. Weiss, N. Jaitly, Z. Yang, Y. Xiao, Z. Chen, S. Bengio et al., “Tacotron: Towards end-to-end speech synthesis,” in The Annual Conference of the International Speech Communication Association (Interspeech), 2017, pp. 4006–4010.

[8] R. Liu, B. Sisman, G. Gao, and H. Li, “Expressive tts training with frame and style reconstruction loss,” IEEE/ACM Transactions on Audio, Speech, and Language Processing, vol. 29, pp. 1806–1818, 2021.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天|여름이다

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值