UnivNet
概述
UnivNet 模型在 UnivNet: A Neural Vocoder with Multi-Resolution Spectrogram Discriminators for High-Fidelity Waveform Generation 中由 Won Jang、Dan Lim、Jaesam Yoon、Bongwan Kin 和 Juntae Kim 提出。UnivNet 模型是一个生成对抗网络 (GAN),经过训练可以合成高保真语音波形。transformers
中共享的 UnivNet 模型是生成器,它将条件对数梅尔频谱图和可选噪声序列映射到语音波形(例如语音合成器)。推理只需要生成器。用于训练生成器
的判别器未实现。
论文的摘要如下:
大多数神经语音合成器使用带限梅尔频谱图来生成波形。如果使用全频带频谱特征作为输入,则语音合成器可以接收尽可能多的声学信息。然而,在一些使用全频带梅尔频谱图的模型中,会发生过平滑问题,其中会生成不清晰的频谱图。为了解决这个问题,我们提出了 UnivNet,这是一种神经语音合成器,可以实时合成高保真波形。受语音活动检测领域工作的启发,我们添加了一个多分辨率频谱图判别器,它使用不同的参数集计算多个线性频谱图幅度。使用全频带梅尔频谱图作为输入,我们希望通过添加使用多分辨率频谱图作为输入的判别器来生成高分辨率信号。在包含数百个说话人信息的训练数据集上的评估中,UnivNet 在针对已知和未知说话人的竞争模型中获得了最佳的客观和主观结果。这些结果,包括文本到语音的最佳主观得分,证明了快速适应新说话人的潜力,而无需从头开始训练。
提示
- 用于 UnivNetModel.forward() 的
noise_sequence
参数应为形状为([batch_size], noise_length, model.config.model_in_channels)
的标准高斯噪声(例如来自torch.randn
),其中noise_length
应与input_features
参数的长度维度(维度 1)匹配。如果没有提供,它将被随机生成;可以向generator
参数提供一个torch.Generator
,以便可以复制前向传递。(请注意,UnivNetFeatureExtractor 默认情况下将返回生成的噪声,因此无需手动生成noise_sequence
。) - 可以通过
UnivNetFeatureExtractor.batch_decode()
方法从UnivNetModel输出中删除UnivNetFeatureExtractor添加的填充,如下面的使用示例所示。 - 用静音填充每个波形的末尾可以减少生成的音频样本末尾的伪影。这可以通过向UnivNetFeatureExtractor.call()提供
pad_end = True
来完成。有关更多详细信息,请参阅此问题。
使用示例
import torch
from scipy.io.wavfile import write
from datasets import Audio, load_dataset
from transformers import UnivNetFeatureExtractor, UnivNetModel
model_id_or_path = "dg845/univnet-dev"
model = UnivNetModel.from_pretrained(model_id_or_path)
feature_extractor = UnivNetFeatureExtractor.from_pretrained(model_id_or_path)
ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
# Resample the audio to the model and feature extractor's sampling rate.
ds = ds.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
# Pad the end of the converted waveforms to reduce artifacts at the end of the output audio samples.
inputs = feature_extractor(
ds[0]["audio"]["array"], sampling_rate=ds[0]["audio"]["sampling_rate"], pad_end=True, return_tensors="pt"
)
with torch.no_grad():
audio = model(**inputs)
# Remove the extra padding at the end of the output.
audio = feature_extractor.batch_decode(**audio)[0]
# Convert to wav file
write("sample_audio.wav", feature_extractor.sampling_rate, audio)
此模型由 dg845 贡献。据我所知,没有官方代码发布,但可以在 maum-ai/univnet 中找到非官方实现,并预训练检查点 此处。
UnivNetConfig
class transformers.UnivNetConfig
< source >( model_in_channels = 64 model_hidden_channels = 32 num_mel_bins = 100 resblock_kernel_sizes = [3, 3, 3] resblock_stride_sizes = [8, 8, 4] resblock_dilation_sizes = [[1, 3, 9, 27], [1, 3, 9, 27], [1, 3, 9, 27]] kernel_predictor_num_blocks = 3 kernel_predictor_hidden_channels = 64 kernel_predictor_conv_size = 3 kernel_predictor_dropout = 0.0 initializer_range = 0.01 leaky_relu_slope = 0.2 **kwargs )
参数
- model_in_channels (
int
, 可选, 默认为 64) — UnivNet 残差网络的输入通道数。这应该与noise_sequence.shape[1]
相对应,并且与 UnivNetFeatureExtractor 类中使用的值一致。 - model_hidden_channels (
int
, 可选, 默认为 32) — UnivNet 残差网络中每个残差块的隐藏通道数。 - num_mel_bins (
int
, 可选, 默认为 100) — 条件对数梅尔谱图中的频率箱数。这应该与 UnivNetFeatureExtractor 类中使用的值一致。 - resblock_kernel_sizes (
Tuple[int]
或List[int]
, 可选, 默认为[3, 3, 3]
) — 定义 UnivNet 残差网络中 1D 卷积层的核大小的整数元组。resblock_kernel_sizes
的长度定义了残差块的数量,并且应该与resblock_stride_sizes
和resblock_dilation_sizes
的长度匹配。 - resblock_stride_sizes (
Tuple[int]
或List[int]
, 可选, 默认为[8, 8, 4]
) — 定义 UnivNet 残差网络中 1D 卷积层的步幅大小的整数元组。resblock_stride_sizes
的长度应该与resblock_kernel_sizes
和resblock_dilation_sizes
的长度匹配。 - resblock_dilation_sizes (
Tuple[Tuple[int]]
或List[List[int]]
, 可选, 默认为[[1, 3, 9, 27], [1, 3, 9, 27], [1, 3, 9, 27]]
) — 定义 UnivNet 残差网络中膨胀 1D 卷积层的膨胀率的嵌套整数元组。resblock_dilation_sizes
的长度应该与resblock_kernel_sizes
和resblock_stride_sizes
的长度匹配。resblock_dilation_sizes
中每个嵌套列表的长度定义了每个残差块中的卷积层数。 - kernel_predictor_num_blocks (
int
, 可选, 默认为 3) — 核预测器网络中的残差块数量,该网络计算 UnivNet 残差网络中每个位置变量卷积层的核和偏差。 - kernel_predictor_hidden_channels (
int
, 可选, 默认值 64) — 内核预测网络中每个残差块的隐藏通道数。 - kernel_predictor_conv_size (
int
, 可选, 默认值 3) — 内核预测网络中每个一维卷积层的核大小。 - kernel_predictor_dropout (
float
, 可选, 默认值 0.0) — 内核预测网络中每个残差块的丢弃概率。 - initializer_range (
float
, 可选, 默认值 0.01) — 用于初始化所有权重矩阵的截断正态初始化的标准差。 - leaky_relu_slope (
float
, 可选, 默认值 0.2) — Leaky ReLU 激活函数使用的负斜率角度。
这是一个配置类,用于存储 UnivNetModel 的配置。它用于根据指定参数实例化一个 UnivNet 声码器模型,定义模型架构。使用默认值实例化配置将产生类似于 UnivNet dg845/univnet-dev 架构的配置,该架构对应于 maum-ai/univnet 中的“c32”架构。
配置对象继承自 PretrainedConfig 并且可以用于控制模型输出。阅读 PretrainedConfig 文档以了解更多信息。
示例
>>> from transformers import UnivNetModel, UnivNetConfig
>>> # Initializing a Tortoise TTS style configuration
>>> configuration = UnivNetConfig()
>>> # Initializing a model (with random weights) from the Tortoise TTS style configuration
>>> model = UnivNetModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
UnivNetFeatureExtractor
class transformers.UnivNetFeatureExtractor
< 源代码 >( feature_size: int = 1 sampling_rate: int = 24000 padding_value: float = 0.0 do_normalize: bool = False num_mel_bins: int = 100 hop_length: int = 256 win_length: int = 1024 win_function: str = 'hann_window' filter_length: Optional = 1024 max_length_s: int = 10 fmin: float = 0.0 fmax: Optional = None mel_floor: float = 1e-09 center: bool = False compression_factor: float = 1.0 compression_clip_val: float = 1e-05 normalize_min: float = -11.512925148010254 normalize_max: float = 2.3143386840820312 model_in_channels: int = 64 pad_end_length: int = 10 return_attention_mask = True **kwargs )
参数
- feature_size (
int
, 可选, 默认值 1) — 提取特征的特征维度。 - sampling_rate (
int
, 可选, 默认为 24000) — 音频文件数字化时的采样率,以赫兹 (Hz) 为单位。 - padding_value (
float
, 可选, 默认为 0.0) — 在将由padding
参数定义的填充策略应用于 UnivNetFeatureExtractor.call() 时使用的填充值。应该对应于音频静音。__call__
的pad_end
参数也会使用此填充值。 - do_normalize (
bool
, 可选, 默认为False
) — 是否对输入执行 Tacotron 2 归一化。归一化可以帮助显着提高某些模型的性能。 - num_mel_bins (
int
, 可选, 默认为 100) — 提取的频谱图特征中的梅尔频率带数。这应该与UnivNetModel.config.num_mel_bins
相匹配。 - hop_length (
int
, 可选, 默认为 256) — 滑动窗口之间的直接样本数。在许多论文中也称为“移位”。请注意,这与其他音频特征提取器(如 SpeechT5FeatureExtractor)不同,后者以毫秒为单位取hop_length
。 - win_length (
int
, 可选, 默认为 1024) — 每个滑动窗口的直接样本数。请注意,这与其他音频特征提取器(如 SpeechT5FeatureExtractor)不同,后者以毫秒为单位取win_length
。 - win_function (
str
, 可选, 默认为"hann_window"
) — 用于加窗的窗口函数的名称,必须可以通过torch.{win_function}
访问。 - filter_length (
int
, 可选, 默认为 1024) — 要使用的 FFT 组件数量。如果为None
,则使用transformers.audio_utils.optimal_fft_length
确定。 - max_length_s (
int
, 可选, 默认为 10) — 模型的最大输入长度,以秒为单位。这用于填充音频。 - fmin (
float
, 可选, 默认为 0.0) — 以 Hz 为单位的最小梅尔频率。 - center (
bool
, 可选, 默认为False
) — 是否对波形进行填充,使得帧t
围绕时间t * hop_length
居中。如果为False
,则帧t
将从时间t * hop_length
开始。 - compression_factor (
float
, 可选, 默认为 1.0) — 谱归一化期间动态范围压缩的乘法压缩因子。 - compression_clip_val (
float
, 可选, 默认为 1e-05) — 应用于波形的值,在谱归一化期间应用动态范围压缩之前。 - normalize_min (
float
, 可选, 默认为 -11.512925148010254) — 用于 Tacotron 2 风格线性归一化的最小值。默认值为 Tacotron 2 实现中的原始值。 - normalize_max (
float
, 可选, 默认为 2.3143386840820312) — 用于 Tacotron 2 风格线性归一化的最大值。默认值为 Tacotron 2 实现中的原始值。 - model_in_channels (
int
, 可选, 默认为 64) — UnivNetModel 模型的输入通道数。这应该与UnivNetModel.config.model_in_channels
相匹配。 - pad_end_length (
int
, 可选, 默认为 10) — 如果对每个波形的末尾进行填充,则要追加的频谱图帧数。追加的样本数将为pad_end_length * hop_length
。 - return_attention_mask (
bool
, 可选, 默认为True
) — 是否 call() 应该返回attention_mask
。
构建一个 UnivNet 特征提取器。
此类使用短时傅里叶变换 (STFT) 从原始语音中提取对数梅尔滤波器组特征。STFT 实现遵循 TacoTron 2 和 Hifi-GAN 的实现。
此特征提取器继承自 SequenceFeatureExtractor,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。
__call__
< 源代码 > ( raw_speech: Union sampling_rate: Optional = None padding: Union = True max_length: Optional = None truncation: bool = True pad_to_multiple_of: Optional = None return_noise: bool = True generator: Optional = None pad_end: bool = False pad_length: Optional = None do_normalize: Optional = None return_attention_mask: Optional = None return_tensors: Union = None )
参数
- raw_speech (
np.ndarray
,List[float]
,List[np.ndarray]
,List[List[float]]
) — 需要填充的序列或序列批次。每个序列可以是 numpy 数组、浮点值列表、numpy 数组列表或浮点值列表列表。必须是单声道音频,而不是立体声,即每个时间步只有一个浮点数。 - sampling_rate (
int
, 可选) —raw_speech
输入采样的采样率。强烈建议在正向调用时传递sampling_rate
,以防止静默错误并允许自动语音识别管道。 - padding (
bool
,str
或 PaddingStrategy, 可选,默认值为True
) — 选择一种策略来填充输入raw_speech
波形(根据模型的填充侧和填充索引),其中:True
或'longest'
:填充到批次中最长的序列(如果只提供一个序列,则不填充)。'max_length'
:填充到使用参数max_length
指定的最大长度,或者如果没有提供该参数,则填充到模型可接受的最大输入长度。False
或'do_not_pad'
(默认):不填充(即,可以输出具有不同长度序列的批次)。
如果
pad_end = True
,则该填充将在应用padding
策略之前进行。 - max_length (
int
, 可选) — 返回列表的最大长度,以及可选的填充长度(见上文)。 - truncation (
bool
, 可选,默认值为True
) — 激活截断,将长度大于max_length
的输入序列截断为max_length
。 - pad_to_multiple_of (
int
, 可选) — 如果设置,将填充序列以使其成为提供的值的倍数。这对于在具有计算能力
>= 7.5
(Volta)的 NVIDIA 硬件上启用 Tensor Cores 的使用特别有用,或者在从序列长度为 128 的倍数中受益的 TPU 上。 - return_noise (
bool
, 可选,默认值为True
) — 是否生成并返回用于 UnivNetModel.forward() 的噪声波形。 - generator (
numpy.random.Generator
, 可选,默认值为None
) — 生成噪声时使用的可选numpy.random.Generator
随机数生成器。 - pad_end (
bool
, 可选, 默认为False
) — 是否在每个波形的末尾填充静音。 这有助于减少生成音频样本末尾的伪影; 有关更多详细信息,请参阅 https://github.com/seungwonpark/melgan/issues/8。 此填充将在padding
中指定的填充策略执行之前进行。 - pad_length (
int
, 可选, 默认为None
) — 如果在每个波形的末尾填充,则填充的长度(以频谱帧为单位)。 如果未设置,则默认为self.config.pad_end_length
。 - do_normalize (
bool
, 可选) — 是否对输入执行 Tacotron 2 归一化。 归一化有助于显着提高某些模型的性能。 如果未设置,则默认为self.config.do_normalize
。 - return_attention_mask (
bool
, 可选) — 是否返回注意力掩码。 如果保留默认值,则会根据特定特征提取器的默认值返回注意力掩码。 - return_tensors (
str
或 TensorType, 可选) — 如果设置,将返回张量而不是 python 整数列表。 可接受的值为:'tf'
: 返回 TensorFlowtf.constant
对象。'pt'
: 返回 PyTorchtorch.np.array
对象。'np'
: 返回 Numpynp.ndarray
对象。
将一个或多个序列特征化并为模型准备的主要方法。
UnivNetModel
class transformers.UnivNetModel
< 源代码 >( config: UnivNetConfig )
参数
- config (UnivNetConfig) — 模型配置类,包含模型的所有参数。 使用配置文件初始化不会加载与模型相关的权重,只会加载配置。 查看 from_pretrained() 方法以加载模型权重。
UnivNet GAN 声码器。 此模型继承自 PreTrainedModel。 查看超类文档以了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪 head 等)。
此模型也是 PyTorch torch.nn.Module 子类。 将其用作常规 PyTorch 模块,并参考 PyTorch 文档以了解有关一般使用和行为的所有事项。
forward
< 源代码 > ( input_features: FloatTensor noise_sequence: Optional = None padding_mask: Optional = None generator: Optional = None return_dict: Optional = None ) → transformers.models.univnet.modeling_univnet.UnivNetModelOutput
或 tuple(torch.FloatTensor)
参数
- input_features (
torch.FloatTensor
) — 包含对数梅尔声谱图的张量。 可以批处理并具有(batch_size, sequence_length, config.num_mel_channels)
的形状, 也可以不批处理并具有(sequence_length, config.num_mel_channels)
的形状。 - noise_sequence (
torch.FloatTensor
, 可选) — 包含标准高斯噪声的噪声序列张量。 可以批处理并具有(batch_size, sequence_length, config.model_in_channels)
的形状, 也可以不批处理并具有(sequence_length, config.model_in_channels)
的形状。 如果未提供,将随机生成。 - padding_mask (
torch.BoolTensor
, 可选) — 指示每个序列的哪些部分被填充的掩码。 掩码值在[0, 1]
中选择:- 1 表示未被掩码的标记
- 0 表示被掩码的标记
掩码可以批处理并具有
(batch_size, sequence_length)
的形状, 也可以不批处理并具有(sequence_length,)
的形状。 - generator (
torch.Generator
, 可选) — 一个 torch 生成器, 用于使生成确定性。 return_dict — 是否返回一个 ModelOutput 子类而不是一个普通元组。
返回
transformers.models.univnet.modeling_univnet.UnivNetModelOutput
或 tuple(torch.FloatTensor)
一个 transformers.models.univnet.modeling_univnet.UnivNetModelOutput
或一个 torch.FloatTensor
的元组(如果传递了 return_dict=False
或当 config.return_dict=False
时), 包含根据配置 (UnivNetConfig) 和输入而变化的各种元素。
- waveforms (
torch.FloatTensor
,形状为(batch_size, sequence_length)
) — 批处理的 1D(单声道)输出音频波形。 - waveform_lengths (
torch.FloatTensor
,形状为(batch_size,)
) —waveforms
中每个未填充波形的批处理长度(以样本为单位)。
The UnivNetModel 正向方法,覆盖了 __call__
特殊方法。
虽然正向传播的配方需要在此函数中定义, 但应该在之后调用 Module
实例, 而不是此函数, 因为前者负责运行前处理和后处理步骤, 而后者会静默地忽略它们。
将噪声波形和条件声谱图转换为语音波形。 传递一批对数梅尔声谱图将返回一批语音波形。 传递单个未批处理的对数梅尔声谱图将返回单个未批处理的语音波形。
示例
>>> from transformers import UnivNetFeatureExtractor, UnivNetModel
>>> from datasets import load_dataset, Audio
>>> model = UnivNetModel.from_pretrained("dg845/univnet-dev")
>>> feature_extractor = UnivNetFeatureExtractor.from_pretrained("dg845/univnet-dev")
>>> ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> # Resample the audio to the feature extractor's sampling rate.
>>> ds = ds.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
>>> inputs = feature_extractor(
... ds[0]["audio"]["array"], sampling_rate=ds[0]["audio"]["sampling_rate"], return_tensors="pt"
... )
>>> audio = model(**inputs).waveforms
>>> list(audio.shape)
[1, 140288]